Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index 1d547113d270d6536bf719d10750dd6e8467b4f5..ad52e15385885d7d31f75fbd5712289a73fdc5af 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -2762,6 +2762,35 @@ Node* WasmGraphBuilder::LoadMem(wasm::LocalType type, MachineType memtype, |
load = BuildUnalignedLoad(type, memtype, index, offset, alignment); |
} |
+#if defined(V8_TARGET_BIG_ENDIAN) |
+ int numberOfBytes = 1 << ElementSizeLog2Of(memtype.representation()); |
+ |
+ switch (numberOfBytes) { |
ivica.bogosavljevic
2016/07/06 11:28:48
You are missing here proper handling of floating-p
|
+ case 1: |
+ break; |
+ case 2: |
+ load = graph()->NewNode(jsgraph()->machine()->Word16ReverseBytes().op(), |
+ load); |
+ if (memtype.IsSigned()) |
+ load = |
+ graph()->NewNode(jsgraph()->machine()->Word32Sar(), |
+ graph()->NewNode(jsgraph()->machine()->Word32Shl(), |
+ load, Int32Constant(16)), |
+ Int32Constant(16)); |
+ break; |
+ case 4: |
+ load = graph()->NewNode(jsgraph()->machine()->Word32ReverseBytes().op(), |
+ load); |
+ break; |
+ case 8: |
+ load = graph()->NewNode(jsgraph()->machine()->Word64ReverseBytes().op(), |
+ load); |
ivica.bogosavljevic
2016/06/29 14:21:59
32 bit architectures don't have Word64ReverseByte
|
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+#endif |
+ |
if (type == wasm::kAstI64 && |
ElementSizeLog2Of(memtype.representation()) < 3) { |
// TODO(titzer): TF zeroes the upper bits of 64-bit loads for subword sizes. |
@@ -2878,6 +2907,34 @@ Node* WasmGraphBuilder::StoreMem(MachineType memtype, Node* index, |
// WASM semantics throw on OOB. Introduce explicit bounds check. |
BoundsCheckMem(memtype, index, offset, position); |
StoreRepresentation rep(memtype.representation(), kNoWriteBarrier); |
+ |
+#if defined(V8_TARGET_BIG_ENDIAN) |
+ int numberOfBytes = 1 << ElementSizeLog2Of(memtype.representation()); |
+ |
+ switch (numberOfBytes) { |
+ case 1: |
+ break; |
+ case 2: |
+ val = graph()->NewNode( |
+ memtype.IsSigned() ? jsgraph()->machine()->Word32Sar() |
+ : jsgraph()->machine()->Word32Shr(), |
+ graph()->NewNode(jsgraph()->machine()->Word32ReverseBytes().op(), |
+ val), |
+ jsgraph()->Int32Constant(32 - numberOfBytes * 8)); |
+ break; |
+ case 4: |
+ val = graph()->NewNode(jsgraph()->machine()->Word32ReverseBytes().op(), |
+ val); |
+ break; |
+ case 8: |
+ val = graph()->NewNode(jsgraph()->machine()->Word64ReverseBytes().op(), |
+ val); |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+#endif |
+ |
bool aligned = static_cast<int>(alignment) >= |
ElementSizeLog2Of(memtype.representation()); |