summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/spec/spec/memory.wast.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/spec/spec/memory.wast.js')
-rw-r--r--js/src/jit-test/tests/wasm/spec/spec/memory.wast.js399
1 files changed, 399 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/spec/spec/memory.wast.js b/js/src/jit-test/tests/wasm/spec/spec/memory.wast.js
new file mode 100644
index 0000000000..831bb26d69
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/spec/spec/memory.wast.js
@@ -0,0 +1,399 @@
+/* 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/memory.wast
+
+// ./test/core/memory.wast:3
+let $0 = instantiate(`(module (memory 0))`);
+
+// ./test/core/memory.wast:4
+let $1 = instantiate(`(module (memory 1))`);
+
+// ./test/core/memory.wast:5
+let $2 = instantiate(`(module (memory 0 0))`);
+
+// ./test/core/memory.wast:6
+let $3 = instantiate(`(module (memory 0 1))`);
+
+// ./test/core/memory.wast:7
+let $4 = instantiate(`(module (memory 1 256))`);
+
+// ./test/core/memory.wast:8
+let $5 = instantiate(`(module (memory 0 65536))`);
+
+// ./test/core/memory.wast:10
+assert_invalid(() => instantiate(`(module (memory 0) (memory 0))`), `multiple memories`);
+
+// ./test/core/memory.wast:11
+assert_invalid(
+ () => instantiate(`(module (memory (import "spectest" "memory") 0) (memory 0))`),
+ `multiple memories`,
+);
+
+// ./test/core/memory.wast:13
+let $6 = instantiate(`(module (memory (data)) (func (export "memsize") (result i32) (memory.size)))`);
+
+// ./test/core/memory.wast:14
+assert_return(() => invoke($6, `memsize`, []), [value("i32", 0)]);
+
+// ./test/core/memory.wast:15
+let $7 = instantiate(`(module (memory (data "")) (func (export "memsize") (result i32) (memory.size)))`);
+
+// ./test/core/memory.wast:16
+assert_return(() => invoke($7, `memsize`, []), [value("i32", 0)]);
+
+// ./test/core/memory.wast:17
+let $8 = instantiate(`(module (memory (data "x")) (func (export "memsize") (result i32) (memory.size)))`);
+
+// ./test/core/memory.wast:18
+assert_return(() => invoke($8, `memsize`, []), [value("i32", 1)]);
+
+// ./test/core/memory.wast:20
+assert_invalid(() => instantiate(`(module (data (i32.const 0)))`), `unknown memory`);
+
+// ./test/core/memory.wast:21
+assert_invalid(() => instantiate(`(module (data (i32.const 0) ""))`), `unknown memory`);
+
+// ./test/core/memory.wast:22
+assert_invalid(() => instantiate(`(module (data (i32.const 0) "x"))`), `unknown memory`);
+
+// ./test/core/memory.wast:24
+assert_invalid(
+ () => instantiate(`(module (func (drop (f32.load (i32.const 0)))))`),
+ `unknown memory`,
+);
+
+// ./test/core/memory.wast:28
+assert_invalid(
+ () => instantiate(`(module (func (f32.store (i32.const 0) (f32.const 0))))`),
+ `unknown memory`,
+);
+
+// ./test/core/memory.wast:32
+assert_invalid(
+ () => instantiate(`(module (func (drop (i32.load8_s (i32.const 0)))))`),
+ `unknown memory`,
+);
+
+// ./test/core/memory.wast:36
+assert_invalid(
+ () => instantiate(`(module (func (i32.store8 (i32.const 0) (i32.const 0))))`),
+ `unknown memory`,
+);
+
+// ./test/core/memory.wast:40
+assert_invalid(
+ () => instantiate(`(module (func (drop (memory.size))))`),
+ `unknown memory`,
+);
+
+// ./test/core/memory.wast:44
+assert_invalid(
+ () => instantiate(`(module (func (drop (memory.grow (i32.const 0)))))`),
+ `unknown memory`,
+);
+
+// ./test/core/memory.wast:50
+assert_invalid(
+ () => instantiate(`(module (memory 1 0))`),
+ `size minimum must not be greater than maximum`,
+);
+
+// ./test/core/memory.wast:54
+assert_invalid(
+ () => instantiate(`(module (memory 65537))`),
+ `memory size must be at most 65536 pages (4GiB)`,
+);
+
+// ./test/core/memory.wast:58
+assert_invalid(
+ () => instantiate(`(module (memory 2147483648))`),
+ `memory size must be at most 65536 pages (4GiB)`,
+);
+
+// ./test/core/memory.wast:62
+assert_invalid(
+ () => instantiate(`(module (memory 4294967295))`),
+ `memory size must be at most 65536 pages (4GiB)`,
+);
+
+// ./test/core/memory.wast:66
+assert_invalid(
+ () => instantiate(`(module (memory 0 65537))`),
+ `memory size must be at most 65536 pages (4GiB)`,
+);
+
+// ./test/core/memory.wast:70
+assert_invalid(
+ () => instantiate(`(module (memory 0 2147483648))`),
+ `memory size must be at most 65536 pages (4GiB)`,
+);
+
+// ./test/core/memory.wast:74
+assert_invalid(
+ () => instantiate(`(module (memory 0 4294967295))`),
+ `memory size must be at most 65536 pages (4GiB)`,
+);
+
+// ./test/core/memory.wast:79
+assert_malformed(
+ () => instantiate(`(memory 0x1_0000_0000) `),
+ `i32 constant out of range`,
+);
+
+// ./test/core/memory.wast:83
+assert_malformed(
+ () => instantiate(`(memory 0x1_0000_0000 0x1_0000_0000) `),
+ `i32 constant out of range`,
+);
+
+// ./test/core/memory.wast:87
+assert_malformed(
+ () => instantiate(`(memory 0 0x1_0000_0000) `),
+ `i32 constant out of range`,
+);
+
+// ./test/core/memory.wast:92
+let $9 = instantiate(`(module
+ (memory 1)
+ (data (i32.const 0) "ABC\\a7D") (data (i32.const 20) "WASM")
+
+ ;; Data section
+ (func (export "data") (result i32)
+ (i32.and
+ (i32.and
+ (i32.and
+ (i32.eq (i32.load8_u (i32.const 0)) (i32.const 65))
+ (i32.eq (i32.load8_u (i32.const 3)) (i32.const 167))
+ )
+ (i32.and
+ (i32.eq (i32.load8_u (i32.const 6)) (i32.const 0))
+ (i32.eq (i32.load8_u (i32.const 19)) (i32.const 0))
+ )
+ )
+ (i32.and
+ (i32.and
+ (i32.eq (i32.load8_u (i32.const 20)) (i32.const 87))
+ (i32.eq (i32.load8_u (i32.const 23)) (i32.const 77))
+ )
+ (i32.and
+ (i32.eq (i32.load8_u (i32.const 24)) (i32.const 0))
+ (i32.eq (i32.load8_u (i32.const 1023)) (i32.const 0))
+ )
+ )
+ )
+ )
+
+ ;; Memory cast
+ (func (export "cast") (result f64)
+ (i64.store (i32.const 8) (i64.const -12345))
+ (if
+ (f64.eq
+ (f64.load (i32.const 8))
+ (f64.reinterpret_i64 (i64.const -12345))
+ )
+ (then (return (f64.const 0)))
+ )
+ (i64.store align=1 (i32.const 9) (i64.const 0))
+ (i32.store16 align=1 (i32.const 15) (i32.const 16453))
+ (f64.load align=1 (i32.const 9))
+ )
+
+ ;; Sign and zero extending memory loads
+ (func (export "i32_load8_s") (param $$i i32) (result i32)
+ (i32.store8 (i32.const 8) (local.get $$i))
+ (i32.load8_s (i32.const 8))
+ )
+ (func (export "i32_load8_u") (param $$i i32) (result i32)
+ (i32.store8 (i32.const 8) (local.get $$i))
+ (i32.load8_u (i32.const 8))
+ )
+ (func (export "i32_load16_s") (param $$i i32) (result i32)
+ (i32.store16 (i32.const 8) (local.get $$i))
+ (i32.load16_s (i32.const 8))
+ )
+ (func (export "i32_load16_u") (param $$i i32) (result i32)
+ (i32.store16 (i32.const 8) (local.get $$i))
+ (i32.load16_u (i32.const 8))
+ )
+ (func (export "i64_load8_s") (param $$i i64) (result i64)
+ (i64.store8 (i32.const 8) (local.get $$i))
+ (i64.load8_s (i32.const 8))
+ )
+ (func (export "i64_load8_u") (param $$i i64) (result i64)
+ (i64.store8 (i32.const 8) (local.get $$i))
+ (i64.load8_u (i32.const 8))
+ )
+ (func (export "i64_load16_s") (param $$i i64) (result i64)
+ (i64.store16 (i32.const 8) (local.get $$i))
+ (i64.load16_s (i32.const 8))
+ )
+ (func (export "i64_load16_u") (param $$i i64) (result i64)
+ (i64.store16 (i32.const 8) (local.get $$i))
+ (i64.load16_u (i32.const 8))
+ )
+ (func (export "i64_load32_s") (param $$i i64) (result i64)
+ (i64.store32 (i32.const 8) (local.get $$i))
+ (i64.load32_s (i32.const 8))
+ )
+ (func (export "i64_load32_u") (param $$i i64) (result i64)
+ (i64.store32 (i32.const 8) (local.get $$i))
+ (i64.load32_u (i32.const 8))
+ )
+)`);
+
+// ./test/core/memory.wast:180
+assert_return(() => invoke($9, `data`, []), [value("i32", 1)]);
+
+// ./test/core/memory.wast:181
+assert_return(() => invoke($9, `cast`, []), [value("f64", 42)]);
+
+// ./test/core/memory.wast:183
+assert_return(() => invoke($9, `i32_load8_s`, [-1]), [value("i32", -1)]);
+
+// ./test/core/memory.wast:184
+assert_return(() => invoke($9, `i32_load8_u`, [-1]), [value("i32", 255)]);
+
+// ./test/core/memory.wast:185
+assert_return(() => invoke($9, `i32_load16_s`, [-1]), [value("i32", -1)]);
+
+// ./test/core/memory.wast:186
+assert_return(() => invoke($9, `i32_load16_u`, [-1]), [value("i32", 65535)]);
+
+// ./test/core/memory.wast:188
+assert_return(() => invoke($9, `i32_load8_s`, [100]), [value("i32", 100)]);
+
+// ./test/core/memory.wast:189
+assert_return(() => invoke($9, `i32_load8_u`, [200]), [value("i32", 200)]);
+
+// ./test/core/memory.wast:190
+assert_return(() => invoke($9, `i32_load16_s`, [20000]), [value("i32", 20000)]);
+
+// ./test/core/memory.wast:191
+assert_return(() => invoke($9, `i32_load16_u`, [40000]), [value("i32", 40000)]);
+
+// ./test/core/memory.wast:193
+assert_return(() => invoke($9, `i32_load8_s`, [-19110589]), [value("i32", 67)]);
+
+// ./test/core/memory.wast:194
+assert_return(() => invoke($9, `i32_load8_s`, [878104047]), [value("i32", -17)]);
+
+// ./test/core/memory.wast:195
+assert_return(() => invoke($9, `i32_load8_u`, [-19110589]), [value("i32", 67)]);
+
+// ./test/core/memory.wast:196
+assert_return(() => invoke($9, `i32_load8_u`, [878104047]), [value("i32", 239)]);
+
+// ./test/core/memory.wast:197
+assert_return(() => invoke($9, `i32_load16_s`, [-19110589]), [value("i32", 25923)]);
+
+// ./test/core/memory.wast:198
+assert_return(() => invoke($9, `i32_load16_s`, [878104047]), [value("i32", -12817)]);
+
+// ./test/core/memory.wast:199
+assert_return(() => invoke($9, `i32_load16_u`, [-19110589]), [value("i32", 25923)]);
+
+// ./test/core/memory.wast:200
+assert_return(() => invoke($9, `i32_load16_u`, [878104047]), [value("i32", 52719)]);
+
+// ./test/core/memory.wast:202
+assert_return(() => invoke($9, `i64_load8_s`, [-1n]), [value("i64", -1n)]);
+
+// ./test/core/memory.wast:203
+assert_return(() => invoke($9, `i64_load8_u`, [-1n]), [value("i64", 255n)]);
+
+// ./test/core/memory.wast:204
+assert_return(() => invoke($9, `i64_load16_s`, [-1n]), [value("i64", -1n)]);
+
+// ./test/core/memory.wast:205
+assert_return(() => invoke($9, `i64_load16_u`, [-1n]), [value("i64", 65535n)]);
+
+// ./test/core/memory.wast:206
+assert_return(() => invoke($9, `i64_load32_s`, [-1n]), [value("i64", -1n)]);
+
+// ./test/core/memory.wast:207
+assert_return(() => invoke($9, `i64_load32_u`, [-1n]), [value("i64", 4294967295n)]);
+
+// ./test/core/memory.wast:209
+assert_return(() => invoke($9, `i64_load8_s`, [100n]), [value("i64", 100n)]);
+
+// ./test/core/memory.wast:210
+assert_return(() => invoke($9, `i64_load8_u`, [200n]), [value("i64", 200n)]);
+
+// ./test/core/memory.wast:211
+assert_return(() => invoke($9, `i64_load16_s`, [20000n]), [value("i64", 20000n)]);
+
+// ./test/core/memory.wast:212
+assert_return(() => invoke($9, `i64_load16_u`, [40000n]), [value("i64", 40000n)]);
+
+// ./test/core/memory.wast:213
+assert_return(() => invoke($9, `i64_load32_s`, [20000n]), [value("i64", 20000n)]);
+
+// ./test/core/memory.wast:214
+assert_return(() => invoke($9, `i64_load32_u`, [40000n]), [value("i64", 40000n)]);
+
+// ./test/core/memory.wast:216
+assert_return(() => invoke($9, `i64_load8_s`, [-81985529755441853n]), [value("i64", 67n)]);
+
+// ./test/core/memory.wast:217
+assert_return(() => invoke($9, `i64_load8_s`, [3771275841602506223n]), [value("i64", -17n)]);
+
+// ./test/core/memory.wast:218
+assert_return(() => invoke($9, `i64_load8_u`, [-81985529755441853n]), [value("i64", 67n)]);
+
+// ./test/core/memory.wast:219
+assert_return(() => invoke($9, `i64_load8_u`, [3771275841602506223n]), [value("i64", 239n)]);
+
+// ./test/core/memory.wast:220
+assert_return(() => invoke($9, `i64_load16_s`, [-81985529755441853n]), [value("i64", 25923n)]);
+
+// ./test/core/memory.wast:221
+assert_return(() => invoke($9, `i64_load16_s`, [3771275841602506223n]), [value("i64", -12817n)]);
+
+// ./test/core/memory.wast:222
+assert_return(() => invoke($9, `i64_load16_u`, [-81985529755441853n]), [value("i64", 25923n)]);
+
+// ./test/core/memory.wast:223
+assert_return(() => invoke($9, `i64_load16_u`, [3771275841602506223n]), [value("i64", 52719n)]);
+
+// ./test/core/memory.wast:224
+assert_return(() => invoke($9, `i64_load32_s`, [-81985529755441853n]), [value("i64", 1446274371n)]);
+
+// ./test/core/memory.wast:225
+assert_return(() => invoke($9, `i64_load32_s`, [3771275841602506223n]), [value("i64", -1732588049n)]);
+
+// ./test/core/memory.wast:226
+assert_return(() => invoke($9, `i64_load32_u`, [-81985529755441853n]), [value("i64", 1446274371n)]);
+
+// ./test/core/memory.wast:227
+assert_return(() => invoke($9, `i64_load32_u`, [3771275841602506223n]), [value("i64", 2562379247n)]);
+
+// ./test/core/memory.wast:231
+assert_malformed(
+ () => instantiate(`(memory $$foo 1) (memory $$foo 1) `),
+ `duplicate memory`,
+);
+
+// ./test/core/memory.wast:235
+assert_malformed(
+ () => instantiate(`(import "" "" (memory $$foo 1)) (memory $$foo 1) `),
+ `duplicate memory`,
+);
+
+// ./test/core/memory.wast:239
+assert_malformed(
+ () => instantiate(`(import "" "" (memory $$foo 1)) (import "" "" (memory $$foo 1)) `),
+ `duplicate memory`,
+);