summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/spec/spec/switch.wast.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /js/src/jit-test/tests/wasm/spec/spec/switch.wast.js
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
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.js220
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`,
+);