diff options
author | taylor.fish <taylor-github@taylor.fish> | 2022-06-24 18:04:09 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-24 11:04:09 -0700 |
commit | 93b8849d9f98ef7ed812938ff0b3219819c2be77 (patch) | |
tree | 41ce9e70faa8150a74edd77af7956aca6dd6ba4c /test/wasm2js | |
parent | a0f7540305d94c0182c3dd16161a84ab808ef340 (diff) | |
download | binaryen-93b8849d9f98ef7ed812938ff0b3219819c2be77.tar.gz binaryen-93b8849d9f98ef7ed812938ff0b3219819c2be77.tar.bz2 binaryen-93b8849d9f98ef7ed812938ff0b3219819c2be77.zip |
[Wasm2JS] Fix lowering of i64.extendN_s instructions (#4321)
Diffstat (limited to 'test/wasm2js')
-rw-r--r-- | test/wasm2js/sign_ext.2asm.js | 179 | ||||
-rw-r--r-- | test/wasm2js/sign_ext.2asm.js.opt | 34 | ||||
-rw-r--r-- | test/wasm2js/sign_ext.wast | 9 |
3 files changed, 218 insertions, 4 deletions
diff --git a/test/wasm2js/sign_ext.2asm.js b/test/wasm2js/sign_ext.2asm.js index c6c1ce7ce..175ff0aba 100644 --- a/test/wasm2js/sign_ext.2asm.js +++ b/test/wasm2js/sign_ext.2asm.js @@ -1,3 +1,4 @@ +import { setTempRet0 } from 'env'; function asmFunc(env) { var Math_imul = Math.imul; @@ -13,6 +14,8 @@ function asmFunc(env) { var abort = env.abort; var nan = NaN; var infinity = Infinity; + var setTempRet0 = env.setTempRet0; + var i64toi32_i32$HIGH_BITS = 0; function $0(x) { x = x | 0; return x << 24 >> 24 | 0; @@ -23,13 +26,185 @@ function asmFunc(env) { return x << 16 >> 16 | 0; } + function $2(x, x$hi) { + x = x | 0; + x$hi = x$hi | 0; + var i64toi32_i32$2 = 0, i64toi32_i32$1 = 0; + i64toi32_i32$2 = x << 24 >> 24; + i64toi32_i32$1 = i64toi32_i32$2 >> 31 | 0; + i64toi32_i32$HIGH_BITS = i64toi32_i32$1; + return i64toi32_i32$2 | 0; + } + + function $3(x, x$hi) { + x = x | 0; + x$hi = x$hi | 0; + var i64toi32_i32$2 = 0, i64toi32_i32$1 = 0; + i64toi32_i32$2 = x << 16 >> 16; + i64toi32_i32$1 = i64toi32_i32$2 >> 31 | 0; + i64toi32_i32$HIGH_BITS = i64toi32_i32$1; + return i64toi32_i32$2 | 0; + } + + function $4(x, x$hi) { + x = x | 0; + x$hi = x$hi | 0; + var i64toi32_i32$2 = 0, i64toi32_i32$1 = 0; + i64toi32_i32$2 = x; + i64toi32_i32$1 = i64toi32_i32$2 >> 31 | 0; + i64toi32_i32$HIGH_BITS = i64toi32_i32$1; + return i64toi32_i32$2 | 0; + } + + function legalstub$2($0_1, $1_1) { + $0_1 = $0_1 | 0; + $1_1 = $1_1 | 0; + var i64toi32_i32$2 = 0, i64toi32_i32$4 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$3 = 0, $12 = 0, $13 = 0, $4_1 = 0, $4$hi = 0, $7$hi = 0, $2_1 = 0, $2$hi = 0; + i64toi32_i32$0 = 0; + $4_1 = $0_1; + $4$hi = i64toi32_i32$0; + i64toi32_i32$0 = 0; + i64toi32_i32$2 = $1_1; + i64toi32_i32$1 = 0; + i64toi32_i32$3 = 32; + i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; + if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { + i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; + $12 = 0; + } else { + i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0; + $12 = i64toi32_i32$2 << i64toi32_i32$4 | 0; + } + $7$hi = i64toi32_i32$1; + i64toi32_i32$1 = $4$hi; + i64toi32_i32$0 = $4_1; + i64toi32_i32$2 = $7$hi; + i64toi32_i32$3 = $12; + i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0; + i64toi32_i32$2 = $2(i64toi32_i32$0 | i64toi32_i32$3 | 0 | 0, i64toi32_i32$2 | 0) | 0; + i64toi32_i32$0 = i64toi32_i32$HIGH_BITS; + $2_1 = i64toi32_i32$2; + $2$hi = i64toi32_i32$0; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$2 = 0; + i64toi32_i32$3 = 32; + i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; + if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { + i64toi32_i32$2 = 0; + $13 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; + } else { + i64toi32_i32$2 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; + $13 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$0 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$1 >>> i64toi32_i32$4 | 0) | 0; + } + setTempRet0($13 | 0); + i64toi32_i32$2 = $2$hi; + return $2_1 | 0; + } + + function legalstub$3($0_1, $1_1) { + $0_1 = $0_1 | 0; + $1_1 = $1_1 | 0; + var i64toi32_i32$2 = 0, i64toi32_i32$4 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$3 = 0, $12 = 0, $13 = 0, $4_1 = 0, $4$hi = 0, $7$hi = 0, $2_1 = 0, $2$hi = 0; + i64toi32_i32$0 = 0; + $4_1 = $0_1; + $4$hi = i64toi32_i32$0; + i64toi32_i32$0 = 0; + i64toi32_i32$2 = $1_1; + i64toi32_i32$1 = 0; + i64toi32_i32$3 = 32; + i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; + if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { + i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; + $12 = 0; + } else { + i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0; + $12 = i64toi32_i32$2 << i64toi32_i32$4 | 0; + } + $7$hi = i64toi32_i32$1; + i64toi32_i32$1 = $4$hi; + i64toi32_i32$0 = $4_1; + i64toi32_i32$2 = $7$hi; + i64toi32_i32$3 = $12; + i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0; + i64toi32_i32$2 = $3(i64toi32_i32$0 | i64toi32_i32$3 | 0 | 0, i64toi32_i32$2 | 0) | 0; + i64toi32_i32$0 = i64toi32_i32$HIGH_BITS; + $2_1 = i64toi32_i32$2; + $2$hi = i64toi32_i32$0; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$2 = 0; + i64toi32_i32$3 = 32; + i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; + if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { + i64toi32_i32$2 = 0; + $13 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; + } else { + i64toi32_i32$2 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; + $13 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$0 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$1 >>> i64toi32_i32$4 | 0) | 0; + } + setTempRet0($13 | 0); + i64toi32_i32$2 = $2$hi; + return $2_1 | 0; + } + + function legalstub$4($0_1, $1_1) { + $0_1 = $0_1 | 0; + $1_1 = $1_1 | 0; + var i64toi32_i32$2 = 0, i64toi32_i32$4 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$3 = 0, $12 = 0, $13 = 0, $4_1 = 0, $4$hi = 0, $7$hi = 0, $2_1 = 0, $2$hi = 0; + i64toi32_i32$0 = 0; + $4_1 = $0_1; + $4$hi = i64toi32_i32$0; + i64toi32_i32$0 = 0; + i64toi32_i32$2 = $1_1; + i64toi32_i32$1 = 0; + i64toi32_i32$3 = 32; + i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; + if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { + i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; + $12 = 0; + } else { + i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0; + $12 = i64toi32_i32$2 << i64toi32_i32$4 | 0; + } + $7$hi = i64toi32_i32$1; + i64toi32_i32$1 = $4$hi; + i64toi32_i32$0 = $4_1; + i64toi32_i32$2 = $7$hi; + i64toi32_i32$3 = $12; + i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0; + i64toi32_i32$2 = $4(i64toi32_i32$0 | i64toi32_i32$3 | 0 | 0, i64toi32_i32$2 | 0) | 0; + i64toi32_i32$0 = i64toi32_i32$HIGH_BITS; + $2_1 = i64toi32_i32$2; + $2$hi = i64toi32_i32$0; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$2 = 0; + i64toi32_i32$3 = 32; + i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; + if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { + i64toi32_i32$2 = 0; + $13 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; + } else { + i64toi32_i32$2 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; + $13 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$0 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$1 >>> i64toi32_i32$4 | 0) | 0; + } + setTempRet0($13 | 0); + i64toi32_i32$2 = $2$hi; + return $2_1 | 0; + } + return { "test8": $0, - "test16": $1 + "test16": $1, + "test8_i64": legalstub$2, + "test16_i64": legalstub$3, + "test32_i64": legalstub$4 }; } -var retasmFunc = asmFunc( { abort: function() { throw new Error('abort'); } +var retasmFunc = asmFunc( { abort: function() { throw new Error('abort'); }, + setTempRet0 }); export var test8 = retasmFunc.test8; export var test16 = retasmFunc.test16; +export var test8_i64 = retasmFunc.test8_i64; +export var test16_i64 = retasmFunc.test16_i64; +export var test32_i64 = retasmFunc.test32_i64; diff --git a/test/wasm2js/sign_ext.2asm.js.opt b/test/wasm2js/sign_ext.2asm.js.opt index 31dbdc970..d4d572c1b 100644 --- a/test/wasm2js/sign_ext.2asm.js.opt +++ b/test/wasm2js/sign_ext.2asm.js.opt @@ -1,3 +1,4 @@ +import { setTempRet0 } from 'env'; function asmFunc(env) { var Math_imul = Math.imul; @@ -13,6 +14,8 @@ function asmFunc(env) { var abort = env.abort; var nan = NaN; var infinity = Infinity; + var setTempRet0 = env.setTempRet0; + var i64toi32_i32$HIGH_BITS = 0; function $0($0_1) { $0_1 = $0_1 | 0; return $0_1 << 24 >> 24; @@ -23,13 +26,40 @@ function asmFunc(env) { return $0_1 << 16 >> 16; } + function legalstub$2($0_1, $1_1) { + $0_1 = $0_1 << 24 >> 24; + i64toi32_i32$HIGH_BITS = $0_1 >> 31; + setTempRet0(i64toi32_i32$HIGH_BITS | 0); + return $0_1; + } + + function legalstub$3($0_1, $1_1) { + $0_1 = $0_1 << 16 >> 16; + i64toi32_i32$HIGH_BITS = $0_1 >> 31; + setTempRet0(i64toi32_i32$HIGH_BITS | 0); + return $0_1; + } + + function legalstub$4($0_1, $1_1) { + i64toi32_i32$HIGH_BITS = $0_1 >> 31; + setTempRet0(i64toi32_i32$HIGH_BITS | 0); + return $0_1; + } + return { "test8": $0, - "test16": $1 + "test16": $1, + "test8_i64": legalstub$2, + "test16_i64": legalstub$3, + "test32_i64": legalstub$4 }; } -var retasmFunc = asmFunc( { abort: function() { throw new Error('abort'); } +var retasmFunc = asmFunc( { abort: function() { throw new Error('abort'); }, + setTempRet0 }); export var test8 = retasmFunc.test8; export var test16 = retasmFunc.test16; +export var test8_i64 = retasmFunc.test8_i64; +export var test16_i64 = retasmFunc.test16_i64; +export var test32_i64 = retasmFunc.test32_i64; diff --git a/test/wasm2js/sign_ext.wast b/test/wasm2js/sign_ext.wast index 7dcb03911..825502a3f 100644 --- a/test/wasm2js/sign_ext.wast +++ b/test/wasm2js/sign_ext.wast @@ -5,4 +5,13 @@ (func "test16" (param $x i32) (result i32) (i32.extend16_s (local.get $x)) ) + (func "test8_i64" (param $x i64) (result i64) + (i64.extend8_s (local.get $x)) + ) + (func "test16_i64" (param $x i64) (result i64) + (i64.extend16_s (local.get $x)) + ) + (func "test32_i64" (param $x i64) (result i64) + (i64.extend32_s (local.get $x)) + ) ) |