diff options
Diffstat (limited to 'js/src/jit-test/tests/wasm/spec/spec/labels.wast.js')
-rw-r--r-- | js/src/jit-test/tests/wasm/spec/spec/labels.wast.js | 400 |
1 files changed, 400 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/spec/spec/labels.wast.js b/js/src/jit-test/tests/wasm/spec/spec/labels.wast.js new file mode 100644 index 0000000000..b76f13f90a --- /dev/null +++ b/js/src/jit-test/tests/wasm/spec/spec/labels.wast.js @@ -0,0 +1,400 @@ +/* Copyright 2021 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// ./test/core/labels.wast + +// ./test/core/labels.wast:1 +let $0 = instantiate(`(module + (func (export "block") (result i32) + (block $$exit (result i32) + (br $$exit (i32.const 1)) + (i32.const 0) + ) + ) + + (func (export "loop1") (result i32) + (local $$i i32) + (local.set $$i (i32.const 0)) + (block $$exit (result i32) + (loop $$cont (result i32) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if (i32.eq (local.get $$i) (i32.const 5)) + (then (br $$exit (local.get $$i))) + ) + (br $$cont) + ) + ) + ) + + (func (export "loop2") (result i32) + (local $$i i32) + (local.set $$i (i32.const 0)) + (block $$exit (result i32) + (loop $$cont (result i32) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if (i32.eq (local.get $$i) (i32.const 5)) + (then (br $$cont)) + ) + (if (i32.eq (local.get $$i) (i32.const 8)) + (then (br $$exit (local.get $$i))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (br $$cont) + ) + ) + ) + + (func (export "loop3") (result i32) + (local $$i i32) + (local.set $$i (i32.const 0)) + (block $$exit (result i32) + (loop $$cont (result i32) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if (i32.eq (local.get $$i) (i32.const 5)) + (then (br $$exit (local.get $$i))) + ) + (local.get $$i) + ) + ) + ) + + (func (export "loop4") (param $$max i32) (result i32) + (local $$i i32) + (local.set $$i (i32.const 1)) + (block $$exit (result i32) + (loop $$cont (result i32) + (local.set $$i (i32.add (local.get $$i) (local.get $$i))) + (if (i32.gt_u (local.get $$i) (local.get $$max)) + (then (br $$exit (local.get $$i))) + ) + (br $$cont) + ) + ) + ) + + (func (export "loop5") (result i32) + (i32.add + (loop $$l (result i32) (i32.const 1)) + (i32.const 1) + ) + ) + + (func (export "loop6") (result i32) + (loop (result i32) + (br_if 0 (i32.const 0)) + (i32.const 3) + ) + ) + + (func (export "if") (result i32) + (local $$i i32) + (local.set $$i (i32.const 0)) + (block + (if $$l + (i32.const 1) + (then (br $$l) (local.set $$i (i32.const 666))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if $$l + (i32.const 1) + (then (br $$l) (local.set $$i (i32.const 666))) + (else (local.set $$i (i32.const 888))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if $$l + (i32.const 1) + (then (br $$l) (local.set $$i (i32.const 666))) + (else (local.set $$i (i32.const 888))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if $$l + (i32.const 0) + (then (local.set $$i (i32.const 888))) + (else (br $$l) (local.set $$i (i32.const 666))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if $$l + (i32.const 0) + (then (local.set $$i (i32.const 888))) + (else (br $$l) (local.set $$i (i32.const 666))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + ) + (local.get $$i) + ) + + (func (export "if2") (result i32) + (local $$i i32) + (local.set $$i (i32.const 0)) + (block + (if + (i32.const 1) + (then (br 0) (local.set $$i (i32.const 666))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if + (i32.const 1) + (then (br 0) (local.set $$i (i32.const 666))) + (else (local.set $$i (i32.const 888))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if + (i32.const 1) + (then (br 0) (local.set $$i (i32.const 666))) + (else (local.set $$i (i32.const 888))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if + (i32.const 0) + (then (local.set $$i (i32.const 888))) + (else (br 0) (local.set $$i (i32.const 666))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + (if + (i32.const 0) + (then (local.set $$i (i32.const 888))) + (else (br 0) (local.set $$i (i32.const 666))) + ) + (local.set $$i (i32.add (local.get $$i) (i32.const 1))) + ) + (local.get $$i) + ) + + (func (export "switch") (param i32) (result i32) + (block $$ret (result i32) + (i32.mul (i32.const 10) + (block $$exit (result i32) + (block $$0 + (block $$default + (block $$3 + (block $$2 + (block $$1 + (br_table $$0 $$1 $$2 $$3 $$default (local.get 0)) + ) ;; 1 + ) ;; 2 + (br $$exit (i32.const 2)) + ) ;; 3 + (br $$ret (i32.const 3)) + ) ;; default + ) ;; 0 + (i32.const 5) + ) + ) + ) + ) + + (func (export "return") (param i32) (result i32) + (block $$default + (block $$1 + (block $$0 + (br_table $$0 $$1 (local.get 0)) + (br $$default) + ) ;; 0 + (return (i32.const 0)) + ) ;; 1 + ) ;; default + (i32.const 2) + ) + + (func (export "br_if0") (result i32) + (local $$i i32) + (local.set $$i (i32.const 0)) + (block $$outer (result i32) + (block $$inner + (br_if $$inner (i32.const 0)) + (local.set $$i (i32.or (local.get $$i) (i32.const 0x1))) + (br_if $$inner (i32.const 1)) + (local.set $$i (i32.or (local.get $$i) (i32.const 0x2))) + ) + (drop (br_if $$outer + (block (result i32) + (local.set $$i (i32.or (local.get $$i) (i32.const 0x4))) + (local.get $$i) + ) + (i32.const 0) + )) + (local.set $$i (i32.or (local.get $$i) (i32.const 0x8))) + (drop (br_if $$outer + (block (result i32) + (local.set $$i (i32.or (local.get $$i) (i32.const 0x10))) + (local.get $$i) + ) + (i32.const 1) + )) + (local.set $$i (i32.or (local.get $$i) (i32.const 0x20))) (local.get $$i) + ) + ) + + (func (export "br_if1") (result i32) + (block $$l0 (result i32) + (drop + (br_if $$l0 + (block $$l1 (result i32) (br $$l1 (i32.const 1))) + (i32.const 1) + ) + ) + (i32.const 0) + ) + ) + + (func (export "br_if2") (result i32) + (block $$l0 (result i32) + (if (i32.const 1) + (then + (drop + (br_if $$l0 + (block $$l1 (result i32) (br $$l1 (i32.const 1))) + (i32.const 1) + ) + ) + ) + ) + (i32.const 0) + ) + ) + + (func (export "br_if3") (result i32) + (local $$i1 i32) + (drop + (i32.add + (block $$l0 (result i32) + (drop (br_if $$l0 + (block (result i32) (local.set $$i1 (i32.const 1)) (local.get $$i1)) + (block (result i32) (local.set $$i1 (i32.const 2)) (local.get $$i1)) + )) + (i32.const 0) + ) + (i32.const 0) + ) + ) + (local.get $$i1) + ) + + (func (export "br") (result i32) + (block $$l0 (result i32) + (if (i32.const 1) + (then (br $$l0 (block $$l1 (result i32) (br $$l1 (i32.const 1))))) + (else (block (drop (block $$l1 (result i32) (br $$l1 (i32.const 1)))))) + ) + (i32.const 1) + ) + ) + + (func (export "shadowing") (result i32) + (block $$l1 (result i32) (i32.xor (br $$l1 (i32.const 1)) (i32.const 2))) + ) + + (func (export "redefinition") (result i32) + (block $$l1 (result i32) + (i32.add + (block $$l1 (result i32) (i32.const 2)) + (block $$l1 (result i32) (br $$l1 (i32.const 3))) + ) + ) + ) +)`); + +// ./test/core/labels.wast:291 +assert_return(() => invoke($0, `block`, []), [value("i32", 1)]); + +// ./test/core/labels.wast:292 +assert_return(() => invoke($0, `loop1`, []), [value("i32", 5)]); + +// ./test/core/labels.wast:293 +assert_return(() => invoke($0, `loop2`, []), [value("i32", 8)]); + +// ./test/core/labels.wast:294 +assert_return(() => invoke($0, `loop3`, []), [value("i32", 1)]); + +// ./test/core/labels.wast:295 +assert_return(() => invoke($0, `loop4`, [8]), [value("i32", 16)]); + +// ./test/core/labels.wast:296 +assert_return(() => invoke($0, `loop5`, []), [value("i32", 2)]); + +// ./test/core/labels.wast:297 +assert_return(() => invoke($0, `loop6`, []), [value("i32", 3)]); + +// ./test/core/labels.wast:298 +assert_return(() => invoke($0, `if`, []), [value("i32", 5)]); + +// ./test/core/labels.wast:299 +assert_return(() => invoke($0, `if2`, []), [value("i32", 5)]); + +// ./test/core/labels.wast:300 +assert_return(() => invoke($0, `switch`, [0]), [value("i32", 50)]); + +// ./test/core/labels.wast:301 +assert_return(() => invoke($0, `switch`, [1]), [value("i32", 20)]); + +// ./test/core/labels.wast:302 +assert_return(() => invoke($0, `switch`, [2]), [value("i32", 20)]); + +// ./test/core/labels.wast:303 +assert_return(() => invoke($0, `switch`, [3]), [value("i32", 3)]); + +// ./test/core/labels.wast:304 +assert_return(() => invoke($0, `switch`, [4]), [value("i32", 50)]); + +// ./test/core/labels.wast:305 +assert_return(() => invoke($0, `switch`, [5]), [value("i32", 50)]); + +// ./test/core/labels.wast:306 +assert_return(() => invoke($0, `return`, [0]), [value("i32", 0)]); + +// ./test/core/labels.wast:307 +assert_return(() => invoke($0, `return`, [1]), [value("i32", 2)]); + +// ./test/core/labels.wast:308 +assert_return(() => invoke($0, `return`, [2]), [value("i32", 2)]); + +// ./test/core/labels.wast:309 +assert_return(() => invoke($0, `br_if0`, []), [value("i32", 29)]); + +// ./test/core/labels.wast:310 +assert_return(() => invoke($0, `br_if1`, []), [value("i32", 1)]); + +// ./test/core/labels.wast:311 +assert_return(() => invoke($0, `br_if2`, []), [value("i32", 1)]); + +// ./test/core/labels.wast:312 +assert_return(() => invoke($0, `br_if3`, []), [value("i32", 2)]); + +// ./test/core/labels.wast:313 +assert_return(() => invoke($0, `br`, []), [value("i32", 1)]); + +// ./test/core/labels.wast:314 +assert_return(() => invoke($0, `shadowing`, []), [value("i32", 1)]); + +// ./test/core/labels.wast:315 +assert_return(() => invoke($0, `redefinition`, []), [value("i32", 5)]); + +// ./test/core/labels.wast:317 +assert_invalid( + () => instantiate(`(module (func (block $$l (f32.neg (br_if $$l (i32.const 1))) (nop))))`), + `type mismatch`, +); + +// ./test/core/labels.wast:321 +assert_invalid( + () => instantiate(`(module (func (block $$l (br_if $$l (f32.const 0) (i32.const 1)))))`), + `type mismatch`, +); + +// ./test/core/labels.wast:325 +assert_invalid( + () => instantiate(`(module (func (block $$l (br_if $$l (f32.const 0) (i32.const 1)))))`), + `type mismatch`, +); |