blob: f113840c0499719fc066228102eab5fc5ffb6fce [file] [log] [blame]
Thomas Livelyb61232e2018-10-31 23:58:20 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128 | FileCheck %s
2
3; Test loads and stores with custom alignment values.
4
5target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
6target triple = "wasm32-unknown-unknown"
7
8; ==============================================================================
9; 16 x i8
10; ==============================================================================
11
12; CHECK-LABEL: load_v16i8_a1:
13; CHECK-NEXT: .param i32{{$}}
14; CHECK-NEXT: .result v128{{$}}
15; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
16; CHECK-NEXT: return $pop[[R]]{{$}}
17define <16 x i8> @load_v16i8_a1(<16 x i8> *%p) {
18 %v = load <16 x i8>, <16 x i8>* %p, align 1
19 ret <16 x i8> %v
20}
21
22; CHECK-LABEL: load_v16i8_a4:
23; CHECK-NEXT: .param i32{{$}}
24; CHECK-NEXT: .result v128{{$}}
25; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
26; CHECK-NEXT: return $pop[[R]]{{$}}
27define <16 x i8> @load_v16i8_a4(<16 x i8> *%p) {
28 %v = load <16 x i8>, <16 x i8>* %p, align 4
29 ret <16 x i8> %v
30}
31
32; 16 is the default alignment for v128 so no attribute is needed.
33
34; CHECK-LABEL: load_v16i8_a16:
35; CHECK-NEXT: .param i32{{$}}
36; CHECK-NEXT: .result v128{{$}}
37; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
38; CHECK-NEXT: return $pop[[R]]{{$}}
39define <16 x i8> @load_v16i8_a16(<16 x i8> *%p) {
40 %v = load <16 x i8>, <16 x i8>* %p, align 16
41 ret <16 x i8> %v
42}
43
44; 32 is greater than the default alignment so it is ignored.
45
46; CHECK-LABEL: load_v16i8_a32:
47; CHECK-NEXT: .param i32{{$}}
48; CHECK-NEXT: .result v128{{$}}
49; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
50; CHECK-NEXT: return $pop[[R]]{{$}}
51define <16 x i8> @load_v16i8_a32(<16 x i8> *%p) {
52 %v = load <16 x i8>, <16 x i8>* %p, align 32
53 ret <16 x i8> %v
54}
55
56; CHECK-LABEL: store_v16i8_a1:
57; CHECK-NEXT: .param i32, v128{{$}}
58; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
59; CHECK-NEXT: return{{$}}
60define void @store_v16i8_a1(<16 x i8> *%p, <16 x i8> %v) {
61 store <16 x i8> %v, <16 x i8>* %p, align 1
62 ret void
63}
64
65; CHECK-LABEL: store_v16i8_a4:
66; CHECK-NEXT: .param i32, v128{{$}}
67; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
68; CHECK-NEXT: return{{$}}
69define void @store_v16i8_a4(<16 x i8> *%p, <16 x i8> %v) {
70 store <16 x i8> %v, <16 x i8>* %p, align 4
71 ret void
72}
73
74; 16 is the default alignment for v128 so no attribute is needed.
75
76; CHECK-LABEL: store_v16i8_a16:
77; CHECK-NEXT: .param i32, v128{{$}}
78; CHECK-NEXT: v128.store 0($0), $1{{$}}
79; CHECK-NEXT: return{{$}}
80define void @store_v16i8_a16(<16 x i8> *%p, <16 x i8> %v) {
81 store <16 x i8> %v, <16 x i8>* %p, align 16
82 ret void
83}
84
85; 32 is greater than the default alignment so it is ignored.
86
87; CHECK-LABEL: store_v16i8_a32:
88; CHECK-NEXT: .param i32, v128{{$}}
89; CHECK-NEXT: v128.store 0($0), $1{{$}}
90; CHECK-NEXT: return{{$}}
91define void @store_v16i8_a32(<16 x i8> *%p, <16 x i8> %v) {
92 store <16 x i8> %v, <16 x i8>* %p, align 32
93 ret void
94}
95
96; ==============================================================================
97; 8 x i16
98; ==============================================================================
99
100; CHECK-LABEL: load_v8i16_a1:
101; CHECK-NEXT: .param i32{{$}}
102; CHECK-NEXT: .result v128{{$}}
103; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
104; CHECK-NEXT: return $pop[[R]]{{$}}
105define <8 x i16> @load_v8i16_a1(<8 x i16> *%p) {
106 %v = load <8 x i16>, <8 x i16>* %p, align 1
107 ret <8 x i16> %v
108}
109
110; CHECK-LABEL: load_v8i16_a4:
111; CHECK-NEXT: .param i32{{$}}
112; CHECK-NEXT: .result v128{{$}}
113; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
114; CHECK-NEXT: return $pop[[R]]{{$}}
115define <8 x i16> @load_v8i16_a4(<8 x i16> *%p) {
116 %v = load <8 x i16>, <8 x i16>* %p, align 4
117 ret <8 x i16> %v
118}
119
120; 8 is the default alignment for v128 so no attribute is needed.
121
122; CHECK-LABEL: load_v8i16_a16:
123; CHECK-NEXT: .param i32{{$}}
124; CHECK-NEXT: .result v128{{$}}
125; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
126; CHECK-NEXT: return $pop[[R]]{{$}}
127define <8 x i16> @load_v8i16_a16(<8 x i16> *%p) {
128 %v = load <8 x i16>, <8 x i16>* %p, align 16
129 ret <8 x i16> %v
130}
131
132; 32 is greater than the default alignment so it is ignored.
133
134; CHECK-LABEL: load_v8i16_a32:
135; CHECK-NEXT: .param i32{{$}}
136; CHECK-NEXT: .result v128{{$}}
137; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
138; CHECK-NEXT: return $pop[[R]]{{$}}
139define <8 x i16> @load_v8i16_a32(<8 x i16> *%p) {
140 %v = load <8 x i16>, <8 x i16>* %p, align 32
141 ret <8 x i16> %v
142}
143
144; CHECK-LABEL: store_v8i16_a1:
145; CHECK-NEXT: .param i32, v128{{$}}
146; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
147; CHECK-NEXT: return{{$}}
148define void @store_v8i16_a1(<8 x i16> *%p, <8 x i16> %v) {
149 store <8 x i16> %v, <8 x i16>* %p, align 1
150 ret void
151}
152
153; CHECK-LABEL: store_v8i16_a4:
154; CHECK-NEXT: .param i32, v128{{$}}
155; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
156; CHECK-NEXT: return{{$}}
157define void @store_v8i16_a4(<8 x i16> *%p, <8 x i16> %v) {
158 store <8 x i16> %v, <8 x i16>* %p, align 4
159 ret void
160}
161
162; 16 is the default alignment for v128 so no attribute is needed.
163
164; CHECK-LABEL: store_v8i16_a16:
165; CHECK-NEXT: .param i32, v128{{$}}
166; CHECK-NEXT: v128.store 0($0), $1{{$}}
167; CHECK-NEXT: return{{$}}
168define void @store_v8i16_a16(<8 x i16> *%p, <8 x i16> %v) {
169 store <8 x i16> %v, <8 x i16>* %p, align 16
170 ret void
171}
172
173; 32 is greater than the default alignment so it is ignored.
174
175; CHECK-LABEL: store_v8i16_a32:
176; CHECK-NEXT: .param i32, v128{{$}}
177; CHECK-NEXT: v128.store 0($0), $1{{$}}
178; CHECK-NEXT: return{{$}}
179define void @store_v8i16_a32(<8 x i16> *%p, <8 x i16> %v) {
180 store <8 x i16> %v, <8 x i16>* %p, align 32
181 ret void
182}
183
184; ==============================================================================
185; 4 x i32
186; ==============================================================================
187
188; CHECK-LABEL: load_v4i32_a1:
189; CHECK-NEXT: .param i32{{$}}
190; CHECK-NEXT: .result v128{{$}}
191; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
192; CHECK-NEXT: return $pop[[R]]{{$}}
193define <4 x i32> @load_v4i32_a1(<4 x i32> *%p) {
194 %v = load <4 x i32>, <4 x i32>* %p, align 1
195 ret <4 x i32> %v
196}
197
198; CHECK-LABEL: load_v4i32_a4:
199; CHECK-NEXT: .param i32{{$}}
200; CHECK-NEXT: .result v128{{$}}
201; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
202; CHECK-NEXT: return $pop[[R]]{{$}}
203define <4 x i32> @load_v4i32_a4(<4 x i32> *%p) {
204 %v = load <4 x i32>, <4 x i32>* %p, align 4
205 ret <4 x i32> %v
206}
207
208; 4 is the default alignment for v128 so no attribute is needed.
209
210; CHECK-LABEL: load_v4i32_a16:
211; CHECK-NEXT: .param i32{{$}}
212; CHECK-NEXT: .result v128{{$}}
213; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
214; CHECK-NEXT: return $pop[[R]]{{$}}
215define <4 x i32> @load_v4i32_a16(<4 x i32> *%p) {
216 %v = load <4 x i32>, <4 x i32>* %p, align 16
217 ret <4 x i32> %v
218}
219
220; 32 is greater than the default alignment so it is ignored.
221
222; CHECK-LABEL: load_v4i32_a32:
223; CHECK-NEXT: .param i32{{$}}
224; CHECK-NEXT: .result v128{{$}}
225; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
226; CHECK-NEXT: return $pop[[R]]{{$}}
227define <4 x i32> @load_v4i32_a32(<4 x i32> *%p) {
228 %v = load <4 x i32>, <4 x i32>* %p, align 32
229 ret <4 x i32> %v
230}
231
232; CHECK-LABEL: store_v4i32_a1:
233; CHECK-NEXT: .param i32, v128{{$}}
234; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
235; CHECK-NEXT: return{{$}}
236define void @store_v4i32_a1(<4 x i32> *%p, <4 x i32> %v) {
237 store <4 x i32> %v, <4 x i32>* %p, align 1
238 ret void
239}
240
241; CHECK-LABEL: store_v4i32_a4:
242; CHECK-NEXT: .param i32, v128{{$}}
243; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
244; CHECK-NEXT: return{{$}}
245define void @store_v4i32_a4(<4 x i32> *%p, <4 x i32> %v) {
246 store <4 x i32> %v, <4 x i32>* %p, align 4
247 ret void
248}
249
250; 16 is the default alignment for v128 so no attribute is needed.
251
252; CHECK-LABEL: store_v4i32_a16:
253; CHECK-NEXT: .param i32, v128{{$}}
254; CHECK-NEXT: v128.store 0($0), $1{{$}}
255; CHECK-NEXT: return{{$}}
256define void @store_v4i32_a16(<4 x i32> *%p, <4 x i32> %v) {
257 store <4 x i32> %v, <4 x i32>* %p, align 16
258 ret void
259}
260
261; 32 is greater than the default alignment so it is ignored.
262
263; CHECK-LABEL: store_v4i32_a32:
264; CHECK-NEXT: .param i32, v128{{$}}
265; CHECK-NEXT: v128.store 0($0), $1{{$}}
266; CHECK-NEXT: return{{$}}
267define void @store_v4i32_a32(<4 x i32> *%p, <4 x i32> %v) {
268 store <4 x i32> %v, <4 x i32>* %p, align 32
269 ret void
270}
271
272; ==============================================================================
273; 2 x i64
274; ==============================================================================
275
276; CHECK-LABEL: load_v2i64_a1:
277; CHECK-NEXT: .param i32{{$}}
278; CHECK-NEXT: .result v128{{$}}
279; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
280; CHECK-NEXT: return $pop[[R]]{{$}}
281define <2 x i64> @load_v2i64_a1(<2 x i64> *%p) {
282 %v = load <2 x i64>, <2 x i64>* %p, align 1
283 ret <2 x i64> %v
284}
285
286; CHECK-LABEL: load_v2i64_a4:
287; CHECK-NEXT: .param i32{{$}}
288; CHECK-NEXT: .result v128{{$}}
289; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
290; CHECK-NEXT: return $pop[[R]]{{$}}
291define <2 x i64> @load_v2i64_a4(<2 x i64> *%p) {
292 %v = load <2 x i64>, <2 x i64>* %p, align 4
293 ret <2 x i64> %v
294}
295
296; 2 is the default alignment for v128 so no attribute is needed.
297
298; CHECK-LABEL: load_v2i64_a16:
299; CHECK-NEXT: .param i32{{$}}
300; CHECK-NEXT: .result v128{{$}}
301; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
302; CHECK-NEXT: return $pop[[R]]{{$}}
303define <2 x i64> @load_v2i64_a16(<2 x i64> *%p) {
304 %v = load <2 x i64>, <2 x i64>* %p, align 16
305 ret <2 x i64> %v
306}
307
308; 32 is greater than the default alignment so it is ignored.
309
310; CHECK-LABEL: load_v2i64_a32:
311; CHECK-NEXT: .param i32{{$}}
312; CHECK-NEXT: .result v128{{$}}
313; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
314; CHECK-NEXT: return $pop[[R]]{{$}}
315define <2 x i64> @load_v2i64_a32(<2 x i64> *%p) {
316 %v = load <2 x i64>, <2 x i64>* %p, align 32
317 ret <2 x i64> %v
318}
319
320; CHECK-LABEL: store_v2i64_a1:
321; CHECK-NEXT: .param i32, v128{{$}}
322; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
323; CHECK-NEXT: return{{$}}
324define void @store_v2i64_a1(<2 x i64> *%p, <2 x i64> %v) {
325 store <2 x i64> %v, <2 x i64>* %p, align 1
326 ret void
327}
328
329; CHECK-LABEL: store_v2i64_a4:
330; CHECK-NEXT: .param i32, v128{{$}}
331; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
332; CHECK-NEXT: return{{$}}
333define void @store_v2i64_a4(<2 x i64> *%p, <2 x i64> %v) {
334 store <2 x i64> %v, <2 x i64>* %p, align 4
335 ret void
336}
337
338; 16 is the default alignment for v128 so no attribute is needed.
339
340; CHECK-LABEL: store_v2i64_a16:
341; CHECK-NEXT: .param i32, v128{{$}}
342; CHECK-NEXT: v128.store 0($0), $1{{$}}
343; CHECK-NEXT: return{{$}}
344define void @store_v2i64_a16(<2 x i64> *%p, <2 x i64> %v) {
345 store <2 x i64> %v, <2 x i64>* %p, align 16
346 ret void
347}
348
349; 32 is greater than the default alignment so it is ignored.
350
351; CHECK-LABEL: store_v2i64_a32:
352; CHECK-NEXT: .param i32, v128{{$}}
353; CHECK-NEXT: v128.store 0($0), $1{{$}}
354; CHECK-NEXT: return{{$}}
355define void @store_v2i64_a32(<2 x i64> *%p, <2 x i64> %v) {
356 store <2 x i64> %v, <2 x i64>* %p, align 32
357 ret void
358}
359
360; ==============================================================================
361; 4 x float
362; ==============================================================================
363
364; CHECK-LABEL: load_v4f32_a1:
365; CHECK-NEXT: .param i32{{$}}
366; CHECK-NEXT: .result v128{{$}}
367; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
368; CHECK-NEXT: return $pop[[R]]{{$}}
369define <4 x float> @load_v4f32_a1(<4 x float> *%p) {
370 %v = load <4 x float>, <4 x float>* %p, align 1
371 ret <4 x float> %v
372}
373
374; CHECK-LABEL: load_v4f32_a4:
375; CHECK-NEXT: .param i32{{$}}
376; CHECK-NEXT: .result v128{{$}}
377; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
378; CHECK-NEXT: return $pop[[R]]{{$}}
379define <4 x float> @load_v4f32_a4(<4 x float> *%p) {
380 %v = load <4 x float>, <4 x float>* %p, align 4
381 ret <4 x float> %v
382}
383
384; 4 is the default alignment for v128 so no attribute is needed.
385
386; CHECK-LABEL: load_v4f32_a16:
387; CHECK-NEXT: .param i32{{$}}
388; CHECK-NEXT: .result v128{{$}}
389; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
390; CHECK-NEXT: return $pop[[R]]{{$}}
391define <4 x float> @load_v4f32_a16(<4 x float> *%p) {
392 %v = load <4 x float>, <4 x float>* %p, align 16
393 ret <4 x float> %v
394}
395
396; 32 is greater than the default alignment so it is ignored.
397
398; CHECK-LABEL: load_v4f32_a32:
399; CHECK-NEXT: .param i32{{$}}
400; CHECK-NEXT: .result v128{{$}}
401; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
402; CHECK-NEXT: return $pop[[R]]{{$}}
403define <4 x float> @load_v4f32_a32(<4 x float> *%p) {
404 %v = load <4 x float>, <4 x float>* %p, align 32
405 ret <4 x float> %v
406}
407
408; CHECK-LABEL: store_v4f32_a1:
409; CHECK-NEXT: .param i32, v128{{$}}
410; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
411; CHECK-NEXT: return{{$}}
412define void @store_v4f32_a1(<4 x float> *%p, <4 x float> %v) {
413 store <4 x float> %v, <4 x float>* %p, align 1
414 ret void
415}
416
417; CHECK-LABEL: store_v4f32_a4:
418; CHECK-NEXT: .param i32, v128{{$}}
419; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
420; CHECK-NEXT: return{{$}}
421define void @store_v4f32_a4(<4 x float> *%p, <4 x float> %v) {
422 store <4 x float> %v, <4 x float>* %p, align 4
423 ret void
424}
425
426; 16 is the default alignment for v128 so no attribute is needed.
427
428; CHECK-LABEL: store_v4f32_a16:
429; CHECK-NEXT: .param i32, v128{{$}}
430; CHECK-NEXT: v128.store 0($0), $1{{$}}
431; CHECK-NEXT: return{{$}}
432define void @store_v4f32_a16(<4 x float> *%p, <4 x float> %v) {
433 store <4 x float> %v, <4 x float>* %p, align 16
434 ret void
435}
436
437; 32 is greater than the default alignment so it is ignored.
438
439; CHECK-LABEL: store_v4f32_a32:
440; CHECK-NEXT: .param i32, v128{{$}}
441; CHECK-NEXT: v128.store 0($0), $1{{$}}
442; CHECK-NEXT: return{{$}}
443define void @store_v4f32_a32(<4 x float> *%p, <4 x float> %v) {
444 store <4 x float> %v, <4 x float>* %p, align 32
445 ret void
446}
447
448; ==============================================================================
449; 2 x double
450; ==============================================================================
451
452; CHECK-LABEL: load_v2f64_a1:
453; CHECK-NEXT: .param i32{{$}}
454; CHECK-NEXT: .result v128{{$}}
455; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
456; CHECK-NEXT: return $pop[[R]]{{$}}
457define <2 x double> @load_v2f64_a1(<2 x double> *%p) {
458 %v = load <2 x double>, <2 x double>* %p, align 1
459 ret <2 x double> %v
460}
461
462; CHECK-LABEL: load_v2f64_a4:
463; CHECK-NEXT: .param i32{{$}}
464; CHECK-NEXT: .result v128{{$}}
465; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
466; CHECK-NEXT: return $pop[[R]]{{$}}
467define <2 x double> @load_v2f64_a4(<2 x double> *%p) {
468 %v = load <2 x double>, <2 x double>* %p, align 4
469 ret <2 x double> %v
470}
471
472; 2 is the default alignment for v128 so no attribute is needed.
473
474; CHECK-LABEL: load_v2f64_a16:
475; CHECK-NEXT: .param i32{{$}}
476; CHECK-NEXT: .result v128{{$}}
477; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
478; CHECK-NEXT: return $pop[[R]]{{$}}
479define <2 x double> @load_v2f64_a16(<2 x double> *%p) {
480 %v = load <2 x double>, <2 x double>* %p, align 16
481 ret <2 x double> %v
482}
483
484; 32 is greater than the default alignment so it is ignored.
485
486; CHECK-LABEL: load_v2f64_a32:
487; CHECK-NEXT: .param i32{{$}}
488; CHECK-NEXT: .result v128{{$}}
489; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
490; CHECK-NEXT: return $pop[[R]]{{$}}
491define <2 x double> @load_v2f64_a32(<2 x double> *%p) {
492 %v = load <2 x double>, <2 x double>* %p, align 32
493 ret <2 x double> %v
494}
495
496; CHECK-LABEL: store_v2f64_a1:
497; CHECK-NEXT: .param i32, v128{{$}}
498; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
499; CHECK-NEXT: return{{$}}
500define void @store_v2f64_a1(<2 x double> *%p, <2 x double> %v) {
501 store <2 x double> %v, <2 x double>* %p, align 1
502 ret void
503}
504
505; CHECK-LABEL: store_v2f64_a4:
506; CHECK-NEXT: .param i32, v128{{$}}
507; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
508; CHECK-NEXT: return{{$}}
509define void @store_v2f64_a4(<2 x double> *%p, <2 x double> %v) {
510 store <2 x double> %v, <2 x double>* %p, align 4
511 ret void
512}
513
514; 16 is the default alignment for v128 so no attribute is needed.
515
516; CHECK-LABEL: store_v2f64_a16:
517; CHECK-NEXT: .param i32, v128{{$}}
518; CHECK-NEXT: v128.store 0($0), $1{{$}}
519; CHECK-NEXT: return{{$}}
520define void @store_v2f64_a16(<2 x double> *%p, <2 x double> %v) {
521 store <2 x double> %v, <2 x double>* %p, align 16
522 ret void
523}
524
525; 32 is greater than the default alignment so it is ignored.
526
527; CHECK-LABEL: store_v2f64_a32:
528; CHECK-NEXT: .param i32, v128{{$}}
529; CHECK-NEXT: v128.store 0($0), $1{{$}}
530; CHECK-NEXT: return{{$}}
531define void @store_v2f64_a32(<2 x double> *%p, <2 x double> %v) {
532 store <2 x double> %v, <2 x double>* %p, align 32
533 ret void
534}