...
1;; Test `br` operator
2
3(module
4 ;; Auxiliary definition
5 (func $dummy)
6
7 (func (export "type-i32") (block (drop (i32.ctz (br 0)))))
8 (func (export "type-i64") (block (drop (i64.ctz (br 0)))))
9 (func (export "type-f32") (block (drop (f32.neg (br 0)))))
10 (func (export "type-f64") (block (drop (f64.neg (br 0)))))
11 (func (export "type-i32-i32") (block (drop (i32.add (br 0)))))
12 (func (export "type-i64-i64") (block (drop (i64.add (br 0)))))
13 (func (export "type-f32-f32") (block (drop (f32.add (br 0)))))
14 (func (export "type-f64-f64") (block (drop (f64.add (br 0)))))
15
16 (func (export "type-i32-value") (result i32)
17 (block (result i32) (i32.ctz (br 0 (i32.const 1))))
18 )
19 (func (export "type-i64-value") (result i64)
20 (block (result i64) (i64.ctz (br 0 (i64.const 2))))
21 )
22 (func (export "type-f32-value") (result f32)
23 (block (result f32) (f32.neg (br 0 (f32.const 3))))
24 )
25 (func (export "type-f64-value") (result f64)
26 (block (result f64) (f64.neg (br 0 (f64.const 4))))
27 )
28 (func (export "type-f64-f64-value") (result f64 f64)
29 (block (result f64 f64)
30 (f64.add (br 0 (f64.const 4) (f64.const 5))) (f64.const 6)
31 )
32 )
33
34 (func (export "as-block-first")
35 (block (br 0) (call $dummy))
36 )
37 (func (export "as-block-mid")
38 (block (call $dummy) (br 0) (call $dummy))
39 )
40 (func (export "as-block-last")
41 (block (nop) (call $dummy) (br 0))
42 )
43 (func (export "as-block-value") (result i32)
44 (block (result i32) (nop) (call $dummy) (br 0 (i32.const 2)))
45 )
46
47 (func (export "as-loop-first") (result i32)
48 (block (result i32) (loop (result i32) (br 1 (i32.const 3)) (i32.const 2)))
49 )
50 (func (export "as-loop-mid") (result i32)
51 (block (result i32)
52 (loop (result i32) (call $dummy) (br 1 (i32.const 4)) (i32.const 2))
53 )
54 )
55 (func (export "as-loop-last") (result i32)
56 (block (result i32)
57 (loop (result i32) (nop) (call $dummy) (br 1 (i32.const 5)))
58 )
59 )
60
61 (func (export "as-br-value") (result i32)
62 (block (result i32) (br 0 (br 0 (i32.const 9))))
63 )
64
65 (func (export "as-br_if-cond")
66 (block (br_if 0 (br 0)))
67 )
68 (func (export "as-br_if-value") (result i32)
69 (block (result i32)
70 (drop (br_if 0 (br 0 (i32.const 8)) (i32.const 1))) (i32.const 7)
71 )
72 )
73 (func (export "as-br_if-value-cond") (result i32)
74 (block (result i32)
75 (drop (br_if 0 (i32.const 6) (br 0 (i32.const 9)))) (i32.const 7)
76 )
77 )
78
79 (func (export "as-br_table-index")
80 (block (br_table 0 0 0 (br 0)))
81 )
82 (func (export "as-br_table-value") (result i32)
83 (block (result i32)
84 (br_table 0 0 0 (br 0 (i32.const 10)) (i32.const 1)) (i32.const 7)
85 )
86 )
87 (func (export "as-br_table-value-index") (result i32)
88 (block (result i32)
89 (br_table 0 0 (i32.const 6) (br 0 (i32.const 11))) (i32.const 7)
90 )
91 )
92
93 (func (export "as-return-value") (result i64)
94 (block (result i64) (return (br 0 (i64.const 7))))
95 )
96 (func (export "as-return-values") (result i32 i64)
97 (i32.const 2)
98 (block (result i64) (return (br 0 (i32.const 1) (i64.const 7))))
99 )
100
101 (func (export "as-if-cond") (result i32)
102 (block (result i32)
103 (if (result i32) (br 0 (i32.const 2))
104 (then (i32.const 0))
105 (else (i32.const 1))
106 )
107 )
108 )
109 (func (export "as-if-then") (param i32 i32) (result i32)
110 (block (result i32)
111 (if (result i32) (local.get 0)
112 (then (br 1 (i32.const 3)))
113 (else (local.get 1))
114 )
115 )
116 )
117 (func (export "as-if-else") (param i32 i32) (result i32)
118 (block (result i32)
119 (if (result i32) (local.get 0)
120 (then (local.get 1))
121 (else (br 1 (i32.const 4)))
122 )
123 )
124 )
125
126 (func (export "as-select-first") (param i32 i32) (result i32)
127 (block (result i32)
128 (select (br 0 (i32.const 5)) (local.get 0) (local.get 1))
129 )
130 )
131 (func (export "as-select-second") (param i32 i32) (result i32)
132 (block (result i32)
133 (select (local.get 0) (br 0 (i32.const 6)) (local.get 1))
134 )
135 )
136 (func (export "as-select-cond") (result i32)
137 (block (result i32)
138 (select (i32.const 0) (i32.const 1) (br 0 (i32.const 7)))
139 )
140 )
141 (func (export "as-select-all") (result i32)
142 (block (result i32) (select (br 0 (i32.const 8))))
143 )
144
145 (func $f (param i32 i32 i32) (result i32) (i32.const -1))
146 (func (export "as-call-first") (result i32)
147 (block (result i32)
148 (call $f (br 0 (i32.const 12)) (i32.const 2) (i32.const 3))
149 )
150 )
151 (func (export "as-call-mid") (result i32)
152 (block (result i32)
153 (call $f (i32.const 1) (br 0 (i32.const 13)) (i32.const 3))
154 )
155 )
156 (func (export "as-call-last") (result i32)
157 (block (result i32)
158 (call $f (i32.const 1) (i32.const 2) (br 0 (i32.const 14)))
159 )
160 )
161 (func (export "as-call-all") (result i32)
162 (block (result i32) (call $f (br 0 (i32.const 15))))
163 )
164
165 (type $sig (func (param i32 i32 i32) (result i32)))
166 (table funcref (elem $f))
167 (func (export "as-call_indirect-func") (result i32)
168 (block (result i32)
169 (call_indirect (type $sig)
170 (br 0 (i32.const 20))
171 (i32.const 1) (i32.const 2) (i32.const 3)
172 )
173 )
174 )
175 (func (export "as-call_indirect-first") (result i32)
176 (block (result i32)
177 (call_indirect (type $sig)
178 (i32.const 0)
179 (br 0 (i32.const 21)) (i32.const 2) (i32.const 3)
180 )
181 )
182 )
183 (func (export "as-call_indirect-mid") (result i32)
184 (block (result i32)
185 (call_indirect (type $sig)
186 (i32.const 0)
187 (i32.const 1) (br 0 (i32.const 22)) (i32.const 3)
188 )
189 )
190 )
191 (func (export "as-call_indirect-last") (result i32)
192 (block (result i32)
193 (call_indirect (type $sig)
194 (i32.const 0)
195 (i32.const 1) (i32.const 2) (br 0 (i32.const 23))
196 )
197 )
198 )
199 (func (export "as-call_indirect-all") (result i32)
200 (block (result i32) (call_indirect (type $sig) (br 0 (i32.const 24))))
201 )
202
203 (func (export "as-local.set-value") (result i32) (local f32)
204 (block (result i32) (local.set 0 (br 0 (i32.const 17))) (i32.const -1))
205 )
206 (func (export "as-local.tee-value") (result i32) (local i32)
207 (block (result i32) (local.tee 0 (br 0 (i32.const 1))))
208 )
209 (global $a (mut i32) (i32.const 10))
210 (func (export "as-global.set-value") (result i32)
211 (block (result i32) (global.set $a (br 0 (i32.const 1))))
212 )
213
214 (memory 1)
215 (func (export "as-load-address") (result f32)
216 (block (result f32) (f32.load (br 0 (f32.const 1.7))))
217 )
218 (func (export "as-loadN-address") (result i64)
219 (block (result i64) (i64.load8_s (br 0 (i64.const 30))))
220 )
221
222 (func (export "as-store-address") (result i32)
223 (block (result i32)
224 (f64.store (br 0 (i32.const 30)) (f64.const 7)) (i32.const -1)
225 )
226 )
227 (func (export "as-store-value") (result i32)
228 (block (result i32)
229 (i64.store (i32.const 2) (br 0 (i32.const 31))) (i32.const -1)
230 )
231 )
232 (func (export "as-store-both") (result i32)
233 (block (result i32)
234 (i64.store (br 0 (i32.const 32))) (i32.const -1)
235 )
236 )
237
238 (func (export "as-storeN-address") (result i32)
239 (block (result i32)
240 (i32.store8 (br 0 (i32.const 32)) (i32.const 7)) (i32.const -1)
241 )
242 )
243 (func (export "as-storeN-value") (result i32)
244 (block (result i32)
245 (i64.store16 (i32.const 2) (br 0 (i32.const 33))) (i32.const -1)
246 )
247 )
248 (func (export "as-storeN-both") (result i32)
249 (block (result i32)
250 (i64.store16 (br 0 (i32.const 34))) (i32.const -1)
251 )
252 )
253
254 (func (export "as-unary-operand") (result f32)
255 (block (result f32) (f32.neg (br 0 (f32.const 3.4))))
256 )
257
258 (func (export "as-binary-left") (result i32)
259 (block (result i32) (i32.add (br 0 (i32.const 3)) (i32.const 10)))
260 )
261 (func (export "as-binary-right") (result i64)
262 (block (result i64) (i64.sub (i64.const 10) (br 0 (i64.const 45))))
263 )
264 (func (export "as-binary-both") (result i32)
265 (block (result i32) (i32.add (br 0 (i32.const 46))))
266 )
267
268 (func (export "as-test-operand") (result i32)
269 (block (result i32) (i32.eqz (br 0 (i32.const 44))))
270 )
271
272 (func (export "as-compare-left") (result i32)
273 (block (result i32) (f64.le (br 0 (i32.const 43)) (f64.const 10)))
274 )
275 (func (export "as-compare-right") (result i32)
276 (block (result i32) (f32.ne (f32.const 10) (br 0 (i32.const 42))))
277 )
278 (func (export "as-compare-both") (result i32)
279 (block (result i32) (f64.le (br 0 (i32.const 44))))
280 )
281
282 (func (export "as-convert-operand") (result i32)
283 (block (result i32) (i32.wrap_i64 (br 0 (i32.const 41))))
284 )
285
286 (func (export "as-memory.grow-size") (result i32)
287 (block (result i32) (memory.grow (br 0 (i32.const 40))))
288 )
289
290 (func (export "nested-block-value") (result i32)
291 (i32.add
292 (i32.const 1)
293 (block (result i32)
294 (call $dummy)
295 (i32.add (i32.const 4) (br 0 (i32.const 8)))
296 )
297 )
298 )
299
300 (func (export "nested-br-value") (result i32)
301 (i32.add
302 (i32.const 1)
303 (block (result i32)
304 (drop (i32.const 2))
305 (drop
306 (block (result i32)
307 (drop (i32.const 4))
308 (br 0 (br 1 (i32.const 8)))
309 )
310 )
311 (i32.const 16)
312 )
313 )
314 )
315
316 (func (export "nested-br_if-value") (result i32)
317 (i32.add
318 (i32.const 1)
319 (block (result i32)
320 (drop (i32.const 2))
321 (drop
322 (block (result i32)
323 (drop (i32.const 4))
324 (drop (br_if 0 (br 1 (i32.const 8)) (i32.const 1)))
325 (i32.const 32)
326 )
327 )
328 (i32.const 16)
329 )
330 )
331 )
332
333 (func (export "nested-br_if-value-cond") (result i32)
334 (i32.add
335 (i32.const 1)
336 (block (result i32)
337 (drop (i32.const 2))
338 (drop (br_if 0 (i32.const 4) (br 0 (i32.const 8))))
339 (i32.const 16)
340 )
341 )
342 )
343
344 (func (export "nested-br_table-value") (result i32)
345 (i32.add
346 (i32.const 1)
347 (block (result i32)
348 (drop (i32.const 2))
349 (drop
350 (block (result i32)
351 (drop (i32.const 4))
352 (br_table 0 (br 1 (i32.const 8)) (i32.const 1))
353 )
354 )
355 (i32.const 16)
356 )
357 )
358 )
359
360 (func (export "nested-br_table-value-index") (result i32)
361 (i32.add
362 (i32.const 1)
363 (block (result i32)
364 (drop (i32.const 2))
365 (br_table 0 (i32.const 4) (br 0 (i32.const 8)))
366 (i32.const 16)
367 )
368 )
369 )
370)
371
372(assert_return (invoke "type-i32"))
373(assert_return (invoke "type-i64"))
374(assert_return (invoke "type-f32"))
375(assert_return (invoke "type-f64"))
376(assert_return (invoke "type-i32-i32"))
377(assert_return (invoke "type-i64-i64"))
378(assert_return (invoke "type-f32-f32"))
379(assert_return (invoke "type-f64-f64"))
380
381(assert_return (invoke "type-i32-value") (i32.const 1))
382(assert_return (invoke "type-i64-value") (i64.const 2))
383(assert_return (invoke "type-f32-value") (f32.const 3))
384(assert_return (invoke "type-f64-value") (f64.const 4))
385(assert_return (invoke "type-f64-f64-value") (f64.const 4) (f64.const 5))
386
387(assert_return (invoke "as-block-first"))
388(assert_return (invoke "as-block-mid"))
389(assert_return (invoke "as-block-last"))
390(assert_return (invoke "as-block-value") (i32.const 2))
391
392(assert_return (invoke "as-loop-first") (i32.const 3))
393(assert_return (invoke "as-loop-mid") (i32.const 4))
394(assert_return (invoke "as-loop-last") (i32.const 5))
395
396(assert_return (invoke "as-br-value") (i32.const 9))
397
398(assert_return (invoke "as-br_if-cond"))
399(assert_return (invoke "as-br_if-value") (i32.const 8))
400(assert_return (invoke "as-br_if-value-cond") (i32.const 9))
401
402(assert_return (invoke "as-br_table-index"))
403(assert_return (invoke "as-br_table-value") (i32.const 10))
404(assert_return (invoke "as-br_table-value-index") (i32.const 11))
405
406(assert_return (invoke "as-return-value") (i64.const 7))
407(assert_return (invoke "as-return-values") (i32.const 2) (i64.const 7))
408
409(assert_return (invoke "as-if-cond") (i32.const 2))
410(assert_return (invoke "as-if-then" (i32.const 1) (i32.const 6)) (i32.const 3))
411(assert_return (invoke "as-if-then" (i32.const 0) (i32.const 6)) (i32.const 6))
412(assert_return (invoke "as-if-else" (i32.const 0) (i32.const 6)) (i32.const 4))
413(assert_return (invoke "as-if-else" (i32.const 1) (i32.const 6)) (i32.const 6))
414
415(assert_return (invoke "as-select-first" (i32.const 0) (i32.const 6)) (i32.const 5))
416(assert_return (invoke "as-select-first" (i32.const 1) (i32.const 6)) (i32.const 5))
417(assert_return (invoke "as-select-second" (i32.const 0) (i32.const 6)) (i32.const 6))
418(assert_return (invoke "as-select-second" (i32.const 1) (i32.const 6)) (i32.const 6))
419(assert_return (invoke "as-select-cond") (i32.const 7))
420(assert_return (invoke "as-select-all") (i32.const 8))
421
422(assert_return (invoke "as-call-first") (i32.const 12))
423(assert_return (invoke "as-call-mid") (i32.const 13))
424(assert_return (invoke "as-call-last") (i32.const 14))
425(assert_return (invoke "as-call-all") (i32.const 15))
426
427(assert_return (invoke "as-call_indirect-func") (i32.const 20))
428(assert_return (invoke "as-call_indirect-first") (i32.const 21))
429(assert_return (invoke "as-call_indirect-mid") (i32.const 22))
430(assert_return (invoke "as-call_indirect-last") (i32.const 23))
431(assert_return (invoke "as-call_indirect-all") (i32.const 24))
432
433(assert_return (invoke "as-local.set-value") (i32.const 17))
434(assert_return (invoke "as-local.tee-value") (i32.const 1))
435(assert_return (invoke "as-global.set-value") (i32.const 1))
436
437(assert_return (invoke "as-load-address") (f32.const 1.7))
438(assert_return (invoke "as-loadN-address") (i64.const 30))
439
440(assert_return (invoke "as-store-address") (i32.const 30))
441(assert_return (invoke "as-store-value") (i32.const 31))
442(assert_return (invoke "as-store-both") (i32.const 32))
443(assert_return (invoke "as-storeN-address") (i32.const 32))
444(assert_return (invoke "as-storeN-value") (i32.const 33))
445(assert_return (invoke "as-storeN-both") (i32.const 34))
446
447(assert_return (invoke "as-unary-operand") (f32.const 3.4))
448
449(assert_return (invoke "as-binary-left") (i32.const 3))
450(assert_return (invoke "as-binary-right") (i64.const 45))
451(assert_return (invoke "as-binary-both") (i32.const 46))
452
453(assert_return (invoke "as-test-operand") (i32.const 44))
454
455(assert_return (invoke "as-compare-left") (i32.const 43))
456(assert_return (invoke "as-compare-right") (i32.const 42))
457(assert_return (invoke "as-compare-both") (i32.const 44))
458
459(assert_return (invoke "as-convert-operand") (i32.const 41))
460
461(assert_return (invoke "as-memory.grow-size") (i32.const 40))
462
463(assert_return (invoke "nested-block-value") (i32.const 9))
464(assert_return (invoke "nested-br-value") (i32.const 9))
465(assert_return (invoke "nested-br_if-value") (i32.const 9))
466(assert_return (invoke "nested-br_if-value-cond") (i32.const 9))
467(assert_return (invoke "nested-br_table-value") (i32.const 9))
468(assert_return (invoke "nested-br_table-value-index") (i32.const 9))
469
470(assert_invalid
471 (module (func $type-arg-empty-vs-num (result i32)
472 (block (result i32) (br 0) (i32.const 1))
473 ))
474 "type mismatch"
475)
476
477(assert_invalid
478 (module (func $type-arg-void-vs-num (result i32)
479 (block (result i32) (br 0 (nop)) (i32.const 1))
480 ))
481 "type mismatch"
482)
483(assert_invalid
484 (module (func $type-arg-void-vs-num-nested (result i32)
485 (block (result i32) (i32.const 0) (block (br 1)))
486 ))
487 "type mismatch"
488)
489(assert_invalid
490 (module (func $type-arg-num-vs-num (result i32)
491 (block (result i32) (br 0 (i64.const 1)) (i32.const 1))
492 ))
493 "type mismatch"
494)
495
496(assert_invalid
497 (module
498 (func $type-arg-empty-in-br
499 (i32.const 0)
500 (block (result i32) (br 0 (br 0))) (i32.eqz) (drop)
501 )
502 )
503 "type mismatch"
504)
505(assert_invalid
506 (module
507 (func $type-arg-empty-in-br_if
508 (i32.const 0)
509 (block (result i32) (br_if 0 (br 0) (i32.const 1))) (i32.eqz) (drop)
510 )
511 )
512 "type mismatch"
513)
514(assert_invalid
515 (module
516 (func $type-arg-empty-in-br_table
517 (i32.const 0)
518 (block (result i32) (br_table 0 (br 0))) (i32.eqz) (drop)
519 )
520 )
521 "type mismatch"
522)
523(assert_invalid
524 (module
525 (func $type-arg-empty-in-return
526 (block (result i32)
527 (return (br 0))
528 )
529 (i32.eqz) (drop)
530 )
531 )
532 "type mismatch"
533)
534(assert_invalid
535 (module
536 (func $type-arg-empty-in-select
537 (block (result i32)
538 (select (br 0) (i32.const 1) (i32.const 2))
539 )
540 (i32.eqz) (drop)
541 )
542 )
543 "type mismatch"
544)
545(assert_invalid
546 (module
547 (func $type-arg-empty-in-call
548 (block (result i32)
549 (call 1 (br 0))
550 )
551 (i32.eqz) (drop)
552 )
553 (func (param i32) (result i32) (local.get 0))
554 )
555 "type mismatch"
556)
557(assert_invalid
558 (module
559 (func $f (param i32) (result i32) (local.get 0))
560 (type $sig (func (param i32) (result i32)))
561 (table funcref (elem $f))
562 (func $type-arg-empty-in-call_indirect
563 (block (result i32)
564 (call_indirect (type $sig)
565 (br 0) (i32.const 0)
566 )
567 )
568 (i32.eqz) (drop)
569 )
570 )
571 "type mismatch"
572)
573(assert_invalid
574 (module
575 (func $type-arg-empty-in-local.set
576 (local i32)
577 (block (result i32)
578 (local.set 0 (br 0)) (local.get 0)
579 )
580 (i32.eqz) (drop)
581 )
582 )
583 "type mismatch"
584)
585(assert_invalid
586 (module
587 (func $type-arg-empty-in-local.tee
588 (local i32)
589 (block (result i32)
590 (local.tee 0 (br 0))
591 )
592 (i32.eqz) (drop)
593 )
594 )
595 "type mismatch"
596)
597(assert_invalid
598 (module
599 (global $x (mut i32) (i32.const 0))
600 (func $type-arg-empty-in-global.set
601 (block (result i32)
602 (global.set $x (br 0)) (global.get $x)
603 )
604 (i32.eqz) (drop)
605 )
606 )
607 "type mismatch"
608)
609(assert_invalid
610 (module
611 (memory 0)
612 (func $type-arg-empty-in-memory.grow
613 (block (result i32)
614 (memory.grow (br 0))
615 )
616 (i32.eqz) (drop)
617 )
618 )
619 "type mismatch"
620)
621(assert_invalid
622 (module
623 (memory 1)
624 (func $type-arg-empty-in-load
625 (block (result i32)
626 (i32.load (br 0))
627 )
628 (i32.eqz) (drop)
629 )
630 )
631 "type mismatch"
632)
633(assert_invalid
634 (module
635 (memory 1)
636 (func $type-arg-empty-in-store
637 (block (result i32)
638 (i32.store (br 0) (i32.const 0))
639 )
640 (i32.eqz) (drop)
641 )
642 )
643 "type mismatch"
644)
645
646(assert_invalid
647 (module (func $unbound-label (br 1)))
648 "unknown label"
649)
650(assert_invalid
651 (module (func $unbound-nested-label (block (block (br 5)))))
652 "unknown label"
653)
654(assert_invalid
655 (module (func $large-label (br 0x10000001)))
656 "unknown label"
657)
View as plain text