summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/I64ToI32Lowering.cpp4
-rw-r--r--test/passes/flatten_i64-to-i32-lowering.txt275
-rw-r--r--test/passes/flatten_i64-to-i32-lowering.wast13
-rw-r--r--test/wasm2js/endianness.2asm.js8
-rw-r--r--test/wasm2js/left-to-right.2asm.js4
-rw-r--r--test/wasm2js/traps.2asm.js4
6 files changed, 298 insertions, 10 deletions
diff --git a/src/passes/I64ToI32Lowering.cpp b/src/passes/I64ToI32Lowering.cpp
index e2d3cc414..26f40c284 100644
--- a/src/passes/I64ToI32Lowering.cpp
+++ b/src/passes/I64ToI32Lowering.cpp
@@ -366,7 +366,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> {
builder->makeLoad(4,
curr->signed_,
curr->offset + 4,
- 1,
+ std::min(uint32_t(curr->align), uint32_t(4)),
builder->makeGetLocal(ptrTemp, i32),
i32));
} else if (curr->signed_) {
@@ -409,7 +409,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> {
Store* storeHigh =
builder->makeStore(4,
curr->offset + 4,
- 1,
+ std::min(uint32_t(curr->align), uint32_t(4)),
builder->makeGetLocal(ptrTemp, i32),
builder->makeGetLocal(highBits, i32),
i32);
diff --git a/test/passes/flatten_i64-to-i32-lowering.txt b/test/passes/flatten_i64-to-i32-lowering.txt
index 52995f993..967610194 100644
--- a/test/passes/flatten_i64-to-i32-lowering.txt
+++ b/test/passes/flatten_i64-to-i32-lowering.txt
@@ -1,6 +1,8 @@
(module
(type $FUNCSIG$j (func (result i32)))
+ (type $1 (func))
(import "env" "func" (func $import (result i32)))
+ (memory $0 1 1)
(global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0))
(func $defined (; 1 ;) (type $FUNCSIG$j) (result i32)
(local $0 i32)
@@ -141,6 +143,279 @@
)
(unreachable)
)
+ (func $mem (; 5 ;) (type $1)
+ (local $0 i32)
+ (local $0$hi i32)
+ (local $1 i32)
+ (local $1$hi i32)
+ (local $2 i32)
+ (local $2$hi i32)
+ (local $3 i32)
+ (local $3$hi i32)
+ (local $4 i32)
+ (local $4$hi i32)
+ (local $i64toi32_i32$0 i32)
+ (local $i64toi32_i32$1 i32)
+ (local $i64toi32_i32$2 i32)
+ (block
+ (block
+ (local.set $0
+ (block (result i32)
+ (local.set $i64toi32_i32$2
+ (i32.const 0)
+ )
+ (local.set $i64toi32_i32$0
+ (i32.load
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.set $i64toi32_i32$1
+ (i32.load offset=4
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.get $i64toi32_i32$0)
+ )
+ )
+ (local.set $0$hi
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (drop
+ (block (result i32)
+ (local.set $i64toi32_i32$1
+ (local.get $0$hi)
+ )
+ (local.get $0)
+ )
+ )
+ (nop)
+ (block
+ (local.set $1
+ (block (result i32)
+ (local.set $i64toi32_i32$2
+ (i32.const 0)
+ )
+ (local.set $i64toi32_i32$1
+ (i32.load
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.set $i64toi32_i32$0
+ (i32.load offset=4
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (local.set $1$hi
+ (local.get $i64toi32_i32$0)
+ )
+ )
+ (drop
+ (block (result i32)
+ (local.set $i64toi32_i32$0
+ (local.get $1$hi)
+ )
+ (local.get $1)
+ )
+ )
+ (nop)
+ (block
+ (local.set $2
+ (block (result i32)
+ (local.set $i64toi32_i32$2
+ (i32.const 0)
+ )
+ (local.set $i64toi32_i32$0
+ (i32.load align=2
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.set $i64toi32_i32$1
+ (i32.load offset=4 align=2
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.get $i64toi32_i32$0)
+ )
+ )
+ (local.set $2$hi
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (drop
+ (block (result i32)
+ (local.set $i64toi32_i32$1
+ (local.get $2$hi)
+ )
+ (local.get $2)
+ )
+ )
+ (nop)
+ (block
+ (local.set $3
+ (block (result i32)
+ (local.set $i64toi32_i32$2
+ (i32.const 0)
+ )
+ (local.set $i64toi32_i32$1
+ (i32.load align=1
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.set $i64toi32_i32$0
+ (i32.load offset=4 align=1
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (local.set $3$hi
+ (local.get $i64toi32_i32$0)
+ )
+ )
+ (drop
+ (block (result i32)
+ (local.set $i64toi32_i32$0
+ (local.get $3$hi)
+ )
+ (local.get $3)
+ )
+ )
+ (nop)
+ (block
+ (local.set $4
+ (block (result i32)
+ (local.set $i64toi32_i32$2
+ (i32.const 0)
+ )
+ (local.set $i64toi32_i32$0
+ (i32.load
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.set $i64toi32_i32$1
+ (i32.load offset=4
+ (local.get $i64toi32_i32$2)
+ )
+ )
+ (local.get $i64toi32_i32$0)
+ )
+ )
+ (local.set $4$hi
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (drop
+ (block (result i32)
+ (local.set $i64toi32_i32$1
+ (local.get $4$hi)
+ )
+ (local.get $4)
+ )
+ )
+ (nop)
+ (block
+ (local.set $i64toi32_i32$0
+ (i32.const 0)
+ )
+ (i32.store
+ (local.get $i64toi32_i32$0)
+ (block (result i32)
+ (local.set $i64toi32_i32$1
+ (i32.const 0)
+ )
+ (i32.const 1)
+ )
+ )
+ (i32.store offset=4
+ (local.get $i64toi32_i32$0)
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (nop)
+ (block
+ (local.set $i64toi32_i32$0
+ (i32.const 0)
+ )
+ (i32.store
+ (local.get $i64toi32_i32$0)
+ (block (result i32)
+ (local.set $i64toi32_i32$1
+ (i32.const 0)
+ )
+ (i32.const 2)
+ )
+ )
+ (i32.store offset=4
+ (local.get $i64toi32_i32$0)
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (nop)
+ (block
+ (local.set $i64toi32_i32$0
+ (i32.const 0)
+ )
+ (i32.store align=2
+ (local.get $i64toi32_i32$0)
+ (block (result i32)
+ (local.set $i64toi32_i32$1
+ (i32.const 0)
+ )
+ (i32.const 3)
+ )
+ )
+ (i32.store offset=4 align=2
+ (local.get $i64toi32_i32$0)
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (nop)
+ (block
+ (local.set $i64toi32_i32$0
+ (i32.const 0)
+ )
+ (i32.store align=1
+ (local.get $i64toi32_i32$0)
+ (block (result i32)
+ (local.set $i64toi32_i32$1
+ (i32.const 0)
+ )
+ (i32.const 4)
+ )
+ )
+ (i32.store offset=4 align=1
+ (local.get $i64toi32_i32$0)
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (nop)
+ (block
+ (local.set $i64toi32_i32$0
+ (i32.const 0)
+ )
+ (i32.store
+ (local.get $i64toi32_i32$0)
+ (block (result i32)
+ (local.set $i64toi32_i32$1
+ (i32.const 0)
+ )
+ (i32.const 5)
+ )
+ )
+ (i32.store offset=4
+ (local.get $i64toi32_i32$0)
+ (local.get $i64toi32_i32$1)
+ )
+ )
+ (nop)
+ )
+ (nop)
+ )
)
(module
(type $0 (func (param i32 i32)))
diff --git a/test/passes/flatten_i64-to-i32-lowering.wast b/test/passes/flatten_i64-to-i32-lowering.wast
index 2f3bb37ca..9b75e683f 100644
--- a/test/passes/flatten_i64-to-i32-lowering.wast
+++ b/test/passes/flatten_i64-to-i32-lowering.wast
@@ -1,4 +1,5 @@
(module
+ (memory 1 1)
(import "env" "func" (func $import (result i64)))
(func $defined (result i64)
(i64.add (i64.const 1) (i64.const 2))
@@ -24,6 +25,18 @@
(unreachable)
)
)
+ (func $mem
+ (drop (i64.load align=8 (i32.const 0)))
+ (drop (i64.load align=4 (i32.const 0)))
+ (drop (i64.load align=2 (i32.const 0)))
+ (drop (i64.load align=1 (i32.const 0)))
+ (drop (i64.load (i32.const 0)))
+ (i64.store align=8 (i32.const 0) (i64.const 1))
+ (i64.store align=4 (i32.const 0) (i64.const 2))
+ (i64.store align=2 (i32.const 0) (i64.const 3))
+ (i64.store align=1 (i32.const 0) (i64.const 4))
+ (i64.store (i32.const 0) (i64.const 5))
+ )
)
(module
(global $f (mut i64) (i64.const 0x12345678ABCDEFAF))
diff --git a/test/wasm2js/endianness.2asm.js b/test/wasm2js/endianness.2asm.js
index 3bd0c42a8..2ce7c3f63 100644
--- a/test/wasm2js/endianness.2asm.js
+++ b/test/wasm2js/endianness.2asm.js
@@ -196,12 +196,12 @@ function asmFunc(global, env, buffer) {
function $13(value, value$hi) {
value = value | 0;
value$hi = value$hi | 0;
- var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$1 = 0;
i64toi32_i32$0 = value$hi;
i64_store_little(0, value, i64toi32_i32$0);
i64toi32_i32$2 = 0;
i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2];
- i64toi32_i32$1 = (wasm2js_i32$0 = i64toi32_i32$2, HEAPU8[wasm2js_i32$0 + 4 | 0] | HEAPU8[wasm2js_i32$0 + 5 | 0] << 8 | HEAPU8[wasm2js_i32$0 + 6 | 0] << 16 | HEAPU8[wasm2js_i32$0 + 7 | 0] << 24);
+ i64toi32_i32$1 = HEAP32[i64toi32_i32$2 + 4 >> 2];
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
return i64toi32_i32$0 | 0;
}
@@ -260,11 +260,11 @@ function asmFunc(global, env, buffer) {
function $20(value, value$hi) {
value = value | 0;
value$hi = value$hi | 0;
- var i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0;
+ var i64toi32_i32$1 = 0, i64toi32_i32$0 = 0;
i64toi32_i32$0 = value$hi;
i64toi32_i32$1 = 0;
HEAP32[i64toi32_i32$1 >> 2] = value;
- (wasm2js_i32$0 = i64toi32_i32$1, wasm2js_i32$1 = i64toi32_i32$0), ((HEAP8[wasm2js_i32$0 + 4 | 0] = wasm2js_i32$1 & 255, HEAP8[wasm2js_i32$0 + 5 | 0] = wasm2js_i32$1 >>> 8 & 255), HEAP8[wasm2js_i32$0 + 6 | 0] = wasm2js_i32$1 >>> 16 & 255), HEAP8[wasm2js_i32$0 + 7 | 0] = wasm2js_i32$1 >>> 24 & 255;
+ HEAP32[i64toi32_i32$1 + 4 >> 2] = i64toi32_i32$0;
i64toi32_i32$0 = i64_load_little(0);
i64toi32_i32$1 = i64toi32_i32$HIGH_BITS;
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
diff --git a/test/wasm2js/left-to-right.2asm.js b/test/wasm2js/left-to-right.2asm.js
index 681490ca7..b7c187e1c 100644
--- a/test/wasm2js/left-to-right.2asm.js
+++ b/test/wasm2js/left-to-right.2asm.js
@@ -942,7 +942,7 @@ function asmFunc(global, env, buffer) {
}
function $87() {
- var i64toi32_i32$0 = 0, $0 = 0, i64toi32_i32$1 = 0, $1 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0;
+ var i64toi32_i32$0 = 0, $0 = 0, i64toi32_i32$1 = 0, $1 = 0;
reset();
$0 = i32_left();
i64toi32_i32$0 = i64_right();
@@ -950,7 +950,7 @@ function asmFunc(global, env, buffer) {
$1 = i64toi32_i32$0;
i64toi32_i32$0 = $0;
HEAP32[i64toi32_i32$0 >> 2] = $1;
- (wasm2js_i32$0 = i64toi32_i32$0, wasm2js_i32$1 = i64toi32_i32$1), ((HEAP8[wasm2js_i32$0 + 4 | 0] = wasm2js_i32$1 & 255, HEAP8[wasm2js_i32$0 + 5 | 0] = wasm2js_i32$1 >>> 8 & 255), HEAP8[wasm2js_i32$0 + 6 | 0] = wasm2js_i32$1 >>> 16 & 255), HEAP8[wasm2js_i32$0 + 7 | 0] = wasm2js_i32$1 >>> 24 & 255;
+ HEAP32[i64toi32_i32$0 + 4 >> 2] = i64toi32_i32$1;
return get() | 0;
}
diff --git a/test/wasm2js/traps.2asm.js b/test/wasm2js/traps.2asm.js
index 36fdb06ca..ab0b68564 100644
--- a/test/wasm2js/traps.2asm.js
+++ b/test/wasm2js/traps.2asm.js
@@ -2077,10 +2077,10 @@ function asmFunc(global, env, buffer) {
function $1(i) {
i = i | 0;
- var i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0;
+ var i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0;
i64toi32_i32$2 = i;
i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2];
- i64toi32_i32$1 = (wasm2js_i32$0 = i64toi32_i32$2, HEAPU8[wasm2js_i32$0 + 4 | 0] | HEAPU8[wasm2js_i32$0 + 5 | 0] << 8 | HEAPU8[wasm2js_i32$0 + 6 | 0] << 16 | HEAPU8[wasm2js_i32$0 + 7 | 0] << 24);
+ i64toi32_i32$1 = HEAP32[i64toi32_i32$2 + 4 >> 2];
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
return i64toi32_i32$0 | 0;
}