diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/passes/remove-copysign.txt | 40 | ||||
-rw-r--r-- | test/passes/remove-copysign.wast | 7 | ||||
-rw-r--r-- | test/wasm2asm/float-ops.2asm.js | 29 | ||||
-rw-r--r-- | test/wasm2asm/float-ops.wast | 6 |
4 files changed, 82 insertions, 0 deletions
diff --git a/test/passes/remove-copysign.txt b/test/passes/remove-copysign.txt new file mode 100644 index 000000000..b411f083b --- /dev/null +++ b/test/passes/remove-copysign.txt @@ -0,0 +1,40 @@ +(module + (type $0 (func (param f64 f64) (result f64))) + (type $1 (func (param f32 f32) (result f32))) + (func $copysign64 (; 0 ;) (type $0) (param $0 f64) (param $1 f64) (result f64) + (f64.reinterpret/i64 + (i64.or + (i64.and + (i64.reinterpret/f64 + (get_local $0) + ) + (i64.const 9223372036854775807) + ) + (i64.and + (i64.reinterpret/f64 + (get_local $1) + ) + (i64.const -9223372036854775808) + ) + ) + ) + ) + (func $copysign32 (; 1 ;) (type $1) (param $0 f32) (param $1 f32) (result f32) + (f32.reinterpret/i32 + (i32.or + (i32.and + (i32.reinterpret/f32 + (get_local $0) + ) + (i32.const 2147483647) + ) + (i32.and + (i32.reinterpret/f32 + (get_local $1) + ) + (i32.const -2147483648) + ) + ) + ) + ) +) diff --git a/test/passes/remove-copysign.wast b/test/passes/remove-copysign.wast new file mode 100644 index 000000000..d64a30965 --- /dev/null +++ b/test/passes/remove-copysign.wast @@ -0,0 +1,7 @@ +(module + (func $copysign64 (param $0 f64) (param $1 f64) (result f64) + (f64.copysign (get_local $0) (get_local $1))) + (func $copysign32 (param $0 f32) (param $1 f32) (result f32) + (f32.copysign (get_local $0) (get_local $1))) +) + 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; diff --git a/test/wasm2asm/float-ops.wast b/test/wasm2asm/float-ops.wast index 4ca32bb49..de26c9931 100644 --- a/test/wasm2asm/float-ops.wast +++ b/test/wasm2asm/float-ops.wast @@ -101,4 +101,10 @@ (func (export "f64.sqrt") (param $0 f64) (result f64) (f64.sqrt (get_local $0))) + + ;; copysign + (func $copysign64 (param $0 f64) (param $1 f64) (result f64) + (f64.copysign (get_local $0) (get_local $1))) + (func $copysign32 (param $0 f32) (param $1 f32) (result f32) + (f32.copysign (get_local $0) (get_local $1))) ) |