diff options
author | Alex Crichton <alex@alexcrichton.com> | 2018-05-25 10:54:05 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2018-05-25 08:54:05 -0700 |
commit | becfa3ee4214bb4e6fbe1dbdbf6c3756c548d82b (patch) | |
tree | 1108b2519d6ac1f97ae12b0d32792aa15a4e9237 /test/wasm2asm/i64-ctz.2asm.js | |
parent | 6e56ef195d01936c0c7f7a6d1c0f5d1c7e2c2e52 (diff) | |
download | binaryen-becfa3ee4214bb4e6fbe1dbdbf6c3756c548d82b.tar.gz binaryen-becfa3ee4214bb4e6fbe1dbdbf6c3756c548d82b.tar.bz2 binaryen-becfa3ee4214bb4e6fbe1dbdbf6c3756c548d82b.zip |
wasm2asm: Finish i64 lowering operations (#1563)
* wasm2asm: Finish i64 lowering operations
This commit finishes out lowering i64 operations to JS with implementations of
division and remainder for JS. The primary change here is to have these compiled
from Rust to wasm and then have them "linked in" via intrinsics. The
`RemoveNonJSOps` pass has been updated to include some of what
`I64ToI32Lowering` was previously doing, basically replacing some instructions
with calls to intrinsics. The intrinsics are now all tracked in one location.
Hopefully the intrinsics don't need to be regenerated too much, but for
posterity the source currently [lives in a gist][gist], although I suspect that
gist won't continue to compile and work as-is for all of time.
[gist]: https://gist.github.com/alexcrichton/e7ea67bcdd17ce4b6254e66f77165690
Diffstat (limited to 'test/wasm2asm/i64-ctz.2asm.js')
-rw-r--r-- | test/wasm2asm/i64-ctz.2asm.js | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/test/wasm2asm/i64-ctz.2asm.js b/test/wasm2asm/i64-ctz.2asm.js new file mode 100644 index 000000000..a85ad8e82 --- /dev/null +++ b/test/wasm2asm/i64-ctz.2asm.js @@ -0,0 +1,158 @@ +function asmFunc(global, env, buffer) { + "use asm"; + var HEAP8 = new global.Int8Array(buffer); + var HEAP16 = new global.Int16Array(buffer); + var HEAP32 = new global.Int32Array(buffer); + var HEAPU8 = new global.Uint8Array(buffer); + var HEAPU16 = new global.Uint16Array(buffer); + var HEAPU32 = new global.Uint32Array(buffer); + var HEAPF32 = new global.Float32Array(buffer); + var HEAPF64 = new global.Float64Array(buffer); + var Math_imul = global.Math.imul; + var Math_fround = global.Math.fround; + var Math_abs = global.Math.abs; + var Math_clz32 = global.Math.clz32; + var Math_min = global.Math.min; + var Math_max = global.Math.max; + var Math_floor = global.Math.floor; + var Math_ceil = global.Math.ceil; + var Math_sqrt = global.Math.sqrt; + var i64toi32_i32$HIGH_BITS = 0; + function popcnt64($0, $0$hi) { + $0 = $0 | 0; + $0$hi = $0$hi | 0; + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; + i64toi32_i32$0 = $0$hi; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$0 = __wasm_popcnt_i64($0 | 0, i64toi32_i32$0 | 0) | 0; + i64toi32_i32$1 = i64toi32_i32$HIGH_BITS; + i64toi32_i32$1 = i64toi32_i32$1; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$HIGH_BITS = i64toi32_i32$1; + return i64toi32_i32$0 | 0; + } + + function ctz64($0, $0$hi) { + $0 = $0 | 0; + $0$hi = $0$hi | 0; + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; + i64toi32_i32$0 = $0$hi; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$0 = __wasm_ctz_i64($0 | 0, i64toi32_i32$0 | 0) | 0; + i64toi32_i32$1 = i64toi32_i32$HIGH_BITS; + i64toi32_i32$1 = i64toi32_i32$1; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$HIGH_BITS = i64toi32_i32$1; + return i64toi32_i32$0 | 0; + } + + function __wasm_ctz_i64(var$0, var$0$hi) { + var$0 = var$0 | 0; + var$0$hi = var$0$hi | 0; + var i64toi32_i32$0 = 0, i64toi32_i32$5 = 0, i64toi32_i32$3 = 0, i64toi32_i32$4 = 0, i64toi32_i32$2 = 0, i64toi32_i32$1 = 0, $10 = 0, $5$hi = 0, $8$hi = 0; + i64toi32_i32$0 = var$0$hi; + i64toi32_i32$0 = i64toi32_i32$0; + if (((var$0 | i64toi32_i32$0 | 0 | 0) == (0 | 0) | 0) == (0 | 0)) { + i64toi32_i32$0 = var$0$hi; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$2 = var$0; + i64toi32_i32$1 = 4294967295; + i64toi32_i32$3 = 4294967295; + i64toi32_i32$4 = i64toi32_i32$2 + i64toi32_i32$3 | 0; + i64toi32_i32$5 = i64toi32_i32$0 + i64toi32_i32$1 | 0; + if (i64toi32_i32$4 >>> 0 < i64toi32_i32$3 >>> 0) i64toi32_i32$5 = i64toi32_i32$5 + 1 | 0; + $5$hi = i64toi32_i32$5; + i64toi32_i32$5 = var$0$hi; + i64toi32_i32$5 = $5$hi; + i64toi32_i32$0 = i64toi32_i32$4; + i64toi32_i32$2 = var$0$hi; + i64toi32_i32$3 = var$0; + i64toi32_i32$2 = i64toi32_i32$5 ^ i64toi32_i32$2 | 0; + i64toi32_i32$2 = i64toi32_i32$2; + i64toi32_i32$0 = i64toi32_i32$0 ^ i64toi32_i32$3 | 0; + i64toi32_i32$3 = Math_clz32(i64toi32_i32$2); + i64toi32_i32$5 = 0; + if ((i64toi32_i32$3 | 0) == (32 | 0)) $10 = Math_clz32(i64toi32_i32$0) + 32 | 0; else $10 = i64toi32_i32$3; + $8$hi = i64toi32_i32$5; + i64toi32_i32$5 = 0; + i64toi32_i32$0 = 63; + i64toi32_i32$2 = $8$hi; + i64toi32_i32$3 = $10; + i64toi32_i32$1 = i64toi32_i32$0 - i64toi32_i32$3 | 0; + i64toi32_i32$4 = (i64toi32_i32$0 >>> 0 < i64toi32_i32$3 >>> 0) + i64toi32_i32$2 | 0; + i64toi32_i32$4 = i64toi32_i32$5 - i64toi32_i32$4 | 0; + i64toi32_i32$4 = i64toi32_i32$4; + i64toi32_i32$0 = i64toi32_i32$1; + i64toi32_i32$HIGH_BITS = i64toi32_i32$4; + return i64toi32_i32$0 | 0; + } + i64toi32_i32$0 = 0; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$4 = 64; + i64toi32_i32$HIGH_BITS = i64toi32_i32$0; + return i64toi32_i32$4 | 0; + } + + function __wasm_popcnt_i64(var$0, var$0$hi) { + var$0 = var$0 | 0; + var$0$hi = var$0$hi | 0; + var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$4 = 0, i64toi32_i32$5 = 0, i64toi32_i32$3 = 0, i64toi32_i32$1 = 0, var$1$hi = 0, var$1 = 0, $5 = 0, $5$hi = 0, $4 = 0, $9$hi = 0; + label$1 : { + label$2 : do { + i64toi32_i32$0 = var$1$hi; + i64toi32_i32$0 = var$0$hi; + i64toi32_i32$0 = i64toi32_i32$0; + $4 = (var$0 | i64toi32_i32$0 | 0 | 0) == (0 | 0); + i64toi32_i32$0 = var$1$hi; + $5 = var$1; + $5$hi = i64toi32_i32$0; + if ($4) break label$1; + i64toi32_i32$0 = $5$hi; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$0 = var$0$hi; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$0 = i64toi32_i32$0; + i64toi32_i32$2 = var$0; + i64toi32_i32$1 = 0; + i64toi32_i32$3 = 1; + i64toi32_i32$4 = i64toi32_i32$2 - i64toi32_i32$3 | 0; + i64toi32_i32$5 = (i64toi32_i32$2 >>> 0 < i64toi32_i32$3 >>> 0) + i64toi32_i32$1 | 0; + i64toi32_i32$5 = i64toi32_i32$0 - i64toi32_i32$5 | 0; + $9$hi = i64toi32_i32$5; + i64toi32_i32$5 = i64toi32_i32$0; + i64toi32_i32$0 = i64toi32_i32$2; + i64toi32_i32$2 = $9$hi; + i64toi32_i32$3 = i64toi32_i32$4; + i64toi32_i32$2 = i64toi32_i32$5 & i64toi32_i32$2 | 0; + i64toi32_i32$2 = i64toi32_i32$2; + var$0 = i64toi32_i32$0 & i64toi32_i32$4 | 0; + var$0$hi = i64toi32_i32$2; + i64toi32_i32$2 = var$1$hi; + i64toi32_i32$2 = i64toi32_i32$2; + i64toi32_i32$5 = var$1; + i64toi32_i32$0 = 0; + i64toi32_i32$3 = 1; + i64toi32_i32$1 = i64toi32_i32$5 + i64toi32_i32$3 | 0; + i64toi32_i32$4 = i64toi32_i32$2 + i64toi32_i32$0 | 0; + if (i64toi32_i32$1 >>> 0 < i64toi32_i32$3 >>> 0) i64toi32_i32$4 = i64toi32_i32$4 + 1 | 0; + i64toi32_i32$4 = i64toi32_i32$4; + var$1 = i64toi32_i32$1; + var$1$hi = i64toi32_i32$4; + continue label$2; + break label$2; + } while (1); + }; + i64toi32_i32$4 = $5$hi; + i64toi32_i32$4 = i64toi32_i32$4; + i64toi32_i32$5 = $5; + i64toi32_i32$HIGH_BITS = i64toi32_i32$4; + return i64toi32_i32$5 | 0; + } + + return { + a: popcnt64, + b: ctz64 + }; +} + |