1 ;; Test memory section structure
4 (module (memory 1 256))
5 (module (memory 0 65536))
6 (module (memory 0 0) (data (i32.const 0)))
7 (module (memory 0 0) (data (i32.const 0) ""))
8 (module (memory 1 1) (data (i32.const 0) "a"))
9 (module (memory 1 2) (data (i32.const 0) "a") (data (i32.const 65535) "b"))
11 (data (i32.const 0) "a") (data (i32.const 1) "b") (data (i32.const 2) "c")
14 (module (memory (data)) (func (export "memsize") (result i32) (current_memory)))
15 (assert_return (invoke "memsize") (i32.const 0))
16 (module (memory (data "")) (func (export "memsize") (result i32) (current_memory)))
17 (assert_return (invoke "memsize") (i32.const 0))
18 (module (memory (data "x")) (func (export "memsize") (result i32) (current_memory)))
19 (assert_return (invoke "memsize") (i32.const 1))
21 (assert_invalid (module (data (i32.const 0))) "unknown memory")
22 (assert_invalid (module (data (i32.const 0) "")) "unknown memory")
23 (assert_invalid (module (data (i32.const 0) "x")) "unknown memory")
26 (module (memory 1) (data (i64.const 0)))
30 (module (memory 1) (data (i32.ctz (i32.const 0))))
31 "constant expression required"
34 (module (memory 1) (data (nop)))
35 "constant expression required"
40 "memory size minimum must not be greater than maximum"
43 (module (memory 0 0) (data (i32.const 0) "a"))
44 "data segment does not fit"
47 (module (memory 1 2) (data (i32.const 0) "a") (data (i32.const 98304) "b"))
48 "data segment does not fit"
51 (module (memory 1 2) (data (i32.const 0) "abc") (data (i32.const 0) "def"))
52 "data segment not disjoint and ordered"
55 (module (memory 1 2) (data (i32.const 3) "ab") (data (i32.const 0) "de"))
56 "data segment not disjoint and ordered"
61 (data (i32.const 0) "a") (data (i32.const 2) "b") (data (i32.const 1) "c")
63 "data segment not disjoint and ordered"
66 (module (memory 65537))
67 "memory size must be at most 65536 pages (4GiB)"
70 (module (memory 2147483648))
71 "memory size must be at most 65536 pages (4GiB)"
74 (module (memory 4294967295))
75 "memory size must be at most 65536 pages (4GiB)"
78 (module (memory 0 65537))
79 "memory size must be at most 65536 pages (4GiB)"
82 (module (memory 0 2147483648))
83 "memory size must be at most 65536 pages (4GiB)"
86 (module (memory 0 4294967295))
87 "memory size must be at most 65536 pages (4GiB)"
90 ;; Test alignment annotation rules
91 (module (memory 0) (func (drop (i32.load8_u align=1 (i32.const 0)))))
92 (module (memory 0) (func (drop (i32.load16_u align=2 (i32.const 0)))))
93 (module (memory 0) (func (drop (i32.load align=4 (i32.const 0)))))
94 (module (memory 0) (func (drop (f32.load align=4 (i32.const 0)))))
97 (module (memory 0) (func (drop (i64.load align=0 (i32.const 0)))))
98 "alignment must be a power of two"
101 (module (memory 0) (func (drop (i64.load align=3 (i32.const 0)))))
102 "alignment must be a power of two"
105 (module (memory 0) (func (drop (i64.load align=5 (i32.const 0)))))
106 "alignment must be a power of two"
109 (module (memory 0) (func (drop (i64.load align=6 (i32.const 0)))))
110 "alignment must be a power of two"
113 (module (memory 0) (func (drop (i64.load align=7 (i32.const 0)))))
114 "alignment must be a power of two"
118 (module (memory 0) (func (drop (i64.load align=16 (i32.const 0)))))
119 "alignment must not be larger than natural"
122 (module (memory 0) (func (drop (i64.load align=32 (i32.const 0)))))
123 "alignment must not be larger than natural"
126 (module (memory 0) (func (drop (i32.load align=8 (i32.const 0)))))
127 "alignment must not be larger than natural"
130 (module (memory 0) (func (drop (i32.load16_u align=4 (i32.const 0)))))
131 "alignment must not be larger than natural"
134 (module (memory 0) (func (drop (i32.load8_u align=2 (i32.const 0)))))
135 "alignment must not be larger than natural"
138 (module (memory 0) (func (i32.store8 align=2 (i32.const 0) (i32.const 0))))
139 "alignment must not be larger than natural"
142 (module (memory 0) (func (i32.load16_u align=4 (i32.const 0))))
143 "alignment must not be larger than natural"
146 (module (memory 0) (func (i32.load8_u align=2 (i32.const 0))))
147 "alignment must not be larger than natural"
150 (module (memory 0) (func (i32.store8 align=2 (i32.const 0) (i32.const 0))))
151 "alignment must not be larger than natural"
156 (data (i32.const 0) "ABC\a7D") (data (i32.const 20) "WASM")
159 (func (export "data") (result i32)
163 (i32.eq (i32.load8_u (i32.const 0)) (i32.const 65))
164 (i32.eq (i32.load8_u (i32.const 3)) (i32.const 167))
167 (i32.eq (i32.load8_u (i32.const 6)) (i32.const 0))
168 (i32.eq (i32.load8_u (i32.const 19)) (i32.const 0))
173 (i32.eq (i32.load8_u (i32.const 20)) (i32.const 87))
174 (i32.eq (i32.load8_u (i32.const 23)) (i32.const 77))
177 (i32.eq (i32.load8_u (i32.const 24)) (i32.const 0))
178 (i32.eq (i32.load8_u (i32.const 1023)) (i32.const 0))
184 ;; Aligned read/write
185 (func (export "aligned") (result i32)
187 (set_local 0 (i32.const 10))
191 (i32.eq (get_local 0) (i32.const 0))
194 (set_local 2 (i32.mul (get_local 0) (i32.const 4)))
195 (i32.store (get_local 2) (get_local 0))
196 (set_local 1 (i32.load (get_local 2)))
198 (i32.ne (get_local 0) (get_local 1))
199 (return (i32.const 0))
201 (set_local 0 (i32.sub (get_local 0) (i32.const 1)))
208 ;; Unaligned read/write
209 (func (export "unaligned") (result i32)
211 (set_local 0 (i32.const 10))
215 (i32.eq (get_local 0) (i32.const 0))
218 (set_local 2 (f64.convert_s/i32 (get_local 0)))
219 (f64.store align=1 (get_local 0) (get_local 2))
220 (set_local 1 (f64.load align=1 (get_local 0)))
222 (f64.ne (get_local 2) (get_local 1))
223 (return (i32.const 0))
225 (set_local 0 (i32.sub (get_local 0) (i32.const 1)))
233 (func (export "cast") (result f64)
234 (i64.store (i32.const 8) (i64.const -12345))
237 (f64.load (i32.const 8))
238 (f64.reinterpret/i64 (i64.const -12345))
240 (return (f64.const 0))
242 (i64.store align=1 (i32.const 9) (i64.const 0))
243 (i32.store16 align=1 (i32.const 15) (i32.const 16453))
244 (f64.load align=1 (i32.const 9))
247 ;; Sign and zero extending memory loads
248 (func (export "i32_load8_s") (param $i i32) (result i32)
249 (i32.store8 (i32.const 8) (get_local $i))
250 (i32.load8_s (i32.const 8))
252 (func (export "i32_load8_u") (param $i i32) (result i32)
253 (i32.store8 (i32.const 8) (get_local $i))
254 (i32.load8_u (i32.const 8))
256 (func (export "i32_load16_s") (param $i i32) (result i32)
257 (i32.store16 (i32.const 8) (get_local $i))
258 (i32.load16_s (i32.const 8))
260 (func (export "i32_load16_u") (param $i i32) (result i32)
261 (i32.store16 (i32.const 8) (get_local $i))
262 (i32.load16_u (i32.const 8))
264 (func (export "i64_load8_s") (param $i i64) (result i64)
265 (i64.store8 (i32.const 8) (get_local $i))
266 (i64.load8_s (i32.const 8))
268 (func (export "i64_load8_u") (param $i i64) (result i64)
269 (i64.store8 (i32.const 8) (get_local $i))
270 (i64.load8_u (i32.const 8))
272 (func (export "i64_load16_s") (param $i i64) (result i64)
273 (i64.store16 (i32.const 8) (get_local $i))
274 (i64.load16_s (i32.const 8))
276 (func (export "i64_load16_u") (param $i i64) (result i64)
277 (i64.store16 (i32.const 8) (get_local $i))
278 (i64.load16_u (i32.const 8))
280 (func (export "i64_load32_s") (param $i i64) (result i64)
281 (i64.store32 (i32.const 8) (get_local $i))
282 (i64.load32_s (i32.const 8))
284 (func (export "i64_load32_u") (param $i i64) (result i64)
285 (i64.store32 (i32.const 8) (get_local $i))
286 (i64.load32_u (i32.const 8))
290 (assert_return (invoke "data") (i32.const 1))
291 (assert_return (invoke "aligned") (i32.const 1))
292 (assert_return (invoke "unaligned") (i32.const 1))
293 (assert_return (invoke "cast") (f64.const 42.0))
295 (assert_return (invoke "i32_load8_s" (i32.const -1)) (i32.const -1))
296 (assert_return (invoke "i32_load8_u" (i32.const -1)) (i32.const 255))
297 (assert_return (invoke "i32_load16_s" (i32.const -1)) (i32.const -1))
298 (assert_return (invoke "i32_load16_u" (i32.const -1)) (i32.const 65535))
300 (assert_return (invoke "i32_load8_s" (i32.const 100)) (i32.const 100))
301 (assert_return (invoke "i32_load8_u" (i32.const 200)) (i32.const 200))
302 (assert_return (invoke "i32_load16_s" (i32.const 20000)) (i32.const 20000))
303 (assert_return (invoke "i32_load16_u" (i32.const 40000)) (i32.const 40000))
305 (assert_return (invoke "i64_load8_s" (i64.const -1)) (i64.const -1))
306 (assert_return (invoke "i64_load8_u" (i64.const -1)) (i64.const 255))
307 (assert_return (invoke "i64_load16_s" (i64.const -1)) (i64.const -1))
308 (assert_return (invoke "i64_load16_u" (i64.const -1)) (i64.const 65535))
309 (assert_return (invoke "i64_load32_s" (i64.const -1)) (i64.const -1))
310 (assert_return (invoke "i64_load32_u" (i64.const -1)) (i64.const 4294967295))
312 (assert_return (invoke "i64_load8_s" (i64.const 100)) (i64.const 100))
313 (assert_return (invoke "i64_load8_u" (i64.const 200)) (i64.const 200))
314 (assert_return (invoke "i64_load16_s" (i64.const 20000)) (i64.const 20000))
315 (assert_return (invoke "i64_load16_u" (i64.const 40000)) (i64.const 40000))
316 (assert_return (invoke "i64_load32_s" (i64.const 20000)) (i64.const 20000))
317 (assert_return (invoke "i64_load32_u" (i64.const 40000)) (i64.const 40000))