blob: c19a7f616296429fbe5148743993f2043d750270 [file] [log] [blame]
Thomas Lively64a39a12019-01-10 22:32:11 +00001; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+unimplemented-simd128 | FileCheck %s
Thomas Livelyb61232e2018-10-31 23:58:20 +00002
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:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000013; CHECK-NEXT: .functype load_v16i8_a1 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +000014; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
15; CHECK-NEXT: return $pop[[R]]{{$}}
16define <16 x i8> @load_v16i8_a1(<16 x i8> *%p) {
17 %v = load <16 x i8>, <16 x i8>* %p, align 1
18 ret <16 x i8> %v
19}
20
21; CHECK-LABEL: load_v16i8_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000022; CHECK-NEXT: .functype load_v16i8_a4 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +000023; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
24; CHECK-NEXT: return $pop[[R]]{{$}}
25define <16 x i8> @load_v16i8_a4(<16 x i8> *%p) {
26 %v = load <16 x i8>, <16 x i8>* %p, align 4
27 ret <16 x i8> %v
28}
29
30; 16 is the default alignment for v128 so no attribute is needed.
31
32; CHECK-LABEL: load_v16i8_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000033; CHECK-NEXT: .functype load_v16i8_a16 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +000034; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
35; CHECK-NEXT: return $pop[[R]]{{$}}
36define <16 x i8> @load_v16i8_a16(<16 x i8> *%p) {
37 %v = load <16 x i8>, <16 x i8>* %p, align 16
38 ret <16 x i8> %v
39}
40
41; 32 is greater than the default alignment so it is ignored.
42
43; CHECK-LABEL: load_v16i8_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000044; CHECK-NEXT: .functype load_v16i8_a32 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +000045; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
46; CHECK-NEXT: return $pop[[R]]{{$}}
47define <16 x i8> @load_v16i8_a32(<16 x i8> *%p) {
48 %v = load <16 x i8>, <16 x i8>* %p, align 32
49 ret <16 x i8> %v
50}
51
52; CHECK-LABEL: store_v16i8_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000053; CHECK-NEXT: .functype store_v16i8_a1 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +000054; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
55; CHECK-NEXT: return{{$}}
56define void @store_v16i8_a1(<16 x i8> *%p, <16 x i8> %v) {
57 store <16 x i8> %v, <16 x i8>* %p, align 1
58 ret void
59}
60
61; CHECK-LABEL: store_v16i8_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000062; CHECK-NEXT: .functype store_v16i8_a4 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +000063; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
64; CHECK-NEXT: return{{$}}
65define void @store_v16i8_a4(<16 x i8> *%p, <16 x i8> %v) {
66 store <16 x i8> %v, <16 x i8>* %p, align 4
67 ret void
68}
69
70; 16 is the default alignment for v128 so no attribute is needed.
71
72; CHECK-LABEL: store_v16i8_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000073; CHECK-NEXT: .functype store_v16i8_a16 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +000074; CHECK-NEXT: v128.store 0($0), $1{{$}}
75; CHECK-NEXT: return{{$}}
76define void @store_v16i8_a16(<16 x i8> *%p, <16 x i8> %v) {
77 store <16 x i8> %v, <16 x i8>* %p, align 16
78 ret void
79}
80
81; 32 is greater than the default alignment so it is ignored.
82
83; CHECK-LABEL: store_v16i8_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000084; CHECK-NEXT: .functype store_v16i8_a32 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +000085; CHECK-NEXT: v128.store 0($0), $1{{$}}
86; CHECK-NEXT: return{{$}}
87define void @store_v16i8_a32(<16 x i8> *%p, <16 x i8> %v) {
88 store <16 x i8> %v, <16 x i8>* %p, align 32
89 ret void
90}
91
92; ==============================================================================
93; 8 x i16
94; ==============================================================================
95
96; CHECK-LABEL: load_v8i16_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000097; CHECK-NEXT: .functype load_v8i16_a1 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +000098; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
99; CHECK-NEXT: return $pop[[R]]{{$}}
100define <8 x i16> @load_v8i16_a1(<8 x i16> *%p) {
101 %v = load <8 x i16>, <8 x i16>* %p, align 1
102 ret <8 x i16> %v
103}
104
105; CHECK-LABEL: load_v8i16_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000106; CHECK-NEXT: .functype load_v8i16_a4 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000107; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
108; CHECK-NEXT: return $pop[[R]]{{$}}
109define <8 x i16> @load_v8i16_a4(<8 x i16> *%p) {
110 %v = load <8 x i16>, <8 x i16>* %p, align 4
111 ret <8 x i16> %v
112}
113
114; 8 is the default alignment for v128 so no attribute is needed.
115
116; CHECK-LABEL: load_v8i16_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000117; CHECK-NEXT: .functype load_v8i16_a16 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000118; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
119; CHECK-NEXT: return $pop[[R]]{{$}}
120define <8 x i16> @load_v8i16_a16(<8 x i16> *%p) {
121 %v = load <8 x i16>, <8 x i16>* %p, align 16
122 ret <8 x i16> %v
123}
124
125; 32 is greater than the default alignment so it is ignored.
126
127; CHECK-LABEL: load_v8i16_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000128; CHECK-NEXT: .functype load_v8i16_a32 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000129; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
130; CHECK-NEXT: return $pop[[R]]{{$}}
131define <8 x i16> @load_v8i16_a32(<8 x i16> *%p) {
132 %v = load <8 x i16>, <8 x i16>* %p, align 32
133 ret <8 x i16> %v
134}
135
136; CHECK-LABEL: store_v8i16_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000137; CHECK-NEXT: .functype store_v8i16_a1 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000138; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
139; CHECK-NEXT: return{{$}}
140define void @store_v8i16_a1(<8 x i16> *%p, <8 x i16> %v) {
141 store <8 x i16> %v, <8 x i16>* %p, align 1
142 ret void
143}
144
145; CHECK-LABEL: store_v8i16_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000146; CHECK-NEXT: .functype store_v8i16_a4 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000147; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
148; CHECK-NEXT: return{{$}}
149define void @store_v8i16_a4(<8 x i16> *%p, <8 x i16> %v) {
150 store <8 x i16> %v, <8 x i16>* %p, align 4
151 ret void
152}
153
154; 16 is the default alignment for v128 so no attribute is needed.
155
156; CHECK-LABEL: store_v8i16_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000157; CHECK-NEXT: .functype store_v8i16_a16 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000158; CHECK-NEXT: v128.store 0($0), $1{{$}}
159; CHECK-NEXT: return{{$}}
160define void @store_v8i16_a16(<8 x i16> *%p, <8 x i16> %v) {
161 store <8 x i16> %v, <8 x i16>* %p, align 16
162 ret void
163}
164
165; 32 is greater than the default alignment so it is ignored.
166
167; CHECK-LABEL: store_v8i16_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000168; CHECK-NEXT: .functype store_v8i16_a32 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000169; CHECK-NEXT: v128.store 0($0), $1{{$}}
170; CHECK-NEXT: return{{$}}
171define void @store_v8i16_a32(<8 x i16> *%p, <8 x i16> %v) {
172 store <8 x i16> %v, <8 x i16>* %p, align 32
173 ret void
174}
175
176; ==============================================================================
177; 4 x i32
178; ==============================================================================
179
180; CHECK-LABEL: load_v4i32_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000181; CHECK-NEXT: .functype load_v4i32_a1 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000182; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
183; CHECK-NEXT: return $pop[[R]]{{$}}
184define <4 x i32> @load_v4i32_a1(<4 x i32> *%p) {
185 %v = load <4 x i32>, <4 x i32>* %p, align 1
186 ret <4 x i32> %v
187}
188
189; CHECK-LABEL: load_v4i32_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000190; CHECK-NEXT: .functype load_v4i32_a4 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000191; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
192; CHECK-NEXT: return $pop[[R]]{{$}}
193define <4 x i32> @load_v4i32_a4(<4 x i32> *%p) {
194 %v = load <4 x i32>, <4 x i32>* %p, align 4
195 ret <4 x i32> %v
196}
197
198; 4 is the default alignment for v128 so no attribute is needed.
199
200; CHECK-LABEL: load_v4i32_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000201; CHECK-NEXT: .functype load_v4i32_a16 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000202; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
203; CHECK-NEXT: return $pop[[R]]{{$}}
204define <4 x i32> @load_v4i32_a16(<4 x i32> *%p) {
205 %v = load <4 x i32>, <4 x i32>* %p, align 16
206 ret <4 x i32> %v
207}
208
209; 32 is greater than the default alignment so it is ignored.
210
211; CHECK-LABEL: load_v4i32_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000212; CHECK-NEXT: .functype load_v4i32_a32 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000213; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
214; CHECK-NEXT: return $pop[[R]]{{$}}
215define <4 x i32> @load_v4i32_a32(<4 x i32> *%p) {
216 %v = load <4 x i32>, <4 x i32>* %p, align 32
217 ret <4 x i32> %v
218}
219
220; CHECK-LABEL: store_v4i32_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000221; CHECK-NEXT: .functype store_v4i32_a1 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000222; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
223; CHECK-NEXT: return{{$}}
224define void @store_v4i32_a1(<4 x i32> *%p, <4 x i32> %v) {
225 store <4 x i32> %v, <4 x i32>* %p, align 1
226 ret void
227}
228
229; CHECK-LABEL: store_v4i32_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000230; CHECK-NEXT: .functype store_v4i32_a4 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000231; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
232; CHECK-NEXT: return{{$}}
233define void @store_v4i32_a4(<4 x i32> *%p, <4 x i32> %v) {
234 store <4 x i32> %v, <4 x i32>* %p, align 4
235 ret void
236}
237
238; 16 is the default alignment for v128 so no attribute is needed.
239
240; CHECK-LABEL: store_v4i32_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000241; CHECK-NEXT: .functype store_v4i32_a16 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000242; CHECK-NEXT: v128.store 0($0), $1{{$}}
243; CHECK-NEXT: return{{$}}
244define void @store_v4i32_a16(<4 x i32> *%p, <4 x i32> %v) {
245 store <4 x i32> %v, <4 x i32>* %p, align 16
246 ret void
247}
248
249; 32 is greater than the default alignment so it is ignored.
250
251; CHECK-LABEL: store_v4i32_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000252; CHECK-NEXT: .functype store_v4i32_a32 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000253; CHECK-NEXT: v128.store 0($0), $1{{$}}
254; CHECK-NEXT: return{{$}}
255define void @store_v4i32_a32(<4 x i32> *%p, <4 x i32> %v) {
256 store <4 x i32> %v, <4 x i32>* %p, align 32
257 ret void
258}
259
260; ==============================================================================
261; 2 x i64
262; ==============================================================================
263
264; CHECK-LABEL: load_v2i64_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000265; CHECK-NEXT: .functype load_v2i64_a1 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000266; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
267; CHECK-NEXT: return $pop[[R]]{{$}}
268define <2 x i64> @load_v2i64_a1(<2 x i64> *%p) {
269 %v = load <2 x i64>, <2 x i64>* %p, align 1
270 ret <2 x i64> %v
271}
272
273; CHECK-LABEL: load_v2i64_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000274; CHECK-NEXT: .functype load_v2i64_a4 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000275; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
276; CHECK-NEXT: return $pop[[R]]{{$}}
277define <2 x i64> @load_v2i64_a4(<2 x i64> *%p) {
278 %v = load <2 x i64>, <2 x i64>* %p, align 4
279 ret <2 x i64> %v
280}
281
282; 2 is the default alignment for v128 so no attribute is needed.
283
284; CHECK-LABEL: load_v2i64_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000285; CHECK-NEXT: .functype load_v2i64_a16 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000286; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
287; CHECK-NEXT: return $pop[[R]]{{$}}
288define <2 x i64> @load_v2i64_a16(<2 x i64> *%p) {
289 %v = load <2 x i64>, <2 x i64>* %p, align 16
290 ret <2 x i64> %v
291}
292
293; 32 is greater than the default alignment so it is ignored.
294
295; CHECK-LABEL: load_v2i64_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000296; CHECK-NEXT: .functype load_v2i64_a32 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000297; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
298; CHECK-NEXT: return $pop[[R]]{{$}}
299define <2 x i64> @load_v2i64_a32(<2 x i64> *%p) {
300 %v = load <2 x i64>, <2 x i64>* %p, align 32
301 ret <2 x i64> %v
302}
303
304; CHECK-LABEL: store_v2i64_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000305; CHECK-NEXT: .functype store_v2i64_a1 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000306; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
307; CHECK-NEXT: return{{$}}
308define void @store_v2i64_a1(<2 x i64> *%p, <2 x i64> %v) {
309 store <2 x i64> %v, <2 x i64>* %p, align 1
310 ret void
311}
312
313; CHECK-LABEL: store_v2i64_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000314; CHECK-NEXT: .functype store_v2i64_a4 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000315; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
316; CHECK-NEXT: return{{$}}
317define void @store_v2i64_a4(<2 x i64> *%p, <2 x i64> %v) {
318 store <2 x i64> %v, <2 x i64>* %p, align 4
319 ret void
320}
321
322; 16 is the default alignment for v128 so no attribute is needed.
323
324; CHECK-LABEL: store_v2i64_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000325; CHECK-NEXT: .functype store_v2i64_a16 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000326; CHECK-NEXT: v128.store 0($0), $1{{$}}
327; CHECK-NEXT: return{{$}}
328define void @store_v2i64_a16(<2 x i64> *%p, <2 x i64> %v) {
329 store <2 x i64> %v, <2 x i64>* %p, align 16
330 ret void
331}
332
333; 32 is greater than the default alignment so it is ignored.
334
335; CHECK-LABEL: store_v2i64_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000336; CHECK-NEXT: .functype store_v2i64_a32 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000337; CHECK-NEXT: v128.store 0($0), $1{{$}}
338; CHECK-NEXT: return{{$}}
339define void @store_v2i64_a32(<2 x i64> *%p, <2 x i64> %v) {
340 store <2 x i64> %v, <2 x i64>* %p, align 32
341 ret void
342}
343
344; ==============================================================================
345; 4 x float
346; ==============================================================================
347
348; CHECK-LABEL: load_v4f32_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000349; CHECK-NEXT: .functype load_v4f32_a1 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000350; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
351; CHECK-NEXT: return $pop[[R]]{{$}}
352define <4 x float> @load_v4f32_a1(<4 x float> *%p) {
353 %v = load <4 x float>, <4 x float>* %p, align 1
354 ret <4 x float> %v
355}
356
357; CHECK-LABEL: load_v4f32_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000358; CHECK-NEXT: .functype load_v4f32_a4 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000359; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
360; CHECK-NEXT: return $pop[[R]]{{$}}
361define <4 x float> @load_v4f32_a4(<4 x float> *%p) {
362 %v = load <4 x float>, <4 x float>* %p, align 4
363 ret <4 x float> %v
364}
365
366; 4 is the default alignment for v128 so no attribute is needed.
367
368; CHECK-LABEL: load_v4f32_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000369; CHECK-NEXT: .functype load_v4f32_a16 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000370; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
371; CHECK-NEXT: return $pop[[R]]{{$}}
372define <4 x float> @load_v4f32_a16(<4 x float> *%p) {
373 %v = load <4 x float>, <4 x float>* %p, align 16
374 ret <4 x float> %v
375}
376
377; 32 is greater than the default alignment so it is ignored.
378
379; CHECK-LABEL: load_v4f32_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000380; CHECK-NEXT: .functype load_v4f32_a32 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000381; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
382; CHECK-NEXT: return $pop[[R]]{{$}}
383define <4 x float> @load_v4f32_a32(<4 x float> *%p) {
384 %v = load <4 x float>, <4 x float>* %p, align 32
385 ret <4 x float> %v
386}
387
388; CHECK-LABEL: store_v4f32_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000389; CHECK-NEXT: .functype store_v4f32_a1 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000390; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
391; CHECK-NEXT: return{{$}}
392define void @store_v4f32_a1(<4 x float> *%p, <4 x float> %v) {
393 store <4 x float> %v, <4 x float>* %p, align 1
394 ret void
395}
396
397; CHECK-LABEL: store_v4f32_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000398; CHECK-NEXT: .functype store_v4f32_a4 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000399; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
400; CHECK-NEXT: return{{$}}
401define void @store_v4f32_a4(<4 x float> *%p, <4 x float> %v) {
402 store <4 x float> %v, <4 x float>* %p, align 4
403 ret void
404}
405
406; 16 is the default alignment for v128 so no attribute is needed.
407
408; CHECK-LABEL: store_v4f32_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000409; CHECK-NEXT: .functype store_v4f32_a16 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000410; CHECK-NEXT: v128.store 0($0), $1{{$}}
411; CHECK-NEXT: return{{$}}
412define void @store_v4f32_a16(<4 x float> *%p, <4 x float> %v) {
413 store <4 x float> %v, <4 x float>* %p, align 16
414 ret void
415}
416
417; 32 is greater than the default alignment so it is ignored.
418
419; CHECK-LABEL: store_v4f32_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000420; CHECK-NEXT: .functype store_v4f32_a32 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000421; CHECK-NEXT: v128.store 0($0), $1{{$}}
422; CHECK-NEXT: return{{$}}
423define void @store_v4f32_a32(<4 x float> *%p, <4 x float> %v) {
424 store <4 x float> %v, <4 x float>* %p, align 32
425 ret void
426}
427
428; ==============================================================================
429; 2 x double
430; ==============================================================================
431
432; CHECK-LABEL: load_v2f64_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000433; CHECK-NEXT: .functype load_v2f64_a1 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000434; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=0{{$}}
435; CHECK-NEXT: return $pop[[R]]{{$}}
436define <2 x double> @load_v2f64_a1(<2 x double> *%p) {
437 %v = load <2 x double>, <2 x double>* %p, align 1
438 ret <2 x double> %v
439}
440
441; CHECK-LABEL: load_v2f64_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000442; CHECK-NEXT: .functype load_v2f64_a4 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000443; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0):p2align=2{{$}}
444; CHECK-NEXT: return $pop[[R]]{{$}}
445define <2 x double> @load_v2f64_a4(<2 x double> *%p) {
446 %v = load <2 x double>, <2 x double>* %p, align 4
447 ret <2 x double> %v
448}
449
450; 2 is the default alignment for v128 so no attribute is needed.
451
452; CHECK-LABEL: load_v2f64_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000453; CHECK-NEXT: .functype load_v2f64_a16 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000454; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
455; CHECK-NEXT: return $pop[[R]]{{$}}
456define <2 x double> @load_v2f64_a16(<2 x double> *%p) {
457 %v = load <2 x double>, <2 x double>* %p, align 16
458 ret <2 x double> %v
459}
460
461; 32 is greater than the default alignment so it is ignored.
462
463; CHECK-LABEL: load_v2f64_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000464; CHECK-NEXT: .functype load_v2f64_a32 (i32) -> (v128){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000465; CHECK-NEXT: v128.load $push[[R:[0-9]+]]=, 0($0){{$}}
466; CHECK-NEXT: return $pop[[R]]{{$}}
467define <2 x double> @load_v2f64_a32(<2 x double> *%p) {
468 %v = load <2 x double>, <2 x double>* %p, align 32
469 ret <2 x double> %v
470}
471
472; CHECK-LABEL: store_v2f64_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000473; CHECK-NEXT: .functype store_v2f64_a1 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000474; CHECK-NEXT: v128.store 0($0):p2align=0, $1{{$}}
475; CHECK-NEXT: return{{$}}
476define void @store_v2f64_a1(<2 x double> *%p, <2 x double> %v) {
477 store <2 x double> %v, <2 x double>* %p, align 1
478 ret void
479}
480
481; CHECK-LABEL: store_v2f64_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000482; CHECK-NEXT: .functype store_v2f64_a4 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000483; CHECK-NEXT: v128.store 0($0):p2align=2, $1{{$}}
484; CHECK-NEXT: return{{$}}
485define void @store_v2f64_a4(<2 x double> *%p, <2 x double> %v) {
486 store <2 x double> %v, <2 x double>* %p, align 4
487 ret void
488}
489
490; 16 is the default alignment for v128 so no attribute is needed.
491
492; CHECK-LABEL: store_v2f64_a16:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000493; CHECK-NEXT: .functype store_v2f64_a16 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000494; CHECK-NEXT: v128.store 0($0), $1{{$}}
495; CHECK-NEXT: return{{$}}
496define void @store_v2f64_a16(<2 x double> *%p, <2 x double> %v) {
497 store <2 x double> %v, <2 x double>* %p, align 16
498 ret void
499}
500
501; 32 is greater than the default alignment so it is ignored.
502
503; CHECK-LABEL: store_v2f64_a32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000504; CHECK-NEXT: .functype store_v2f64_a32 (i32, v128) -> (){{$}}
Thomas Livelyb61232e2018-10-31 23:58:20 +0000505; CHECK-NEXT: v128.store 0($0), $1{{$}}
506; CHECK-NEXT: return{{$}}
507define void @store_v2f64_a32(<2 x double> *%p, <2 x double> %v) {
508 store <2 x double> %v, <2 x double>* %p, align 32
509 ret void
510}