summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/full-cycle.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/full-cycle.js')
-rw-r--r--js/src/jit-test/tests/wasm/full-cycle.js148
1 files changed, 148 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/full-cycle.js b/js/src/jit-test/tests/wasm/full-cycle.js
new file mode 100644
index 0000000000..6f62638202
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/full-cycle.js
@@ -0,0 +1,148 @@
+wasmFullPass(`(module
+ (func $test (param i32) (param i32) (result i32) (i32.add (local.get 0) (local.get 1)))
+ (func $run (result i32) (call $test (i32.const 1) (i32.const ${Math.pow(2, 31) - 1})))
+ (export "run" (func $run))
+)`, -Math.pow(2, 31));
+
+wasmFullPass(`(module
+ (func (result i32)
+ i32.const 1
+ i32.const 42
+ i32.add
+ return
+ unreachable
+ i32.const 0
+ call 3
+ i32.const 42
+ i32.add
+ )
+ (func) (func) (func)
+(export "run" (func 0)))`, 43);
+
+wasmFullPass(`
+(module
+ (import "env" "a" (global $a i32))
+ (import "env" "b" (func $b (param i32) (result i32)))
+ (func (export "run") (param $0 i32) (result i32) local.get 0 call $b)
+)`, 43, { env: { a: 1337, b: x => x+1 } }, 42);
+
+// Global section.
+wasmFullPass(`(module
+ (import "globals" "x" (global $imported i32))
+ (global $mut_local (mut i32) (i32.const 0))
+ (global $imm_local i32 (i32.const 37))
+ (global $imm_local_2 i32 (global.get 0))
+ (func $get (result i32)
+ i32.const 13
+ global.set $mut_local
+ global.get $imported
+ global.get $mut_local
+ i32.add
+ global.get $imm_local
+ i32.add
+ global.get $imm_local_2
+ i32.add
+ )
+ (export "run" (func $get))
+)`, 13 + 42 + 37 + 42, { globals: {x: 42} });
+
+// Memory.
+wasmFullPass(`(module
+ (memory (export "memory") 1 2)
+ (data (i32.const 0) "\\00\\01\\02" "\\03\\04\\05")
+ (data (i32.const 6) "\\06")
+ (func (export "run") (result i32)
+ i32.const 1
+ i32.load offset=2
+ )
+)`, 0x06050403);
+
+let memory = new WebAssembly.Memory({ initial: 1, maximum: 2 });
+
+wasmFullPass(`(module
+ (memory (import "" "memory") 1 2)
+ (data (i32.const 0) "\\00\\01\\02\\03\\04\\05")
+ (func (export "run") (result i32)
+ i32.const 1
+ i32.load offset=2
+ )
+ (export "mem" (memory 0))
+)`, 0x050403, {"": {memory}});
+
+// Tables.
+wasmFullPass(`(module
+ (table (export "table") 3 funcref)
+ (type $t (func (result i32)))
+ (func $foo (result i32) (i32.const 1))
+ (func $bar (result i32) (i32.const 2))
+ (func $baz (result i32) (i32.const 3))
+ (elem (i32.const 0) $baz $bar)
+ (elem (i32.const 2) $foo)
+ (func (export "run") (param i32) (result i32)
+ local.get 0
+ call_indirect (type $t)
+ )
+)`, 3, {}, 0);
+
+let table = new WebAssembly.Table({ element: 'funcref', initial: 3, maximum: 3 });
+
+wasmFullPass(`(module
+ (table (import "" "table") 3 4 funcref)
+ (type $t (func (result i32)))
+ (func $foo (result i32) (i32.const 1))
+ (func $bar (result i32) (i32.const 2))
+ (func $baz (result i32) (i32.const 3))
+ (elem (i32.const 0) $baz $bar)
+ (elem (i32.const 2) $foo)
+ (func (export "run") (param i32) (result i32)
+ local.get 0
+ call_indirect (type $t)
+ )
+)`, 3, {"":{table}}, 0);
+
+// Start function.
+wasmFullPass(`(module
+ (global $g (mut i32) (i32.const 0))
+ (func $start
+ global.get $g
+ i32.const 1
+ i32.add
+ global.set $g
+ )
+ (start $start)
+ (func (export "run") (result i32)
+ global.get $g
+ )
+)`, 1);
+
+// Branch table.
+for (let [p, result] of [
+ [0, 7],
+ [1, 6],
+ [2, 4],
+ [42, 4]
+]) {
+ wasmFullPass(`(module
+ (func (export "run") (param $p i32) (result i32) (local $n i32)
+ i32.const 0
+ local.set $n
+ block $c block $b block $a
+ local.get $p
+ br_table $a $b $c
+ end $a
+ local.get $n
+ i32.const 1
+ i32.add
+ local.set $n
+ end $b
+ local.get $n
+ i32.const 2
+ i32.add
+ local.set $n
+ end $c
+ local.get $n
+ i32.const 4
+ i32.add
+ )
+ )`, result, {}, p);
+}