diff options
Diffstat (limited to 'js/src/jit-test/tests/wasm/spec/spec/switch.wast.js')
-rw-r--r-- | js/src/jit-test/tests/wasm/spec/spec/switch.wast.js | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/spec/spec/switch.wast.js b/js/src/jit-test/tests/wasm/spec/spec/switch.wast.js new file mode 100644 index 0000000000..403b2c3762 --- /dev/null +++ b/js/src/jit-test/tests/wasm/spec/spec/switch.wast.js @@ -0,0 +1,220 @@ +/* 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/switch.wast + +// ./test/core/switch.wast:1 +let $0 = instantiate(`(module + ;; Statement switch + (func (export "stmt") (param $$i i32) (result i32) + (local $$j i32) + (local.set $$j (i32.const 100)) + (block $$switch + (block $$7 + (block $$default + (block $$6 + (block $$5 + (block $$4 + (block $$3 + (block $$2 + (block $$1 + (block $$0 + (br_table $$0 $$1 $$2 $$3 $$4 $$5 $$6 $$7 $$default + (local.get $$i) + ) + ) ;; 0 + (return (local.get $$i)) + ) ;; 1 + (nop) + ;; fallthrough + ) ;; 2 + ;; fallthrough + ) ;; 3 + (local.set $$j (i32.sub (i32.const 0) (local.get $$i))) + (br $$switch) + ) ;; 4 + (br $$switch) + ) ;; 5 + (local.set $$j (i32.const 101)) + (br $$switch) + ) ;; 6 + (local.set $$j (i32.const 101)) + ;; fallthrough + ) ;; default + (local.set $$j (i32.const 102)) + ) ;; 7 + ;; fallthrough + ) + (return (local.get $$j)) + ) + + ;; Expression switch + (func (export "expr") (param $$i i64) (result i64) + (local $$j i64) + (local.set $$j (i64.const 100)) + (return + (block $$switch (result i64) + (block $$7 + (block $$default + (block $$4 + (block $$5 + (block $$6 + (block $$3 + (block $$2 + (block $$1 + (block $$0 + (br_table $$0 $$1 $$2 $$3 $$4 $$5 $$6 $$7 $$default + (i32.wrap_i64 (local.get $$i)) + ) + ) ;; 0 + (return (local.get $$i)) + ) ;; 1 + (nop) + ;; fallthrough + ) ;; 2 + ;; fallthrough + ) ;; 3 + (br $$switch (i64.sub (i64.const 0) (local.get $$i))) + ) ;; 6 + (local.set $$j (i64.const 101)) + ;; fallthrough + ) ;; 4 + ;; fallthrough + ) ;; 5 + ;; fallthrough + ) ;; default + (br $$switch (local.get $$j)) + ) ;; 7 + (i64.const -5) + ) + ) + ) + + ;; Argument switch + (func (export "arg") (param $$i i32) (result i32) + (return + (block $$2 (result i32) + (i32.add (i32.const 10) + (block $$1 (result i32) + (i32.add (i32.const 100) + (block $$0 (result i32) + (i32.add (i32.const 1000) + (block $$default (result i32) + (br_table $$0 $$1 $$2 $$default + (i32.mul (i32.const 2) (local.get $$i)) + (i32.and (i32.const 3) (local.get $$i)) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + + ;; Corner cases + (func (export "corner") (result i32) + (block + (br_table 0 (i32.const 0)) + ) + (i32.const 1) + ) +)`); + +// ./test/core/switch.wast:120 +assert_return(() => invoke($0, `stmt`, [0]), [value("i32", 0)]); + +// ./test/core/switch.wast:121 +assert_return(() => invoke($0, `stmt`, [1]), [value("i32", -1)]); + +// ./test/core/switch.wast:122 +assert_return(() => invoke($0, `stmt`, [2]), [value("i32", -2)]); + +// ./test/core/switch.wast:123 +assert_return(() => invoke($0, `stmt`, [3]), [value("i32", -3)]); + +// ./test/core/switch.wast:124 +assert_return(() => invoke($0, `stmt`, [4]), [value("i32", 100)]); + +// ./test/core/switch.wast:125 +assert_return(() => invoke($0, `stmt`, [5]), [value("i32", 101)]); + +// ./test/core/switch.wast:126 +assert_return(() => invoke($0, `stmt`, [6]), [value("i32", 102)]); + +// ./test/core/switch.wast:127 +assert_return(() => invoke($0, `stmt`, [7]), [value("i32", 100)]); + +// ./test/core/switch.wast:128 +assert_return(() => invoke($0, `stmt`, [-10]), [value("i32", 102)]); + +// ./test/core/switch.wast:130 +assert_return(() => invoke($0, `expr`, [0n]), [value("i64", 0n)]); + +// ./test/core/switch.wast:131 +assert_return(() => invoke($0, `expr`, [1n]), [value("i64", -1n)]); + +// ./test/core/switch.wast:132 +assert_return(() => invoke($0, `expr`, [2n]), [value("i64", -2n)]); + +// ./test/core/switch.wast:133 +assert_return(() => invoke($0, `expr`, [3n]), [value("i64", -3n)]); + +// ./test/core/switch.wast:134 +assert_return(() => invoke($0, `expr`, [6n]), [value("i64", 101n)]); + +// ./test/core/switch.wast:135 +assert_return(() => invoke($0, `expr`, [7n]), [value("i64", -5n)]); + +// ./test/core/switch.wast:136 +assert_return(() => invoke($0, `expr`, [-10n]), [value("i64", 100n)]); + +// ./test/core/switch.wast:138 +assert_return(() => invoke($0, `arg`, [0]), [value("i32", 110)]); + +// ./test/core/switch.wast:139 +assert_return(() => invoke($0, `arg`, [1]), [value("i32", 12)]); + +// ./test/core/switch.wast:140 +assert_return(() => invoke($0, `arg`, [2]), [value("i32", 4)]); + +// ./test/core/switch.wast:141 +assert_return(() => invoke($0, `arg`, [3]), [value("i32", 1116)]); + +// ./test/core/switch.wast:142 +assert_return(() => invoke($0, `arg`, [4]), [value("i32", 118)]); + +// ./test/core/switch.wast:143 +assert_return(() => invoke($0, `arg`, [5]), [value("i32", 20)]); + +// ./test/core/switch.wast:144 +assert_return(() => invoke($0, `arg`, [6]), [value("i32", 12)]); + +// ./test/core/switch.wast:145 +assert_return(() => invoke($0, `arg`, [7]), [value("i32", 1124)]); + +// ./test/core/switch.wast:146 +assert_return(() => invoke($0, `arg`, [8]), [value("i32", 126)]); + +// ./test/core/switch.wast:148 +assert_return(() => invoke($0, `corner`, []), [value("i32", 1)]); + +// ./test/core/switch.wast:150 +assert_invalid( + () => instantiate(`(module (func (br_table 3 (i32.const 0))))`), + `unknown label`, +); |