da34947f6279ea009ff31e7b3821b944b492cfa7
[platform/framework/web/lwnode.git] /
1 ;; Test alignment annotation rules
2
3 (module (memory i64 0) (func (drop (i32.load8_s align=1 (i64.const 0)))))
4 (module (memory i64 0) (func (drop (i32.load8_u align=1 (i64.const 0)))))
5 (module (memory i64 0) (func (drop (i32.load16_s align=2 (i64.const 0)))))
6 (module (memory i64 0) (func (drop (i32.load16_u align=2 (i64.const 0)))))
7 (module (memory i64 0) (func (drop (i32.load align=4 (i64.const 0)))))
8 (module (memory i64 0) (func (drop (i64.load8_s align=1 (i64.const 0)))))
9 (module (memory i64 0) (func (drop (i64.load8_u align=1 (i64.const 0)))))
10 (module (memory i64 0) (func (drop (i64.load16_s align=2 (i64.const 0)))))
11 (module (memory i64 0) (func (drop (i64.load16_u align=2 (i64.const 0)))))
12 (module (memory i64 0) (func (drop (i64.load32_s align=4 (i64.const 0)))))
13 (module (memory i64 0) (func (drop (i64.load32_u align=4 (i64.const 0)))))
14 (module (memory i64 0) (func (drop (i64.load align=8 (i64.const 0)))))
15 (module (memory i64 0) (func (drop (f32.load align=4 (i64.const 0)))))
16 (module (memory i64 0) (func (drop (f64.load align=8 (i64.const 0)))))
17 (module (memory i64 0) (func (i32.store8 align=1 (i64.const 0) (i32.const 1))))
18 (module (memory i64 0) (func (i32.store16 align=2 (i64.const 0) (i32.const 1))))
19 (module (memory i64 0) (func (i32.store align=4 (i64.const 0) (i32.const 1))))
20 (module (memory i64 0) (func (i64.store8 align=1 (i64.const 0) (i64.const 1))))
21 (module (memory i64 0) (func (i64.store16 align=2 (i64.const 0) (i64.const 1))))
22 (module (memory i64 0) (func (i64.store32 align=4 (i64.const 0) (i64.const 1))))
23 (module (memory i64 0) (func (i64.store align=8 (i64.const 0) (i64.const 1))))
24 (module (memory i64 0) (func (f32.store align=4 (i64.const 0) (f32.const 1.0))))
25 (module (memory i64 0) (func (f64.store align=8 (i64.const 0) (f64.const 1.0))))
26
27 (assert_malformed
28   (module quote
29     "(module (memory i64 0) (func (drop (i32.load8_s align=0 (i64.const 0)))))"
30   )
31   "alignment"
32 )
33 (assert_malformed
34   (module quote
35     "(module (memory i64 0) (func (drop (i32.load8_s align=7 (i64.const 0)))))"
36   )
37   "alignment"
38 )
39 (assert_malformed
40   (module quote
41     "(module (memory i64 0) (func (drop (i32.load8_u align=0 (i64.const 0)))))"
42   )
43   "alignment"
44 )
45 (assert_malformed
46   (module quote
47     "(module (memory i64 0) (func (drop (i32.load8_u align=7 (i64.const 0)))))"
48   )
49   "alignment"
50 )
51 (assert_malformed
52   (module quote
53     "(module (memory i64 0) (func (drop (i32.load16_s align=0 (i64.const 0)))))"
54   )
55   "alignment"
56 )
57 (assert_malformed
58   (module quote
59     "(module (memory i64 0) (func (drop (i32.load16_s align=7 (i64.const 0)))))"
60   )
61   "alignment"
62 )
63 (assert_malformed
64   (module quote
65     "(module (memory i64 0) (func (drop (i32.load16_u align=0 (i64.const 0)))))"
66   )
67   "alignment"
68 )
69 (assert_malformed
70   (module quote
71     "(module (memory i64 0) (func (drop (i32.load16_u align=7 (i64.const 0)))))"
72   )
73   "alignment"
74 )
75 (assert_malformed
76   (module quote
77     "(module (memory i64 0) (func (drop (i32.load align=0 (i64.const 0)))))"
78   )
79   "alignment"
80 )
81 (assert_malformed
82   (module quote
83     "(module (memory i64 0) (func (drop (i32.load align=7 (i64.const 0)))))"
84   )
85   "alignment"
86 )
87 (assert_malformed
88   (module quote
89     "(module (memory i64 0) (func (drop (i64.load8_s align=0 (i64.const 0)))))"
90   )
91   "alignment"
92 )
93 (assert_malformed
94   (module quote
95     "(module (memory i64 0) (func (drop (i64.load8_s align=7 (i64.const 0)))))"
96   )
97   "alignment"
98 )
99 (assert_malformed
100   (module quote
101     "(module (memory i64 0) (func (drop (i64.load8_u align=0 (i64.const 0)))))"
102   )
103   "alignment"
104 )
105 (assert_malformed
106   (module quote
107     "(module (memory i64 0) (func (drop (i64.load8_u align=7 (i64.const 0)))))"
108   )
109   "alignment"
110 )
111 (assert_malformed
112   (module quote
113     "(module (memory i64 0) (func (drop (i64.load16_s align=0 (i64.const 0)))))"
114   )
115   "alignment"
116 )
117 (assert_malformed
118   (module quote
119     "(module (memory i64 0) (func (drop (i64.load16_s align=7 (i64.const 0)))))"
120   )
121   "alignment"
122 )
123 (assert_malformed
124   (module quote
125     "(module (memory i64 0) (func (drop (i64.load16_u align=0 (i64.const 0)))))"
126   )
127   "alignment"
128 )
129 (assert_malformed
130   (module quote
131     "(module (memory i64 0) (func (drop (i64.load16_u align=7 (i64.const 0)))))"
132   )
133   "alignment"
134 )
135 (assert_malformed
136   (module quote
137     "(module (memory i64 0) (func (drop (i64.load32_s align=0 (i64.const 0)))))"
138   )
139   "alignment"
140 )
141 (assert_malformed
142   (module quote
143     "(module (memory i64 0) (func (drop (i64.load32_s align=7 (i64.const 0)))))"
144   )
145   "alignment"
146 )
147 (assert_malformed
148   (module quote
149     "(module (memory i64 0) (func (drop (i64.load32_u align=0 (i64.const 0)))))"
150   )
151   "alignment"
152 )
153 (assert_malformed
154   (module quote
155     "(module (memory i64 0) (func (drop (i64.load32_u align=7 (i64.const 0)))))"
156   )
157   "alignment"
158 )
159 (assert_malformed
160   (module quote
161     "(module (memory i64 0) (func (drop (i64.load align=0 (i64.const 0)))))"
162   )
163   "alignment"
164 )
165 (assert_malformed
166   (module quote
167     "(module (memory i64 0) (func (drop (i64.load align=7 (i64.const 0)))))"
168   )
169   "alignment"
170 )
171 (assert_malformed
172   (module quote
173     "(module (memory i64 0) (func (drop (f32.load align=0 (i64.const 0)))))"
174   )
175   "alignment"
176 )
177 (assert_malformed
178   (module quote
179     "(module (memory i64 0) (func (drop (f32.load align=7 (i64.const 0)))))"
180   )
181   "alignment"
182 )
183 (assert_malformed
184   (module quote
185     "(module (memory i64 0) (func (drop (f64.load align=0 (i64.const 0)))))"
186   )
187   "alignment"
188 )
189 (assert_malformed
190   (module quote
191     "(module (memory i64 0) (func (drop (f64.load align=7 (i64.const 0)))))"
192   )
193   "alignment"
194 )
195
196 (assert_malformed
197   (module quote
198     "(module (memory i64 0) (func (i32.store8 align=0 (i64.const 0) (i32.const 0))))"
199   )
200   "alignment"
201 )
202 (assert_malformed
203   (module quote
204     "(module (memory i64 0) (func (i32.store8 align=7 (i64.const 0) (i32.const 0))))"
205   )
206   "alignment"
207 )
208 (assert_malformed
209   (module quote
210     "(module (memory i64 0) (func (i32.store16 align=0 (i64.const 0) (i32.const 0))))"
211   )
212   "alignment"
213 )
214 (assert_malformed
215   (module quote
216     "(module (memory i64 0) (func (i32.store16 align=7 (i64.const 0) (i32.const 0))))"
217   )
218   "alignment"
219 )
220 (assert_malformed
221   (module quote
222     "(module (memory i64 0) (func (i32.store align=0 (i64.const 0) (i32.const 0))))"
223   )
224   "alignment"
225 )
226 (assert_malformed
227   (module quote
228     "(module (memory i64 0) (func (i32.store align=7 (i64.const 0) (i32.const 0))))"
229   )
230   "alignment"
231 )
232 (assert_malformed
233   (module quote
234     "(module (memory i64 0) (func (i64.store8 align=0 (i64.const 0) (i64.const 0))))"
235   )
236   "alignment"
237 )
238 (assert_malformed
239   (module quote
240     "(module (memory i64 0) (func (i64.store8 align=7 (i64.const 0) (i64.const 0))))"
241   )
242   "alignment"
243 )
244 (assert_malformed
245   (module quote
246     "(module (memory i64 0) (func (i64.store16 align=0 (i64.const 0) (i64.const 0))))"
247   )
248   "alignment"
249 )
250 (assert_malformed
251   (module quote
252     "(module (memory i64 0) (func (i64.store16 align=7 (i64.const 0) (i64.const 0))))"
253   )
254   "alignment"
255 )
256 (assert_malformed
257   (module quote
258     "(module (memory i64 0) (func (i64.store32 align=0 (i64.const 0) (i64.const 0))))"
259   )
260   "alignment"
261 )
262 (assert_malformed
263   (module quote
264     "(module (memory i64 0) (func (i64.store32 align=7 (i64.const 0) (i64.const 0))))"
265   )
266   "alignment"
267 )
268 (assert_malformed
269   (module quote
270     "(module (memory i64 0) (func (i64.store align=0 (i64.const 0) (i64.const 0))))"
271   )
272   "alignment"
273 )
274 (assert_malformed
275   (module quote
276     "(module (memory i64 0) (func (i64.store align=7 (i64.const 0) (i64.const 0))))"
277   )
278   "alignment"
279 )
280 (assert_malformed
281   (module quote
282     "(module (memory i64 0) (func (f32.store align=0 (i64.const 0) (f32.const 0))))"
283   )
284   "alignment"
285 )
286 (assert_malformed
287   (module quote
288     "(module (memory i64 0) (func (f32.store align=7 (i64.const 0) (f32.const 0))))"
289   )
290   "alignment"
291 )
292 (assert_malformed
293   (module quote
294     "(module (memory i64 0) (func (f64.store align=0 (i64.const 0) (f32.const 0))))"
295   )
296   "alignment"
297 )
298 (assert_malformed
299   (module quote
300     "(module (memory i64 0) (func (f64.store align=7 (i64.const 0) (f32.const 0))))"
301   )
302   "alignment"
303 )
304
305 (assert_invalid
306   (module (memory i64 0) (func (drop (i32.load8_s align=2 (i64.const 0)))))
307   "alignment must not be larger than natural"
308 )
309 (assert_invalid
310   (module (memory i64 0) (func (drop (i32.load8_u align=2 (i64.const 0)))))
311   "alignment must not be larger than natural"
312 )
313 (assert_invalid
314   (module (memory i64 0) (func (drop (i32.load16_s align=4 (i64.const 0)))))
315   "alignment must not be larger than natural"
316 )
317 (assert_invalid
318   (module (memory i64 0) (func (drop (i32.load16_u align=4 (i64.const 0)))))
319   "alignment must not be larger than natural"
320 )
321 (assert_invalid
322   (module (memory i64 0) (func (drop (i32.load align=8 (i64.const 0)))))
323   "alignment must not be larger than natural"
324 )
325 (assert_invalid
326   (module (memory i64 0) (func (drop (i64.load8_s align=2 (i64.const 0)))))
327   "alignment must not be larger than natural"
328 )
329 (assert_invalid
330   (module (memory i64 0) (func (drop (i64.load8_u align=2 (i64.const 0)))))
331   "alignment must not be larger than natural"
332 )
333 (assert_invalid
334   (module (memory i64 0) (func (drop (i64.load16_s align=4 (i64.const 0)))))
335   "alignment must not be larger than natural"
336 )
337 (assert_invalid
338   (module (memory i64 0) (func (drop (i64.load16_u align=4 (i64.const 0)))))
339   "alignment must not be larger than natural"
340 )
341 (assert_invalid
342   (module (memory i64 0) (func (drop (i64.load32_s align=8 (i64.const 0)))))
343   "alignment must not be larger than natural"
344 )
345 (assert_invalid
346   (module (memory i64 0) (func (drop (i64.load32_u align=8 (i64.const 0)))))
347   "alignment must not be larger than natural"
348 )
349 (assert_invalid
350   (module (memory i64 0) (func (drop (i64.load align=16 (i64.const 0)))))
351   "alignment must not be larger than natural"
352 )
353 (assert_invalid
354   (module (memory i64 0) (func (drop (f32.load align=8 (i64.const 0)))))
355   "alignment must not be larger than natural"
356 )
357 (assert_invalid
358   (module (memory i64 0) (func (drop (f64.load align=16 (i64.const 0)))))
359   "alignment must not be larger than natural"
360 )
361
362 (assert_invalid
363   (module (memory i64 0) (func (drop (i32.load8_s align=2 (i64.const 0)))))
364   "alignment must not be larger than natural"
365 )
366 (assert_invalid
367   (module (memory i64 0) (func (drop (i32.load8_u align=2 (i64.const 0)))))
368   "alignment must not be larger than natural"
369 )
370 (assert_invalid
371   (module (memory i64 0) (func (drop (i32.load16_s align=4 (i64.const 0)))))
372   "alignment must not be larger than natural"
373 )
374 (assert_invalid
375   (module (memory i64 0) (func (drop (i32.load16_u align=4 (i64.const 0)))))
376   "alignment must not be larger than natural"
377 )
378 (assert_invalid
379   (module (memory i64 0) (func (drop (i32.load align=8 (i64.const 0)))))
380   "alignment must not be larger than natural"
381 )
382 (assert_invalid
383   (module (memory i64 0) (func (drop (i64.load8_s align=2 (i64.const 0)))))
384   "alignment must not be larger than natural"
385 )
386 (assert_invalid
387   (module (memory i64 0) (func (drop (i64.load8_u align=2 (i64.const 0)))))
388   "alignment must not be larger than natural"
389 )
390 (assert_invalid
391   (module (memory i64 0) (func (drop (i64.load16_s align=4 (i64.const 0)))))
392   "alignment must not be larger than natural"
393 )
394 (assert_invalid
395   (module (memory i64 0) (func (drop (i64.load16_u align=4 (i64.const 0)))))
396   "alignment must not be larger than natural"
397 )
398 (assert_invalid
399   (module (memory i64 0) (func (drop (i64.load32_s align=8 (i64.const 0)))))
400   "alignment must not be larger than natural"
401 )
402 (assert_invalid
403   (module (memory i64 0) (func (drop (i64.load32_u align=8 (i64.const 0)))))
404   "alignment must not be larger than natural"
405 )
406 (assert_invalid
407   (module (memory i64 0) (func (drop (i64.load align=16 (i64.const 0)))))
408   "alignment must not be larger than natural"
409 )
410 (assert_invalid
411   (module (memory i64 0) (func (drop (f32.load align=8 (i64.const 0)))))
412   "alignment must not be larger than natural"
413 )
414 (assert_invalid
415   (module (memory i64 0) (func (drop (f64.load align=16 (i64.const 0)))))
416   "alignment must not be larger than natural"
417 )
418
419 (assert_invalid
420   (module (memory i64 0) (func (i32.store8 align=2 (i64.const 0) (i32.const 0))))
421   "alignment must not be larger than natural"
422 )
423 (assert_invalid
424   (module (memory i64 0) (func (i32.store16 align=4 (i64.const 0) (i32.const 0))))
425   "alignment must not be larger than natural"
426 )
427 (assert_invalid
428   (module (memory i64 0) (func (i32.store align=8 (i64.const 0) (i32.const 0))))
429   "alignment must not be larger than natural"
430 )
431 (assert_invalid
432   (module (memory i64 0) (func (i64.store8 align=2 (i64.const 0) (i64.const 0))))
433   "alignment must not be larger than natural"
434 )
435 (assert_invalid
436   (module (memory i64 0) (func (i64.store16 align=4 (i64.const 0) (i64.const 0))))
437   "alignment must not be larger than natural"
438 )
439 (assert_invalid
440   (module (memory i64 0) (func (i64.store32 align=8 (i64.const 0) (i64.const 0))))
441   "alignment must not be larger than natural"
442 )
443 (assert_invalid
444   (module (memory i64 0) (func (i64.store align=16 (i64.const 0) (i64.const 0))))
445   "alignment must not be larger than natural"
446 )
447 (assert_invalid
448   (module (memory i64 0) (func (f32.store align=8 (i64.const 0) (f32.const 0))))
449   "alignment must not be larger than natural"
450 )
451 (assert_invalid
452   (module (memory i64 0) (func (f64.store align=16 (i64.const 0) (f64.const 0))))
453   "alignment must not be larger than natural"
454 )
455
456 ;; Test aligned and unaligned read/write
457
458 (module
459   (memory i64 1)
460
461   ;; $default: natural alignment, $1: align=1, $2: align=2, $4: align=4, $8: align=8
462
463   (func (export "f32_align_switch") (param i32) (result f32)
464     (local f32 f32)
465     (local.set 1 (f32.const 10.0))
466     (block $4
467       (block $2
468         (block $1
469           (block $default
470             (block $0
471               (br_table $0 $default $1 $2 $4 (local.get 0))
472             ) ;; 0
473             (f32.store (i64.const 0) (local.get 1))
474             (local.set 2 (f32.load (i64.const 0)))
475             (br $4)
476           ) ;; default
477           (f32.store align=1 (i64.const 0) (local.get 1))
478           (local.set 2 (f32.load align=1 (i64.const 0)))
479           (br $4)
480         ) ;; 1
481         (f32.store align=2 (i64.const 0) (local.get 1))
482         (local.set 2 (f32.load align=2 (i64.const 0)))
483         (br $4)
484       ) ;; 2
485       (f32.store align=4 (i64.const 0) (local.get 1))
486       (local.set 2 (f32.load align=4 (i64.const 0)))
487     ) ;; 4
488     (local.get 2)
489   )
490
491   (func (export "f64_align_switch") (param i32) (result f64)
492     (local f64 f64)
493     (local.set 1 (f64.const 10.0))
494     (block $8
495       (block $4
496         (block $2
497           (block $1
498             (block $default
499               (block $0
500                 (br_table $0 $default $1 $2 $4 $8 (local.get 0))
501               ) ;; 0
502               (f64.store (i64.const 0) (local.get 1))
503               (local.set 2 (f64.load (i64.const 0)))
504               (br $8)
505             ) ;; default
506             (f64.store align=1 (i64.const 0) (local.get 1))
507             (local.set 2 (f64.load align=1 (i64.const 0)))
508             (br $8)
509           ) ;; 1
510           (f64.store align=2 (i64.const 0) (local.get 1))
511           (local.set 2 (f64.load align=2 (i64.const 0)))
512           (br $8)
513         ) ;; 2
514         (f64.store align=4 (i64.const 0) (local.get 1))
515         (local.set 2 (f64.load align=4 (i64.const 0)))
516         (br $8)
517       ) ;; 4
518       (f64.store align=8 (i64.const 0) (local.get 1))
519       (local.set 2 (f64.load align=8 (i64.const 0)))
520     ) ;; 8
521     (local.get 2)
522   )
523
524   ;; $8s: i32/i64.load8_s, $8u: i32/i64.load8_u, $16s: i32/i64.load16_s, $16u: i32/i64.load16_u, $32: i32.load
525   ;; $32s: i64.load32_s, $32u: i64.load32_u, $64: i64.load
526
527   (func (export "i32_align_switch") (param i32 i32) (result i32)
528     (local i32 i32)
529     (local.set 2 (i32.const 10))
530     (block $32
531       (block $16u
532         (block $16s
533           (block $8u
534             (block $8s
535               (block $0
536                 (br_table $0 $8s $8u $16s $16u $32 (local.get 0))
537               ) ;; 0
538               (if (i32.eq (local.get 1) (i32.const 0))
539                 (then
540                   (i32.store8 (i64.const 0) (local.get 2))
541                   (local.set 3 (i32.load8_s (i64.const 0)))
542                 )
543               )
544               (if (i32.eq (local.get 1) (i32.const 1))
545                 (then
546                   (i32.store8 align=1 (i64.const 0) (local.get 2))
547                   (local.set 3 (i32.load8_s align=1 (i64.const 0)))
548                 )
549               )
550               (br $32)
551             ) ;; 8s
552             (if (i32.eq (local.get 1) (i32.const 0))
553               (then
554                 (i32.store8 (i64.const 0) (local.get 2))
555                 (local.set 3 (i32.load8_u (i64.const 0)))
556               )
557             )
558             (if (i32.eq (local.get 1) (i32.const 1))
559               (then
560                 (i32.store8 align=1 (i64.const 0) (local.get 2))
561                 (local.set 3 (i32.load8_u align=1 (i64.const 0)))
562               )
563             )
564             (br $32)
565           ) ;; 8u
566           (if (i32.eq (local.get 1) (i32.const 0))
567             (then
568               (i32.store16 (i64.const 0) (local.get 2))
569               (local.set 3 (i32.load16_s (i64.const 0)))
570             )
571           )
572           (if (i32.eq (local.get 1) (i32.const 1))
573             (then
574               (i32.store16 align=1 (i64.const 0) (local.get 2))
575               (local.set 3 (i32.load16_s align=1 (i64.const 0)))
576             )
577           )
578           (if (i32.eq (local.get 1) (i32.const 2))
579             (then
580               (i32.store16 align=2 (i64.const 0) (local.get 2))
581               (local.set 3 (i32.load16_s align=2 (i64.const 0)))
582             )
583           )
584           (br $32)
585         ) ;; 16s
586         (if (i32.eq (local.get 1) (i32.const 0))
587           (then
588             (i32.store16 (i64.const 0) (local.get 2))
589             (local.set 3 (i32.load16_u (i64.const 0)))
590           )
591         )
592         (if (i32.eq (local.get 1) (i32.const 1))
593           (then
594             (i32.store16 align=1 (i64.const 0) (local.get 2))
595             (local.set 3 (i32.load16_u align=1 (i64.const 0)))
596           )
597         )
598         (if (i32.eq (local.get 1) (i32.const 2))
599           (then
600             (i32.store16 align=2 (i64.const 0) (local.get 2))
601             (local.set 3 (i32.load16_u align=2 (i64.const 0)))
602           )
603         )
604         (br $32)
605       ) ;; 16u
606       (if (i32.eq (local.get 1) (i32.const 0))
607         (then
608           (i32.store (i64.const 0) (local.get 2))
609           (local.set 3 (i32.load (i64.const 0)))
610         )
611       )
612       (if (i32.eq (local.get 1) (i32.const 1))
613         (then
614           (i32.store align=1 (i64.const 0) (local.get 2))
615           (local.set 3 (i32.load align=1 (i64.const 0)))
616         )
617       )
618       (if (i32.eq (local.get 1) (i32.const 2))
619         (then
620           (i32.store align=2 (i64.const 0) (local.get 2))
621           (local.set 3 (i32.load align=2 (i64.const 0)))
622         )
623       )
624       (if (i32.eq (local.get 1) (i32.const 4))
625         (then
626           (i32.store align=4 (i64.const 0) (local.get 2))
627           (local.set 3 (i32.load align=4 (i64.const 0)))
628         )
629       )
630     ) ;; 32
631     (local.get 3)
632   )
633
634   (func (export "i64_align_switch") (param i32 i32) (result i64)
635     (local i64 i64)
636     (local.set 2 (i64.const 10))
637     (block $64
638       (block $32u
639         (block $32s
640           (block $16u
641             (block $16s
642               (block $8u
643                 (block $8s
644                   (block $0
645                     (br_table $0 $8s $8u $16s $16u $32s $32u $64 (local.get 0))
646                   ) ;; 0
647                   (if (i32.eq (local.get 1) (i32.const 0))
648                     (then
649                       (i64.store8 (i64.const 0) (local.get 2))
650                       (local.set 3 (i64.load8_s (i64.const 0)))
651                     )
652                   )
653                   (if (i32.eq (local.get 1) (i32.const 1))
654                     (then
655                       (i64.store8 align=1 (i64.const 0) (local.get 2))
656                       (local.set 3 (i64.load8_s align=1 (i64.const 0)))
657                     )
658                   )
659                   (br $64)
660                 ) ;; 8s
661                 (if (i32.eq (local.get 1) (i32.const 0))
662                   (then
663                     (i64.store8 (i64.const 0) (local.get 2))
664                     (local.set 3 (i64.load8_u (i64.const 0)))
665                   )
666                 )
667                 (if (i32.eq (local.get 1) (i32.const 1))
668                   (then
669                     (i64.store8 align=1 (i64.const 0) (local.get 2))
670                     (local.set 3 (i64.load8_u align=1 (i64.const 0)))
671                   )
672                 )
673                 (br $64)
674               ) ;; 8u
675               (if (i32.eq (local.get 1) (i32.const 0))
676                 (then
677                   (i64.store16 (i64.const 0) (local.get 2))
678                   (local.set 3 (i64.load16_s (i64.const 0)))
679                 )
680               )
681               (if (i32.eq (local.get 1) (i32.const 1))
682                 (then
683                   (i64.store16 align=1 (i64.const 0) (local.get 2))
684                   (local.set 3 (i64.load16_s align=1 (i64.const 0)))
685                 )
686               )
687               (if (i32.eq (local.get 1) (i32.const 2))
688                 (then
689                   (i64.store16 align=2 (i64.const 0) (local.get 2))
690                   (local.set 3 (i64.load16_s align=2 (i64.const 0)))
691                 )
692               )
693               (br $64)
694             ) ;; 16s
695             (if (i32.eq (local.get 1) (i32.const 0))
696               (then
697                 (i64.store16 (i64.const 0) (local.get 2))
698                 (local.set 3 (i64.load16_u (i64.const 0)))
699               )
700             )
701             (if (i32.eq (local.get 1) (i32.const 1))
702               (then
703                 (i64.store16 align=1 (i64.const 0) (local.get 2))
704                 (local.set 3 (i64.load16_u align=1 (i64.const 0)))
705               )
706             )
707             (if (i32.eq (local.get 1) (i32.const 2))
708               (then
709                 (i64.store16 align=2 (i64.const 0) (local.get 2))
710                 (local.set 3 (i64.load16_u align=2 (i64.const 0)))
711               )
712             )
713             (br $64)
714           ) ;; 16u
715           (if (i32.eq (local.get 1) (i32.const 0))
716             (then
717               (i64.store32 (i64.const 0) (local.get 2))
718               (local.set 3 (i64.load32_s (i64.const 0)))
719             )
720           )
721           (if (i32.eq (local.get 1) (i32.const 1))
722             (then
723               (i64.store32 align=1 (i64.const 0) (local.get 2))
724               (local.set 3 (i64.load32_s align=1 (i64.const 0)))
725             )
726           )
727           (if (i32.eq (local.get 1) (i32.const 2))
728             (then
729               (i64.store32 align=2 (i64.const 0) (local.get 2))
730               (local.set 3 (i64.load32_s align=2 (i64.const 0)))
731             )
732           )
733           (if (i32.eq (local.get 1) (i32.const 4))
734             (then
735               (i64.store32 align=4 (i64.const 0) (local.get 2))
736               (local.set 3 (i64.load32_s align=4 (i64.const 0)))
737             )
738           )
739           (br $64)
740         ) ;; 32s
741         (if (i32.eq (local.get 1) (i32.const 0))
742           (then
743             (i64.store32 (i64.const 0) (local.get 2))
744             (local.set 3 (i64.load32_u (i64.const 0)))
745           )
746         )
747         (if (i32.eq (local.get 1) (i32.const 1))
748           (then
749             (i64.store32 align=1 (i64.const 0) (local.get 2))
750             (local.set 3 (i64.load32_u align=1 (i64.const 0)))
751           )
752         )
753         (if (i32.eq (local.get 1) (i32.const 2))
754           (then
755             (i64.store32 align=2 (i64.const 0) (local.get 2))
756             (local.set 3 (i64.load32_u align=2 (i64.const 0)))
757           )
758         )
759         (if (i32.eq (local.get 1) (i32.const 4))
760           (then
761             (i64.store32 align=4 (i64.const 0) (local.get 2))
762             (local.set 3 (i64.load32_u align=4 (i64.const 0)))
763           )
764         )
765         (br $64)
766       ) ;; 32u
767       (if (i32.eq (local.get 1) (i32.const 0))
768         (then
769           (i64.store (i64.const 0) (local.get 2))
770           (local.set 3 (i64.load (i64.const 0)))
771         )
772       )
773       (if (i32.eq (local.get 1) (i32.const 1))
774         (then
775           (i64.store align=1 (i64.const 0) (local.get 2))
776           (local.set 3 (i64.load align=1 (i64.const 0)))
777         )
778       )
779       (if (i32.eq (local.get 1) (i32.const 2))
780         (then
781           (i64.store align=2 (i64.const 0) (local.get 2))
782           (local.set 3 (i64.load align=2 (i64.const 0)))
783         )
784       )
785       (if (i32.eq (local.get 1) (i32.const 4))
786         (then
787           (i64.store align=4 (i64.const 0) (local.get 2))
788           (local.set 3 (i64.load align=4 (i64.const 0)))
789         )
790       )
791       (if (i32.eq (local.get 1) (i32.const 8))
792         (then
793           (i64.store align=8 (i64.const 0) (local.get 2))
794           (local.set 3 (i64.load align=8 (i64.const 0)))
795         )
796       )
797     ) ;; 64
798     (local.get 3)
799   )
800 )
801
802 (assert_return (invoke "f32_align_switch" (i32.const 0)) (f32.const 10.0))
803 (assert_return (invoke "f32_align_switch" (i32.const 1)) (f32.const 10.0))
804 (assert_return (invoke "f32_align_switch" (i32.const 2)) (f32.const 10.0))
805 (assert_return (invoke "f32_align_switch" (i32.const 3)) (f32.const 10.0))
806
807 (assert_return (invoke "f64_align_switch" (i32.const 0)) (f64.const 10.0))
808 (assert_return (invoke "f64_align_switch" (i32.const 1)) (f64.const 10.0))
809 (assert_return (invoke "f64_align_switch" (i32.const 2)) (f64.const 10.0))
810 (assert_return (invoke "f64_align_switch" (i32.const 3)) (f64.const 10.0))
811 (assert_return (invoke "f64_align_switch" (i32.const 4)) (f64.const 10.0))
812
813 (assert_return (invoke "i32_align_switch" (i32.const 0) (i32.const 0)) (i32.const 10))
814 (assert_return (invoke "i32_align_switch" (i32.const 0) (i32.const 1)) (i32.const 10))
815 (assert_return (invoke "i32_align_switch" (i32.const 1) (i32.const 0)) (i32.const 10))
816 (assert_return (invoke "i32_align_switch" (i32.const 1) (i32.const 1)) (i32.const 10))
817 (assert_return (invoke "i32_align_switch" (i32.const 2) (i32.const 0)) (i32.const 10))
818 (assert_return (invoke "i32_align_switch" (i32.const 2) (i32.const 1)) (i32.const 10))
819 (assert_return (invoke "i32_align_switch" (i32.const 2) (i32.const 2)) (i32.const 10))
820 (assert_return (invoke "i32_align_switch" (i32.const 3) (i32.const 0)) (i32.const 10))
821 (assert_return (invoke "i32_align_switch" (i32.const 3) (i32.const 1)) (i32.const 10))
822 (assert_return (invoke "i32_align_switch" (i32.const 3) (i32.const 2)) (i32.const 10))
823 (assert_return (invoke "i32_align_switch" (i32.const 4) (i32.const 0)) (i32.const 10))
824 (assert_return (invoke "i32_align_switch" (i32.const 4) (i32.const 1)) (i32.const 10))
825 (assert_return (invoke "i32_align_switch" (i32.const 4) (i32.const 2)) (i32.const 10))
826 (assert_return (invoke "i32_align_switch" (i32.const 4) (i32.const 4)) (i32.const 10))
827
828 (assert_return (invoke "i64_align_switch" (i32.const 0) (i32.const 0)) (i64.const 10))
829 (assert_return (invoke "i64_align_switch" (i32.const 0) (i32.const 1)) (i64.const 10))
830 (assert_return (invoke "i64_align_switch" (i32.const 1) (i32.const 0)) (i64.const 10))
831 (assert_return (invoke "i64_align_switch" (i32.const 1) (i32.const 1)) (i64.const 10))
832 (assert_return (invoke "i64_align_switch" (i32.const 2) (i32.const 0)) (i64.const 10))
833 (assert_return (invoke "i64_align_switch" (i32.const 2) (i32.const 1)) (i64.const 10))
834 (assert_return (invoke "i64_align_switch" (i32.const 2) (i32.const 2)) (i64.const 10))
835 (assert_return (invoke "i64_align_switch" (i32.const 3) (i32.const 0)) (i64.const 10))
836 (assert_return (invoke "i64_align_switch" (i32.const 3) (i32.const 1)) (i64.const 10))
837 (assert_return (invoke "i64_align_switch" (i32.const 3) (i32.const 2)) (i64.const 10))
838 (assert_return (invoke "i64_align_switch" (i32.const 4) (i32.const 0)) (i64.const 10))
839 (assert_return (invoke "i64_align_switch" (i32.const 4) (i32.const 1)) (i64.const 10))
840 (assert_return (invoke "i64_align_switch" (i32.const 4) (i32.const 2)) (i64.const 10))
841 (assert_return (invoke "i64_align_switch" (i32.const 4) (i32.const 4)) (i64.const 10))
842 (assert_return (invoke "i64_align_switch" (i32.const 5) (i32.const 0)) (i64.const 10))
843 (assert_return (invoke "i64_align_switch" (i32.const 5) (i32.const 1)) (i64.const 10))
844 (assert_return (invoke "i64_align_switch" (i32.const 5) (i32.const 2)) (i64.const 10))
845 (assert_return (invoke "i64_align_switch" (i32.const 5) (i32.const 4)) (i64.const 10))
846 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 0)) (i64.const 10))
847 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 1)) (i64.const 10))
848 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 2)) (i64.const 10))
849 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 4)) (i64.const 10))
850 (assert_return (invoke "i64_align_switch" (i32.const 6) (i32.const 8)) (i64.const 10))
851
852 ;; Test that an i64 store with 4-byte alignment that's 4 bytes out of bounds traps without storing anything
853
854 (module
855   (memory i64 1)
856   (func (export "store") (param i64 i64)
857     (i64.store align=4 (local.get 0) (local.get 1))
858   )
859   (func (export "load") (param i64) (result i32)
860     (i32.load (local.get 0))
861   )
862 )
863
864 (assert_trap (invoke "store" (i64.const 65532) (i64.const -1)) "out of bounds memory access")
865 ;; No memory was changed
866 (assert_return (invoke "load" (i64.const 65532)) (i32.const 0))