summaryrefslogtreecommitdiff
path: root/test/wasm2js
diff options
context:
space:
mode:
authortaylor.fish <taylor-github@taylor.fish>2022-06-24 18:04:09 +0000
committerGitHub <noreply@github.com>2022-06-24 11:04:09 -0700
commit93b8849d9f98ef7ed812938ff0b3219819c2be77 (patch)
tree41ce9e70faa8150a74edd77af7956aca6dd6ba4c /test/wasm2js
parenta0f7540305d94c0182c3dd16161a84ab808ef340 (diff)
downloadbinaryen-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.js179
-rw-r--r--test/wasm2js/sign_ext.2asm.js.opt34
-rw-r--r--test/wasm2js/sign_ext.wast9
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))
+ )
)