diff options
-rw-r--r-- | src/passes/I64ToI32Lowering.cpp | 4 | ||||
-rw-r--r-- | test/passes/flatten_i64-to-i32-lowering.txt | 275 | ||||
-rw-r--r-- | test/passes/flatten_i64-to-i32-lowering.wast | 13 | ||||
-rw-r--r-- | test/wasm2js/endianness.2asm.js | 8 | ||||
-rw-r--r-- | test/wasm2js/left-to-right.2asm.js | 4 | ||||
-rw-r--r-- | test/wasm2js/traps.2asm.js | 4 |
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; } |