From 95990c43cc8a1af46af630841e6a430a71f6ea8a Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 15 May 2018 10:53:49 -0500 Subject: wasm2asm: Implement f32/f64.copysign (#1551) This commit implements the `copysign` instruction for the wasm2asm binary. The implementation here is a new pass which wholesale replaces `copysign` instructions with the equivalent bit ops and reinterpretation instructions. It's intended that this matches Emscripten's implementation of lowering here. --- test/wasm2asm/float-ops.2asm.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'test/wasm2asm/float-ops.2asm.js') diff --git a/test/wasm2asm/float-ops.2asm.js b/test/wasm2asm/float-ops.2asm.js index fceaa7985..bad4bae9d 100644 --- a/test/wasm2asm/float-ops.2asm.js +++ b/test/wasm2asm/float-ops.2asm.js @@ -206,6 +206,35 @@ function asmFunc(global, env, buffer) { return +Math_sqrt($0); } + function copysign64($0, $1) { + $0 = +$0; + $1 = +$1; + var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, i64toi32_i32$1 = 0; + HEAPF64[0 >> 3] = $0; + i64toi32_i32$0 = HEAP32[(0 + 4 | 0) >> 2] | 0; + i64toi32_i32$2 = HEAP32[0 >> 2] | 0; + i64toi32_i32$1 = 2147483647; + i64toi32_i32$3 = 4294967295; + i64toi32_i32$1 = i64toi32_i32$0 & i64toi32_i32$1 | 0; + i64toi32_i32$3 = i64toi32_i32$2 & i64toi32_i32$3 | 0; + HEAPF64[0 >> 3] = $1; + i64toi32_i32$2 = HEAP32[(0 + 4 | 0) >> 2] | 0; + i64toi32_i32$3 = HEAP32[0 >> 2] | 0; + i64toi32_i32$0 = 2147483648; + i64toi32_i32$0 = i64toi32_i32$2 & i64toi32_i32$0 | 0; + i64toi32_i32$2 = i64toi32_i32$3 & 0 | 0; + i64toi32_i32$0 = i64toi32_i32$1 | i64toi32_i32$0 | 0; + HEAP32[0 >> 2] = i64toi32_i32$3 | i64toi32_i32$2 | 0; + HEAP32[(0 + 4 | 0) >> 2] = i64toi32_i32$0; + return +(+HEAPF64[0 >> 3]); + } + + function copysign32($0, $1) { + $0 = Math_fround($0); + $1 = Math_fround($1); + return Math_fround((HEAP32[0] = (HEAPF32[0] = $0, HEAP32[0]) & 2147483647 | 0 | ((HEAPF32[0] = $1, HEAP32[0]) & 2147483648 | 0) | 0, HEAPF32[0])); + } + function __wasm_ctz_i32(x) { x = x | 0; var $1 = 0; -- cgit v1.2.3