diff options
author | Alex Crichton <alex@alexcrichton.com> | 2018-05-14 13:44:30 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2018-05-14 11:44:30 -0700 |
commit | e086ef9ad169443b85b4d4c9d915bbd378276552 (patch) | |
tree | 17cac9a1e5794b946a91f0bfc8d5c1b8f587b739 /test/wasm2asm/i64-rotate.2asm.js | |
parent | 7ae28f8edba5b23223e4db4dc281b8bf77ce88ea (diff) | |
download | binaryen-e086ef9ad169443b85b4d4c9d915bbd378276552.tar.gz binaryen-e086ef9ad169443b85b4d4c9d915bbd378276552.tar.bz2 binaryen-e086ef9ad169443b85b4d4c9d915bbd378276552.zip |
Implement 64-bit rotation lowering for wasm2asm (#1545)
Not much fancy here, but rather each operation is naively lowered inline to the
if/else chain to execute it.
Diffstat (limited to 'test/wasm2asm/i64-rotate.2asm.js')
-rw-r--r-- | test/wasm2asm/i64-rotate.2asm.js | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/test/wasm2asm/i64-rotate.2asm.js b/test/wasm2asm/i64-rotate.2asm.js new file mode 100644 index 000000000..c76c41e39 --- /dev/null +++ b/test/wasm2asm/i64-rotate.2asm.js @@ -0,0 +1,145 @@ +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 i64toi32_i32$HIGH_BITS = 0; + function dummy() { + + } + + function $1($0, $0$hi, $1, $1$hi, $2, $2$hi) { + $0 = $0 | 0; + $0$hi = $0$hi | 0; + $1 = $1 | 0; + $1$hi = $1$hi | 0; + $2 = $2 | 0; + $2$hi = $2$hi | 0; + var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0; + i64toi32_i32$0 = $0$hi; + i64toi32_i32$2 = $0; + i64toi32_i32$3 = $1; + i64toi32_i32$0 = __wasm_rotl_i64(i64toi32_i32$2 | 0, i64toi32_i32$0 | 0, i64toi32_i32$3 & 63 | 0 | 0) | 0; + i64toi32_i32$2 = $2$hi; + i64toi32_i32$3 = $2; + return (i64toi32_i32$0 | 0) == (i64toi32_i32$3 | 0) & (i64toi32_i32$HIGH_BITS | 0) == (i64toi32_i32$2 | 0) | 0 | 0; + } + + function $2($0, $0$hi, $1, $1$hi, $2, $2$hi) { + $0 = $0 | 0; + $0$hi = $0$hi | 0; + $1 = $1 | 0; + $1$hi = $1$hi | 0; + $2 = $2 | 0; + $2$hi = $2$hi | 0; + var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0; + i64toi32_i32$0 = $0$hi; + i64toi32_i32$2 = $0; + i64toi32_i32$3 = $1; + i64toi32_i32$0 = __wasm_rotr_i64(i64toi32_i32$2 | 0, i64toi32_i32$0 | 0, i64toi32_i32$3 & 63 | 0 | 0) | 0; + i64toi32_i32$2 = $2$hi; + i64toi32_i32$3 = $2; + return (i64toi32_i32$0 | 0) == (i64toi32_i32$3 | 0) & (i64toi32_i32$HIGH_BITS | 0) == (i64toi32_i32$2 | 0) | 0 | 0; + } + + function __wasm_ctz_i32(x) { + x = x | 0; + var $1 = 0; + if ((x | 0) == (0 | 0)) $1 = 32; else $1 = 31 - Math_clz32(x ^ (x - 1 | 0) | 0) | 0; + return $1 | 0; + } + + function __wasm_popcnt_i32(x) { + x = x | 0; + var count = 0, $2 = 0; + count = 0; + b : { + l : do { + $2 = count; + if ((x | 0) == (0 | 0)) break b; + x = x & (x - 1 | 0) | 0; + count = count + 1 | 0; + continue l; + break l; + } while (1); + }; + return $2 | 0; + } + + function __wasm_rotl_i32(x, k) { + x = x | 0; + k = k | 0; + return ((4294967295 >>> (k & 31 | 0) | 0) & x | 0) << (k & 31 | 0) | 0 | (((4294967295 << (32 - (k & 31 | 0) | 0) | 0) & x | 0) >>> (32 - (k & 31 | 0) | 0) | 0) | 0 | 0; + } + + function __wasm_rotr_i32(x, k) { + x = x | 0; + k = k | 0; + return ((4294967295 << (k & 31 | 0) | 0) & x | 0) >>> (k & 31 | 0) | 0 | (((4294967295 >>> (32 - (k & 31 | 0) | 0) | 0) & x | 0) << (32 - (k & 31 | 0) | 0) | 0) | 0 | 0; + } + + function __wasm_rotl_i64($0, $1, $2) { + $0 = $0 | 0; + $1 = $1 | 0; + $2 = $2 | 0; + var $3 = 0, $4 = 0, $5 = 0; + if (($2 | 0) == (32 | 0)) { + i64toi32_i32$HIGH_BITS = $0; + $4 = $1; + } else { + if ($2 >>> 0 >= 32 >>> 0) { + $2 = $2 - 32 | 0; + $3 = 32 - $2 | 0; + i64toi32_i32$HIGH_BITS = $0 << $2 | 0 | ($1 >>> $3 | 0) | 0; + $5 = $1 << $2 | 0 | ($0 >>> $3 | 0) | 0; + } else { + $3 = 32 - $2 | 0; + i64toi32_i32$HIGH_BITS = $1 << $2 | 0 | ($0 >>> $3 | 0) | 0; + $5 = $0 << $2 | 0 | ($1 >>> $3 | 0) | 0; + } + $4 = $5; + } + return $4 | 0; + } + + function __wasm_rotr_i64($0, $1, $2) { + $0 = $0 | 0; + $1 = $1 | 0; + $2 = $2 | 0; + var $3 = 0, $4 = 0, $5 = 0; + if (($2 | 0) == (32 | 0)) { + i64toi32_i32$HIGH_BITS = $0; + $4 = $1; + } else { + if ($2 >>> 0 >= 32 >>> 0) { + $2 = $2 - 32 | 0; + $3 = 32 - $2 | 0; + i64toi32_i32$HIGH_BITS = $0 >>> $2 | 0 | ($1 << $3 | 0) | 0; + $5 = $1 >>> $2 | 0 | ($0 << $3 | 0) | 0; + } else { + $3 = 32 - $2 | 0; + i64toi32_i32$HIGH_BITS = $1 >>> $2 | 0 | ($0 << $3 | 0) | 0; + $5 = $0 >>> $2 | 0 | ($1 << $3 | 0) | 0; + } + $4 = $5; + } + return $4 | 0; + } + + return { + rotl: $1, + rotr: $2 + }; +} + |