summaryrefslogtreecommitdiff
path: root/test/wasm2asm/i64-rotate.2asm.js
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2018-05-14 13:44:30 -0500
committerAlon Zakai <alonzakai@gmail.com>2018-05-14 11:44:30 -0700
commite086ef9ad169443b85b4d4c9d915bbd378276552 (patch)
tree17cac9a1e5794b946a91f0bfc8d5c1b8f587b739 /test/wasm2asm/i64-rotate.2asm.js
parent7ae28f8edba5b23223e4db4dc281b8bf77ce88ea (diff)
downloadbinaryen-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.js145
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
+ };
+}
+