4 (func (export "load_at_zero") (result i32) (i32.load (i32.const 0)))
5 (func (export "store_at_zero") (i32.store (i32.const 0) (i32.const 2)))
7 (func (export "load_at_page_size") (result i32) (i32.load (i32.const 0x10000)))
8 (func (export "store_at_page_size") (i32.store (i32.const 0x10000) (i32.const 3)))
10 (func (export "grow") (param $sz i32) (result i32) (memory.grow (local.get $sz)))
11 (func (export "size") (result i32) (memory.size))
14 (assert_return (invoke "size") (i32.const 0))
15 (assert_trap (invoke "store_at_zero") "out of bounds memory access")
16 (assert_trap (invoke "load_at_zero") "out of bounds memory access")
17 (assert_trap (invoke "store_at_page_size") "out of bounds memory access")
18 (assert_trap (invoke "load_at_page_size") "out of bounds memory access")
19 (assert_return (invoke "grow" (i32.const 1)) (i32.const 0))
20 (assert_return (invoke "size") (i32.const 1))
21 (assert_return (invoke "load_at_zero") (i32.const 0))
22 (assert_return (invoke "store_at_zero"))
23 (assert_return (invoke "load_at_zero") (i32.const 2))
24 (assert_trap (invoke "store_at_page_size") "out of bounds memory access")
25 (assert_trap (invoke "load_at_page_size") "out of bounds memory access")
26 (assert_return (invoke "grow" (i32.const 4)) (i32.const 1))
27 (assert_return (invoke "size") (i32.const 5))
28 (assert_return (invoke "load_at_zero") (i32.const 2))
29 (assert_return (invoke "store_at_zero"))
30 (assert_return (invoke "load_at_zero") (i32.const 2))
31 (assert_return (invoke "load_at_page_size") (i32.const 0))
32 (assert_return (invoke "store_at_page_size"))
33 (assert_return (invoke "load_at_page_size") (i32.const 3))
38 (func (export "grow") (param i32) (result i32) (memory.grow (local.get 0)))
41 (assert_return (invoke "grow" (i32.const 0)) (i32.const 0))
42 (assert_return (invoke "grow" (i32.const 1)) (i32.const 0))
43 (assert_return (invoke "grow" (i32.const 0)) (i32.const 1))
44 (assert_return (invoke "grow" (i32.const 2)) (i32.const 1))
45 (assert_return (invoke "grow" (i32.const 800)) (i32.const 3))
46 (assert_return (invoke "grow" (i32.const 0x10000)) (i32.const -1))
47 (assert_return (invoke "grow" (i32.const 64736)) (i32.const -1))
48 (assert_return (invoke "grow" (i32.const 1)) (i32.const 803))
52 (func (export "grow") (param i32) (result i32) (memory.grow (local.get 0)))
55 (assert_return (invoke "grow" (i32.const 0)) (i32.const 0))
56 (assert_return (invoke "grow" (i32.const 1)) (i32.const 0))
57 (assert_return (invoke "grow" (i32.const 1)) (i32.const 1))
58 (assert_return (invoke "grow" (i32.const 2)) (i32.const 2))
59 (assert_return (invoke "grow" (i32.const 6)) (i32.const 4))
60 (assert_return (invoke "grow" (i32.const 0)) (i32.const 10))
61 (assert_return (invoke "grow" (i32.const 1)) (i32.const -1))
62 (assert_return (invoke "grow" (i32.const 0x10000)) (i32.const -1))
64 ;; Test that newly allocated memory (program start and memory.grow) is zeroed
68 (func (export "grow") (param i32) (result i32)
69 (memory.grow (local.get 0))
71 (func (export "check-memory-zero") (param i32 i32) (result i32)
73 (local.set 2 (i32.const 1))
76 (local.set 2 (i32.load8_u (local.get 0)))
77 (br_if 1 (i32.ne (local.get 2) (i32.const 0)))
78 (br_if 1 (i32.ge_u (local.get 0) (local.get 1)))
79 (local.set 0 (i32.add (local.get 0) (i32.const 1)))
80 (br_if 0 (i32.le_u (local.get 0) (local.get 1)))
87 (assert_return (invoke "check-memory-zero" (i32.const 0) (i32.const 0xffff)) (i32.const 0))
88 (assert_return (invoke "grow" (i32.const 1)) (i32.const 1))
89 (assert_return (invoke "check-memory-zero" (i32.const 0x10000) (i32.const 0x1_ffff)) (i32.const 0))
90 (assert_return (invoke "grow" (i32.const 1)) (i32.const 2))
91 (assert_return (invoke "check-memory-zero" (i32.const 0x20000) (i32.const 0x2_ffff)) (i32.const 0))
92 (assert_return (invoke "grow" (i32.const 1)) (i32.const 3))
93 (assert_return (invoke "check-memory-zero" (i32.const 0x30000) (i32.const 0x3_ffff)) (i32.const 0))
94 (assert_return (invoke "grow" (i32.const 1)) (i32.const 4))
95 (assert_return (invoke "check-memory-zero" (i32.const 0x40000) (i32.const 0x4_ffff)) (i32.const 0))
96 (assert_return (invoke "grow" (i32.const 1)) (i32.const 5))
97 (assert_return (invoke "check-memory-zero" (i32.const 0x50000) (i32.const 0x5_ffff)) (i32.const 0))
99 ;; As the argument of control constructs and instructions
104 (func (export "as-br-value") (result i32)
105 (block (result i32) (br 0 (memory.grow (i32.const 0))))
108 (func (export "as-br_if-cond")
109 (block (br_if 0 (memory.grow (i32.const 0))))
111 (func (export "as-br_if-value") (result i32)
113 (drop (br_if 0 (memory.grow (i32.const 0)) (i32.const 1))) (i32.const 7)
116 (func (export "as-br_if-value-cond") (result i32)
118 (drop (br_if 0 (i32.const 6) (memory.grow (i32.const 0)))) (i32.const 7)
122 (func (export "as-br_table-index")
123 (block (br_table 0 0 0 (memory.grow (i32.const 0))))
125 (func (export "as-br_table-value") (result i32)
127 (br_table 0 0 0 (memory.grow (i32.const 0)) (i32.const 1)) (i32.const 7)
130 (func (export "as-br_table-value-index") (result i32)
132 (br_table 0 0 (i32.const 6) (memory.grow (i32.const 0))) (i32.const 7)
136 (func (export "as-return-value") (result i32)
137 (return (memory.grow (i32.const 0)))
140 (func (export "as-if-cond") (result i32)
141 (if (result i32) (memory.grow (i32.const 0))
142 (then (i32.const 0)) (else (i32.const 1))
145 (func (export "as-if-then") (result i32)
146 (if (result i32) (i32.const 1)
147 (then (memory.grow (i32.const 0))) (else (i32.const 0))
150 (func (export "as-if-else") (result i32)
151 (if (result i32) (i32.const 0)
152 (then (i32.const 0)) (else (memory.grow (i32.const 0)))
156 (func (export "as-select-first") (param i32 i32) (result i32)
157 (select (memory.grow (i32.const 0)) (local.get 0) (local.get 1))
159 (func (export "as-select-second") (param i32 i32) (result i32)
160 (select (local.get 0) (memory.grow (i32.const 0)) (local.get 1))
162 (func (export "as-select-cond") (result i32)
163 (select (i32.const 0) (i32.const 1) (memory.grow (i32.const 0)))
166 (func $f (param i32 i32 i32) (result i32) (i32.const -1))
167 (func (export "as-call-first") (result i32)
168 (call $f (memory.grow (i32.const 0)) (i32.const 2) (i32.const 3))
170 (func (export "as-call-mid") (result i32)
171 (call $f (i32.const 1) (memory.grow (i32.const 0)) (i32.const 3))
173 (func (export "as-call-last") (result i32)
174 (call $f (i32.const 1) (i32.const 2) (memory.grow (i32.const 0)))
177 (type $sig (func (param i32 i32 i32) (result i32)))
178 (table funcref (elem $f))
179 (func (export "as-call_indirect-first") (result i32)
180 (call_indirect (type $sig)
181 (memory.grow (i32.const 0)) (i32.const 2) (i32.const 3) (i32.const 0)
184 (func (export "as-call_indirect-mid") (result i32)
185 (call_indirect (type $sig)
186 (i32.const 1) (memory.grow (i32.const 0)) (i32.const 3) (i32.const 0)
189 (func (export "as-call_indirect-last") (result i32)
190 (call_indirect (type $sig)
191 (i32.const 1) (i32.const 2) (memory.grow (i32.const 0)) (i32.const 0)
194 (func (export "as-call_indirect-index") (result i32)
195 (call_indirect (type $sig)
196 (i32.const 1) (i32.const 2) (i32.const 3) (memory.grow (i32.const 0))
200 (func (export "as-local.set-value") (local i32)
201 (local.set 0 (memory.grow (i32.const 0)))
203 (func (export "as-local.tee-value") (result i32) (local i32)
204 (local.tee 0 (memory.grow (i32.const 0)))
206 (global $g (mut i32) (i32.const 0))
207 (func (export "as-global.set-value") (local i32)
208 (global.set $g (memory.grow (i32.const 0)))
211 (func (export "as-load-address") (result i32)
212 (i32.load (memory.grow (i32.const 0)))
214 (func (export "as-loadN-address") (result i32)
215 (i32.load8_s (memory.grow (i32.const 0)))
218 (func (export "as-store-address")
219 (i32.store (memory.grow (i32.const 0)) (i32.const 7))
221 (func (export "as-store-value")
222 (i32.store (i32.const 2) (memory.grow (i32.const 0)))
225 (func (export "as-storeN-address")
226 (i32.store8 (memory.grow (i32.const 0)) (i32.const 7))
228 (func (export "as-storeN-value")
229 (i32.store16 (i32.const 2) (memory.grow (i32.const 0)))
232 (func (export "as-unary-operand") (result i32)
233 (i32.clz (memory.grow (i32.const 0)))
236 (func (export "as-binary-left") (result i32)
237 (i32.add (memory.grow (i32.const 0)) (i32.const 10))
239 (func (export "as-binary-right") (result i32)
240 (i32.sub (i32.const 10) (memory.grow (i32.const 0)))
243 (func (export "as-test-operand") (result i32)
244 (i32.eqz (memory.grow (i32.const 0)))
247 (func (export "as-compare-left") (result i32)
248 (i32.le_s (memory.grow (i32.const 0)) (i32.const 10))
250 (func (export "as-compare-right") (result i32)
251 (i32.ne (i32.const 10) (memory.grow (i32.const 0)))
254 (func (export "as-memory.grow-size") (result i32)
255 (memory.grow (memory.grow (i32.const 0)))
259 (assert_return (invoke "as-br-value") (i32.const 1))
261 (assert_return (invoke "as-br_if-cond"))
262 (assert_return (invoke "as-br_if-value") (i32.const 1))
263 (assert_return (invoke "as-br_if-value-cond") (i32.const 6))
265 (assert_return (invoke "as-br_table-index"))
266 (assert_return (invoke "as-br_table-value") (i32.const 1))
267 (assert_return (invoke "as-br_table-value-index") (i32.const 6))
269 (assert_return (invoke "as-return-value") (i32.const 1))
271 (assert_return (invoke "as-if-cond") (i32.const 0))
272 (assert_return (invoke "as-if-then") (i32.const 1))
273 (assert_return (invoke "as-if-else") (i32.const 1))
275 (assert_return (invoke "as-select-first" (i32.const 0) (i32.const 1)) (i32.const 1))
276 (assert_return (invoke "as-select-second" (i32.const 0) (i32.const 0)) (i32.const 1))
277 (assert_return (invoke "as-select-cond") (i32.const 0))
279 (assert_return (invoke "as-call-first") (i32.const -1))
280 (assert_return (invoke "as-call-mid") (i32.const -1))
281 (assert_return (invoke "as-call-last") (i32.const -1))
283 (assert_return (invoke "as-call_indirect-first") (i32.const -1))
284 (assert_return (invoke "as-call_indirect-mid") (i32.const -1))
285 (assert_return (invoke "as-call_indirect-last") (i32.const -1))
286 (assert_trap (invoke "as-call_indirect-index") "undefined element")
288 (assert_return (invoke "as-local.set-value"))
289 (assert_return (invoke "as-local.tee-value") (i32.const 1))
290 (assert_return (invoke "as-global.set-value"))
292 (assert_return (invoke "as-load-address") (i32.const 0))
293 (assert_return (invoke "as-loadN-address") (i32.const 0))
294 (assert_return (invoke "as-store-address"))
295 (assert_return (invoke "as-store-value"))
296 (assert_return (invoke "as-storeN-address"))
297 (assert_return (invoke "as-storeN-value"))
299 (assert_return (invoke "as-unary-operand") (i32.const 31))
301 (assert_return (invoke "as-binary-left") (i32.const 11))
302 (assert_return (invoke "as-binary-right") (i32.const 9))
304 (assert_return (invoke "as-test-operand") (i32.const 0))
306 (assert_return (invoke "as-compare-left") (i32.const 1))
307 (assert_return (invoke "as-compare-right") (i32.const 1))
309 (assert_return (invoke "as-memory.grow-size") (i32.const 1))
315 (func $type-size-empty-vs-i32 (result i32)
324 (func $type-size-empty-vs-i32-in-block (result i32)
326 (block (result i32) (memory.grow))
334 (func $type-size-empty-vs-i32-in-loop (result i32)
336 (loop (result i32) (memory.grow))
344 (func $type-size-empty-vs-i32-in-then (result i32)
345 (i32.const 0) (i32.const 0)
346 (if (result i32) (then (memory.grow)))
355 (func $type-size-f32-vs-i32 (result i32)
356 (memory.grow (f32.const 0))
365 (func $type-result-i32-vs-empty
366 (memory.grow (i32.const 0))
374 (func $type-result-i32-vs-f32 (result f32)
375 (memory.grow (i32.const 0))