[AArch64] Fix bug in prolog clobbering live reg when shrink wrapping.
[oota-llvm.git] / test / CodeGen / AArch64 / arm64-ld1.ll
1 ; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -verify-machineinstrs -asm-verbose=false | FileCheck %s
2
3 %struct.__neon_int8x8x2_t = type { <8 x i8>,  <8 x i8> }
4 %struct.__neon_int8x8x3_t = type { <8 x i8>,  <8 x i8>,  <8 x i8> }
5 %struct.__neon_int8x8x4_t = type { <8 x i8>,  <8 x i8>, <8 x i8>,  <8 x i8> }
6
7 define %struct.__neon_int8x8x2_t @ld2_8b(i8* %A) nounwind {
8 ; CHECK-LABEL: ld2_8b
9 ; Make sure we are loading into the results defined by the ABI (i.e., v0, v1)
10 ; and from the argument of the function also defined by ABI (i.e., x0)
11 ; CHECK: ld2.8b { v0, v1 }, [x0]
12 ; CHECK-NEXT: ret
13         %tmp2 = call %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2.v8i8.p0i8(i8* %A)
14         ret %struct.__neon_int8x8x2_t  %tmp2
15 }
16
17 define %struct.__neon_int8x8x3_t @ld3_8b(i8* %A) nounwind {
18 ; CHECK-LABEL: ld3_8b
19 ; Make sure we are using the operands defined by the ABI
20 ; CHECK: ld3.8b { v0, v1, v2 }, [x0]
21 ; CHECK-NEXT: ret
22         %tmp2 = call %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3.v8i8.p0i8(i8* %A)
23         ret %struct.__neon_int8x8x3_t  %tmp2
24 }
25
26 define %struct.__neon_int8x8x4_t @ld4_8b(i8* %A) nounwind {
27 ; CHECK-LABEL: ld4_8b
28 ; Make sure we are using the operands defined by the ABI
29 ; CHECK: ld4.8b { v0, v1, v2, v3 }, [x0]
30 ; CHECK-NEXT: ret
31         %tmp2 = call %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4.v8i8.p0i8(i8* %A)
32         ret %struct.__neon_int8x8x4_t  %tmp2
33 }
34
35 declare %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2.v8i8.p0i8(i8*) nounwind readonly
36 declare %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3.v8i8.p0i8(i8*) nounwind readonly
37 declare %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4.v8i8.p0i8(i8*) nounwind readonly
38
39 %struct.__neon_int8x16x2_t = type { <16 x i8>,  <16 x i8> }
40 %struct.__neon_int8x16x3_t = type { <16 x i8>,  <16 x i8>,  <16 x i8> }
41 %struct.__neon_int8x16x4_t = type { <16 x i8>,  <16 x i8>, <16 x i8>,  <16 x i8> }
42
43 define %struct.__neon_int8x16x2_t @ld2_16b(i8* %A) nounwind {
44 ; CHECK-LABEL: ld2_16b
45 ; Make sure we are using the operands defined by the ABI
46 ; CHECK: ld2.16b { v0, v1 }, [x0]
47 ; CHECK-NEXT: ret
48   %tmp2 = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2.v16i8.p0i8(i8* %A)
49   ret %struct.__neon_int8x16x2_t  %tmp2
50 }
51
52 define %struct.__neon_int8x16x3_t @ld3_16b(i8* %A) nounwind {
53 ; CHECK-LABEL: ld3_16b
54 ; Make sure we are using the operands defined by the ABI
55 ; CHECK: ld3.16b { v0, v1, v2 }, [x0]
56 ; CHECK-NEXT: ret
57   %tmp2 = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3.v16i8.p0i8(i8* %A)
58   ret %struct.__neon_int8x16x3_t  %tmp2
59 }
60
61 define %struct.__neon_int8x16x4_t @ld4_16b(i8* %A) nounwind {
62 ; CHECK-LABEL: ld4_16b
63 ; Make sure we are using the operands defined by the ABI
64 ; CHECK: ld4.16b { v0, v1, v2, v3 }, [x0]
65 ; CHECK-NEXT: ret
66   %tmp2 = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4.v16i8.p0i8(i8* %A)
67   ret %struct.__neon_int8x16x4_t  %tmp2
68 }
69
70 declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2.v16i8.p0i8(i8*) nounwind readonly
71 declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3.v16i8.p0i8(i8*) nounwind readonly
72 declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4.v16i8.p0i8(i8*) nounwind readonly
73
74 %struct.__neon_int16x4x2_t = type { <4 x i16>,  <4 x i16> }
75 %struct.__neon_int16x4x3_t = type { <4 x i16>,  <4 x i16>,  <4 x i16> }
76 %struct.__neon_int16x4x4_t = type { <4 x i16>,  <4 x i16>, <4 x i16>,  <4 x i16> }
77
78 define %struct.__neon_int16x4x2_t @ld2_4h(i16* %A) nounwind {
79 ; CHECK-LABEL: ld2_4h
80 ; Make sure we are using the operands defined by the ABI
81 ; CHECK: ld2.4h { v0, v1 }, [x0]
82 ; CHECK-NEXT: ret
83         %tmp2 = call %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2.v4i16.p0i16(i16* %A)
84         ret %struct.__neon_int16x4x2_t  %tmp2
85 }
86
87 define %struct.__neon_int16x4x3_t @ld3_4h(i16* %A) nounwind {
88 ; CHECK-LABEL: ld3_4h
89 ; Make sure we are using the operands defined by the ABI
90 ; CHECK: ld3.4h { v0, v1, v2 }, [x0]
91 ; CHECK-NEXT: ret
92         %tmp2 = call %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3.v4i16.p0i16(i16* %A)
93         ret %struct.__neon_int16x4x3_t  %tmp2
94 }
95
96 define %struct.__neon_int16x4x4_t @ld4_4h(i16* %A) nounwind {
97 ; CHECK-LABEL: ld4_4h
98 ; Make sure we are using the operands defined by the ABI
99 ; CHECK: ld4.4h { v0, v1, v2, v3 }, [x0]
100 ; CHECK-NEXT: ret
101         %tmp2 = call %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4.v4i16.p0i16(i16* %A)
102         ret %struct.__neon_int16x4x4_t  %tmp2
103 }
104
105 declare %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2.v4i16.p0i16(i16*) nounwind readonly
106 declare %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3.v4i16.p0i16(i16*) nounwind readonly
107 declare %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4.v4i16.p0i16(i16*) nounwind readonly
108
109 %struct.__neon_int16x8x2_t = type { <8 x i16>,  <8 x i16> }
110 %struct.__neon_int16x8x3_t = type { <8 x i16>,  <8 x i16>,  <8 x i16> }
111 %struct.__neon_int16x8x4_t = type { <8 x i16>,  <8 x i16>, <8 x i16>,  <8 x i16> }
112
113 define %struct.__neon_int16x8x2_t @ld2_8h(i16* %A) nounwind {
114 ; CHECK-LABEL: ld2_8h
115 ; Make sure we are using the operands defined by the ABI
116 ; CHECK: ld2.8h { v0, v1 }, [x0]
117 ; CHECK-NEXT: ret
118   %tmp2 = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2.v8i16.p0i16(i16* %A)
119   ret %struct.__neon_int16x8x2_t  %tmp2
120 }
121
122 define %struct.__neon_int16x8x3_t @ld3_8h(i16* %A) nounwind {
123 ; CHECK-LABEL: ld3_8h
124 ; Make sure we are using the operands defined by the ABI
125 ; CHECK: ld3.8h { v0, v1, v2 }, [x0]
126 ; CHECK-NEXT: ret
127   %tmp2 = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3.v8i16.p0i16(i16* %A)
128   ret %struct.__neon_int16x8x3_t %tmp2
129 }
130
131 define %struct.__neon_int16x8x4_t @ld4_8h(i16* %A) nounwind {
132 ; CHECK-LABEL: ld4_8h
133 ; Make sure we are using the operands defined by the ABI
134 ; CHECK: ld4.8h { v0, v1, v2, v3 }, [x0]
135 ; CHECK-NEXT: ret
136   %tmp2 = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4.v8i16.p0i16(i16* %A)
137   ret %struct.__neon_int16x8x4_t  %tmp2
138 }
139
140 declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2.v8i16.p0i16(i16*) nounwind readonly
141 declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3.v8i16.p0i16(i16*) nounwind readonly
142 declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4.v8i16.p0i16(i16*) nounwind readonly
143
144 %struct.__neon_int32x2x2_t = type { <2 x i32>,  <2 x i32> }
145 %struct.__neon_int32x2x3_t = type { <2 x i32>,  <2 x i32>,  <2 x i32> }
146 %struct.__neon_int32x2x4_t = type { <2 x i32>,  <2 x i32>, <2 x i32>,  <2 x i32> }
147
148 define %struct.__neon_int32x2x2_t @ld2_2s(i32* %A) nounwind {
149 ; CHECK-LABEL: ld2_2s
150 ; Make sure we are using the operands defined by the ABI
151 ; CHECK: ld2.2s { v0, v1 }, [x0]
152 ; CHECK-NEXT: ret
153         %tmp2 = call %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2.v2i32.p0i32(i32* %A)
154         ret %struct.__neon_int32x2x2_t  %tmp2
155 }
156
157 define %struct.__neon_int32x2x3_t @ld3_2s(i32* %A) nounwind {
158 ; CHECK-LABEL: ld3_2s
159 ; Make sure we are using the operands defined by the ABI
160 ; CHECK: ld3.2s { v0, v1, v2 }, [x0]
161 ; CHECK-NEXT: ret
162         %tmp2 = call %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3.v2i32.p0i32(i32* %A)
163         ret %struct.__neon_int32x2x3_t  %tmp2
164 }
165
166 define %struct.__neon_int32x2x4_t @ld4_2s(i32* %A) nounwind {
167 ; CHECK-LABEL: ld4_2s
168 ; Make sure we are using the operands defined by the ABI
169 ; CHECK: ld4.2s { v0, v1, v2, v3 }, [x0]
170 ; CHECK-NEXT: ret
171         %tmp2 = call %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4.v2i32.p0i32(i32* %A)
172         ret %struct.__neon_int32x2x4_t  %tmp2
173 }
174
175 declare %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2.v2i32.p0i32(i32*) nounwind readonly
176 declare %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3.v2i32.p0i32(i32*) nounwind readonly
177 declare %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4.v2i32.p0i32(i32*) nounwind readonly
178
179 %struct.__neon_int32x4x2_t = type { <4 x i32>,  <4 x i32> }
180 %struct.__neon_int32x4x3_t = type { <4 x i32>,  <4 x i32>,  <4 x i32> }
181 %struct.__neon_int32x4x4_t = type { <4 x i32>,  <4 x i32>, <4 x i32>,  <4 x i32> }
182
183 define %struct.__neon_int32x4x2_t @ld2_4s(i32* %A) nounwind {
184 ; CHECK-LABEL: ld2_4s
185 ; Make sure we are using the operands defined by the ABI
186 ; CHECK: ld2.4s { v0, v1 }, [x0]
187 ; CHECK-NEXT: ret
188         %tmp2 = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2.v4i32.p0i32(i32* %A)
189         ret %struct.__neon_int32x4x2_t  %tmp2
190 }
191
192 define %struct.__neon_int32x4x3_t @ld3_4s(i32* %A) nounwind {
193 ; CHECK-LABEL: ld3_4s
194 ; Make sure we are using the operands defined by the ABI
195 ; CHECK: ld3.4s { v0, v1, v2 }, [x0]
196 ; CHECK-NEXT: ret
197         %tmp2 = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3.v4i32.p0i32(i32* %A)
198         ret %struct.__neon_int32x4x3_t  %tmp2
199 }
200
201 define %struct.__neon_int32x4x4_t @ld4_4s(i32* %A) nounwind {
202 ; CHECK-LABEL: ld4_4s
203 ; Make sure we are using the operands defined by the ABI
204 ; CHECK: ld4.4s { v0, v1, v2, v3 }, [x0]
205 ; CHECK-NEXT: ret
206         %tmp2 = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4.v4i32.p0i32(i32* %A)
207         ret %struct.__neon_int32x4x4_t  %tmp2
208 }
209
210 declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2.v4i32.p0i32(i32*) nounwind readonly
211 declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3.v4i32.p0i32(i32*) nounwind readonly
212 declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4.v4i32.p0i32(i32*) nounwind readonly
213
214 %struct.__neon_int64x2x2_t = type { <2 x i64>,  <2 x i64> }
215 %struct.__neon_int64x2x3_t = type { <2 x i64>,  <2 x i64>,  <2 x i64> }
216 %struct.__neon_int64x2x4_t = type { <2 x i64>,  <2 x i64>, <2 x i64>,  <2 x i64> }
217
218 define %struct.__neon_int64x2x2_t @ld2_2d(i64* %A) nounwind {
219 ; CHECK-LABEL: ld2_2d
220 ; Make sure we are using the operands defined by the ABI
221 ; CHECK: ld2.2d { v0, v1 }, [x0]
222 ; CHECK-NEXT: ret
223         %tmp2 = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2.v2i64.p0i64(i64* %A)
224         ret %struct.__neon_int64x2x2_t  %tmp2
225 }
226
227 define %struct.__neon_int64x2x3_t @ld3_2d(i64* %A) nounwind {
228 ; CHECK-LABEL: ld3_2d
229 ; Make sure we are using the operands defined by the ABI
230 ; CHECK: ld3.2d { v0, v1, v2 }, [x0]
231 ; CHECK-NEXT: ret
232         %tmp2 = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3.v2i64.p0i64(i64* %A)
233         ret %struct.__neon_int64x2x3_t  %tmp2
234 }
235
236 define %struct.__neon_int64x2x4_t @ld4_2d(i64* %A) nounwind {
237 ; CHECK-LABEL: ld4_2d
238 ; Make sure we are using the operands defined by the ABI
239 ; CHECK: ld4.2d { v0, v1, v2, v3 }, [x0]
240 ; CHECK-NEXT: ret
241         %tmp2 = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4.v2i64.p0i64(i64* %A)
242         ret %struct.__neon_int64x2x4_t  %tmp2
243 }
244
245 declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2.v2i64.p0i64(i64*) nounwind readonly
246 declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3.v2i64.p0i64(i64*) nounwind readonly
247 declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4.v2i64.p0i64(i64*) nounwind readonly
248
249 %struct.__neon_int64x1x2_t = type { <1 x i64>,  <1 x i64> }
250 %struct.__neon_int64x1x3_t = type { <1 x i64>,  <1 x i64>, <1 x i64> }
251 %struct.__neon_int64x1x4_t = type { <1 x i64>,  <1 x i64>, <1 x i64>, <1 x i64> }
252
253
254 define %struct.__neon_int64x1x2_t @ld2_1di64(i64* %A) nounwind {
255 ; CHECK-LABEL: ld2_1di64
256 ; Make sure we are using the operands defined by the ABI
257 ; CHECK: ld1.1d { v0, v1 }, [x0]
258 ; CHECK-NEXT: ret
259         %tmp2 = call %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2.v1i64.p0i64(i64* %A)
260         ret %struct.__neon_int64x1x2_t  %tmp2
261 }
262
263 define %struct.__neon_int64x1x3_t @ld3_1di64(i64* %A) nounwind {
264 ; CHECK-LABEL: ld3_1di64
265 ; Make sure we are using the operands defined by the ABI
266 ; CHECK: ld1.1d { v0, v1, v2 }, [x0]
267 ; CHECK-NEXT: ret
268         %tmp2 = call %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3.v1i64.p0i64(i64* %A)
269         ret %struct.__neon_int64x1x3_t  %tmp2
270 }
271
272 define %struct.__neon_int64x1x4_t @ld4_1di64(i64* %A) nounwind {
273 ; CHECK-LABEL: ld4_1di64
274 ; Make sure we are using the operands defined by the ABI
275 ; CHECK: ld1.1d { v0, v1, v2, v3 }, [x0]
276 ; CHECK-NEXT: ret
277         %tmp2 = call %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4.v1i64.p0i64(i64* %A)
278         ret %struct.__neon_int64x1x4_t  %tmp2
279 }
280
281
282 declare %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2.v1i64.p0i64(i64*) nounwind readonly
283 declare %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3.v1i64.p0i64(i64*) nounwind readonly
284 declare %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4.v1i64.p0i64(i64*) nounwind readonly
285
286 %struct.__neon_float64x1x2_t = type { <1 x double>,  <1 x double> }
287 %struct.__neon_float64x1x3_t = type { <1 x double>,  <1 x double>, <1 x double> }
288 %struct.__neon_float64x1x4_t = type { <1 x double>,  <1 x double>, <1 x double>, <1 x double> }
289
290
291 define %struct.__neon_float64x1x2_t @ld2_1df64(double* %A) nounwind {
292 ; CHECK-LABEL: ld2_1df64
293 ; Make sure we are using the operands defined by the ABI
294 ; CHECK: ld1.1d { v0, v1 }, [x0]
295 ; CHECK-NEXT: ret
296         %tmp2 = call %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld2.v1f64.p0f64(double* %A)
297         ret %struct.__neon_float64x1x2_t  %tmp2
298 }
299
300 define %struct.__neon_float64x1x3_t @ld3_1df64(double* %A) nounwind {
301 ; CHECK-LABEL: ld3_1df64
302 ; Make sure we are using the operands defined by the ABI
303 ; CHECK: ld1.1d { v0, v1, v2 }, [x0]
304 ; CHECK-NEXT: ret
305         %tmp2 = call %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld3.v1f64.p0f64(double* %A)
306         ret %struct.__neon_float64x1x3_t  %tmp2
307 }
308
309 define %struct.__neon_float64x1x4_t @ld4_1df64(double* %A) nounwind {
310 ; CHECK-LABEL: ld4_1df64
311 ; Make sure we are using the operands defined by the ABI
312 ; CHECK: ld1.1d { v0, v1, v2, v3 }, [x0]
313 ; CHECK-NEXT: ret
314         %tmp2 = call %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld4.v1f64.p0f64(double* %A)
315         ret %struct.__neon_float64x1x4_t  %tmp2
316 }
317
318 declare %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld2.v1f64.p0f64(double*) nounwind readonly
319 declare %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld3.v1f64.p0f64(double*) nounwind readonly
320 declare %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld4.v1f64.p0f64(double*) nounwind readonly
321
322
323 define %struct.__neon_int8x16x2_t @ld2lane_16b(<16 x i8> %L1, <16 x i8> %L2, i8* %A) nounwind {
324 ; Make sure we are using the operands defined by the ABI
325 ; CHECK: ld2lane_16b
326 ; CHECK: ld2.b { v0, v1 }[1], [x0]
327 ; CHECK-NEXT: ret
328         %tmp2 = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2lane.v16i8.p0i8(<16 x i8> %L1, <16 x i8> %L2, i64 1, i8* %A)
329         ret %struct.__neon_int8x16x2_t  %tmp2
330 }
331
332 define %struct.__neon_int8x16x3_t @ld3lane_16b(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, i8* %A) nounwind {
333 ; Make sure we are using the operands defined by the ABI
334 ; CHECK: ld3lane_16b
335 ; CHECK: ld3.b { v0, v1, v2 }[1], [x0]
336 ; CHECK-NEXT: ret
337         %tmp2 = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3lane.v16i8.p0i8(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, i64 1, i8* %A)
338         ret %struct.__neon_int8x16x3_t  %tmp2
339 }
340
341 define %struct.__neon_int8x16x4_t @ld4lane_16b(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, <16 x i8> %L4, i8* %A) nounwind {
342 ; Make sure we are using the operands defined by the ABI
343 ; CHECK: ld4lane_16b
344 ; CHECK: ld4.b { v0, v1, v2, v3 }[1], [x0]
345 ; CHECK-NEXT: ret
346         %tmp2 = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4lane.v16i8.p0i8(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, <16 x i8> %L4, i64 1, i8* %A)
347         ret %struct.__neon_int8x16x4_t  %tmp2
348 }
349
350 declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2lane.v16i8.p0i8(<16 x i8>, <16 x i8>, i64, i8*) nounwind readonly
351 declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3lane.v16i8.p0i8(<16 x i8>, <16 x i8>, <16 x i8>, i64, i8*) nounwind readonly
352 declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4lane.v16i8.p0i8(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i64, i8*) nounwind readonly
353
354 define %struct.__neon_int16x8x2_t @ld2lane_8h(<8 x i16> %L1, <8 x i16> %L2, i16* %A) nounwind {
355 ; Make sure we are using the operands defined by the ABI
356 ; CHECK: ld2lane_8h
357 ; CHECK: ld2.h { v0, v1 }[1], [x0]
358 ; CHECK-NEXT: ret
359         %tmp2 = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2lane.v8i16.p0i16(<8 x i16> %L1, <8 x i16> %L2, i64 1, i16* %A)
360         ret %struct.__neon_int16x8x2_t  %tmp2
361 }
362
363 define %struct.__neon_int16x8x3_t @ld3lane_8h(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, i16* %A) nounwind {
364 ; Make sure we are using the operands defined by the ABI
365 ; CHECK: ld3lane_8h
366 ; CHECK: ld3.h { v0, v1, v2 }[1], [x0]
367 ; CHECK-NEXT: ret
368         %tmp2 = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3lane.v8i16.p0i16(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, i64 1, i16* %A)
369         ret %struct.__neon_int16x8x3_t  %tmp2
370 }
371
372 define %struct.__neon_int16x8x4_t @ld4lane_8h(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, <8 x i16> %L4, i16* %A) nounwind {
373 ; Make sure we are using the operands defined by the ABI
374 ; CHECK: ld4lane_8h
375 ; CHECK: ld4.h { v0, v1, v2, v3 }[1], [x0]
376 ; CHECK-NEXT: ret
377         %tmp2 = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4lane.v8i16.p0i16(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, <8 x i16> %L4, i64 1, i16* %A)
378         ret %struct.__neon_int16x8x4_t  %tmp2
379 }
380
381 declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2lane.v8i16.p0i16(<8 x i16>, <8 x i16>, i64, i16*) nounwind readonly
382 declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3lane.v8i16.p0i16(<8 x i16>, <8 x i16>, <8 x i16>, i64, i16*) nounwind readonly
383 declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4lane.v8i16.p0i16(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i64, i16*) nounwind readonly
384
385 define %struct.__neon_int32x4x2_t @ld2lane_4s(<4 x i32> %L1, <4 x i32> %L2, i32* %A) nounwind {
386 ; Make sure we are using the operands defined by the ABI
387 ; CHECK: ld2lane_4s
388 ; CHECK: ld2.s { v0, v1 }[1], [x0]
389 ; CHECK-NEXT: ret
390         %tmp2 = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2lane.v4i32.p0i32(<4 x i32> %L1, <4 x i32> %L2, i64 1, i32* %A)
391         ret %struct.__neon_int32x4x2_t  %tmp2
392 }
393
394 define %struct.__neon_int32x4x3_t @ld3lane_4s(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, i32* %A) nounwind {
395 ; Make sure we are using the operands defined by the ABI
396 ; CHECK: ld3lane_4s
397 ; CHECK: ld3.s { v0, v1, v2 }[1], [x0]
398 ; CHECK-NEXT: ret
399         %tmp2 = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3lane.v4i32.p0i32(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, i64 1, i32* %A)
400         ret %struct.__neon_int32x4x3_t  %tmp2
401 }
402
403 define %struct.__neon_int32x4x4_t @ld4lane_4s(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, <4 x i32> %L4, i32* %A) nounwind {
404 ; Make sure we are using the operands defined by the ABI
405 ; CHECK: ld4lane_4s
406 ; CHECK: ld4.s { v0, v1, v2, v3 }[1], [x0]
407 ; CHECK-NEXT: ret
408         %tmp2 = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4lane.v4i32.p0i32(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, <4 x i32> %L4, i64 1, i32* %A)
409         ret %struct.__neon_int32x4x4_t  %tmp2
410 }
411
412 declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2lane.v4i32.p0i32(<4 x i32>, <4 x i32>, i64, i32*) nounwind readonly
413 declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3lane.v4i32.p0i32(<4 x i32>, <4 x i32>, <4 x i32>, i64, i32*) nounwind readonly
414 declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4lane.v4i32.p0i32(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i64, i32*) nounwind readonly
415
416 define %struct.__neon_int64x2x2_t @ld2lane_2d(<2 x i64> %L1, <2 x i64> %L2, i64* %A) nounwind {
417 ; Make sure we are using the operands defined by the ABI
418 ; CHECK: ld2lane_2d
419 ; CHECK: ld2.d { v0, v1 }[1], [x0]
420 ; CHECK-NEXT: ret
421         %tmp2 = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2lane.v2i64.p0i64(<2 x i64> %L1, <2 x i64> %L2, i64 1, i64* %A)
422         ret %struct.__neon_int64x2x2_t  %tmp2
423 }
424
425 define %struct.__neon_int64x2x3_t @ld3lane_2d(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, i64* %A) nounwind {
426 ; Make sure we are using the operands defined by the ABI
427 ; CHECK: ld3lane_2d
428 ; CHECK: ld3.d { v0, v1, v2 }[1], [x0]
429 ; CHECK-NEXT: ret
430         %tmp2 = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3lane.v2i64.p0i64(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, i64 1, i64* %A)
431         ret %struct.__neon_int64x2x3_t  %tmp2
432 }
433
434 define %struct.__neon_int64x2x4_t @ld4lane_2d(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, <2 x i64> %L4, i64* %A) nounwind {
435 ; Make sure we are using the operands defined by the ABI
436 ; CHECK: ld4lane_2d
437 ; CHECK: ld4.d { v0, v1, v2, v3 }[1], [x0]
438 ; CHECK-NEXT: ret
439         %tmp2 = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4lane.v2i64.p0i64(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, <2 x i64> %L4, i64 1, i64* %A)
440         ret %struct.__neon_int64x2x4_t  %tmp2
441 }
442
443 declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2lane.v2i64.p0i64(<2 x i64>, <2 x i64>, i64, i64*) nounwind readonly
444 declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3lane.v2i64.p0i64(<2 x i64>, <2 x i64>, <2 x i64>, i64, i64*) nounwind readonly
445 declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4lane.v2i64.p0i64(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i64, i64*) nounwind readonly
446
447 define <8 x i8> @ld1r_8b(i8* %bar) {
448 ; CHECK: ld1r_8b
449 ; Make sure we are using the operands defined by the ABI
450 ; CHECK: ld1r.8b { v0 }, [x0]
451 ; CHECK-NEXT: ret
452   %tmp1 = load i8, i8* %bar
453   %tmp2 = insertelement <8 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 %tmp1, i32 0
454   %tmp3 = insertelement <8 x i8> %tmp2, i8 %tmp1, i32 1
455   %tmp4 = insertelement <8 x i8> %tmp3, i8 %tmp1, i32 2
456   %tmp5 = insertelement <8 x i8> %tmp4, i8 %tmp1, i32 3
457   %tmp6 = insertelement <8 x i8> %tmp5, i8 %tmp1, i32 4
458   %tmp7 = insertelement <8 x i8> %tmp6, i8 %tmp1, i32 5
459   %tmp8 = insertelement <8 x i8> %tmp7, i8 %tmp1, i32 6
460   %tmp9 = insertelement <8 x i8> %tmp8, i8 %tmp1, i32 7
461   ret <8 x i8> %tmp9
462 }
463
464 define <16 x i8> @ld1r_16b(i8* %bar) {
465 ; CHECK: ld1r_16b
466 ; Make sure we are using the operands defined by the ABI
467 ; CHECK: ld1r.16b { v0 }, [x0]
468 ; CHECK-NEXT: ret
469   %tmp1 = load i8, i8* %bar
470   %tmp2 = insertelement <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 %tmp1, i32 0
471   %tmp3 = insertelement <16 x i8> %tmp2, i8 %tmp1, i32 1
472   %tmp4 = insertelement <16 x i8> %tmp3, i8 %tmp1, i32 2
473   %tmp5 = insertelement <16 x i8> %tmp4, i8 %tmp1, i32 3
474   %tmp6 = insertelement <16 x i8> %tmp5, i8 %tmp1, i32 4
475   %tmp7 = insertelement <16 x i8> %tmp6, i8 %tmp1, i32 5
476   %tmp8 = insertelement <16 x i8> %tmp7, i8 %tmp1, i32 6
477   %tmp9 = insertelement <16 x i8> %tmp8, i8 %tmp1, i32 7
478   %tmp10 = insertelement <16 x i8> %tmp9, i8 %tmp1, i32 8
479   %tmp11 = insertelement <16 x i8> %tmp10, i8 %tmp1, i32 9
480   %tmp12 = insertelement <16 x i8> %tmp11, i8 %tmp1, i32 10
481   %tmp13 = insertelement <16 x i8> %tmp12, i8 %tmp1, i32 11
482   %tmp14 = insertelement <16 x i8> %tmp13, i8 %tmp1, i32 12
483   %tmp15 = insertelement <16 x i8> %tmp14, i8 %tmp1, i32 13
484   %tmp16 = insertelement <16 x i8> %tmp15, i8 %tmp1, i32 14
485   %tmp17 = insertelement <16 x i8> %tmp16, i8 %tmp1, i32 15
486   ret <16 x i8> %tmp17
487 }
488
489 define <4 x i16> @ld1r_4h(i16* %bar) {
490 ; CHECK: ld1r_4h
491 ; Make sure we are using the operands defined by the ABI
492 ; CHECK: ld1r.4h { v0 }, [x0]
493 ; CHECK-NEXT: ret
494   %tmp1 = load i16, i16* %bar
495   %tmp2 = insertelement <4 x i16> <i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0
496   %tmp3 = insertelement <4 x i16> %tmp2, i16 %tmp1, i32 1
497   %tmp4 = insertelement <4 x i16> %tmp3, i16 %tmp1, i32 2
498   %tmp5 = insertelement <4 x i16> %tmp4, i16 %tmp1, i32 3
499   ret <4 x i16> %tmp5
500 }
501
502 define <8 x i16> @ld1r_8h(i16* %bar) {
503 ; CHECK: ld1r_8h
504 ; Make sure we are using the operands defined by the ABI
505 ; CHECK: ld1r.8h { v0 }, [x0]
506 ; CHECK-NEXT: ret
507   %tmp1 = load i16, i16* %bar
508   %tmp2 = insertelement <8 x i16> <i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0
509   %tmp3 = insertelement <8 x i16> %tmp2, i16 %tmp1, i32 1
510   %tmp4 = insertelement <8 x i16> %tmp3, i16 %tmp1, i32 2
511   %tmp5 = insertelement <8 x i16> %tmp4, i16 %tmp1, i32 3
512   %tmp6 = insertelement <8 x i16> %tmp5, i16 %tmp1, i32 4
513   %tmp7 = insertelement <8 x i16> %tmp6, i16 %tmp1, i32 5
514   %tmp8 = insertelement <8 x i16> %tmp7, i16 %tmp1, i32 6
515   %tmp9 = insertelement <8 x i16> %tmp8, i16 %tmp1, i32 7
516   ret <8 x i16> %tmp9
517 }
518
519 define <2 x i32> @ld1r_2s(i32* %bar) {
520 ; CHECK: ld1r_2s
521 ; Make sure we are using the operands defined by the ABI
522 ; CHECK: ld1r.2s { v0 }, [x0]
523 ; CHECK-NEXT: ret
524   %tmp1 = load i32, i32* %bar
525   %tmp2 = insertelement <2 x i32> <i32 undef, i32 undef>, i32 %tmp1, i32 0
526   %tmp3 = insertelement <2 x i32> %tmp2, i32 %tmp1, i32 1
527   ret <2 x i32> %tmp3
528 }
529
530 define <4 x i32> @ld1r_4s(i32* %bar) {
531 ; CHECK: ld1r_4s
532 ; Make sure we are using the operands defined by the ABI
533 ; CHECK: ld1r.4s { v0 }, [x0]
534 ; CHECK-NEXT: ret
535   %tmp1 = load i32, i32* %bar
536   %tmp2 = insertelement <4 x i32> <i32 undef, i32 undef, i32 undef, i32 undef>, i32 %tmp1, i32 0
537   %tmp3 = insertelement <4 x i32> %tmp2, i32 %tmp1, i32 1
538   %tmp4 = insertelement <4 x i32> %tmp3, i32 %tmp1, i32 2
539   %tmp5 = insertelement <4 x i32> %tmp4, i32 %tmp1, i32 3
540   ret <4 x i32> %tmp5
541 }
542
543 define <2 x i64> @ld1r_2d(i64* %bar) {
544 ; CHECK: ld1r_2d
545 ; Make sure we are using the operands defined by the ABI
546 ; CHECK: ld1r.2d { v0 }, [x0]
547 ; CHECK-NEXT: ret
548   %tmp1 = load i64, i64* %bar
549   %tmp2 = insertelement <2 x i64> <i64 undef, i64 undef>, i64 %tmp1, i32 0
550   %tmp3 = insertelement <2 x i64> %tmp2, i64 %tmp1, i32 1
551   ret <2 x i64> %tmp3
552 }
553
554 define %struct.__neon_int8x8x2_t @ld2r_8b(i8* %A) nounwind {
555 ; CHECK: ld2r_8b
556 ; Make sure we are using the operands defined by the ABI
557 ; CHECK: ld2r.8b { v0, v1 }, [x0]
558 ; CHECK-NEXT: ret
559         %tmp2 = call %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2r.v8i8.p0i8(i8* %A)
560         ret %struct.__neon_int8x8x2_t  %tmp2
561 }
562
563 define %struct.__neon_int8x8x3_t @ld3r_8b(i8* %A) nounwind {
564 ; CHECK: ld3r_8b
565 ; Make sure we are using the operands defined by the ABI
566 ; CHECK: ld3r.8b { v0, v1, v2 }, [x0]
567 ; CHECK-NEXT: ret
568         %tmp2 = call %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3r.v8i8.p0i8(i8* %A)
569         ret %struct.__neon_int8x8x3_t  %tmp2
570 }
571
572 define %struct.__neon_int8x8x4_t @ld4r_8b(i8* %A) nounwind {
573 ; CHECK: ld4r_8b
574 ; Make sure we are using the operands defined by the ABI
575 ; CHECK: ld4r.8b { v0, v1, v2, v3 }, [x0]
576 ; CHECK-NEXT: ret
577         %tmp2 = call %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4r.v8i8.p0i8(i8* %A)
578         ret %struct.__neon_int8x8x4_t  %tmp2
579 }
580
581 declare %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2r.v8i8.p0i8(i8*) nounwind readonly
582 declare %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3r.v8i8.p0i8(i8*) nounwind readonly
583 declare %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4r.v8i8.p0i8(i8*) nounwind readonly
584
585 define %struct.__neon_int8x16x2_t @ld2r_16b(i8* %A) nounwind {
586 ; CHECK: ld2r_16b
587 ; Make sure we are using the operands defined by the ABI
588 ; CHECK: ld2r.16b { v0, v1 }, [x0]
589 ; CHECK-NEXT: ret
590         %tmp2 = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2r.v16i8.p0i8(i8* %A)
591         ret %struct.__neon_int8x16x2_t  %tmp2
592 }
593
594 define %struct.__neon_int8x16x3_t @ld3r_16b(i8* %A) nounwind {
595 ; CHECK: ld3r_16b
596 ; Make sure we are using the operands defined by the ABI
597 ; CHECK: ld3r.16b { v0, v1, v2 }, [x0]
598 ; CHECK-NEXT: ret
599         %tmp2 = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3r.v16i8.p0i8(i8* %A)
600         ret %struct.__neon_int8x16x3_t  %tmp2
601 }
602
603 define %struct.__neon_int8x16x4_t @ld4r_16b(i8* %A) nounwind {
604 ; CHECK: ld4r_16b
605 ; Make sure we are using the operands defined by the ABI
606 ; CHECK: ld4r.16b { v0, v1, v2, v3 }, [x0]
607 ; CHECK-NEXT: ret
608         %tmp2 = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4r.v16i8.p0i8(i8* %A)
609         ret %struct.__neon_int8x16x4_t  %tmp2
610 }
611
612 declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2r.v16i8.p0i8(i8*) nounwind readonly
613 declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3r.v16i8.p0i8(i8*) nounwind readonly
614 declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4r.v16i8.p0i8(i8*) nounwind readonly
615
616 define %struct.__neon_int16x4x2_t @ld2r_4h(i16* %A) nounwind {
617 ; CHECK: ld2r_4h
618 ; Make sure we are using the operands defined by the ABI
619 ; CHECK: ld2r.4h { v0, v1 }, [x0]
620 ; CHECK-NEXT: ret
621         %tmp2 = call %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2r.v4i16.p0i16(i16* %A)
622         ret %struct.__neon_int16x4x2_t  %tmp2
623 }
624
625 define %struct.__neon_int16x4x3_t @ld3r_4h(i16* %A) nounwind {
626 ; CHECK: ld3r_4h
627 ; Make sure we are using the operands defined by the ABI
628 ; CHECK: ld3r.4h { v0, v1, v2 }, [x0]
629 ; CHECK-NEXT: ret
630         %tmp2 = call %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3r.v4i16.p0i16(i16* %A)
631         ret %struct.__neon_int16x4x3_t  %tmp2
632 }
633
634 define %struct.__neon_int16x4x4_t @ld4r_4h(i16* %A) nounwind {
635 ; CHECK: ld4r_4h
636 ; Make sure we are using the operands defined by the ABI
637 ; CHECK: ld4r.4h { v0, v1, v2, v3 }, [x0]
638 ; CHECK-NEXT: ret
639         %tmp2 = call %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4r.v4i16.p0i16(i16* %A)
640         ret %struct.__neon_int16x4x4_t  %tmp2
641 }
642
643 declare %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2r.v4i16.p0i16(i16*) nounwind readonly
644 declare %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3r.v4i16.p0i16(i16*) nounwind readonly
645 declare %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4r.v4i16.p0i16(i16*) nounwind readonly
646
647 define %struct.__neon_int16x8x2_t @ld2r_8h(i16* %A) nounwind {
648 ; CHECK: ld2r_8h
649 ; Make sure we are using the operands defined by the ABI
650 ; CHECK: ld2r.8h { v0, v1 }, [x0]
651 ; CHECK-NEXT: ret
652   %tmp2 = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2r.v8i16.p0i16(i16* %A)
653   ret %struct.__neon_int16x8x2_t  %tmp2
654 }
655
656 define %struct.__neon_int16x8x3_t @ld3r_8h(i16* %A) nounwind {
657 ; CHECK: ld3r_8h
658 ; Make sure we are using the operands defined by the ABI
659 ; CHECK: ld3r.8h { v0, v1, v2 }, [x0]
660 ; CHECK-NEXT: ret
661   %tmp2 = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3r.v8i16.p0i16(i16* %A)
662   ret %struct.__neon_int16x8x3_t  %tmp2
663 }
664
665 define %struct.__neon_int16x8x4_t @ld4r_8h(i16* %A) nounwind {
666 ; CHECK: ld4r_8h
667 ; Make sure we are using the operands defined by the ABI
668 ; CHECK: ld4r.8h { v0, v1, v2, v3 }, [x0]
669 ; CHECK-NEXT: ret
670   %tmp2 = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4r.v8i16.p0i16(i16* %A)
671   ret %struct.__neon_int16x8x4_t  %tmp2
672 }
673
674 declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2r.v8i16.p0i16(i16*) nounwind readonly
675 declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3r.v8i16.p0i16(i16*) nounwind readonly
676 declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4r.v8i16.p0i16(i16*) nounwind readonly
677
678 define %struct.__neon_int32x2x2_t @ld2r_2s(i32* %A) nounwind {
679 ; CHECK: ld2r_2s
680 ; Make sure we are using the operands defined by the ABI
681 ; CHECK: ld2r.2s { v0, v1 }, [x0]
682 ; CHECK-NEXT: ret
683         %tmp2 = call %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2r.v2i32.p0i32(i32* %A)
684         ret %struct.__neon_int32x2x2_t  %tmp2
685 }
686
687 define %struct.__neon_int32x2x3_t @ld3r_2s(i32* %A) nounwind {
688 ; CHECK: ld3r_2s
689 ; Make sure we are using the operands defined by the ABI
690 ; CHECK: ld3r.2s { v0, v1, v2 }, [x0]
691 ; CHECK-NEXT: ret
692         %tmp2 = call %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3r.v2i32.p0i32(i32* %A)
693         ret %struct.__neon_int32x2x3_t  %tmp2
694 }
695
696 define %struct.__neon_int32x2x4_t @ld4r_2s(i32* %A) nounwind {
697 ; CHECK: ld4r_2s
698 ; Make sure we are using the operands defined by the ABI
699 ; CHECK: ld4r.2s { v0, v1, v2, v3 }, [x0]
700 ; CHECK-NEXT: ret
701         %tmp2 = call %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4r.v2i32.p0i32(i32* %A)
702         ret %struct.__neon_int32x2x4_t  %tmp2
703 }
704
705 declare %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2r.v2i32.p0i32(i32*) nounwind readonly
706 declare %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3r.v2i32.p0i32(i32*) nounwind readonly
707 declare %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4r.v2i32.p0i32(i32*) nounwind readonly
708
709 define %struct.__neon_int32x4x2_t @ld2r_4s(i32* %A) nounwind {
710 ; CHECK: ld2r_4s
711 ; Make sure we are using the operands defined by the ABI
712 ; CHECK: ld2r.4s { v0, v1 }, [x0]
713 ; CHECK-NEXT: ret
714         %tmp2 = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2r.v4i32.p0i32(i32* %A)
715         ret %struct.__neon_int32x4x2_t  %tmp2
716 }
717
718 define %struct.__neon_int32x4x3_t @ld3r_4s(i32* %A) nounwind {
719 ; CHECK: ld3r_4s
720 ; Make sure we are using the operands defined by the ABI
721 ; CHECK: ld3r.4s { v0, v1, v2 }, [x0]
722 ; CHECK-NEXT: ret
723         %tmp2 = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3r.v4i32.p0i32(i32* %A)
724         ret %struct.__neon_int32x4x3_t  %tmp2
725 }
726
727 define %struct.__neon_int32x4x4_t @ld4r_4s(i32* %A) nounwind {
728 ; CHECK: ld4r_4s
729 ; Make sure we are using the operands defined by the ABI
730 ; CHECK: ld4r.4s { v0, v1, v2, v3 }, [x0]
731 ; CHECK-NEXT: ret
732         %tmp2 = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4r.v4i32.p0i32(i32* %A)
733         ret %struct.__neon_int32x4x4_t  %tmp2
734 }
735
736 declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2r.v4i32.p0i32(i32*) nounwind readonly
737 declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3r.v4i32.p0i32(i32*) nounwind readonly
738 declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4r.v4i32.p0i32(i32*) nounwind readonly
739
740 define %struct.__neon_int64x1x2_t @ld2r_1d(i64* %A) nounwind {
741 ; CHECK: ld2r_1d
742 ; Make sure we are using the operands defined by the ABI
743 ; CHECK: ld2r.1d { v0, v1 }, [x0]
744 ; CHECK-NEXT: ret
745         %tmp2 = call %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2r.v1i64.p0i64(i64* %A)
746         ret %struct.__neon_int64x1x2_t  %tmp2
747 }
748
749 define %struct.__neon_int64x1x3_t @ld3r_1d(i64* %A) nounwind {
750 ; CHECK: ld3r_1d
751 ; Make sure we are using the operands defined by the ABI
752 ; CHECK: ld3r.1d { v0, v1, v2 }, [x0]
753 ; CHECK-NEXT: ret
754         %tmp2 = call %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3r.v1i64.p0i64(i64* %A)
755         ret %struct.__neon_int64x1x3_t  %tmp2
756 }
757
758 define %struct.__neon_int64x1x4_t @ld4r_1d(i64* %A) nounwind {
759 ; CHECK: ld4r_1d
760 ; Make sure we are using the operands defined by the ABI
761 ; CHECK: ld4r.1d { v0, v1, v2, v3 }, [x0]
762 ; CHECK-NEXT: ret
763         %tmp2 = call %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4r.v1i64.p0i64(i64* %A)
764         ret %struct.__neon_int64x1x4_t  %tmp2
765 }
766
767 declare %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2r.v1i64.p0i64(i64*) nounwind readonly
768 declare %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3r.v1i64.p0i64(i64*) nounwind readonly
769 declare %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4r.v1i64.p0i64(i64*) nounwind readonly
770
771 define %struct.__neon_int64x2x2_t @ld2r_2d(i64* %A) nounwind {
772 ; CHECK: ld2r_2d
773 ; Make sure we are using the operands defined by the ABI
774 ; CHECK: ld2r.2d { v0, v1 }, [x0]
775 ; CHECK-NEXT: ret
776         %tmp2 = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2r.v2i64.p0i64(i64* %A)
777         ret %struct.__neon_int64x2x2_t  %tmp2
778 }
779
780 define %struct.__neon_int64x2x3_t @ld3r_2d(i64* %A) nounwind {
781 ; CHECK: ld3r_2d
782 ; Make sure we are using the operands defined by the ABI
783 ; CHECK: ld3r.2d { v0, v1, v2 }, [x0]
784 ; CHECK-NEXT: ret
785         %tmp2 = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3r.v2i64.p0i64(i64* %A)
786         ret %struct.__neon_int64x2x3_t  %tmp2
787 }
788
789 define %struct.__neon_int64x2x4_t @ld4r_2d(i64* %A) nounwind {
790 ; CHECK: ld4r_2d
791 ; Make sure we are using the operands defined by the ABI
792 ; CHECK: ld4r.2d { v0, v1, v2, v3 }, [x0]
793 ; CHECK-NEXT: ret
794         %tmp2 = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4r.v2i64.p0i64(i64* %A)
795         ret %struct.__neon_int64x2x4_t  %tmp2
796 }
797
798 declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2r.v2i64.p0i64(i64*) nounwind readonly
799 declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3r.v2i64.p0i64(i64*) nounwind readonly
800 declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4r.v2i64.p0i64(i64*) nounwind readonly
801
802 define <16 x i8> @ld1_16b(<16 x i8> %V, i8* %bar) {
803 ; CHECK-LABEL: ld1_16b
804 ; Make sure we are using the operands defined by the ABI
805 ; CHECK: ld1.b { v0 }[0], [x0]
806 ; CHECK-NEXT: ret
807   %tmp1 = load i8, i8* %bar
808   %tmp2 = insertelement <16 x i8> %V, i8 %tmp1, i32 0
809   ret <16 x i8> %tmp2
810 }
811
812 define <8 x i16> @ld1_8h(<8 x i16> %V, i16* %bar) {
813 ; CHECK-LABEL: ld1_8h
814 ; Make sure we are using the operands defined by the ABI
815 ; CHECK: ld1.h { v0 }[0], [x0]
816 ; CHECK-NEXT: ret
817   %tmp1 = load i16, i16* %bar
818   %tmp2 = insertelement <8 x i16> %V, i16 %tmp1, i32 0
819   ret <8 x i16> %tmp2
820 }
821
822 define <4 x i32> @ld1_4s(<4 x i32> %V, i32* %bar) {
823 ; CHECK-LABEL: ld1_4s
824 ; Make sure we are using the operands defined by the ABI
825 ; CHECK: ld1.s { v0 }[0], [x0]
826 ; CHECK-NEXT: ret
827   %tmp1 = load i32, i32* %bar
828   %tmp2 = insertelement <4 x i32> %V, i32 %tmp1, i32 0
829   ret <4 x i32> %tmp2
830 }
831
832 define <4 x float> @ld1_4s_float(<4 x float> %V, float* %bar) {
833 ; CHECK-LABEL: ld1_4s_float:
834 ; Make sure we are using the operands defined by the ABI
835 ; CHECK: ld1.s { v0 }[0], [x0]
836 ; CHECK-NEXT: ret
837   %tmp1 = load float, float* %bar
838   %tmp2 = insertelement <4 x float> %V, float %tmp1, i32 0
839   ret <4 x float> %tmp2
840 }
841
842 define <2 x i64> @ld1_2d(<2 x i64> %V, i64* %bar) {
843 ; CHECK-LABEL: ld1_2d
844 ; Make sure we are using the operands defined by the ABI
845 ; CHECK: ld1.d { v0 }[0], [x0]
846 ; CHECK-NEXT: ret
847   %tmp1 = load i64, i64* %bar
848   %tmp2 = insertelement <2 x i64> %V, i64 %tmp1, i32 0
849   ret <2 x i64> %tmp2
850 }
851
852 define <2 x double> @ld1_2d_double(<2 x double> %V, double* %bar) {
853 ; CHECK-LABEL: ld1_2d_double:
854 ; Make sure we are using the operands defined by the ABI
855 ; CHECK: ld1.d { v0 }[0], [x0]
856 ; CHECK-NEXT: ret
857   %tmp1 = load double, double* %bar
858   %tmp2 = insertelement <2 x double> %V, double %tmp1, i32 0
859   ret <2 x double> %tmp2
860 }
861
862 define <1 x i64> @ld1_1d(<1 x i64>* %p) {
863 ; CHECK-LABEL: ld1_1d
864 ; Make sure we are using the operands defined by the ABI
865 ; CHECK: ldr [[REG:d[0-9]+]], [x0]
866 ; CHECK-NEXT: ret
867   %tmp = load <1 x i64>, <1 x i64>* %p, align 8
868   ret <1 x i64> %tmp
869 }
870
871 define <8 x i8> @ld1_8b(<8 x i8> %V, i8* %bar) {
872 ; CHECK-LABEL: ld1_8b
873 ; Make sure we are using the operands defined by the ABI
874 ; CHECK: ld1.b { v0 }[0], [x0]
875 ; CHECK-NEXT: ret
876   %tmp1 = load i8, i8* %bar
877   %tmp2 = insertelement <8 x i8> %V, i8 %tmp1, i32 0
878   ret <8 x i8> %tmp2
879 }
880
881 define <4 x i16> @ld1_4h(<4 x i16> %V, i16* %bar) {
882 ; CHECK-LABEL: ld1_4h
883 ; Make sure we are using the operands defined by the ABI
884 ; CHECK: ld1.h { v0 }[0], [x0]
885 ; CHECK-NEXT: ret
886   %tmp1 = load i16, i16* %bar
887   %tmp2 = insertelement <4 x i16> %V, i16 %tmp1, i32 0
888   ret <4 x i16> %tmp2
889 }
890
891 define <2 x i32> @ld1_2s(<2 x i32> %V, i32* %bar) {
892 ; CHECK-LABEL: ld1_2s:
893 ; Make sure we are using the operands defined by the ABI
894 ; CHECK: ld1.s { v0 }[0], [x0]
895 ; CHECK-NEXT: ret
896   %tmp1 = load i32, i32* %bar
897   %tmp2 = insertelement <2 x i32> %V, i32 %tmp1, i32 0
898   ret <2 x i32> %tmp2
899 }
900
901 define <2 x float> @ld1_2s_float(<2 x float> %V, float* %bar) {
902 ; CHECK-LABEL: ld1_2s_float:
903 ; Make sure we are using the operands defined by the ABI
904 ; CHECK: ld1.s { v0 }[0], [x0]
905 ; CHECK-NEXT: ret
906   %tmp1 = load float, float* %bar
907   %tmp2 = insertelement <2 x float> %V, float %tmp1, i32 0
908   ret <2 x float> %tmp2
909 }
910
911
912 ; Add rdar://13098923 test case: vld1_dup_u32 doesn't generate ld1r.2s
913 define void @ld1r_2s_from_dup(i8* nocapture %a, i8* nocapture %b, i16* nocapture %diff) nounwind ssp {
914 entry:
915 ; CHECK: ld1r_2s_from_dup
916 ; CHECK: ld1r.2s { [[ARG1:v[0-9]+]] }, [x0]
917 ; CHECK-NEXT: ld1r.2s { [[ARG2:v[0-9]+]] }, [x1]
918 ; CHECK-NEXT: usubl.8h v[[RESREGNUM:[0-9]+]], [[ARG1]], [[ARG2]]
919 ; CHECK-NEXT: str d[[RESREGNUM]], [x2]
920 ; CHECK-NEXT: ret
921   %tmp = bitcast i8* %a to i32*
922   %tmp1 = load i32, i32* %tmp, align 4
923   %tmp2 = insertelement <2 x i32> undef, i32 %tmp1, i32 0
924   %lane = shufflevector <2 x i32> %tmp2, <2 x i32> undef, <2 x i32> zeroinitializer
925   %tmp3 = bitcast <2 x i32> %lane to <8 x i8>
926   %tmp4 = bitcast i8* %b to i32*
927   %tmp5 = load i32, i32* %tmp4, align 4
928   %tmp6 = insertelement <2 x i32> undef, i32 %tmp5, i32 0
929   %lane1 = shufflevector <2 x i32> %tmp6, <2 x i32> undef, <2 x i32> zeroinitializer
930   %tmp7 = bitcast <2 x i32> %lane1 to <8 x i8>
931   %vmovl.i.i = zext <8 x i8> %tmp3 to <8 x i16>
932   %vmovl.i4.i = zext <8 x i8> %tmp7 to <8 x i16>
933   %sub.i = sub <8 x i16> %vmovl.i.i, %vmovl.i4.i
934   %tmp8 = bitcast <8 x i16> %sub.i to <2 x i64>
935   %shuffle.i = shufflevector <2 x i64> %tmp8, <2 x i64> undef, <1 x i32> zeroinitializer
936   %tmp9 = bitcast <1 x i64> %shuffle.i to <4 x i16>
937   %tmp10 = bitcast i16* %diff to <4 x i16>*
938   store <4 x i16> %tmp9, <4 x i16>* %tmp10, align 8
939   ret void
940 }
941
942 ; Tests for rdar://11947069: vld1_dup_* and vld1q_dup_* code gen is suboptimal
943 define <4 x float> @ld1r_4s_float(float* nocapture %x) {
944 entry:
945 ; CHECK-LABEL: ld1r_4s_float
946 ; Make sure we are using the operands defined by the ABI
947 ; CHECK: ld1r.4s { v0 }, [x0]
948 ; CHECK-NEXT: ret
949   %tmp = load float, float* %x, align 4
950   %tmp1 = insertelement <4 x float> undef, float %tmp, i32 0
951   %tmp2 = insertelement <4 x float> %tmp1, float %tmp, i32 1
952   %tmp3 = insertelement <4 x float> %tmp2, float %tmp, i32 2
953   %tmp4 = insertelement <4 x float> %tmp3, float %tmp, i32 3
954   ret <4 x float> %tmp4
955 }
956
957 define <2 x float> @ld1r_2s_float(float* nocapture %x) {
958 entry:
959 ; CHECK-LABEL: ld1r_2s_float
960 ; Make sure we are using the operands defined by the ABI
961 ; CHECK: ld1r.2s { v0 }, [x0]
962 ; CHECK-NEXT: ret
963   %tmp = load float, float* %x, align 4
964   %tmp1 = insertelement <2 x float> undef, float %tmp, i32 0
965   %tmp2 = insertelement <2 x float> %tmp1, float %tmp, i32 1
966   ret <2 x float> %tmp2
967 }
968
969 define <2 x double> @ld1r_2d_double(double* nocapture %x) {
970 entry:
971 ; CHECK-LABEL: ld1r_2d_double
972 ; Make sure we are using the operands defined by the ABI
973 ; CHECK: ld1r.2d { v0 }, [x0]
974 ; CHECK-NEXT: ret
975   %tmp = load double, double* %x, align 4
976   %tmp1 = insertelement <2 x double> undef, double %tmp, i32 0
977   %tmp2 = insertelement <2 x double> %tmp1, double %tmp, i32 1
978   ret <2 x double> %tmp2
979 }
980
981 define <1 x double> @ld1r_1d_double(double* nocapture %x) {
982 entry:
983 ; CHECK-LABEL: ld1r_1d_double
984 ; Make sure we are using the operands defined by the ABI
985 ; CHECK: ldr d0, [x0]
986 ; CHECK-NEXT: ret
987   %tmp = load double, double* %x, align 4
988   %tmp1 = insertelement <1 x double> undef, double %tmp, i32 0
989   ret <1 x double> %tmp1
990 }
991
992 define <4 x float> @ld1r_4s_float_shuff(float* nocapture %x) {
993 entry:
994 ; CHECK-LABEL: ld1r_4s_float_shuff
995 ; Make sure we are using the operands defined by the ABI
996 ; CHECK: ld1r.4s { v0 }, [x0]
997 ; CHECK-NEXT: ret
998   %tmp = load float, float* %x, align 4
999   %tmp1 = insertelement <4 x float> undef, float %tmp, i32 0
1000   %lane = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer
1001   ret <4 x float> %lane
1002 }
1003
1004 define <2 x float> @ld1r_2s_float_shuff(float* nocapture %x) {
1005 entry:
1006 ; CHECK-LABEL: ld1r_2s_float_shuff
1007 ; Make sure we are using the operands defined by the ABI
1008 ; CHECK: ld1r.2s { v0 }, [x0]
1009 ; CHECK-NEXT: ret
1010   %tmp = load float, float* %x, align 4
1011   %tmp1 = insertelement <2 x float> undef, float %tmp, i32 0
1012   %lane = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer
1013   ret <2 x float> %lane
1014 }
1015
1016 define <2 x double> @ld1r_2d_double_shuff(double* nocapture %x) {
1017 entry:
1018 ; CHECK-LABEL: ld1r_2d_double_shuff
1019 ; Make sure we are using the operands defined by the ABI
1020 ; CHECK: ld1r.2d { v0 }, [x0]
1021 ; CHECK-NEXT: ret
1022   %tmp = load double, double* %x, align 4
1023   %tmp1 = insertelement <2 x double> undef, double %tmp, i32 0
1024   %lane = shufflevector <2 x double> %tmp1, <2 x double> undef, <2 x i32> zeroinitializer
1025   ret <2 x double> %lane
1026 }
1027
1028 define <1 x double> @ld1r_1d_double_shuff(double* nocapture %x) {
1029 entry:
1030 ; CHECK-LABEL: ld1r_1d_double_shuff
1031 ; Make sure we are using the operands defined by the ABI
1032 ; CHECK: ldr d0, [x0]
1033 ; CHECK-NEXT: ret
1034   %tmp = load double, double* %x, align 4
1035   %tmp1 = insertelement <1 x double> undef, double %tmp, i32 0
1036   %lane = shufflevector <1 x double> %tmp1, <1 x double> undef, <1 x i32> zeroinitializer
1037   ret <1 x double> %lane
1038 }
1039
1040 %struct.__neon_float32x2x2_t = type { <2 x float>,  <2 x float> }
1041 %struct.__neon_float32x2x3_t = type { <2 x float>,  <2 x float>,  <2 x float> }
1042 %struct.__neon_float32x2x4_t = type { <2 x float>,  <2 x float>, <2 x float>,  <2 x float> }
1043
1044 declare %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld1x2.v8i8.p0i8(i8*) nounwind readonly
1045 declare %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld1x2.v4i16.p0i16(i16*) nounwind readonly
1046 declare %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld1x2.v2i32.p0i32(i32*) nounwind readonly
1047 declare %struct.__neon_float32x2x2_t @llvm.aarch64.neon.ld1x2.v2f32.p0f32(float*) nounwind readonly
1048 declare %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld1x2.v1i64.p0i64(i64*) nounwind readonly
1049 declare %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld1x2.v1f64.p0f64(double*) nounwind readonly
1050
1051 define %struct.__neon_int8x8x2_t @ld1_x2_v8i8(i8* %addr) {
1052 ; CHECK-LABEL: ld1_x2_v8i8:
1053 ; CHECK: ld1.8b { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1054   %val = call %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld1x2.v8i8.p0i8(i8* %addr)
1055   ret %struct.__neon_int8x8x2_t %val
1056 }
1057
1058 define %struct.__neon_int16x4x2_t @ld1_x2_v4i16(i16* %addr) {
1059 ; CHECK-LABEL: ld1_x2_v4i16:
1060 ; CHECK: ld1.4h { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1061   %val = call %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld1x2.v4i16.p0i16(i16* %addr)
1062   ret %struct.__neon_int16x4x2_t %val
1063 }
1064
1065 define %struct.__neon_int32x2x2_t @ld1_x2_v2i32(i32* %addr) {
1066 ; CHECK-LABEL: ld1_x2_v2i32:
1067 ; CHECK: ld1.2s { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1068   %val = call %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld1x2.v2i32.p0i32(i32* %addr)
1069   ret %struct.__neon_int32x2x2_t %val
1070 }
1071
1072 define %struct.__neon_float32x2x2_t @ld1_x2_v2f32(float* %addr) {
1073 ; CHECK-LABEL: ld1_x2_v2f32:
1074 ; CHECK: ld1.2s { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1075   %val = call %struct.__neon_float32x2x2_t @llvm.aarch64.neon.ld1x2.v2f32.p0f32(float* %addr)
1076   ret %struct.__neon_float32x2x2_t %val
1077 }
1078
1079 define %struct.__neon_int64x1x2_t @ld1_x2_v1i64(i64* %addr) {
1080 ; CHECK-LABEL: ld1_x2_v1i64:
1081 ; CHECK: ld1.1d { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1082   %val = call %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld1x2.v1i64.p0i64(i64* %addr)
1083   ret %struct.__neon_int64x1x2_t %val
1084 }
1085
1086 define %struct.__neon_float64x1x2_t @ld1_x2_v1f64(double* %addr) {
1087 ; CHECK-LABEL: ld1_x2_v1f64:
1088 ; CHECK: ld1.1d { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1089   %val = call %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld1x2.v1f64.p0f64(double* %addr)
1090   ret %struct.__neon_float64x1x2_t %val
1091 }
1092
1093
1094 %struct.__neon_float32x4x2_t = type { <4 x float>,  <4 x float> }
1095 %struct.__neon_float32x4x3_t = type { <4 x float>,  <4 x float>,  <4 x float> }
1096 %struct.__neon_float32x4x4_t = type { <4 x float>,  <4 x float>, <4 x float>,  <4 x float> }
1097
1098 %struct.__neon_float64x2x2_t = type { <2 x double>,  <2 x double> }
1099 %struct.__neon_float64x2x3_t = type { <2 x double>,  <2 x double>,  <2 x double> }
1100 %struct.__neon_float64x2x4_t = type { <2 x double>,  <2 x double>, <2 x double>,  <2 x double> }
1101
1102 declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0i8(i8*) nounwind readonly
1103 declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld1x2.v8i16.p0i16(i16*) nounwind readonly
1104 declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld1x2.v4i32.p0i32(i32*) nounwind readonly
1105 declare %struct.__neon_float32x4x2_t @llvm.aarch64.neon.ld1x2.v4f32.p0f32(float*) nounwind readonly
1106 declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld1x2.v2i64.p0i64(i64*) nounwind readonly
1107 declare %struct.__neon_float64x2x2_t @llvm.aarch64.neon.ld1x2.v2f64.p0f64(double*) nounwind readonly
1108
1109 define %struct.__neon_int8x16x2_t @ld1_x2_v16i8(i8* %addr) {
1110 ; CHECK-LABEL: ld1_x2_v16i8:
1111 ; CHECK: ld1.16b { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1112   %val = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0i8(i8* %addr)
1113   ret %struct.__neon_int8x16x2_t %val
1114 }
1115
1116 define %struct.__neon_int16x8x2_t @ld1_x2_v8i16(i16* %addr) {
1117 ; CHECK-LABEL: ld1_x2_v8i16:
1118 ; CHECK: ld1.8h { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1119   %val = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld1x2.v8i16.p0i16(i16* %addr)
1120   ret %struct.__neon_int16x8x2_t %val
1121 }
1122
1123 define %struct.__neon_int32x4x2_t @ld1_x2_v4i32(i32* %addr) {
1124 ; CHECK-LABEL: ld1_x2_v4i32:
1125 ; CHECK: ld1.4s { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1126   %val = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld1x2.v4i32.p0i32(i32* %addr)
1127   ret %struct.__neon_int32x4x2_t %val
1128 }
1129
1130 define %struct.__neon_float32x4x2_t @ld1_x2_v4f32(float* %addr) {
1131 ; CHECK-LABEL: ld1_x2_v4f32:
1132 ; CHECK: ld1.4s { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1133   %val = call %struct.__neon_float32x4x2_t @llvm.aarch64.neon.ld1x2.v4f32.p0f32(float* %addr)
1134   ret %struct.__neon_float32x4x2_t %val
1135 }
1136
1137 define %struct.__neon_int64x2x2_t @ld1_x2_v2i64(i64* %addr) {
1138 ; CHECK-LABEL: ld1_x2_v2i64:
1139 ; CHECK: ld1.2d { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1140   %val = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld1x2.v2i64.p0i64(i64* %addr)
1141   ret %struct.__neon_int64x2x2_t %val
1142 }
1143
1144 define %struct.__neon_float64x2x2_t @ld1_x2_v2f64(double* %addr) {
1145 ; CHECK-LABEL: ld1_x2_v2f64:
1146 ; CHECK: ld1.2d { {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1147   %val = call %struct.__neon_float64x2x2_t @llvm.aarch64.neon.ld1x2.v2f64.p0f64(double* %addr)
1148   ret %struct.__neon_float64x2x2_t %val
1149 }
1150
1151 declare %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld1x3.v8i8.p0i8(i8*) nounwind readonly
1152 declare %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld1x3.v4i16.p0i16(i16*) nounwind readonly
1153 declare %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld1x3.v2i32.p0i32(i32*) nounwind readonly
1154 declare %struct.__neon_float32x2x3_t @llvm.aarch64.neon.ld1x3.v2f32.p0f32(float*) nounwind readonly
1155 declare %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld1x3.v1i64.p0i64(i64*) nounwind readonly
1156 declare %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld1x3.v1f64.p0f64(double*) nounwind readonly
1157
1158 define %struct.__neon_int8x8x3_t @ld1_x3_v8i8(i8* %addr) {
1159 ; CHECK-LABEL: ld1_x3_v8i8:
1160 ; CHECK: ld1.8b { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1161   %val = call %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld1x3.v8i8.p0i8(i8* %addr)
1162   ret %struct.__neon_int8x8x3_t %val
1163 }
1164
1165 define %struct.__neon_int16x4x3_t @ld1_x3_v4i16(i16* %addr) {
1166 ; CHECK-LABEL: ld1_x3_v4i16:
1167 ; CHECK: ld1.4h { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1168   %val = call %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld1x3.v4i16.p0i16(i16* %addr)
1169   ret %struct.__neon_int16x4x3_t %val
1170 }
1171
1172 define %struct.__neon_int32x2x3_t @ld1_x3_v2i32(i32* %addr) {
1173 ; CHECK-LABEL: ld1_x3_v2i32:
1174 ; CHECK: ld1.2s { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1175   %val = call %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld1x3.v2i32.p0i32(i32* %addr)
1176   ret %struct.__neon_int32x2x3_t %val
1177 }
1178
1179 define %struct.__neon_float32x2x3_t @ld1_x3_v2f32(float* %addr) {
1180 ; CHECK-LABEL: ld1_x3_v2f32:
1181 ; CHECK: ld1.2s { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1182   %val = call %struct.__neon_float32x2x3_t @llvm.aarch64.neon.ld1x3.v2f32.p0f32(float* %addr)
1183   ret %struct.__neon_float32x2x3_t %val
1184 }
1185
1186 define %struct.__neon_int64x1x3_t @ld1_x3_v1i64(i64* %addr) {
1187 ; CHECK-LABEL: ld1_x3_v1i64:
1188 ; CHECK: ld1.1d { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1189   %val = call %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld1x3.v1i64.p0i64(i64* %addr)
1190   ret %struct.__neon_int64x1x3_t %val
1191 }
1192
1193 define %struct.__neon_float64x1x3_t @ld1_x3_v1f64(double* %addr) {
1194 ; CHECK-LABEL: ld1_x3_v1f64:
1195 ; CHECK: ld1.1d { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1196   %val = call %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld1x3.v1f64.p0f64(double* %addr)
1197   ret %struct.__neon_float64x1x3_t %val
1198 }
1199
1200 declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld1x3.v16i8.p0i8(i8*) nounwind readonly
1201 declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld1x3.v8i16.p0i16(i16*) nounwind readonly
1202 declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld1x3.v4i32.p0i32(i32*) nounwind readonly
1203 declare %struct.__neon_float32x4x3_t @llvm.aarch64.neon.ld1x3.v4f32.p0f32(float*) nounwind readonly
1204 declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld1x3.v2i64.p0i64(i64*) nounwind readonly
1205 declare %struct.__neon_float64x2x3_t @llvm.aarch64.neon.ld1x3.v2f64.p0f64(double*) nounwind readonly
1206
1207 define %struct.__neon_int8x16x3_t @ld1_x3_v16i8(i8* %addr) {
1208 ; CHECK-LABEL: ld1_x3_v16i8:
1209 ; CHECK: ld1.16b { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1210   %val = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld1x3.v16i8.p0i8(i8* %addr)
1211   ret %struct.__neon_int8x16x3_t %val
1212 }
1213
1214 define %struct.__neon_int16x8x3_t @ld1_x3_v8i16(i16* %addr) {
1215 ; CHECK-LABEL: ld1_x3_v8i16:
1216 ; CHECK: ld1.8h { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1217   %val = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld1x3.v8i16.p0i16(i16* %addr)
1218   ret %struct.__neon_int16x8x3_t %val
1219 }
1220
1221 define %struct.__neon_int32x4x3_t @ld1_x3_v4i32(i32* %addr) {
1222 ; CHECK-LABEL: ld1_x3_v4i32:
1223 ; CHECK: ld1.4s { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1224   %val = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld1x3.v4i32.p0i32(i32* %addr)
1225   ret %struct.__neon_int32x4x3_t %val
1226 }
1227
1228 define %struct.__neon_float32x4x3_t @ld1_x3_v4f32(float* %addr) {
1229 ; CHECK-LABEL: ld1_x3_v4f32:
1230 ; CHECK: ld1.4s { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1231   %val = call %struct.__neon_float32x4x3_t @llvm.aarch64.neon.ld1x3.v4f32.p0f32(float* %addr)
1232   ret %struct.__neon_float32x4x3_t %val
1233 }
1234
1235 define %struct.__neon_int64x2x3_t @ld1_x3_v2i64(i64* %addr) {
1236 ; CHECK-LABEL: ld1_x3_v2i64:
1237 ; CHECK: ld1.2d { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1238   %val = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld1x3.v2i64.p0i64(i64* %addr)
1239   ret %struct.__neon_int64x2x3_t %val
1240 }
1241
1242 define %struct.__neon_float64x2x3_t @ld1_x3_v2f64(double* %addr) {
1243 ; CHECK-LABEL: ld1_x3_v2f64:
1244 ; CHECK: ld1.2d { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1245   %val = call %struct.__neon_float64x2x3_t @llvm.aarch64.neon.ld1x3.v2f64.p0f64(double* %addr)
1246   ret %struct.__neon_float64x2x3_t %val
1247 }
1248
1249 declare %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld1x4.v8i8.p0i8(i8*) nounwind readonly
1250 declare %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld1x4.v4i16.p0i16(i16*) nounwind readonly
1251 declare %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld1x4.v2i32.p0i32(i32*) nounwind readonly
1252 declare %struct.__neon_float32x2x4_t @llvm.aarch64.neon.ld1x4.v2f32.p0f32(float*) nounwind readonly
1253 declare %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld1x4.v1i64.p0i64(i64*) nounwind readonly
1254 declare %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld1x4.v1f64.p0f64(double*) nounwind readonly
1255
1256 define %struct.__neon_int8x8x4_t @ld1_x4_v8i8(i8* %addr) {
1257 ; CHECK-LABEL: ld1_x4_v8i8:
1258 ; CHECK: ld1.8b { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1259   %val = call %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld1x4.v8i8.p0i8(i8* %addr)
1260   ret %struct.__neon_int8x8x4_t %val
1261 }
1262
1263 define %struct.__neon_int16x4x4_t @ld1_x4_v4i16(i16* %addr) {
1264 ; CHECK-LABEL: ld1_x4_v4i16:
1265 ; CHECK: ld1.4h { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1266   %val = call %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld1x4.v4i16.p0i16(i16* %addr)
1267   ret %struct.__neon_int16x4x4_t %val
1268 }
1269
1270 define %struct.__neon_int32x2x4_t @ld1_x4_v2i32(i32* %addr) {
1271 ; CHECK-LABEL: ld1_x4_v2i32:
1272 ; CHECK: ld1.2s { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1273   %val = call %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld1x4.v2i32.p0i32(i32* %addr)
1274   ret %struct.__neon_int32x2x4_t %val
1275 }
1276
1277 define %struct.__neon_float32x2x4_t @ld1_x4_v2f32(float* %addr) {
1278 ; CHECK-LABEL: ld1_x4_v2f32:
1279 ; CHECK: ld1.2s { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1280   %val = call %struct.__neon_float32x2x4_t @llvm.aarch64.neon.ld1x4.v2f32.p0f32(float* %addr)
1281   ret %struct.__neon_float32x2x4_t %val
1282 }
1283
1284 define %struct.__neon_int64x1x4_t @ld1_x4_v1i64(i64* %addr) {
1285 ; CHECK-LABEL: ld1_x4_v1i64:
1286 ; CHECK: ld1.1d { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1287   %val = call %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld1x4.v1i64.p0i64(i64* %addr)
1288   ret %struct.__neon_int64x1x4_t %val
1289 }
1290
1291 define %struct.__neon_float64x1x4_t @ld1_x4_v1f64(double* %addr) {
1292 ; CHECK-LABEL: ld1_x4_v1f64:
1293 ; CHECK: ld1.1d { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1294   %val = call %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld1x4.v1f64.p0f64(double* %addr)
1295   ret %struct.__neon_float64x1x4_t %val
1296 }
1297
1298 declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld1x4.v16i8.p0i8(i8*) nounwind readonly
1299 declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld1x4.v8i16.p0i16(i16*) nounwind readonly
1300 declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld1x4.v4i32.p0i32(i32*) nounwind readonly
1301 declare %struct.__neon_float32x4x4_t @llvm.aarch64.neon.ld1x4.v4f32.p0f32(float*) nounwind readonly
1302 declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld1x4.v2i64.p0i64(i64*) nounwind readonly
1303 declare %struct.__neon_float64x2x4_t @llvm.aarch64.neon.ld1x4.v2f64.p0f64(double*) nounwind readonly
1304
1305 define %struct.__neon_int8x16x4_t @ld1_x4_v16i8(i8* %addr) {
1306 ; CHECK-LABEL: ld1_x4_v16i8:
1307 ; CHECK: ld1.16b { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1308   %val = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld1x4.v16i8.p0i8(i8* %addr)
1309   ret %struct.__neon_int8x16x4_t %val
1310 }
1311
1312 define %struct.__neon_int16x8x4_t @ld1_x4_v8i16(i16* %addr) {
1313 ; CHECK-LABEL: ld1_x4_v8i16:
1314 ; CHECK: ld1.8h { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1315   %val = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld1x4.v8i16.p0i16(i16* %addr)
1316   ret %struct.__neon_int16x8x4_t %val
1317 }
1318
1319 define %struct.__neon_int32x4x4_t @ld1_x4_v4i32(i32* %addr) {
1320 ; CHECK-LABEL: ld1_x4_v4i32:
1321 ; CHECK: ld1.4s { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1322   %val = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld1x4.v4i32.p0i32(i32* %addr)
1323   ret %struct.__neon_int32x4x4_t %val
1324 }
1325
1326 define %struct.__neon_float32x4x4_t @ld1_x4_v4f32(float* %addr) {
1327 ; CHECK-LABEL: ld1_x4_v4f32:
1328 ; CHECK: ld1.4s { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1329   %val = call %struct.__neon_float32x4x4_t @llvm.aarch64.neon.ld1x4.v4f32.p0f32(float* %addr)
1330   ret %struct.__neon_float32x4x4_t %val
1331 }
1332
1333 define %struct.__neon_int64x2x4_t @ld1_x4_v2i64(i64* %addr) {
1334 ; CHECK-LABEL: ld1_x4_v2i64:
1335 ; CHECK: ld1.2d { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1336   %val = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld1x4.v2i64.p0i64(i64* %addr)
1337   ret %struct.__neon_int64x2x4_t %val
1338 }
1339
1340 define %struct.__neon_float64x2x4_t @ld1_x4_v2f64(double* %addr) {
1341 ; CHECK-LABEL: ld1_x4_v2f64:
1342 ; CHECK: ld1.2d { {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} }, [x0]
1343   %val = call %struct.__neon_float64x2x4_t @llvm.aarch64.neon.ld1x4.v2f64.p0f64(double* %addr)
1344   ret %struct.__neon_float64x2x4_t %val
1345 }