summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/passes/remove-copysign.txt40
-rw-r--r--test/passes/remove-copysign.wast7
-rw-r--r--test/wasm2asm/float-ops.2asm.js29
-rw-r--r--test/wasm2asm/float-ops.wast6
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)))
)