summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/builtin.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/builtin.js')
-rw-r--r--js/src/jit-test/tests/wasm/builtin.js132
1 files changed, 132 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/builtin.js b/js/src/jit-test/tests/wasm/builtin.js
new file mode 100644
index 0000000000..65d673d9a7
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/builtin.js
@@ -0,0 +1,132 @@
+let values = [-Infinity, Infinity, NaN, 0, -0, -0.1, 0.1, 0.5, -1.6, 1.6, 13.37];
+
+function unary(name) {
+ print(name);
+
+ let imports = {
+ math: {
+ func: Math[name],
+ }
+ };
+
+ let f32 = x => Math.fround(Math[name](Math.fround(x)));
+ let f64 = Math[name];
+
+ let i = wasmEvalText(`(module
+ (import "math" "func" (func $f32 (param f32) (result f32)))
+ (import "math" "func" (func $f64 (param f64) (result f64)))
+
+ (table $t 10 funcref)
+ (type $f_f (func (param f32) (result f32)))
+ (type $d_d (func (param f64) (result f64)))
+ (elem (i32.const 0) $f32 $f64)
+
+ (func (export "f32") (param f32) (result f32)
+ local.get 0
+ call $f32
+ )
+ (func (export "f32_t") (param f32) (result f32)
+ local.get 0
+ i32.const 0
+ call_indirect (type $f_f)
+ )
+ (func (export "f64") (param f64) (result f64)
+ local.get 0
+ call $f64
+ )
+ (func (export "f64_t") (param f64) (result f64)
+ local.get 0
+ i32.const 1
+ call_indirect (type $d_d)
+ )
+ )`, imports).exports;
+
+ for (let v of values) {
+ assertEq(i.f32(v), f32(v));
+ assertEq(i.f32_t(v), f32(v));
+ assertEq(i.f64(v), f64(v));
+ assertEq(i.f64_t(v), f64(v));
+ }
+}
+
+function binary(name) {
+ print(name);
+
+ let imports = {
+ math: {
+ func: Math[name]
+ }
+ };
+
+ let f32 = (x, y) => Math.fround(Math[name](Math.fround(x), Math.fround(y)));
+ let f64 = Math[name];
+
+ let i = wasmEvalText(`(module
+ (import "math" "func" (func $f32 (param f32) (param f32) (result f32)))
+ (import "math" "func" (func $f64 (param f64) (param f64) (result f64)))
+
+ (table $t 10 funcref)
+ (type $ff_f (func (param f32) (param f32) (result f32)))
+ (type $dd_d (func (param f64) (param f64) (result f64)))
+ (elem (i32.const 0) $f32 $f64)
+
+ (func (export "f32") (param f32) (param f32) (result f32)
+ local.get 0
+ local.get 1
+ call $f32
+ )
+ (func (export "f32_t") (param f32) (param f32) (result f32)
+ local.get 0
+ local.get 1
+ i32.const 0
+ call_indirect (type $ff_f)
+ )
+ (func (export "f64") (param f64) (param f64) (result f64)
+ local.get 0
+ local.get 1
+ call $f64
+ )
+ (func (export "f64_t") (param f64) (param f64) (result f64)
+ local.get 0
+ local.get 1
+ i32.const 1
+ call_indirect (type $dd_d)
+ )
+ )`, imports).exports;
+
+ for (let v of values) {
+ for (let w of values) {
+ assertEq(i.f32(v, w), f32(v, w));
+ assertEq(i.f64(v, w), f64(v, w));
+ }
+ }
+}
+
+unary('sin');
+unary('sin');
+unary('tan');
+unary('cos');
+unary('exp');
+unary('log');
+unary('asin');
+unary('atan');
+unary('acos');
+unary('log10');
+unary('log2');
+unary('log1p');
+unary('expm1');
+unary('sinh');
+unary('tanh');
+unary('cosh');
+unary('asinh');
+unary('atanh');
+unary('acosh');
+unary('sign');
+unary('trunc');
+unary('cbrt');
+
+binary('atan2');
+binary('hypot');
+binary('pow');
+
+print('done');