summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/multi-value/block-validate.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/multi-value/block-validate.js')
-rw-r--r--js/src/jit-test/tests/wasm/multi-value/block-validate.js266
1 files changed, 266 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/multi-value/block-validate.js b/js/src/jit-test/tests/wasm/multi-value/block-validate.js
new file mode 100644
index 0000000000..7845c016e3
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/multi-value/block-validate.js
@@ -0,0 +1,266 @@
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.add
+ (block (result i32 i32)
+ (i32.const 32)
+ (i32.const 10)))))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32) (i32.const 10)
+ (block (param i32 i32) (result i32 i32))
+ (i32.add)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (block (param i32) (result i32 i32)
+ (i32.const 10))
+ (i32.add)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.add
+ (loop (result i32 i32)
+ (i32.const 32)
+ (i32.const 10)))))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32) (i32.const 10)
+ (loop (param i32 i32) (result i32 i32))
+ (i32.add)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (loop (param i32) (result i32 i32)
+ (i32.const 10))
+ (i32.add)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.add
+ (block (result i32 i32)
+ (i32.const 32)
+ (i32.const 10)
+ (br 0)))))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (i32.const 10)
+ (block (param i32 i32) (result i32 i32)
+ (br 0))
+ (i32.add)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (block (param i32) (result i32 i32)
+ (i32.const 10)
+ (br 0))
+ (i32.add)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.add
+ (block (result i32 i32)
+ (i32.const 32)
+ (i32.const 10)
+ (block (param i32 i32) (result i32 i32)
+ (br 1))))))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (i32.const 10)
+ (block (param i32 i32) (result i32 i32)
+ (block (param i32 i32) (result i32 i32)
+ (br 1)))
+ (i32.add)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (i32.const 10)
+ (block (param i32 i32) (result i32 i32)
+ (block (param i32 i32) (result i32 i32)
+ (br 0)))
+ (i32.add)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (block (param i32) (result i32 i32)
+ (i32.const 10)
+ (block (param i32 i32) (result i32 i32)
+ (br 1)))
+ (i32.add)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (i32.const 10)
+ (i32.const 1)
+ (if (param i32 i32) (result i32)
+ (then (i32.add))
+ (else (i32.sub)))))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (i32.const 10)
+ (i32.const 1)
+ (if (param i32 i32) (result i32 i32)
+ (then
+ (drop)
+ (drop)
+ (i32.const 10)
+ (i32.const 32)))
+ (i32.sub)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (i32.const 10)
+ (i32.const 1)
+ (if (param i32 i32) (result i32 i32)
+ (then (return)))
+ (i32.sub)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (i32.const 32)
+ (i32.const 10)
+ (i32.const 1)
+ (if (param i32 i32) (result i32 i32)
+ (then)
+ (else (return)))
+ (i32.sub)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (local $i i32)
+ (i32.const 0) ;; sum
+ (i32.const 10) ;; i
+ (loop $loop (param i32 i32) (result i32)
+ (local.tee $i)
+ (i32.add) ;; sum = i + sum
+ (i32.sub (local.get $i) (i32.const 1))
+ (local.tee $i)
+ (local.get $i)
+ (br_if $loop (i32.eqz))
+ (drop))))`);
+
+// Tests the encoding: with more than 64 function types, the block type encoded
+// as an uleb will create a confusion with the valtype; an sleb is required.
+
+wasmValidateText(`
+ (module
+ ${(function () {
+ s = "";
+ for ( let i=0; i < 64; i++ ) {
+ let t = [];
+ for ( let j=0; j < 6; j++ )
+ t.push(i & (1 << j) ? "i32" : "f32");
+ s += "(func (param " + t.join(" ") + "))\n";
+ }
+ return s;
+ })()}
+ (func (result i32)
+ (i32.add
+ (block (result i32 i32)
+ (i32.const 32)
+ (i32.const 10)))))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (block $B (result i32 i32)
+ (br $B (i32.const 1) (i32.const 2))
+ (i32.const 0x1337))
+ (drop)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (block $B (result i32 i32)
+ (i32.const 1)
+ (br $B (i32.const 2))
+ (i32.const 0x1337))
+ (drop)))`);
+
+wasmValidateText(`
+ (module
+ (func (result i32)
+ (block $B (result i32 i32)
+ (i32.const 1)
+ (i32.const 2)
+ (br $B)
+ (i32.const 0x1337))
+ (drop)))`);
+
+wasmValidateText(`
+ (module
+ (func (param $cond i32) (result i32)
+ (block $B (result i32 i32)
+ (br_if $B (i32.const 1) (i32.const 2) (local.get $cond)))
+ (drop)))`);
+
+wasmValidateText(`
+ (module
+ (func (param $cond i32) (result i32)
+ (block $B (result i32 i32)
+ (i32.const 1)
+ (br_if $B (i32.const 2) (local.get $cond)))
+ (drop)))`);
+
+wasmValidateText(`
+ (module
+ (func (param $cond i32) (result i32)
+ (block $B (result i32 i32)
+ (i32.const 1)
+ (i32.const 2)
+ (br_if $B (local.get $cond)))
+ (drop)))`);
+
+wasmValidateText(`
+ (module
+ (func (param $cond i32) (result i32)
+ (block $B (result i32 i32)
+ (i32.const 1)
+ (i32.const 2)
+ (local.get $cond)
+ (br_if $B))
+ (drop)))`);
+
+wasmValidateText(`
+ (module
+ (func (param $index i32) (result i32)
+ (block $OUT (result i32)
+ (block $B1 (result i32 i32)
+ (block $B2 (result i32 i32)
+ (block $B3 (result i32 i32)
+ (br_table $B1 $B2 $B3 (i32.const 1) (i32.const 2) (local.get $index)))
+ (br $OUT (i32.add)))
+ (br $OUT (i32.sub)))
+ (br $OUT (i32.mul)))))`);