[PATCH] D78076: [mlir] Support big endian in DenseElementsAttr
Mehdi AMINI via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 4 15:38:27 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rG3a7be241f252: [mlir] Support big endian in DenseElementsAttr (authored by imaihal, committed by mehdi_amini).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D78076/new/
https://reviews.llvm.org/D78076
Files:
mlir/lib/IR/Attributes.cpp
Index: mlir/lib/IR/Attributes.cpp
===================================================================
--- mlir/lib/IR/Attributes.cpp
+++ mlir/lib/IR/Attributes.cpp
@@ -16,6 +16,7 @@
#include "mlir/IR/Types.h"
#include "llvm/ADT/Sequence.h"
#include "llvm/ADT/Twine.h"
+#include "llvm/Support/Endian.h"
using namespace mlir;
using namespace mlir::detail;
@@ -550,6 +551,29 @@
return (rawData[bitPos / CHAR_BIT] & (1 << (bitPos % CHAR_BIT))) != 0;
}
+/// Get start position of actual data in `value`. Actual data is
+/// stored in last `bitWidth`/CHAR_BIT bytes in big endian.
+static char *getAPIntDataPos(APInt &value, size_t bitWidth) {
+ char *dataPos =
+ const_cast<char *>(reinterpret_cast<const char *>(value.getRawData()));
+ if (llvm::support::endian::system_endianness() ==
+ llvm::support::endianness::big)
+ dataPos = dataPos + 8 - llvm::divideCeil(bitWidth, CHAR_BIT);
+ return dataPos;
+}
+
+/// Read APInt `value` from appropriate position.
+static void readAPInt(APInt &value, size_t bitWidth, char *outData) {
+ char *dataPos = getAPIntDataPos(value, bitWidth);
+ std::copy_n(dataPos, llvm::divideCeil(bitWidth, CHAR_BIT), outData);
+}
+
+/// Write `inData` to appropriate position of APInt `value`.
+static void writeAPInt(const char *inData, size_t bitWidth, APInt &value) {
+ char *dataPos = getAPIntDataPos(value, bitWidth);
+ std::copy_n(inData, llvm::divideCeil(bitWidth, CHAR_BIT), dataPos);
+}
+
/// Writes value to the bit position `bitPos` in array `rawData`.
static void writeBits(char *rawData, size_t bitPos, APInt value) {
size_t bitWidth = value.getBitWidth();
@@ -560,9 +584,7 @@
// Otherwise, the bit position is guaranteed to be byte aligned.
assert((bitPos % CHAR_BIT) == 0 && "expected bitPos to be 8-bit aligned");
- std::copy_n(reinterpret_cast<const char *>(value.getRawData()),
- llvm::divideCeil(bitWidth, CHAR_BIT),
- rawData + (bitPos / CHAR_BIT));
+ readAPInt(value, bitWidth, rawData + (bitPos / CHAR_BIT));
}
/// Reads the next `bitWidth` bits from the bit position `bitPos` in array
@@ -575,9 +597,7 @@
// Otherwise, the bit position must be 8-bit aligned.
assert((bitPos % CHAR_BIT) == 0 && "expected bitPos to be 8-bit aligned");
APInt result(bitWidth, 0);
- std::copy_n(
- rawData + (bitPos / CHAR_BIT), llvm::divideCeil(bitWidth, CHAR_BIT),
- const_cast<char *>(reinterpret_cast<const char *>(result.getRawData())));
+ writeAPInt(rawData + (bitPos / CHAR_BIT), bitWidth, result);
return result;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78076.261947.patch
Type: text/x-patch
Size: 2552 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200504/0b5ff59e/attachment.bin>
More information about the llvm-commits
mailing list