diff options
Diffstat (limited to 'js/src/jit-test/tests/wasm/branch-hinting/parsing.js')
-rw-r--r-- | js/src/jit-test/tests/wasm/branch-hinting/parsing.js | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/branch-hinting/parsing.js b/js/src/jit-test/tests/wasm/branch-hinting/parsing.js new file mode 100644 index 0000000000..0ff9b0f557 --- /dev/null +++ b/js/src/jit-test/tests/wasm/branch-hinting/parsing.js @@ -0,0 +1,154 @@ +// Make sure we are correctly parsing this custom section. +var code =` +(module + (func $$dummy) + (func $main (param i32) (result i32) + i32.const 0 + local.get 0 + i32.eq + ;; Only allowed on br_if and if + (@metadata.code.branch_hint "\\00") if + call $$dummy + i32.const 1 + return + else + call $$dummy + i32.const 0 + return + end + i32.const 3 + return + ) + + (export "_main" (func $main)) +)`; + +let branchHintsModule = new WebAssembly.Module(wasmTextToBinary(code)); +assertEq(WebAssembly.Module.customSections(branchHintsModule, "metadata.code.branch_hint").length, 1); +assertEq(wasmParsedBranchHints(branchHintsModule), true); + +let instance = new WebAssembly.Instance(branchHintsModule); +assertEq(instance.exports._main(0), 1); + +// Testing branch hints parsing on `if` and `br_if` +branchHintsModule = new WebAssembly.Module(wasmTextToBinary(` +(module + (func $main + i32.const 0 + (@metadata.code.branch_hint "\\00") + if + i32.const 0 + (@metadata.code.branch_hint "\\01") + br_if 0 + end + ) + (export "_main" (func $main)) +)`)); +assertEq(wasmParsedBranchHints(branchHintsModule), true); +instance = new WebAssembly.Instance(branchHintsModule); +instance.exports._main(); + +let m = new WebAssembly.Module(wasmTextToBinary(` +(module + (type (;0;) (func)) + (type (;1;) (func (param i32) (result i32))) + (type (;2;) (func (result i32))) + (func $__wasm_nullptr (type 0) + unreachable) + (func $main (type 2) (result i32) + (local i32 i32 i32 i32) + i32.const 0 + local.tee 2 + local.set 3 + loop + local.get 2 + i32.const 50000 + i32.eq + (@metadata.code.branch_hint "\\00") if + i32.const 1 + local.set 3 + end + local.get 2 + i32.const 1 + i32.add + local.tee 2 + i32.const 100000 + i32.ne + (@metadata.code.branch_hint "\\01") br_if 0 (;@1;) + end + local.get 3) + (table (;0;) 1 1 funcref) + (memory (;0;) 17 128) + (global (;0;) (mut i32) (i32.const 42)) + (export "memory" (memory 0)) + (export "_main" (func $main)) + (elem (;0;) (i32.const 0) func $__wasm_nullptr) + (type (;0;) (func (param i32))) +)`)); + +assertEq(wasmParsedBranchHints(m), true); +instance = new WebAssembly.Instance(m); +assertEq(instance.exports._main(0), 1); + +// Testing invalid values for branch hints +assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` +(module + (func $main (param i32) (result i32) + i32.const 0 + (@metadata.code.branch_hint "\\0000000") if + i32.const 1 + return + end + i32.const 42 + return + ) + ) +`)), SyntaxError, /invalid value for branch hint/); + +assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` +(module + (func $main (param i32) (result i32) + i32.const 0 + (@metadata.code.branch_hint "\\02") if + i32.const 1 + return + end + i32.const 42 + return + ) + ) +`)), SyntaxError, /invalid value for branch hint/); + +assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` +(module + (func $main (param i32) (result i32) + i32.const 0 + (@metadata.code.branch_hint "\\aaaa") if + i32.const 1 + return + end + i32.const 42 + return + ) + ) +`)), SyntaxError, /wasm text error/); + +assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` +(module + (func $main (param i32) (result i32) + i32.const 0 + (@metadata.code.branch_hint) if + i32.const 1 + return + end + i32.const 42 + return + ) + ) +`)), SyntaxError, /wasm text error/); + +assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` +(module + (@metadata.code.branch_hint) +) +`)), SyntaxError, /wasm text error/); |