...
1;; Valid alignment
2
3(module (memory 1) (func (drop (v128.load align=1 (i32.const 0)))))
4(module (memory 1) (func (drop (v128.load align=2 (i32.const 0)))))
5(module (memory 1) (func (drop (v128.load align=4 (i32.const 0)))))
6(module (memory 1) (func (drop (v128.load align=8 (i32.const 0)))))
7(module (memory 1) (func (drop (v128.load align=16 (i32.const 0)))))
8
9(module (memory 1) (func (v128.store align=1 (i32.const 0) (v128.const i32x4 0 1 2 3))))
10(module (memory 1) (func (v128.store align=2 (i32.const 0) (v128.const i32x4 0 1 2 3))))
11(module (memory 1) (func (v128.store align=4 (i32.const 0) (v128.const i32x4 0 1 2 3))))
12(module (memory 1) (func (v128.store align=8 (i32.const 0) (v128.const i32x4 0 1 2 3))))
13(module (memory 1) (func (v128.store align=16 (i32.const 0) (v128.const i32x4 0 1 2 3))))
14
15(module (memory 1) (func (drop (v128.load8x8_s align=1 (i32.const 0)))))
16(module (memory 1) (func (drop (v128.load8x8_s align=2 (i32.const 0)))))
17(module (memory 1) (func (drop (v128.load8x8_s align=4 (i32.const 0)))))
18(module (memory 1) (func (drop (v128.load8x8_s align=8 (i32.const 0)))))
19(module (memory 1) (func (drop (v128.load8x8_u align=1 (i32.const 0)))))
20(module (memory 1) (func (drop (v128.load8x8_u align=2 (i32.const 0)))))
21(module (memory 1) (func (drop (v128.load8x8_u align=4 (i32.const 0)))))
22(module (memory 1) (func (drop (v128.load8x8_u align=8 (i32.const 0)))))
23(module (memory 1) (func (drop (v128.load16x4_s align=1 (i32.const 0)))))
24(module (memory 1) (func (drop (v128.load16x4_s align=2 (i32.const 0)))))
25(module (memory 1) (func (drop (v128.load16x4_s align=4 (i32.const 0)))))
26(module (memory 1) (func (drop (v128.load16x4_s align=8 (i32.const 0)))))
27(module (memory 1) (func (drop (v128.load16x4_u align=1 (i32.const 0)))))
28(module (memory 1) (func (drop (v128.load16x4_u align=2 (i32.const 0)))))
29(module (memory 1) (func (drop (v128.load16x4_u align=4 (i32.const 0)))))
30(module (memory 1) (func (drop (v128.load16x4_u align=8 (i32.const 0)))))
31(module (memory 1) (func (drop (v128.load32x2_s align=1 (i32.const 0)))))
32(module (memory 1) (func (drop (v128.load32x2_s align=2 (i32.const 0)))))
33(module (memory 1) (func (drop (v128.load32x2_s align=4 (i32.const 0)))))
34(module (memory 1) (func (drop (v128.load32x2_s align=8 (i32.const 0)))))
35(module (memory 1) (func (drop (v128.load32x2_u align=1 (i32.const 0)))))
36(module (memory 1) (func (drop (v128.load32x2_u align=2 (i32.const 0)))))
37(module (memory 1) (func (drop (v128.load32x2_u align=4 (i32.const 0)))))
38(module (memory 1) (func (drop (v128.load32x2_u align=8 (i32.const 0)))))
39
40(module (memory 1) (func (drop (v128.load8_splat align=1 (i32.const 0)))))
41(module (memory 1) (func (drop (v128.load16_splat align=1 (i32.const 0)))))
42(module (memory 1) (func (drop (v128.load16_splat align=2 (i32.const 0)))))
43(module (memory 1) (func (drop (v128.load32_splat align=1 (i32.const 0)))))
44(module (memory 1) (func (drop (v128.load32_splat align=2 (i32.const 0)))))
45(module (memory 1) (func (drop (v128.load32_splat align=4 (i32.const 0)))))
46(module (memory 1) (func (drop (v128.load64_splat align=1 (i32.const 0)))))
47(module (memory 1) (func (drop (v128.load64_splat align=2 (i32.const 0)))))
48(module (memory 1) (func (drop (v128.load64_splat align=4 (i32.const 0)))))
49(module (memory 1) (func (drop (v128.load64_splat align=8 (i32.const 0)))))
50
51;; Invalid alignment
52
53(assert_invalid
54 (module (memory 1) (func (drop (v128.load align=32 (i32.const 0)))))
55 "alignment must not be larger than natural"
56)
57(assert_invalid
58 (module (memory 0) (func(v128.store align=32 (i32.const 0) (v128.const i32x4 0 0 0 0))))
59 "alignment must not be larger than natural"
60)
61(assert_invalid
62 (module (memory 1) (func (result v128) (v128.load8x8_s align=16 (i32.const 0))))
63 "alignment must not be larger than natural"
64)
65(assert_invalid
66 (module (memory 1) (func (result v128) (v128.load8x8_u align=16 (i32.const 0))))
67 "alignment must not be larger than natural"
68)
69(assert_invalid
70 (module (memory 1) (func (result v128) (v128.load16x4_s align=16 (i32.const 0))))
71 "alignment must not be larger than natural"
72)
73(assert_invalid
74 (module (memory 1) (func (result v128) (v128.load16x4_u align=16 (i32.const 0))))
75 "alignment must not be larger than natural"
76)
77(assert_invalid
78 (module (memory 1) (func (result v128) (v128.load32x2_s align=16 (i32.const 0))))
79 "alignment must not be larger than natural"
80)
81(assert_invalid
82 (module (memory 1) (func (result v128) (v128.load32x2_u align=16 (i32.const 0))))
83 "alignment must not be larger than natural"
84)
85(assert_invalid
86 (module (memory 1) (func (result v128) (v128.load8_splat align=2 (i32.const 0))))
87 "alignment must not be larger than natural"
88)
89(assert_invalid
90 (module (memory 1) (func (result v128) (v128.load16_splat align=4 (i32.const 0))))
91 "alignment must not be larger than natural"
92)
93(assert_invalid
94 (module (memory 1) (func (result v128) (v128.load32_splat align=8 (i32.const 0))))
95 "alignment must not be larger than natural"
96)
97(assert_invalid
98 (module (memory 1) (func (result v128) (v128.load64_splat align=16 (i32.const 0))))
99 "alignment must not be larger than natural"
100)
101
102;; Malformed alignment
103
104(assert_malformed
105 (module quote
106 "(memory 1) (func (drop (v128.load align=-1 (i32.const 0))))"
107 )
108 "unknown operator"
109)
110(assert_malformed
111 (module quote
112 "(memory 1) (func (drop (v128.load align=0 (i32.const 0))))"
113 )
114 "alignment must be a power of two"
115)
116(assert_malformed
117 (module quote
118 "(memory 1) (func (drop (v128.load align=7 (i32.const 0))))"
119 )
120 "alignment must be a power of two"
121)
122(assert_malformed
123 (module quote
124 "(memory 1) (func (v128.store align=-1 (i32.const 0) (v128.const i32x4 0 0 0 0)))"
125 )
126 "unknown operator"
127)
128(assert_malformed
129 (module quote
130 "(memory 0) (func (v128.store align=0 (i32.const 0) (v128.const i32x4 0 0 0 0)))"
131 )
132 "alignment must be a power of two"
133)
134(assert_malformed
135 (module quote
136 "(memory 0) (func (v128.store align=7 (i32.const 0) (v128.const i32x4 0 0 0 0)))"
137 )
138 "alignment must be a power of two"
139)
140(assert_malformed
141 (module quote
142 "(memory 1) (func (result v128) (v128.load8x8_s align=-1 (i32.const 0)))"
143 )
144 "unknown operator"
145)
146(assert_malformed
147 (module quote
148 "(memory 1) (func (result v128) (v128.load8x8_s align=0 (i32.const 0)))"
149 )
150 "alignment must be a power of two"
151)
152(assert_malformed
153 (module quote
154 "(memory 1) (func (result v128) (v128.load8x8_s align=7 (i32.const 0)))"
155 )
156 "alignment must be a power of two"
157)
158(assert_malformed
159 (module quote
160 "(memory 1) (func (result v128) (v128.load8x8_u align=-1 (i32.const 0)))"
161 )
162 "unknown operator"
163)
164(assert_malformed
165 (module quote
166 "(memory 1) (func (result v128) (v128.load8x8_u align=0 (i32.const 0)))"
167 )
168 "alignment must be a power of two"
169)
170(assert_malformed
171 (module quote
172 "(memory 1) (func (result v128) (v128.load8x8_u align=7 (i32.const 0)))"
173 )
174 "alignment must be a power of two"
175)
176(assert_malformed
177 (module quote
178 "(memory 1) (func (result v128) (v128.load16x4_s align=-1 (i32.const 0)))"
179 )
180 "unknown operator"
181)
182(assert_malformed
183 (module quote
184 "(memory 1) (func (result v128) (v128.load16x4_s align=0 (i32.const 0)))"
185 )
186 "alignment must be a power of two"
187)
188(assert_malformed
189 (module quote
190 "(memory 1) (func (result v128) (v128.load16x4_s align=7 (i32.const 0)))"
191 )
192 "alignment must be a power of two"
193)
194(assert_malformed
195 (module quote
196 "(memory 1) (func (result v128) (v128.load16x4_u align=-1 (i32.const 0)))"
197 )
198 "unknown operator"
199)
200(assert_malformed
201 (module quote
202 "(memory 1) (func (result v128) (v128.load16x4_u align=0 (i32.const 0)))"
203 )
204 "alignment must be a power of two"
205)
206(assert_malformed
207 (module quote
208 "(memory 1) (func (result v128) (v128.load16x4_u align=7 (i32.const 0)))"
209 )
210 "alignment must be a power of two"
211)
212(assert_malformed
213 (module quote
214 "(memory 1) (func (result v128) (v128.load32x2_s align=-1 (i32.const 0)))"
215 )
216 "unknown operator"
217)
218(assert_malformed
219 (module quote
220 "(memory 1) (func (result v128) (v128.load32x2_s align=0 (i32.const 0)))"
221 )
222 "alignment must be a power of two"
223)
224(assert_malformed
225 (module quote
226 "(memory 1) (func (result v128) (v128.load32x2_s align=7 (i32.const 0)))"
227 )
228 "alignment must be a power of two"
229)
230(assert_malformed
231 (module quote
232 "(memory 1) (func (result v128) (v128.load32x2_u align=-1 (i32.const 0)))"
233 )
234 "unknown operator"
235)
236(assert_malformed
237 (module quote
238 "(memory 1) (func (result v128) (v128.load32x2_u align=0 (i32.const 0)))"
239 )
240 "alignment must be a power of two"
241)
242(assert_malformed
243 (module quote
244 "(memory 1) (func (result v128) (v128.load32x2_u align=7 (i32.const 0)))"
245 )
246 "alignment must be a power of two"
247)
248(assert_malformed
249 (module quote
250 "(memory 1) (func (result v128) (v128.load8_splat align=-1 (i32.const 0)))"
251 )
252 "unknown operator"
253)
254(assert_malformed
255 (module quote
256 "(memory 1) (func (result v128) (v128.load8_splat align=0 (i32.const 0)))"
257 )
258 "alignment must be a power of two"
259)
260(assert_malformed
261 (module quote
262 "(memory 1) (func (result v128) (v128.load16_splat align=-1 (i32.const 0)))"
263 )
264 "unknown operator"
265)
266(assert_malformed
267 (module quote
268 "(memory 1) (func (result v128) (v128.load16_splat align=0 (i32.const 0)))"
269 )
270 "alignment must be a power of two"
271)
272(assert_malformed
273 (module quote
274 "(memory 1) (func (result v128) (v128.load32_splat align=-1 (i32.const 0)))"
275 )
276 "unknown operator"
277)
278(assert_malformed
279 (module quote
280 "(memory 1) (func (result v128) (v128.load32_splat align=0 (i32.const 0)))"
281 )
282 "alignment must be a power of two"
283)
284(assert_malformed
285 (module quote
286 "(memory 1) (func (result v128) (v128.load32_splat align=3 (i32.const 0)))"
287 )
288 "alignment must be a power of two"
289)
290(assert_malformed
291 (module quote
292 "(memory 1) (func (result v128) (v128.load64_splat align=-1 (i32.const 0)))"
293 )
294 "unknown operator"
295)
296(assert_malformed
297 (module quote
298 "(memory 1) (func (result v128) (v128.load64_splat align=0 (i32.const 0)))"
299 )
300 "alignment must be a power of two"
301)
302(assert_malformed
303 (module quote
304 "(memory 1) (func (result v128) (v128.load64_splat align=7 (i32.const 0)))"
305 )
306 "alignment must be a power of two"
307)
308
309;; Test that misaligned SIMD loads/stores don't trap
310
311(module
312 (memory 1 1)
313 (func (export "v128.load align=16") (param $address i32) (result v128)
314 (v128.load align=16 (local.get $address))
315 )
316 (func (export "v128.store align=16") (param $address i32) (param $value v128)
317 (v128.store align=16 (local.get $address) (local.get $value))
318 )
319)
320
321(assert_return (invoke "v128.load align=16" (i32.const 0)) (v128.const i32x4 0 0 0 0))
322(assert_return (invoke "v128.load align=16" (i32.const 1)) (v128.const i32x4 0 0 0 0))
323(assert_return (invoke "v128.store align=16" (i32.const 1) (v128.const i8x16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)))
324(assert_return (invoke "v128.load align=16" (i32.const 0)) (v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15))
325
326;; Test aligned and unaligned read/write
327
328(module
329 (memory 1)
330 (func (export "v128_unaligned_read_and_write") (result v128)
331 (local v128)
332 (v128.store (i32.const 0) (v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15))
333 (v128.load (i32.const 0))
334 )
335 (func (export "v128_aligned_read_and_write") (result v128)
336 (local v128)
337 (v128.store align=2 (i32.const 0) (v128.const i16x8 0 1 2 3 4 5 6 7))
338 (v128.load align=2 (i32.const 0))
339 )
340 (func (export "v128_aligned_read_and_unaligned_write") (result v128)
341 (local v128)
342 (v128.store (i32.const 0) (v128.const i32x4 0 1 2 3))
343 (v128.load align=2 (i32.const 0))
344 )
345 (func (export "v128_unaligned_read_and_aligned_write") (result v128)
346 (local v128)
347 (v128.store align=2 (i32.const 0) (v128.const i32x4 0 1 2 3))
348 (v128.load (i32.const 0))
349 )
350)
351
352(assert_return (invoke "v128_unaligned_read_and_write") (v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15))
353(assert_return (invoke "v128_aligned_read_and_write") (v128.const i16x8 0 1 2 3 4 5 6 7))
354(assert_return (invoke "v128_aligned_read_and_unaligned_write") (v128.const i32x4 0 1 2 3))
355(assert_return (invoke "v128_unaligned_read_and_aligned_write") (v128.const i32x4 0 1 2 3))
View as plain text