From becfa3ee4214bb4e6fbe1dbdbf6c3756c548d82b Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 25 May 2018 10:54:05 -0500 Subject: 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 --- test/wasm2asm/i32.2asm.js | 58 +++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 27 deletions(-) (limited to 'test/wasm2asm/i32.2asm.js') diff --git a/test/wasm2asm/i32.2asm.js b/test/wasm2asm/i32.2asm.js index 7c319ba5e..00ce2866e 100644 --- a/test/wasm2asm/i32.2asm.js +++ b/test/wasm2asm/i32.2asm.js @@ -188,40 +188,44 @@ function asmFunc(global, env, buffer) { return x >>> 0 >= y >>> 0 | 0; } - function __wasm_ctz_i32(x) { - x = x | 0; - var $9 = 0; - if ((x | 0) == (0 | 0)) $9 = 32; else $9 = 31 - Math_clz32(x ^ (x - 1 | 0) | 0) | 0; - return $9 | 0; - } - - function __wasm_popcnt_i32(x) { - x = x | 0; - var count = 0, $5 = 0; - count = 0; - b : { - l : do { - $5 = count; - if ((x | 0) == (0 | 0)) break b; - x = x & (x - 1 | 0) | 0; - count = count + 1 | 0; - continue l; - break l; + function __wasm_ctz_i32(var$0) { + var$0 = var$0 | 0; + if (var$0) return 31 - Math_clz32((var$0 + 4294967295 | 0) ^ var$0 | 0) | 0 | 0; + return 32 | 0; + } + + function __wasm_popcnt_i32(var$0) { + var$0 = var$0 | 0; + var var$1 = 0, $5 = 0; + label$1 : { + label$2 : do { + $5 = var$1; + if ((var$0 | 0) == (0 | 0)) break label$1; + var$0 = var$0 & (var$0 - 1 | 0) | 0; + var$1 = var$1 + 1 | 0; + continue label$2; + break label$2; } while (1); }; return $5 | 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_rotl_i32(var$0, var$1) { + var$0 = var$0 | 0; + var$1 = var$1 | 0; + var var$2 = 0; + var$2 = var$1 & 31 | 0; + var$1 = (0 - var$1 | 0) & 31 | 0; + return ((4294967295 >>> var$2 | 0) & var$0 | 0) << var$2 | 0 | (((4294967295 << var$1 | 0) & var$0 | 0) >>> var$1 | 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_rotr_i32(var$0, var$1) { + var$0 = var$0 | 0; + var$1 = var$1 | 0; + var var$2 = 0; + var$2 = var$1 & 31 | 0; + var$1 = (0 - var$1 | 0) & 31 | 0; + return ((4294967295 << var$2 | 0) & var$0 | 0) >>> var$2 | 0 | (((4294967295 >>> var$1 | 0) & var$0 | 0) << var$1 | 0) | 0 | 0; } return { -- cgit v1.2.3