summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/to-text.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/to-text.js')
-rw-r--r--js/src/jit-test/tests/wasm/to-text.js261
1 files changed, 261 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/to-text.js b/js/src/jit-test/tests/wasm/to-text.js
new file mode 100644
index 000000000..8b64c1434
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/to-text.js
@@ -0,0 +1,261 @@
+load(libdir + "wasm.js");
+
+var caught = false;
+try {
+ wasmBinaryToText(new Int8Array(1));
+} catch (e) {
+ caught = true;
+}
+assertEq(caught, true);
+
+assertErrorMessage(() => wasmBinaryToText(wasmTextToBinary(`(module (func (result i32) (f32.const 13.37)))`)), WebAssembly.CompileError, /type mismatch/);
+
+function runTest(code) {
+ var expected = wasmTextToBinary(code);
+ var s = wasmBinaryToText(expected);
+ print("TEXT: " + s);
+ var roundtrip = wasmTextToBinary(s);
+ assertDeepEq(expected, roundtrip);
+}
+
+// Smoke test
+runTest(`
+(module
+ (func (param i32) (result f64)
+ (local $l f32)
+ (block
+ (set_local $l (f32.const 0.0))
+ (loop $exit $cont
+ (br_if $exit (get_local 0))
+ (br 2)
+ )
+ (drop (if f64 (i32.const 1)
+ (f64.min (f64.neg (f64.const 1)) (f64.const 0))
+ (f64.add (f64.const 0.5) (f64.load offset=0 (i32.const 0)) )
+ ))
+ )
+ (i32.store16 (i32.const 8) (i32.const 128))
+
+ (return (f64.const 0))
+ )
+ (export "test" 0)
+ (memory 1 10)
+)`);
+
+// Constants, stores and loads
+runTest(`
+(module (func
+ (local i32) (local f32) (local f64)
+ (drop (i32.const 0))
+ (drop (i32.const 100002))
+ (drop (f32.const 0.0))
+ (drop (f32.const 1.5))
+ (drop (f64.const 0.0))
+ (drop (f64.const -10.25))
+ (i32.store (i32.const 0) (i32.load (i32.const 0)))
+ (i32.store8 (i32.const 1) (i32.load8_s (i32.const 2)))
+ (i32.store8 (i32.const 3) (i32.load8_u (i32.const 4)))
+ (i32.store16 (i32.const 2) (i32.load16_s (i32.const 0)))
+ (i32.store16 (i32.const 1) (i32.load16_u (i32.const 0)))
+ (f32.store (i32.const 5) (f32.load (i32.const 6)))
+ (f64.store (i32.const 5) (f64.load (i32.const 6)))
+ (set_local 0 (get_local 0))
+ (set_local 2 (get_local 2))
+)(memory 100))`);
+
+// Branching
+runTest(`
+(module
+(func
+ (block (block (block (nop))))
+ (block (loop ))
+ (if (i32.const 0) (block $label (nop)))
+ (if (i32.const 1) (nop) (loop $exit $cont (block )))
+ (block $l (br $l))
+ (block $m (block (block (br $m))))
+ (block $k (br_if 0 (i32.const 0)) (return))
+ (block $n (block (block (br_if 2 (i32.const 1)) (nop))))
+ (block $1 (block $2 (block $3 (br_table $2 $3 $1 (i32.const 1)) )) (nop))
+ (loop $exit $cont (br_if $cont (i32.const 0)) (nop))
+ (return)
+)
+(func (result f32) (return (f32.const -0.5)))
+(memory 0)
+)`);
+
+// i32, f32 and f64 operations
+runTest(`
+(module
+ (func $iadd (param $x i32) (param $y i32) (result i32) (i32.add (get_local $x) (get_local $y)))
+ (func $isub (param $x i32) (param $y i32) (result i32) (i32.sub (get_local $x) (get_local $y)))
+ (func $imul (param $x i32) (param $y i32) (result i32) (i32.mul (get_local $x) (get_local $y)))
+ (func $idiv_s (param $x i32) (param $y i32) (result i32) (i32.div_s (get_local $x) (get_local $y)))
+ (func $idiv_u (param $x i32) (param $y i32) (result i32) (i32.div_u (get_local $x) (get_local $y)))
+ (func $irem_s (param $x i32) (param $y i32) (result i32) (i32.rem_s (get_local $x) (get_local $y)))
+ (func $irem_u (param $x i32) (param $y i32) (result i32) (i32.rem_u (get_local $x) (get_local $y)))
+ (func $iand (param $x i32) (param $y i32) (result i32) (i32.and (get_local $x) (get_local $y)))
+ (func $ior (param $x i32) (param $y i32) (result i32) (i32.or (get_local $x) (get_local $y)))
+ (func $ixor (param $x i32) (param $y i32) (result i32) (i32.xor (get_local $x) (get_local $y)))
+ (func $ishl (param $x i32) (param $y i32) (result i32) (i32.shl (get_local $x) (get_local $y)))
+ (func $ishr_s (param $x i32) (param $y i32) (result i32) (i32.shr_s (get_local $x) (get_local $y)))
+ (func $ishr_u (param $x i32) (param $y i32) (result i32) (i32.shr_u (get_local $x) (get_local $y)))
+ (func $iclz (param $x i32) (result i32) (i32.clz (get_local $x)))
+ (func $ictz (param $x i32) (result i32) (i32.ctz (get_local $x)))
+ (func $ipopcnt (param $x i32) (result i32) (i32.popcnt (get_local $x)))
+ (func $ieq (param $x i32) (param $y i32) (result i32) (i32.eq (get_local $x) (get_local $y)))
+ (func $ine (param $x i32) (param $y i32) (result i32) (i32.ne (get_local $x) (get_local $y)))
+ (func $ilt_s (param $x i32) (param $y i32) (result i32) (i32.lt_s (get_local $x) (get_local $y)))
+ (func $ilt_u (param $x i32) (param $y i32) (result i32) (i32.lt_u (get_local $x) (get_local $y)))
+ (func $ile_s (param $x i32) (param $y i32) (result i32) (i32.le_s (get_local $x) (get_local $y)))
+ (func $ile_u (param $x i32) (param $y i32) (result i32) (i32.le_u (get_local $x) (get_local $y)))
+ (func $igt_s (param $x i32) (param $y i32) (result i32) (i32.gt_s (get_local $x) (get_local $y)))
+ (func $igt_u (param $x i32) (param $y i32) (result i32) (i32.gt_u (get_local $x) (get_local $y)))
+ (func $ige_s (param $x i32) (param $y i32) (result i32) (i32.ge_s (get_local $x) (get_local $y)))
+ (func $ige_u (param $x i32) (param $y i32) (result i32) (i32.ge_u (get_local $x) (get_local $y)))
+
+ (func $fadd (param $x f32) (param $y f32) (result f32) (f32.add (get_local $x) (get_local $y)))
+ (func $fsub (param $x f32) (param $y f32) (result f32) (f32.sub (get_local $x) (get_local $y)))
+ (func $fmul (param $x f32) (param $y f32) (result f32) (f32.mul (get_local $x) (get_local $y)))
+ (func $fdiv (param $x f32) (param $y f32) (result f32) (f32.div (get_local $x) (get_local $y)))
+ (func $fsqrt (param $x f32) (result f32) (f32.sqrt (get_local $x)))
+ (func $fmin (param $x f32) (param $y f32) (result f32) (f32.min (get_local $x) (get_local $y)))
+ (func $fmax (param $x f32) (param $y f32) (result f32) (f32.max (get_local $x) (get_local $y)))
+ (func $fceil (param $x f32) (result f32) (f32.ceil (get_local $x)))
+ (func $ffloor (param $x f32) (result f32) (f32.floor (get_local $x)))
+ (func $fabs (param $x f32) (result f32) (f32.abs (get_local $x)))
+ (func $fneg (param $x f32) (result f32) (f32.neg (get_local $x)))
+
+ (func $dadd (param $x f64) (param $y f64) (result f64) (f64.add (get_local $x) (get_local $y)))
+ (func $dsub (param $x f64) (param $y f64) (result f64) (f64.sub (get_local $x) (get_local $y)))
+ (func $dmul (param $x f64) (param $y f64) (result f64) (f64.mul (get_local $x) (get_local $y)))
+ (func $ddiv (param $x f64) (param $y f64) (result f64) (f64.div (get_local $x) (get_local $y)))
+ (func $dceil (param $x f64) (result f64) (f64.ceil (get_local $x)))
+ (func $dfloor (param $x f64) (result f64) (f64.floor (get_local $x)))
+ (func $dabs (param $x f64) (result f64) (f64.abs (get_local $x)))
+ (func $dneg (param $x f64) (result f64) (f64.neg (get_local $x)))
+(memory 0))`);
+
+// conversions
+runTest(`
+(module
+ (func $itrunc_s_f32 (param $x f32) (result i32) (i32.trunc_s/f32 (get_local $x)))
+ (func $itrunc_u_f32 (param $x f32) (result i32) (i32.trunc_u/f32 (get_local $x)))
+ (func $itrunc_s_f64 (param $x f64) (result i32) (i32.trunc_s/f64 (get_local $x)))
+ (func $itrunc_u_f64 (param $x f64) (result i32) (i32.trunc_u/f64 (get_local $x)))
+ (func $fconvert_s_i32 (param $x i32) (result f32) (f32.convert_s/i32 (get_local $x)))
+ (func $dconvert_s_i32 (param $x i32) (result f64) (f64.convert_s/i32 (get_local $x)))
+ (func $fconvert_u_i32 (param $x i32) (result f32) (f32.convert_u/i32 (get_local $x)))
+ (func $dconvert_u_i32 (param $x i32) (result f64) (f64.convert_u/i32 (get_local $x)))
+ (func $dpromote_f32 (param $x f32) (result f64) (f64.promote/f32 (get_local $x)))
+ (func $fdemote_f64 (param $x f64) (result f32) (f32.demote/f64 (get_local $x)))
+(memory 0))`);
+
+// function calls
+runTest(`
+(module
+ (type $type1 (func (param i32) (result i32)))
+ (import $import1 "mod" "test" (param f32) (result f32))
+ (table anyfunc (elem $func1 $func2))
+ (func $func1 (param i32) (param f32) (nop))
+ (func $func2 (param i32) (result i32) (get_local 0))
+ (func $test
+ (call $func1
+ (call_indirect $type1 (i32.const 2) (i32.const 1))
+ (call $import1 (f32.const 1.0))
+ )
+ )
+ (export "test" $test)
+ (memory 1)
+)`);
+
+// default memory export from binaryen
+runTest(`(module (func (nop)) (memory 0 65535))`);
+
+// stack-machine code that isn't directly representable as an AST
+runTest(`
+(module
+ (func (result i32)
+ (local $x i32)
+ i32.const 100
+ set_local $x
+ i32.const 200
+ set_local $x
+ i32.const 400
+ set_local $x
+ i32.const 2
+ i32.const 16
+ nop
+ set_local $x
+ i32.const 3
+ i32.const 17
+ set_local $x
+ i32.const 18
+ set_local $x
+ i32.lt_s
+ if i32
+ i32.const 101
+ set_local $x
+ i32.const 8
+ i32.const 102
+ set_local $x
+ else
+ i32.const 103
+ set_local $x
+ i32.const 900
+ i32.const 104
+ set_local $x
+ i32.const 105
+ set_local $x
+ end
+ i32.const 107
+ set_local $x
+ get_local $x
+ i32.add
+ i32.const 106
+ set_local $x
+ )
+ (export "" 0)
+)`);
+
+// more stack-machine code that isn't directly representable as an AST
+runTest(`
+(module
+ (func $return_void)
+
+ (func (result i32)
+ (local $x i32)
+ i32.const 0
+ block
+ i32.const 1
+ set_local $x
+ end
+ i32.const 2
+ set_local $x
+ i32.const 3
+ loop
+ i32.const 4
+ set_local $x
+ end
+ i32.const 5
+ set_local $x
+ i32.add
+ call $return_void
+ )
+ (export "" 0)
+)`);
+
+runTest(`
+ (module
+ (func $func
+ block $block
+ i32.const 0
+ if
+ i32.const 0
+ if
+ end
+ else
+ end
+ end
+ )
+ (export "" 0)
+)`);