[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-ld1.ll
blob47fb3308175b0260f1b162354bfd27f1ee81d121
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -verify-machineinstrs | FileCheck %s
4 %struct.__neon_int8x8x2_t = type { <8 x i8>,  <8 x i8> }
5 %struct.__neon_int8x8x3_t = type { <8 x i8>,  <8 x i8>,  <8 x i8> }
6 %struct.__neon_int8x8x4_t = type { <8 x i8>,  <8 x i8>, <8 x i8>,  <8 x i8> }
8 define %struct.__neon_int8x8x2_t @ld2_8b(ptr %A) nounwind {
9 ; CHECK-LABEL: ld2_8b:
10 ; CHECK:       // %bb.0:
11 ; CHECK-NEXT:    ld2.8b { v0, v1 }, [x0]
12 ; CHECK-NEXT:    ret
13 ; Make sure we are loading into the results defined by the ABI (i.e., v0, v1)
14 ; and from the argument of the function also defined by ABI (i.e., x0)
15         %tmp2 = call %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2.v8i8.p0(ptr %A)
16         ret %struct.__neon_int8x8x2_t  %tmp2
19 define %struct.__neon_int8x8x3_t @ld3_8b(ptr %A) nounwind {
20 ; CHECK-LABEL: ld3_8b:
21 ; CHECK:       // %bb.0:
22 ; CHECK-NEXT:    ld3.8b { v0, v1, v2 }, [x0]
23 ; CHECK-NEXT:    ret
24 ; Make sure we are using the operands defined by the ABI
25         %tmp2 = call %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3.v8i8.p0(ptr %A)
26         ret %struct.__neon_int8x8x3_t  %tmp2
29 define %struct.__neon_int8x8x4_t @ld4_8b(ptr %A) nounwind {
30 ; CHECK-LABEL: ld4_8b:
31 ; CHECK:       // %bb.0:
32 ; CHECK-NEXT:    ld4.8b { v0, v1, v2, v3 }, [x0]
33 ; CHECK-NEXT:    ret
34 ; Make sure we are using the operands defined by the ABI
35         %tmp2 = call %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4.v8i8.p0(ptr %A)
36         ret %struct.__neon_int8x8x4_t  %tmp2
39 declare %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2.v8i8.p0(ptr) nounwind readonly
40 declare %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3.v8i8.p0(ptr) nounwind readonly
41 declare %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4.v8i8.p0(ptr) nounwind readonly
43 %struct.__neon_int8x16x2_t = type { <16 x i8>,  <16 x i8> }
44 %struct.__neon_int8x16x3_t = type { <16 x i8>,  <16 x i8>,  <16 x i8> }
45 %struct.__neon_int8x16x4_t = type { <16 x i8>,  <16 x i8>, <16 x i8>,  <16 x i8> }
47 define %struct.__neon_int8x16x2_t @ld2_16b(ptr %A) nounwind {
48 ; CHECK-LABEL: ld2_16b:
49 ; CHECK:       // %bb.0:
50 ; CHECK-NEXT:    ld2.16b { v0, v1 }, [x0]
51 ; CHECK-NEXT:    ret
52 ; Make sure we are using the operands defined by the ABI
53   %tmp2 = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2.v16i8.p0(ptr %A)
54   ret %struct.__neon_int8x16x2_t  %tmp2
57 define %struct.__neon_int8x16x3_t @ld3_16b(ptr %A) nounwind {
58 ; CHECK-LABEL: ld3_16b:
59 ; CHECK:       // %bb.0:
60 ; CHECK-NEXT:    ld3.16b { v0, v1, v2 }, [x0]
61 ; CHECK-NEXT:    ret
62 ; Make sure we are using the operands defined by the ABI
63   %tmp2 = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3.v16i8.p0(ptr %A)
64   ret %struct.__neon_int8x16x3_t  %tmp2
67 define %struct.__neon_int8x16x4_t @ld4_16b(ptr %A) nounwind {
68 ; CHECK-LABEL: ld4_16b:
69 ; CHECK:       // %bb.0:
70 ; CHECK-NEXT:    ld4.16b { v0, v1, v2, v3 }, [x0]
71 ; CHECK-NEXT:    ret
72 ; Make sure we are using the operands defined by the ABI
73   %tmp2 = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4.v16i8.p0(ptr %A)
74   ret %struct.__neon_int8x16x4_t  %tmp2
77 declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2.v16i8.p0(ptr) nounwind readonly
78 declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3.v16i8.p0(ptr) nounwind readonly
79 declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4.v16i8.p0(ptr) nounwind readonly
81 %struct.__neon_int16x4x2_t = type { <4 x i16>,  <4 x i16> }
82 %struct.__neon_int16x4x3_t = type { <4 x i16>,  <4 x i16>,  <4 x i16> }
83 %struct.__neon_int16x4x4_t = type { <4 x i16>,  <4 x i16>, <4 x i16>,  <4 x i16> }
85 define %struct.__neon_int16x4x2_t @ld2_4h(ptr %A) nounwind {
86 ; CHECK-LABEL: ld2_4h:
87 ; CHECK:       // %bb.0:
88 ; CHECK-NEXT:    ld2.4h { v0, v1 }, [x0]
89 ; CHECK-NEXT:    ret
90 ; Make sure we are using the operands defined by the ABI
91         %tmp2 = call %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2.v4i16.p0(ptr %A)
92         ret %struct.__neon_int16x4x2_t  %tmp2
95 define %struct.__neon_int16x4x3_t @ld3_4h(ptr %A) nounwind {
96 ; CHECK-LABEL: ld3_4h:
97 ; CHECK:       // %bb.0:
98 ; CHECK-NEXT:    ld3.4h { v0, v1, v2 }, [x0]
99 ; CHECK-NEXT:    ret
100 ; Make sure we are using the operands defined by the ABI
101         %tmp2 = call %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3.v4i16.p0(ptr %A)
102         ret %struct.__neon_int16x4x3_t  %tmp2
105 define %struct.__neon_int16x4x4_t @ld4_4h(ptr %A) nounwind {
106 ; CHECK-LABEL: ld4_4h:
107 ; CHECK:       // %bb.0:
108 ; CHECK-NEXT:    ld4.4h { v0, v1, v2, v3 }, [x0]
109 ; CHECK-NEXT:    ret
110 ; Make sure we are using the operands defined by the ABI
111         %tmp2 = call %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4.v4i16.p0(ptr %A)
112         ret %struct.__neon_int16x4x4_t  %tmp2
115 declare %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2.v4i16.p0(ptr) nounwind readonly
116 declare %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3.v4i16.p0(ptr) nounwind readonly
117 declare %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4.v4i16.p0(ptr) nounwind readonly
119 %struct.__neon_int16x8x2_t = type { <8 x i16>,  <8 x i16> }
120 %struct.__neon_int16x8x3_t = type { <8 x i16>,  <8 x i16>,  <8 x i16> }
121 %struct.__neon_int16x8x4_t = type { <8 x i16>,  <8 x i16>, <8 x i16>,  <8 x i16> }
123 define %struct.__neon_int16x8x2_t @ld2_8h(ptr %A) nounwind {
124 ; CHECK-LABEL: ld2_8h:
125 ; CHECK:       // %bb.0:
126 ; CHECK-NEXT:    ld2.8h { v0, v1 }, [x0]
127 ; CHECK-NEXT:    ret
128 ; Make sure we are using the operands defined by the ABI
129   %tmp2 = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2.v8i16.p0(ptr %A)
130   ret %struct.__neon_int16x8x2_t  %tmp2
133 define %struct.__neon_int16x8x3_t @ld3_8h(ptr %A) nounwind {
134 ; CHECK-LABEL: ld3_8h:
135 ; CHECK:       // %bb.0:
136 ; CHECK-NEXT:    ld3.8h { v0, v1, v2 }, [x0]
137 ; CHECK-NEXT:    ret
138 ; Make sure we are using the operands defined by the ABI
139   %tmp2 = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3.v8i16.p0(ptr %A)
140   ret %struct.__neon_int16x8x3_t %tmp2
143 define %struct.__neon_int16x8x4_t @ld4_8h(ptr %A) nounwind {
144 ; CHECK-LABEL: ld4_8h:
145 ; CHECK:       // %bb.0:
146 ; CHECK-NEXT:    ld4.8h { v0, v1, v2, v3 }, [x0]
147 ; CHECK-NEXT:    ret
148 ; Make sure we are using the operands defined by the ABI
149   %tmp2 = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4.v8i16.p0(ptr %A)
150   ret %struct.__neon_int16x8x4_t  %tmp2
153 declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2.v8i16.p0(ptr) nounwind readonly
154 declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3.v8i16.p0(ptr) nounwind readonly
155 declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4.v8i16.p0(ptr) nounwind readonly
157 %struct.__neon_int32x2x2_t = type { <2 x i32>,  <2 x i32> }
158 %struct.__neon_int32x2x3_t = type { <2 x i32>,  <2 x i32>,  <2 x i32> }
159 %struct.__neon_int32x2x4_t = type { <2 x i32>,  <2 x i32>, <2 x i32>,  <2 x i32> }
161 define %struct.__neon_int32x2x2_t @ld2_2s(ptr %A) nounwind {
162 ; CHECK-LABEL: ld2_2s:
163 ; CHECK:       // %bb.0:
164 ; CHECK-NEXT:    ld2.2s { v0, v1 }, [x0]
165 ; CHECK-NEXT:    ret
166 ; Make sure we are using the operands defined by the ABI
167         %tmp2 = call %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2.v2i32.p0(ptr %A)
168         ret %struct.__neon_int32x2x2_t  %tmp2
171 define %struct.__neon_int32x2x3_t @ld3_2s(ptr %A) nounwind {
172 ; CHECK-LABEL: ld3_2s:
173 ; CHECK:       // %bb.0:
174 ; CHECK-NEXT:    ld3.2s { v0, v1, v2 }, [x0]
175 ; CHECK-NEXT:    ret
176 ; Make sure we are using the operands defined by the ABI
177         %tmp2 = call %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3.v2i32.p0(ptr %A)
178         ret %struct.__neon_int32x2x3_t  %tmp2
181 define %struct.__neon_int32x2x4_t @ld4_2s(ptr %A) nounwind {
182 ; CHECK-LABEL: ld4_2s:
183 ; CHECK:       // %bb.0:
184 ; CHECK-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0]
185 ; CHECK-NEXT:    ret
186 ; Make sure we are using the operands defined by the ABI
187         %tmp2 = call %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4.v2i32.p0(ptr %A)
188         ret %struct.__neon_int32x2x4_t  %tmp2
191 declare %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2.v2i32.p0(ptr) nounwind readonly
192 declare %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3.v2i32.p0(ptr) nounwind readonly
193 declare %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4.v2i32.p0(ptr) nounwind readonly
195 %struct.__neon_int32x4x2_t = type { <4 x i32>,  <4 x i32> }
196 %struct.__neon_int32x4x3_t = type { <4 x i32>,  <4 x i32>,  <4 x i32> }
197 %struct.__neon_int32x4x4_t = type { <4 x i32>,  <4 x i32>, <4 x i32>,  <4 x i32> }
199 define %struct.__neon_int32x4x2_t @ld2_4s(ptr %A) nounwind {
200 ; CHECK-LABEL: ld2_4s:
201 ; CHECK:       // %bb.0:
202 ; CHECK-NEXT:    ld2.4s { v0, v1 }, [x0]
203 ; CHECK-NEXT:    ret
204 ; Make sure we are using the operands defined by the ABI
205         %tmp2 = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2.v4i32.p0(ptr %A)
206         ret %struct.__neon_int32x4x2_t  %tmp2
209 define %struct.__neon_int32x4x3_t @ld3_4s(ptr %A) nounwind {
210 ; CHECK-LABEL: ld3_4s:
211 ; CHECK:       // %bb.0:
212 ; CHECK-NEXT:    ld3.4s { v0, v1, v2 }, [x0]
213 ; CHECK-NEXT:    ret
214 ; Make sure we are using the operands defined by the ABI
215         %tmp2 = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3.v4i32.p0(ptr %A)
216         ret %struct.__neon_int32x4x3_t  %tmp2
219 define %struct.__neon_int32x4x4_t @ld4_4s(ptr %A) nounwind {
220 ; CHECK-LABEL: ld4_4s:
221 ; CHECK:       // %bb.0:
222 ; CHECK-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0]
223 ; CHECK-NEXT:    ret
224 ; Make sure we are using the operands defined by the ABI
225         %tmp2 = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4.v4i32.p0(ptr %A)
226         ret %struct.__neon_int32x4x4_t  %tmp2
229 declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2.v4i32.p0(ptr) nounwind readonly
230 declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3.v4i32.p0(ptr) nounwind readonly
231 declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4.v4i32.p0(ptr) nounwind readonly
233 %struct.__neon_int64x2x2_t = type { <2 x i64>,  <2 x i64> }
234 %struct.__neon_int64x2x3_t = type { <2 x i64>,  <2 x i64>,  <2 x i64> }
235 %struct.__neon_int64x2x4_t = type { <2 x i64>,  <2 x i64>, <2 x i64>,  <2 x i64> }
237 define %struct.__neon_int64x2x2_t @ld2_2d(ptr %A) nounwind {
238 ; CHECK-LABEL: ld2_2d:
239 ; CHECK:       // %bb.0:
240 ; CHECK-NEXT:    ld2.2d { v0, v1 }, [x0]
241 ; CHECK-NEXT:    ret
242 ; Make sure we are using the operands defined by the ABI
243         %tmp2 = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2.v2i64.p0(ptr %A)
244         ret %struct.__neon_int64x2x2_t  %tmp2
247 define %struct.__neon_int64x2x3_t @ld3_2d(ptr %A) nounwind {
248 ; CHECK-LABEL: ld3_2d:
249 ; CHECK:       // %bb.0:
250 ; CHECK-NEXT:    ld3.2d { v0, v1, v2 }, [x0]
251 ; CHECK-NEXT:    ret
252 ; Make sure we are using the operands defined by the ABI
253         %tmp2 = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3.v2i64.p0(ptr %A)
254         ret %struct.__neon_int64x2x3_t  %tmp2
257 define %struct.__neon_int64x2x4_t @ld4_2d(ptr %A) nounwind {
258 ; CHECK-LABEL: ld4_2d:
259 ; CHECK:       // %bb.0:
260 ; CHECK-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0]
261 ; CHECK-NEXT:    ret
262 ; Make sure we are using the operands defined by the ABI
263         %tmp2 = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4.v2i64.p0(ptr %A)
264         ret %struct.__neon_int64x2x4_t  %tmp2
267 declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2.v2i64.p0(ptr) nounwind readonly
268 declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3.v2i64.p0(ptr) nounwind readonly
269 declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4.v2i64.p0(ptr) nounwind readonly
271 %struct.__neon_int64x1x2_t = type { <1 x i64>,  <1 x i64> }
272 %struct.__neon_int64x1x3_t = type { <1 x i64>,  <1 x i64>, <1 x i64> }
273 %struct.__neon_int64x1x4_t = type { <1 x i64>,  <1 x i64>, <1 x i64>, <1 x i64> }
276 define %struct.__neon_int64x1x2_t @ld2_1di64(ptr %A) nounwind {
277 ; CHECK-LABEL: ld2_1di64:
278 ; CHECK:       // %bb.0:
279 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0]
280 ; CHECK-NEXT:    ret
281 ; Make sure we are using the operands defined by the ABI
282         %tmp2 = call %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2.v1i64.p0(ptr %A)
283         ret %struct.__neon_int64x1x2_t  %tmp2
286 define %struct.__neon_int64x1x3_t @ld3_1di64(ptr %A) nounwind {
287 ; CHECK-LABEL: ld3_1di64:
288 ; CHECK:       // %bb.0:
289 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
290 ; CHECK-NEXT:    ret
291 ; Make sure we are using the operands defined by the ABI
292         %tmp2 = call %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3.v1i64.p0(ptr %A)
293         ret %struct.__neon_int64x1x3_t  %tmp2
296 define %struct.__neon_int64x1x4_t @ld4_1di64(ptr %A) nounwind {
297 ; CHECK-LABEL: ld4_1di64:
298 ; CHECK:       // %bb.0:
299 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
300 ; CHECK-NEXT:    ret
301 ; Make sure we are using the operands defined by the ABI
302         %tmp2 = call %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4.v1i64.p0(ptr %A)
303         ret %struct.__neon_int64x1x4_t  %tmp2
307 declare %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2.v1i64.p0(ptr) nounwind readonly
308 declare %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3.v1i64.p0(ptr) nounwind readonly
309 declare %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4.v1i64.p0(ptr) nounwind readonly
311 %struct.__neon_float64x1x2_t = type { <1 x double>,  <1 x double> }
312 %struct.__neon_float64x1x3_t = type { <1 x double>,  <1 x double>, <1 x double> }
313 %struct.__neon_float64x1x4_t = type { <1 x double>,  <1 x double>, <1 x double>, <1 x double> }
316 define %struct.__neon_float64x1x2_t @ld2_1df64(ptr %A) nounwind {
317 ; CHECK-LABEL: ld2_1df64:
318 ; CHECK:       // %bb.0:
319 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0]
320 ; CHECK-NEXT:    ret
321 ; Make sure we are using the operands defined by the ABI
322         %tmp2 = call %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld2.v1f64.p0(ptr %A)
323         ret %struct.__neon_float64x1x2_t  %tmp2
326 define %struct.__neon_float64x1x3_t @ld3_1df64(ptr %A) nounwind {
327 ; CHECK-LABEL: ld3_1df64:
328 ; CHECK:       // %bb.0:
329 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
330 ; CHECK-NEXT:    ret
331 ; Make sure we are using the operands defined by the ABI
332         %tmp2 = call %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld3.v1f64.p0(ptr %A)
333         ret %struct.__neon_float64x1x3_t  %tmp2
336 define %struct.__neon_float64x1x4_t @ld4_1df64(ptr %A) nounwind {
337 ; CHECK-LABEL: ld4_1df64:
338 ; CHECK:       // %bb.0:
339 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
340 ; CHECK-NEXT:    ret
341 ; Make sure we are using the operands defined by the ABI
342         %tmp2 = call %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld4.v1f64.p0(ptr %A)
343         ret %struct.__neon_float64x1x4_t  %tmp2
346 declare %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld2.v1f64.p0(ptr) nounwind readonly
347 declare %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld3.v1f64.p0(ptr) nounwind readonly
348 declare %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld4.v1f64.p0(ptr) nounwind readonly
351 define %struct.__neon_int8x16x2_t @ld2lane_16b(<16 x i8> %L1, <16 x i8> %L2, ptr %A) nounwind {
352 ; Make sure we are using the operands defined by the ABI
353 ; CHECK-LABEL: ld2lane_16b:
354 ; CHECK:       // %bb.0:
355 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
356 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
357 ; CHECK-NEXT:    ld2.b { v0, v1 }[1], [x0]
358 ; CHECK-NEXT:    ret
359         %tmp2 = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8> %L1, <16 x i8> %L2, i64 1, ptr %A)
360         ret %struct.__neon_int8x16x2_t  %tmp2
363 define %struct.__neon_int8x16x3_t @ld3lane_16b(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, ptr %A) nounwind {
364 ; Make sure we are using the operands defined by the ABI
365 ; CHECK-LABEL: ld3lane_16b:
366 ; CHECK:       // %bb.0:
367 ; CHECK-NEXT:    // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
368 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
369 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
370 ; CHECK-NEXT:    ld3.b { v0, v1, v2 }[1], [x0]
371 ; CHECK-NEXT:    ret
372         %tmp2 = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, i64 1, ptr %A)
373         ret %struct.__neon_int8x16x3_t  %tmp2
376 define %struct.__neon_int8x16x4_t @ld4lane_16b(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, <16 x i8> %L4, ptr %A) nounwind {
377 ; Make sure we are using the operands defined by the ABI
378 ; CHECK-LABEL: ld4lane_16b:
379 ; CHECK:       // %bb.0:
380 ; CHECK-NEXT:    // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
381 ; CHECK-NEXT:    // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
382 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
383 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
384 ; CHECK-NEXT:    ld4.b { v0, v1, v2, v3 }[1], [x0]
385 ; CHECK-NEXT:    ret
386         %tmp2 = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8> %L1, <16 x i8> %L2, <16 x i8> %L3, <16 x i8> %L4, i64 1, ptr %A)
387         ret %struct.__neon_int8x16x4_t  %tmp2
390 declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8>, <16 x i8>, i64, ptr) nounwind readonly
391 declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readonly
392 declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readonly
394 define %struct.__neon_int16x8x2_t @ld2lane_8h(<8 x i16> %L1, <8 x i16> %L2, ptr %A) nounwind {
395 ; Make sure we are using the operands defined by the ABI
396 ; CHECK-LABEL: ld2lane_8h:
397 ; CHECK:       // %bb.0:
398 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
399 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
400 ; CHECK-NEXT:    ld2.h { v0, v1 }[1], [x0]
401 ; CHECK-NEXT:    ret
402         %tmp2 = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16> %L1, <8 x i16> %L2, i64 1, ptr %A)
403         ret %struct.__neon_int16x8x2_t  %tmp2
406 define %struct.__neon_int16x8x3_t @ld3lane_8h(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, ptr %A) nounwind {
407 ; Make sure we are using the operands defined by the ABI
408 ; CHECK-LABEL: ld3lane_8h:
409 ; CHECK:       // %bb.0:
410 ; CHECK-NEXT:    // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
411 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
412 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
413 ; CHECK-NEXT:    ld3.h { v0, v1, v2 }[1], [x0]
414 ; CHECK-NEXT:    ret
415         %tmp2 = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, i64 1, ptr %A)
416         ret %struct.__neon_int16x8x3_t  %tmp2
419 define %struct.__neon_int16x8x4_t @ld4lane_8h(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, <8 x i16> %L4, ptr %A) nounwind {
420 ; Make sure we are using the operands defined by the ABI
421 ; CHECK-LABEL: ld4lane_8h:
422 ; CHECK:       // %bb.0:
423 ; CHECK-NEXT:    // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
424 ; CHECK-NEXT:    // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
425 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
426 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
427 ; CHECK-NEXT:    ld4.h { v0, v1, v2, v3 }[1], [x0]
428 ; CHECK-NEXT:    ret
429         %tmp2 = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16> %L1, <8 x i16> %L2, <8 x i16> %L3, <8 x i16> %L4, i64 1, ptr %A)
430         ret %struct.__neon_int16x8x4_t  %tmp2
433 declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16>, <8 x i16>, i64, ptr) nounwind readonly
434 declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readonly
435 declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readonly
437 define %struct.__neon_int32x4x2_t @ld2lane_4s(<4 x i32> %L1, <4 x i32> %L2, ptr %A) nounwind {
438 ; Make sure we are using the operands defined by the ABI
439 ; CHECK-LABEL: ld2lane_4s:
440 ; CHECK:       // %bb.0:
441 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
442 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
443 ; CHECK-NEXT:    ld2.s { v0, v1 }[1], [x0]
444 ; CHECK-NEXT:    ret
445         %tmp2 = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32> %L1, <4 x i32> %L2, i64 1, ptr %A)
446         ret %struct.__neon_int32x4x2_t  %tmp2
449 define %struct.__neon_int32x4x3_t @ld3lane_4s(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, ptr %A) nounwind {
450 ; Make sure we are using the operands defined by the ABI
451 ; CHECK-LABEL: ld3lane_4s:
452 ; CHECK:       // %bb.0:
453 ; CHECK-NEXT:    // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
454 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
455 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
456 ; CHECK-NEXT:    ld3.s { v0, v1, v2 }[1], [x0]
457 ; CHECK-NEXT:    ret
458         %tmp2 = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, i64 1, ptr %A)
459         ret %struct.__neon_int32x4x3_t  %tmp2
462 define %struct.__neon_int32x4x4_t @ld4lane_4s(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, <4 x i32> %L4, ptr %A) nounwind {
463 ; Make sure we are using the operands defined by the ABI
464 ; CHECK-LABEL: ld4lane_4s:
465 ; CHECK:       // %bb.0:
466 ; CHECK-NEXT:    // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
467 ; CHECK-NEXT:    // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
468 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
469 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
470 ; CHECK-NEXT:    ld4.s { v0, v1, v2, v3 }[1], [x0]
471 ; CHECK-NEXT:    ret
472         %tmp2 = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32> %L1, <4 x i32> %L2, <4 x i32> %L3, <4 x i32> %L4, i64 1, ptr %A)
473         ret %struct.__neon_int32x4x4_t  %tmp2
476 declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32>, <4 x i32>, i64, ptr) nounwind readonly
477 declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readonly
478 declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readonly
480 define %struct.__neon_int64x2x2_t @ld2lane_2d(<2 x i64> %L1, <2 x i64> %L2, ptr %A) nounwind {
481 ; Make sure we are using the operands defined by the ABI
482 ; CHECK-LABEL: ld2lane_2d:
483 ; CHECK:       // %bb.0:
484 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
485 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
486 ; CHECK-NEXT:    ld2.d { v0, v1 }[1], [x0]
487 ; CHECK-NEXT:    ret
488         %tmp2 = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64> %L1, <2 x i64> %L2, i64 1, ptr %A)
489         ret %struct.__neon_int64x2x2_t  %tmp2
492 define %struct.__neon_int64x2x3_t @ld3lane_2d(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, ptr %A) nounwind {
493 ; Make sure we are using the operands defined by the ABI
494 ; CHECK-LABEL: ld3lane_2d:
495 ; CHECK:       // %bb.0:
496 ; CHECK-NEXT:    // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
497 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
498 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
499 ; CHECK-NEXT:    ld3.d { v0, v1, v2 }[1], [x0]
500 ; CHECK-NEXT:    ret
501         %tmp2 = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, i64 1, ptr %A)
502         ret %struct.__neon_int64x2x3_t  %tmp2
505 define %struct.__neon_int64x2x4_t @ld4lane_2d(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, <2 x i64> %L4, ptr %A) nounwind {
506 ; Make sure we are using the operands defined by the ABI
507 ; CHECK-LABEL: ld4lane_2d:
508 ; CHECK:       // %bb.0:
509 ; CHECK-NEXT:    // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
510 ; CHECK-NEXT:    // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
511 ; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
512 ; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
513 ; CHECK-NEXT:    ld4.d { v0, v1, v2, v3 }[1], [x0]
514 ; CHECK-NEXT:    ret
515         %tmp2 = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64> %L1, <2 x i64> %L2, <2 x i64> %L3, <2 x i64> %L4, i64 1, ptr %A)
516         ret %struct.__neon_int64x2x4_t  %tmp2
519 declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64>, <2 x i64>, i64, ptr) nounwind readonly
520 declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readonly
521 declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readonly
523 define <8 x i8> @ld1r_8b(ptr %bar) {
524 ; CHECK-LABEL: ld1r_8b:
525 ; CHECK:       // %bb.0:
526 ; CHECK-NEXT:    ld1r.8b { v0 }, [x0]
527 ; CHECK-NEXT:    ret
528 ; Make sure we are using the operands defined by the ABI
529   %tmp1 = load i8, ptr %bar
530   %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
531   %tmp3 = insertelement <8 x i8> %tmp2, i8 %tmp1, i32 1
532   %tmp4 = insertelement <8 x i8> %tmp3, i8 %tmp1, i32 2
533   %tmp5 = insertelement <8 x i8> %tmp4, i8 %tmp1, i32 3
534   %tmp6 = insertelement <8 x i8> %tmp5, i8 %tmp1, i32 4
535   %tmp7 = insertelement <8 x i8> %tmp6, i8 %tmp1, i32 5
536   %tmp8 = insertelement <8 x i8> %tmp7, i8 %tmp1, i32 6
537   %tmp9 = insertelement <8 x i8> %tmp8, i8 %tmp1, i32 7
538   ret <8 x i8> %tmp9
541 define <16 x i8> @ld1r_16b(ptr %bar) {
542 ; CHECK-LABEL: ld1r_16b:
543 ; CHECK:       // %bb.0:
544 ; CHECK-NEXT:    ld1r.16b { v0 }, [x0]
545 ; CHECK-NEXT:    ret
546 ; Make sure we are using the operands defined by the ABI
547   %tmp1 = load i8, ptr %bar
548   %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
549   %tmp3 = insertelement <16 x i8> %tmp2, i8 %tmp1, i32 1
550   %tmp4 = insertelement <16 x i8> %tmp3, i8 %tmp1, i32 2
551   %tmp5 = insertelement <16 x i8> %tmp4, i8 %tmp1, i32 3
552   %tmp6 = insertelement <16 x i8> %tmp5, i8 %tmp1, i32 4
553   %tmp7 = insertelement <16 x i8> %tmp6, i8 %tmp1, i32 5
554   %tmp8 = insertelement <16 x i8> %tmp7, i8 %tmp1, i32 6
555   %tmp9 = insertelement <16 x i8> %tmp8, i8 %tmp1, i32 7
556   %tmp10 = insertelement <16 x i8> %tmp9, i8 %tmp1, i32 8
557   %tmp11 = insertelement <16 x i8> %tmp10, i8 %tmp1, i32 9
558   %tmp12 = insertelement <16 x i8> %tmp11, i8 %tmp1, i32 10
559   %tmp13 = insertelement <16 x i8> %tmp12, i8 %tmp1, i32 11
560   %tmp14 = insertelement <16 x i8> %tmp13, i8 %tmp1, i32 12
561   %tmp15 = insertelement <16 x i8> %tmp14, i8 %tmp1, i32 13
562   %tmp16 = insertelement <16 x i8> %tmp15, i8 %tmp1, i32 14
563   %tmp17 = insertelement <16 x i8> %tmp16, i8 %tmp1, i32 15
564   ret <16 x i8> %tmp17
567 define <4 x i16> @ld1r_4h(ptr %bar) {
568 ; CHECK-LABEL: ld1r_4h:
569 ; CHECK:       // %bb.0:
570 ; CHECK-NEXT:    ld1r.4h { v0 }, [x0]
571 ; CHECK-NEXT:    ret
572 ; Make sure we are using the operands defined by the ABI
573   %tmp1 = load i16, ptr %bar
574   %tmp2 = insertelement <4 x i16> <i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0
575   %tmp3 = insertelement <4 x i16> %tmp2, i16 %tmp1, i32 1
576   %tmp4 = insertelement <4 x i16> %tmp3, i16 %tmp1, i32 2
577   %tmp5 = insertelement <4 x i16> %tmp4, i16 %tmp1, i32 3
578   ret <4 x i16> %tmp5
581 define <8 x i16> @ld1r_8h(ptr %bar) {
582 ; CHECK-LABEL: ld1r_8h:
583 ; CHECK:       // %bb.0:
584 ; CHECK-NEXT:    ld1r.8h { v0 }, [x0]
585 ; CHECK-NEXT:    ret
586 ; Make sure we are using the operands defined by the ABI
587   %tmp1 = load i16, ptr %bar
588   %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
589   %tmp3 = insertelement <8 x i16> %tmp2, i16 %tmp1, i32 1
590   %tmp4 = insertelement <8 x i16> %tmp3, i16 %tmp1, i32 2
591   %tmp5 = insertelement <8 x i16> %tmp4, i16 %tmp1, i32 3
592   %tmp6 = insertelement <8 x i16> %tmp5, i16 %tmp1, i32 4
593   %tmp7 = insertelement <8 x i16> %tmp6, i16 %tmp1, i32 5
594   %tmp8 = insertelement <8 x i16> %tmp7, i16 %tmp1, i32 6
595   %tmp9 = insertelement <8 x i16> %tmp8, i16 %tmp1, i32 7
596   ret <8 x i16> %tmp9
599 define <2 x i32> @ld1r_2s(ptr %bar) {
600 ; CHECK-LABEL: ld1r_2s:
601 ; CHECK:       // %bb.0:
602 ; CHECK-NEXT:    ld1r.2s { v0 }, [x0]
603 ; CHECK-NEXT:    ret
604 ; Make sure we are using the operands defined by the ABI
605   %tmp1 = load i32, ptr %bar
606   %tmp2 = insertelement <2 x i32> <i32 undef, i32 undef>, i32 %tmp1, i32 0
607   %tmp3 = insertelement <2 x i32> %tmp2, i32 %tmp1, i32 1
608   ret <2 x i32> %tmp3
611 define <4 x i32> @ld1r_4s(ptr %bar) {
612 ; CHECK-LABEL: ld1r_4s:
613 ; CHECK:       // %bb.0:
614 ; CHECK-NEXT:    ld1r.4s { v0 }, [x0]
615 ; CHECK-NEXT:    ret
616 ; Make sure we are using the operands defined by the ABI
617   %tmp1 = load i32, ptr %bar
618   %tmp2 = insertelement <4 x i32> <i32 undef, i32 undef, i32 undef, i32 undef>, i32 %tmp1, i32 0
619   %tmp3 = insertelement <4 x i32> %tmp2, i32 %tmp1, i32 1
620   %tmp4 = insertelement <4 x i32> %tmp3, i32 %tmp1, i32 2
621   %tmp5 = insertelement <4 x i32> %tmp4, i32 %tmp1, i32 3
622   ret <4 x i32> %tmp5
625 define <2 x i64> @ld1r_2d(ptr %bar) {
626 ; CHECK-LABEL: ld1r_2d:
627 ; CHECK:       // %bb.0:
628 ; CHECK-NEXT:    ld1r.2d { v0 }, [x0]
629 ; CHECK-NEXT:    ret
630 ; Make sure we are using the operands defined by the ABI
631   %tmp1 = load i64, ptr %bar
632   %tmp2 = insertelement <2 x i64> <i64 undef, i64 undef>, i64 %tmp1, i32 0
633   %tmp3 = insertelement <2 x i64> %tmp2, i64 %tmp1, i32 1
634   ret <2 x i64> %tmp3
637 define %struct.__neon_int8x8x2_t @ld2r_8b(ptr %A) nounwind {
638 ; CHECK-LABEL: ld2r_8b:
639 ; CHECK:       // %bb.0:
640 ; CHECK-NEXT:    ld2r.8b { v0, v1 }, [x0]
641 ; CHECK-NEXT:    ret
642 ; Make sure we are using the operands defined by the ABI
643         %tmp2 = call %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2r.v8i8.p0(ptr %A)
644         ret %struct.__neon_int8x8x2_t  %tmp2
647 define %struct.__neon_int8x8x3_t @ld3r_8b(ptr %A) nounwind {
648 ; CHECK-LABEL: ld3r_8b:
649 ; CHECK:       // %bb.0:
650 ; CHECK-NEXT:    ld3r.8b { v0, v1, v2 }, [x0]
651 ; CHECK-NEXT:    ret
652 ; Make sure we are using the operands defined by the ABI
653         %tmp2 = call %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3r.v8i8.p0(ptr %A)
654         ret %struct.__neon_int8x8x3_t  %tmp2
657 define %struct.__neon_int8x8x4_t @ld4r_8b(ptr %A) nounwind {
658 ; CHECK-LABEL: ld4r_8b:
659 ; CHECK:       // %bb.0:
660 ; CHECK-NEXT:    ld4r.8b { v0, v1, v2, v3 }, [x0]
661 ; CHECK-NEXT:    ret
662 ; Make sure we are using the operands defined by the ABI
663         %tmp2 = call %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4r.v8i8.p0(ptr %A)
664         ret %struct.__neon_int8x8x4_t  %tmp2
667 declare %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld2r.v8i8.p0(ptr) nounwind readonly
668 declare %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld3r.v8i8.p0(ptr) nounwind readonly
669 declare %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld4r.v8i8.p0(ptr) nounwind readonly
671 define %struct.__neon_int8x16x2_t @ld2r_16b(ptr %A) nounwind {
672 ; CHECK-LABEL: ld2r_16b:
673 ; CHECK:       // %bb.0:
674 ; CHECK-NEXT:    ld2r.16b { v0, v1 }, [x0]
675 ; CHECK-NEXT:    ret
676 ; Make sure we are using the operands defined by the ABI
677         %tmp2 = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2r.v16i8.p0(ptr %A)
678         ret %struct.__neon_int8x16x2_t  %tmp2
681 define %struct.__neon_int8x16x3_t @ld3r_16b(ptr %A) nounwind {
682 ; CHECK-LABEL: ld3r_16b:
683 ; CHECK:       // %bb.0:
684 ; CHECK-NEXT:    ld3r.16b { v0, v1, v2 }, [x0]
685 ; CHECK-NEXT:    ret
686 ; Make sure we are using the operands defined by the ABI
687         %tmp2 = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3r.v16i8.p0(ptr %A)
688         ret %struct.__neon_int8x16x3_t  %tmp2
691 define %struct.__neon_int8x16x4_t @ld4r_16b(ptr %A) nounwind {
692 ; CHECK-LABEL: ld4r_16b:
693 ; CHECK:       // %bb.0:
694 ; CHECK-NEXT:    ld4r.16b { v0, v1, v2, v3 }, [x0]
695 ; CHECK-NEXT:    ret
696 ; Make sure we are using the operands defined by the ABI
697         %tmp2 = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4r.v16i8.p0(ptr %A)
698         ret %struct.__neon_int8x16x4_t  %tmp2
701 declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld2r.v16i8.p0(ptr) nounwind readonly
702 declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld3r.v16i8.p0(ptr) nounwind readonly
703 declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld4r.v16i8.p0(ptr) nounwind readonly
705 define %struct.__neon_int16x4x2_t @ld2r_4h(ptr %A) nounwind {
706 ; CHECK-LABEL: ld2r_4h:
707 ; CHECK:       // %bb.0:
708 ; CHECK-NEXT:    ld2r.4h { v0, v1 }, [x0]
709 ; CHECK-NEXT:    ret
710 ; Make sure we are using the operands defined by the ABI
711         %tmp2 = call %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2r.v4i16.p0(ptr %A)
712         ret %struct.__neon_int16x4x2_t  %tmp2
715 define %struct.__neon_int16x4x3_t @ld3r_4h(ptr %A) nounwind {
716 ; CHECK-LABEL: ld3r_4h:
717 ; CHECK:       // %bb.0:
718 ; CHECK-NEXT:    ld3r.4h { v0, v1, v2 }, [x0]
719 ; CHECK-NEXT:    ret
720 ; Make sure we are using the operands defined by the ABI
721         %tmp2 = call %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3r.v4i16.p0(ptr %A)
722         ret %struct.__neon_int16x4x3_t  %tmp2
725 define %struct.__neon_int16x4x4_t @ld4r_4h(ptr %A) nounwind {
726 ; CHECK-LABEL: ld4r_4h:
727 ; CHECK:       // %bb.0:
728 ; CHECK-NEXT:    ld4r.4h { v0, v1, v2, v3 }, [x0]
729 ; CHECK-NEXT:    ret
730 ; Make sure we are using the operands defined by the ABI
731         %tmp2 = call %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4r.v4i16.p0(ptr %A)
732         ret %struct.__neon_int16x4x4_t  %tmp2
735 declare %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld2r.v4i16.p0(ptr) nounwind readonly
736 declare %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld3r.v4i16.p0(ptr) nounwind readonly
737 declare %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld4r.v4i16.p0(ptr) nounwind readonly
739 define %struct.__neon_int16x8x2_t @ld2r_8h(ptr %A) nounwind {
740 ; CHECK-LABEL: ld2r_8h:
741 ; CHECK:       // %bb.0:
742 ; CHECK-NEXT:    ld2r.8h { v0, v1 }, [x0]
743 ; CHECK-NEXT:    ret
744 ; Make sure we are using the operands defined by the ABI
745   %tmp2 = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2r.v8i16.p0(ptr %A)
746   ret %struct.__neon_int16x8x2_t  %tmp2
749 define %struct.__neon_int16x8x3_t @ld3r_8h(ptr %A) nounwind {
750 ; CHECK-LABEL: ld3r_8h:
751 ; CHECK:       // %bb.0:
752 ; CHECK-NEXT:    ld3r.8h { v0, v1, v2 }, [x0]
753 ; CHECK-NEXT:    ret
754 ; Make sure we are using the operands defined by the ABI
755   %tmp2 = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3r.v8i16.p0(ptr %A)
756   ret %struct.__neon_int16x8x3_t  %tmp2
759 define %struct.__neon_int16x8x4_t @ld4r_8h(ptr %A) nounwind {
760 ; CHECK-LABEL: ld4r_8h:
761 ; CHECK:       // %bb.0:
762 ; CHECK-NEXT:    ld4r.8h { v0, v1, v2, v3 }, [x0]
763 ; CHECK-NEXT:    ret
764 ; Make sure we are using the operands defined by the ABI
765   %tmp2 = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4r.v8i16.p0(ptr %A)
766   ret %struct.__neon_int16x8x4_t  %tmp2
769 declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld2r.v8i16.p0(ptr) nounwind readonly
770 declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld3r.v8i16.p0(ptr) nounwind readonly
771 declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld4r.v8i16.p0(ptr) nounwind readonly
773 define %struct.__neon_int32x2x2_t @ld2r_2s(ptr %A) nounwind {
774 ; CHECK-LABEL: ld2r_2s:
775 ; CHECK:       // %bb.0:
776 ; CHECK-NEXT:    ld2r.2s { v0, v1 }, [x0]
777 ; CHECK-NEXT:    ret
778 ; Make sure we are using the operands defined by the ABI
779         %tmp2 = call %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2r.v2i32.p0(ptr %A)
780         ret %struct.__neon_int32x2x2_t  %tmp2
783 define %struct.__neon_int32x2x3_t @ld3r_2s(ptr %A) nounwind {
784 ; CHECK-LABEL: ld3r_2s:
785 ; CHECK:       // %bb.0:
786 ; CHECK-NEXT:    ld3r.2s { v0, v1, v2 }, [x0]
787 ; CHECK-NEXT:    ret
788 ; Make sure we are using the operands defined by the ABI
789         %tmp2 = call %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3r.v2i32.p0(ptr %A)
790         ret %struct.__neon_int32x2x3_t  %tmp2
793 define %struct.__neon_int32x2x4_t @ld4r_2s(ptr %A) nounwind {
794 ; CHECK-LABEL: ld4r_2s:
795 ; CHECK:       // %bb.0:
796 ; CHECK-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0]
797 ; CHECK-NEXT:    ret
798 ; Make sure we are using the operands defined by the ABI
799         %tmp2 = call %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4r.v2i32.p0(ptr %A)
800         ret %struct.__neon_int32x2x4_t  %tmp2
803 declare %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld2r.v2i32.p0(ptr) nounwind readonly
804 declare %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld3r.v2i32.p0(ptr) nounwind readonly
805 declare %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld4r.v2i32.p0(ptr) nounwind readonly
807 define %struct.__neon_int32x4x2_t @ld2r_4s(ptr %A) nounwind {
808 ; CHECK-LABEL: ld2r_4s:
809 ; CHECK:       // %bb.0:
810 ; CHECK-NEXT:    ld2r.4s { v0, v1 }, [x0]
811 ; CHECK-NEXT:    ret
812 ; Make sure we are using the operands defined by the ABI
813         %tmp2 = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2r.v4i32.p0(ptr %A)
814         ret %struct.__neon_int32x4x2_t  %tmp2
817 define %struct.__neon_int32x4x3_t @ld3r_4s(ptr %A) nounwind {
818 ; CHECK-LABEL: ld3r_4s:
819 ; CHECK:       // %bb.0:
820 ; CHECK-NEXT:    ld3r.4s { v0, v1, v2 }, [x0]
821 ; CHECK-NEXT:    ret
822 ; Make sure we are using the operands defined by the ABI
823         %tmp2 = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3r.v4i32.p0(ptr %A)
824         ret %struct.__neon_int32x4x3_t  %tmp2
827 define %struct.__neon_int32x4x4_t @ld4r_4s(ptr %A) nounwind {
828 ; CHECK-LABEL: ld4r_4s:
829 ; CHECK:       // %bb.0:
830 ; CHECK-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0]
831 ; CHECK-NEXT:    ret
832 ; Make sure we are using the operands defined by the ABI
833         %tmp2 = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4r.v4i32.p0(ptr %A)
834         ret %struct.__neon_int32x4x4_t  %tmp2
837 declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld2r.v4i32.p0(ptr) nounwind readonly
838 declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld3r.v4i32.p0(ptr) nounwind readonly
839 declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld4r.v4i32.p0(ptr) nounwind readonly
841 define %struct.__neon_int64x1x2_t @ld2r_1d(ptr %A) nounwind {
842 ; CHECK-LABEL: ld2r_1d:
843 ; CHECK:       // %bb.0:
844 ; CHECK-NEXT:    ld2r.1d { v0, v1 }, [x0]
845 ; CHECK-NEXT:    ret
846 ; Make sure we are using the operands defined by the ABI
847         %tmp2 = call %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2r.v1i64.p0(ptr %A)
848         ret %struct.__neon_int64x1x2_t  %tmp2
851 define %struct.__neon_int64x1x3_t @ld3r_1d(ptr %A) nounwind {
852 ; CHECK-LABEL: ld3r_1d:
853 ; CHECK:       // %bb.0:
854 ; CHECK-NEXT:    ld3r.1d { v0, v1, v2 }, [x0]
855 ; CHECK-NEXT:    ret
856 ; Make sure we are using the operands defined by the ABI
857         %tmp2 = call %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3r.v1i64.p0(ptr %A)
858         ret %struct.__neon_int64x1x3_t  %tmp2
861 define %struct.__neon_int64x1x4_t @ld4r_1d(ptr %A) nounwind {
862 ; CHECK-LABEL: ld4r_1d:
863 ; CHECK:       // %bb.0:
864 ; CHECK-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0]
865 ; CHECK-NEXT:    ret
866 ; Make sure we are using the operands defined by the ABI
867         %tmp2 = call %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4r.v1i64.p0(ptr %A)
868         ret %struct.__neon_int64x1x4_t  %tmp2
871 declare %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld2r.v1i64.p0(ptr) nounwind readonly
872 declare %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld3r.v1i64.p0(ptr) nounwind readonly
873 declare %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld4r.v1i64.p0(ptr) nounwind readonly
875 define %struct.__neon_int64x2x2_t @ld2r_2d(ptr %A) nounwind {
876 ; CHECK-LABEL: ld2r_2d:
877 ; CHECK:       // %bb.0:
878 ; CHECK-NEXT:    ld2r.2d { v0, v1 }, [x0]
879 ; CHECK-NEXT:    ret
880 ; Make sure we are using the operands defined by the ABI
881         %tmp2 = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2r.v2i64.p0(ptr %A)
882         ret %struct.__neon_int64x2x2_t  %tmp2
885 define %struct.__neon_int64x2x3_t @ld3r_2d(ptr %A) nounwind {
886 ; CHECK-LABEL: ld3r_2d:
887 ; CHECK:       // %bb.0:
888 ; CHECK-NEXT:    ld3r.2d { v0, v1, v2 }, [x0]
889 ; CHECK-NEXT:    ret
890 ; Make sure we are using the operands defined by the ABI
891         %tmp2 = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3r.v2i64.p0(ptr %A)
892         ret %struct.__neon_int64x2x3_t  %tmp2
895 define %struct.__neon_int64x2x4_t @ld4r_2d(ptr %A) nounwind {
896 ; CHECK-LABEL: ld4r_2d:
897 ; CHECK:       // %bb.0:
898 ; CHECK-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0]
899 ; CHECK-NEXT:    ret
900 ; Make sure we are using the operands defined by the ABI
901         %tmp2 = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4r.v2i64.p0(ptr %A)
902         ret %struct.__neon_int64x2x4_t  %tmp2
905 declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld2r.v2i64.p0(ptr) nounwind readonly
906 declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld3r.v2i64.p0(ptr) nounwind readonly
907 declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld4r.v2i64.p0(ptr) nounwind readonly
909 define <16 x i8> @ld1_16b(<16 x i8> %V, ptr %bar) {
910 ; CHECK-LABEL: ld1_16b:
911 ; CHECK:       // %bb.0:
912 ; CHECK-NEXT:    ld1.b { v0 }[0], [x0]
913 ; CHECK-NEXT:    ret
914 ; Make sure we are using the operands defined by the ABI
915   %tmp1 = load i8, ptr %bar
916   %tmp2 = insertelement <16 x i8> %V, i8 %tmp1, i32 0
917   ret <16 x i8> %tmp2
920 define <8 x i16> @ld1_8h(<8 x i16> %V, ptr %bar) {
921 ; CHECK-LABEL: ld1_8h:
922 ; CHECK:       // %bb.0:
923 ; CHECK-NEXT:    ld1.h { v0 }[0], [x0]
924 ; CHECK-NEXT:    ret
925 ; Make sure we are using the operands defined by the ABI
926   %tmp1 = load i16, ptr %bar
927   %tmp2 = insertelement <8 x i16> %V, i16 %tmp1, i32 0
928   ret <8 x i16> %tmp2
931 define <4 x i32> @ld1_4s(<4 x i32> %V, ptr %bar) {
932 ; CHECK-LABEL: ld1_4s:
933 ; CHECK:       // %bb.0:
934 ; CHECK-NEXT:    ld1.s { v0 }[0], [x0]
935 ; CHECK-NEXT:    ret
936 ; Make sure we are using the operands defined by the ABI
937   %tmp1 = load i32, ptr %bar
938   %tmp2 = insertelement <4 x i32> %V, i32 %tmp1, i32 0
939   ret <4 x i32> %tmp2
942 define <4 x float> @ld1_4s_float(<4 x float> %V, ptr %bar) {
943 ; CHECK-LABEL: ld1_4s_float:
944 ; CHECK:       // %bb.0:
945 ; CHECK-NEXT:    ld1.s { v0 }[0], [x0]
946 ; CHECK-NEXT:    ret
947 ; Make sure we are using the operands defined by the ABI
948   %tmp1 = load float, ptr %bar
949   %tmp2 = insertelement <4 x float> %V, float %tmp1, i32 0
950   ret <4 x float> %tmp2
953 define <2 x i64> @ld1_2d(<2 x i64> %V, ptr %bar) {
954 ; CHECK-LABEL: ld1_2d:
955 ; CHECK:       // %bb.0:
956 ; CHECK-NEXT:    ld1.d { v0 }[0], [x0]
957 ; CHECK-NEXT:    ret
958 ; Make sure we are using the operands defined by the ABI
959   %tmp1 = load i64, ptr %bar
960   %tmp2 = insertelement <2 x i64> %V, i64 %tmp1, i32 0
961   ret <2 x i64> %tmp2
964 define <2 x double> @ld1_2d_double(<2 x double> %V, ptr %bar) {
965 ; CHECK-LABEL: ld1_2d_double:
966 ; CHECK:       // %bb.0:
967 ; CHECK-NEXT:    ld1.d { v0 }[0], [x0]
968 ; CHECK-NEXT:    ret
969 ; Make sure we are using the operands defined by the ABI
970   %tmp1 = load double, ptr %bar
971   %tmp2 = insertelement <2 x double> %V, double %tmp1, i32 0
972   ret <2 x double> %tmp2
975 define <1 x i64> @ld1_1d(ptr %p) {
976 ; CHECK-LABEL: ld1_1d:
977 ; CHECK:       // %bb.0:
978 ; CHECK-NEXT:    ldr d0, [x0]
979 ; CHECK-NEXT:    ret
980 ; Make sure we are using the operands defined by the ABI
981   %tmp = load <1 x i64>, ptr %p, align 8
982   ret <1 x i64> %tmp
985 define <8 x i8> @ld1_8b(<8 x i8> %V, ptr %bar) {
986 ; CHECK-LABEL: ld1_8b:
987 ; CHECK:       // %bb.0:
988 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
989 ; CHECK-NEXT:    ld1.b { v0 }[0], [x0]
990 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
991 ; CHECK-NEXT:    ret
992 ; Make sure we are using the operands defined by the ABI
993   %tmp1 = load i8, ptr %bar
994   %tmp2 = insertelement <8 x i8> %V, i8 %tmp1, i32 0
995   ret <8 x i8> %tmp2
998 define <4 x i16> @ld1_4h(<4 x i16> %V, ptr %bar) {
999 ; CHECK-LABEL: ld1_4h:
1000 ; CHECK:       // %bb.0:
1001 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
1002 ; CHECK-NEXT:    ld1.h { v0 }[0], [x0]
1003 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
1004 ; CHECK-NEXT:    ret
1005 ; Make sure we are using the operands defined by the ABI
1006   %tmp1 = load i16, ptr %bar
1007   %tmp2 = insertelement <4 x i16> %V, i16 %tmp1, i32 0
1008   ret <4 x i16> %tmp2
1011 define <2 x i32> @ld1_2s(<2 x i32> %V, ptr %bar) {
1012 ; CHECK-LABEL: ld1_2s:
1013 ; CHECK:       // %bb.0:
1014 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
1015 ; CHECK-NEXT:    ld1.s { v0 }[0], [x0]
1016 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
1017 ; CHECK-NEXT:    ret
1018 ; Make sure we are using the operands defined by the ABI
1019   %tmp1 = load i32, ptr %bar
1020   %tmp2 = insertelement <2 x i32> %V, i32 %tmp1, i32 0
1021   ret <2 x i32> %tmp2
1024 define <2 x float> @ld1_2s_float(<2 x float> %V, ptr %bar) {
1025 ; CHECK-LABEL: ld1_2s_float:
1026 ; CHECK:       // %bb.0:
1027 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
1028 ; CHECK-NEXT:    ld1.s { v0 }[0], [x0]
1029 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
1030 ; CHECK-NEXT:    ret
1031 ; Make sure we are using the operands defined by the ABI
1032   %tmp1 = load float, ptr %bar
1033   %tmp2 = insertelement <2 x float> %V, float %tmp1, i32 0
1034   ret <2 x float> %tmp2
1038 ; Add rdar://13098923 test case: vld1_dup_u32 doesn't generate ld1r.2s
1039 define void @ld1r_2s_from_dup(ptr nocapture %a, ptr nocapture %b, ptr nocapture %diff) nounwind ssp {
1040 ; CHECK-LABEL: ld1r_2s_from_dup:
1041 ; CHECK:       // %bb.0: // %entry
1042 ; CHECK-NEXT:    ld1r.2s { v0 }, [x0]
1043 ; CHECK-NEXT:    ld1r.2s { v1 }, [x1]
1044 ; CHECK-NEXT:    usubl.8h v0, v0, v1
1045 ; CHECK-NEXT:    str d0, [x2]
1046 ; CHECK-NEXT:    ret
1047 entry:
1048   %tmp1 = load i32, ptr %a, align 4
1049   %tmp2 = insertelement <2 x i32> undef, i32 %tmp1, i32 0
1050   %lane = shufflevector <2 x i32> %tmp2, <2 x i32> undef, <2 x i32> zeroinitializer
1051   %tmp3 = bitcast <2 x i32> %lane to <8 x i8>
1052   %tmp5 = load i32, ptr %b, align 4
1053   %tmp6 = insertelement <2 x i32> undef, i32 %tmp5, i32 0
1054   %lane1 = shufflevector <2 x i32> %tmp6, <2 x i32> undef, <2 x i32> zeroinitializer
1055   %tmp7 = bitcast <2 x i32> %lane1 to <8 x i8>
1056   %vmovl.i.i = zext <8 x i8> %tmp3 to <8 x i16>
1057   %vmovl.i4.i = zext <8 x i8> %tmp7 to <8 x i16>
1058   %sub.i = sub <8 x i16> %vmovl.i.i, %vmovl.i4.i
1059   %tmp8 = bitcast <8 x i16> %sub.i to <2 x i64>
1060   %shuffle.i = shufflevector <2 x i64> %tmp8, <2 x i64> undef, <1 x i32> zeroinitializer
1061   %tmp9 = bitcast <1 x i64> %shuffle.i to <4 x i16>
1062   store <4 x i16> %tmp9, ptr %diff, align 8
1063   ret void
1066 ; Tests for rdar://11947069: vld1_dup_* and vld1q_dup_* code gen is suboptimal
1067 define <4 x float> @ld1r_4s_float(ptr nocapture %x) {
1068 ; CHECK-LABEL: ld1r_4s_float:
1069 ; CHECK:       // %bb.0: // %entry
1070 ; CHECK-NEXT:    ld1r.4s { v0 }, [x0]
1071 ; CHECK-NEXT:    ret
1072 entry:
1073 ; Make sure we are using the operands defined by the ABI
1074   %tmp = load float, ptr %x, align 4
1075   %tmp1 = insertelement <4 x float> undef, float %tmp, i32 0
1076   %tmp2 = insertelement <4 x float> %tmp1, float %tmp, i32 1
1077   %tmp3 = insertelement <4 x float> %tmp2, float %tmp, i32 2
1078   %tmp4 = insertelement <4 x float> %tmp3, float %tmp, i32 3
1079   ret <4 x float> %tmp4
1082 define <2 x float> @ld1r_2s_float(ptr nocapture %x) {
1083 ; CHECK-LABEL: ld1r_2s_float:
1084 ; CHECK:       // %bb.0: // %entry
1085 ; CHECK-NEXT:    ld1r.2s { v0 }, [x0]
1086 ; CHECK-NEXT:    ret
1087 entry:
1088 ; Make sure we are using the operands defined by the ABI
1089   %tmp = load float, ptr %x, align 4
1090   %tmp1 = insertelement <2 x float> undef, float %tmp, i32 0
1091   %tmp2 = insertelement <2 x float> %tmp1, float %tmp, i32 1
1092   ret <2 x float> %tmp2
1095 define <2 x double> @ld1r_2d_double(ptr nocapture %x) {
1096 ; CHECK-LABEL: ld1r_2d_double:
1097 ; CHECK:       // %bb.0: // %entry
1098 ; CHECK-NEXT:    ld1r.2d { v0 }, [x0]
1099 ; CHECK-NEXT:    ret
1100 entry:
1101 ; Make sure we are using the operands defined by the ABI
1102   %tmp = load double, ptr %x, align 4
1103   %tmp1 = insertelement <2 x double> undef, double %tmp, i32 0
1104   %tmp2 = insertelement <2 x double> %tmp1, double %tmp, i32 1
1105   ret <2 x double> %tmp2
1108 define <1 x double> @ld1r_1d_double(ptr nocapture %x) {
1109 ; CHECK-LABEL: ld1r_1d_double:
1110 ; CHECK:       // %bb.0: // %entry
1111 ; CHECK-NEXT:    ldr d0, [x0]
1112 ; CHECK-NEXT:    ret
1113 entry:
1114 ; Make sure we are using the operands defined by the ABI
1115   %tmp = load double, ptr %x, align 4
1116   %tmp1 = insertelement <1 x double> undef, double %tmp, i32 0
1117   ret <1 x double> %tmp1
1120 define <4 x float> @ld1r_4s_float_shuff(ptr nocapture %x) {
1121 ; CHECK-LABEL: ld1r_4s_float_shuff:
1122 ; CHECK:       // %bb.0: // %entry
1123 ; CHECK-NEXT:    ld1r.4s { v0 }, [x0]
1124 ; CHECK-NEXT:    ret
1125 entry:
1126 ; Make sure we are using the operands defined by the ABI
1127   %tmp = load float, ptr %x, align 4
1128   %tmp1 = insertelement <4 x float> undef, float %tmp, i32 0
1129   %lane = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer
1130   ret <4 x float> %lane
1133 define <2 x float> @ld1r_2s_float_shuff(ptr nocapture %x) {
1134 ; CHECK-LABEL: ld1r_2s_float_shuff:
1135 ; CHECK:       // %bb.0: // %entry
1136 ; CHECK-NEXT:    ld1r.2s { v0 }, [x0]
1137 ; CHECK-NEXT:    ret
1138 entry:
1139 ; Make sure we are using the operands defined by the ABI
1140   %tmp = load float, ptr %x, align 4
1141   %tmp1 = insertelement <2 x float> undef, float %tmp, i32 0
1142   %lane = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer
1143   ret <2 x float> %lane
1146 define <2 x double> @ld1r_2d_double_shuff(ptr nocapture %x) {
1147 ; CHECK-LABEL: ld1r_2d_double_shuff:
1148 ; CHECK:       // %bb.0: // %entry
1149 ; CHECK-NEXT:    ld1r.2d { v0 }, [x0]
1150 ; CHECK-NEXT:    ret
1151 entry:
1152 ; Make sure we are using the operands defined by the ABI
1153   %tmp = load double, ptr %x, align 4
1154   %tmp1 = insertelement <2 x double> undef, double %tmp, i32 0
1155   %lane = shufflevector <2 x double> %tmp1, <2 x double> undef, <2 x i32> zeroinitializer
1156   ret <2 x double> %lane
1159 define <1 x double> @ld1r_1d_double_shuff(ptr nocapture %x) {
1160 ; CHECK-LABEL: ld1r_1d_double_shuff:
1161 ; CHECK:       // %bb.0: // %entry
1162 ; CHECK-NEXT:    ldr d0, [x0]
1163 ; CHECK-NEXT:    ret
1164 entry:
1165 ; Make sure we are using the operands defined by the ABI
1166   %tmp = load double, ptr %x, align 4
1167   %tmp1 = insertelement <1 x double> undef, double %tmp, i32 0
1168   %lane = shufflevector <1 x double> %tmp1, <1 x double> undef, <1 x i32> zeroinitializer
1169   ret <1 x double> %lane
1172 %struct.__neon_float32x2x2_t = type { <2 x float>,  <2 x float> }
1173 %struct.__neon_float32x2x3_t = type { <2 x float>,  <2 x float>,  <2 x float> }
1174 %struct.__neon_float32x2x4_t = type { <2 x float>,  <2 x float>, <2 x float>,  <2 x float> }
1176 declare %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr) nounwind readonly
1177 declare %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr) nounwind readonly
1178 declare %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr) nounwind readonly
1179 declare %struct.__neon_float32x2x2_t @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr) nounwind readonly
1180 declare %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr) nounwind readonly
1181 declare %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr) nounwind readonly
1183 define %struct.__neon_int8x8x2_t @ld1_x2_v8i8(ptr %addr) {
1184 ; CHECK-LABEL: ld1_x2_v8i8:
1185 ; CHECK:       // %bb.0:
1186 ; CHECK-NEXT:    ld1.8b { v0, v1 }, [x0]
1187 ; CHECK-NEXT:    ret
1188   %val = call %struct.__neon_int8x8x2_t @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr %addr)
1189   ret %struct.__neon_int8x8x2_t %val
1192 define %struct.__neon_int16x4x2_t @ld1_x2_v4i16(ptr %addr) {
1193 ; CHECK-LABEL: ld1_x2_v4i16:
1194 ; CHECK:       // %bb.0:
1195 ; CHECK-NEXT:    ld1.4h { v0, v1 }, [x0]
1196 ; CHECK-NEXT:    ret
1197   %val = call %struct.__neon_int16x4x2_t @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr %addr)
1198   ret %struct.__neon_int16x4x2_t %val
1201 define %struct.__neon_int32x2x2_t @ld1_x2_v2i32(ptr %addr) {
1202 ; CHECK-LABEL: ld1_x2_v2i32:
1203 ; CHECK:       // %bb.0:
1204 ; CHECK-NEXT:    ld1.2s { v0, v1 }, [x0]
1205 ; CHECK-NEXT:    ret
1206   %val = call %struct.__neon_int32x2x2_t @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr %addr)
1207   ret %struct.__neon_int32x2x2_t %val
1210 define %struct.__neon_float32x2x2_t @ld1_x2_v2f32(ptr %addr) {
1211 ; CHECK-LABEL: ld1_x2_v2f32:
1212 ; CHECK:       // %bb.0:
1213 ; CHECK-NEXT:    ld1.2s { v0, v1 }, [x0]
1214 ; CHECK-NEXT:    ret
1215   %val = call %struct.__neon_float32x2x2_t @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr %addr)
1216   ret %struct.__neon_float32x2x2_t %val
1219 define %struct.__neon_int64x1x2_t @ld1_x2_v1i64(ptr %addr) {
1220 ; CHECK-LABEL: ld1_x2_v1i64:
1221 ; CHECK:       // %bb.0:
1222 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0]
1223 ; CHECK-NEXT:    ret
1224   %val = call %struct.__neon_int64x1x2_t @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr %addr)
1225   ret %struct.__neon_int64x1x2_t %val
1228 define %struct.__neon_float64x1x2_t @ld1_x2_v1f64(ptr %addr) {
1229 ; CHECK-LABEL: ld1_x2_v1f64:
1230 ; CHECK:       // %bb.0:
1231 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0]
1232 ; CHECK-NEXT:    ret
1233   %val = call %struct.__neon_float64x1x2_t @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr %addr)
1234   ret %struct.__neon_float64x1x2_t %val
1238 %struct.__neon_float32x4x2_t = type { <4 x float>,  <4 x float> }
1239 %struct.__neon_float32x4x3_t = type { <4 x float>,  <4 x float>,  <4 x float> }
1240 %struct.__neon_float32x4x4_t = type { <4 x float>,  <4 x float>, <4 x float>,  <4 x float> }
1242 %struct.__neon_float64x2x2_t = type { <2 x double>,  <2 x double> }
1243 %struct.__neon_float64x2x3_t = type { <2 x double>,  <2 x double>,  <2 x double> }
1244 %struct.__neon_float64x2x4_t = type { <2 x double>,  <2 x double>, <2 x double>,  <2 x double> }
1246 declare %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr) nounwind readonly
1247 declare %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr) nounwind readonly
1248 declare %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr) nounwind readonly
1249 declare %struct.__neon_float32x4x2_t @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr) nounwind readonly
1250 declare %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr) nounwind readonly
1251 declare %struct.__neon_float64x2x2_t @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr) nounwind readonly
1253 define %struct.__neon_int8x16x2_t @ld1_x2_v16i8(ptr %addr) {
1254 ; CHECK-LABEL: ld1_x2_v16i8:
1255 ; CHECK:       // %bb.0:
1256 ; CHECK-NEXT:    ld1.16b { v0, v1 }, [x0]
1257 ; CHECK-NEXT:    ret
1258   %val = call %struct.__neon_int8x16x2_t @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr %addr)
1259   ret %struct.__neon_int8x16x2_t %val
1262 define %struct.__neon_int16x8x2_t @ld1_x2_v8i16(ptr %addr) {
1263 ; CHECK-LABEL: ld1_x2_v8i16:
1264 ; CHECK:       // %bb.0:
1265 ; CHECK-NEXT:    ld1.8h { v0, v1 }, [x0]
1266 ; CHECK-NEXT:    ret
1267   %val = call %struct.__neon_int16x8x2_t @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr %addr)
1268   ret %struct.__neon_int16x8x2_t %val
1271 define %struct.__neon_int32x4x2_t @ld1_x2_v4i32(ptr %addr) {
1272 ; CHECK-LABEL: ld1_x2_v4i32:
1273 ; CHECK:       // %bb.0:
1274 ; CHECK-NEXT:    ld1.4s { v0, v1 }, [x0]
1275 ; CHECK-NEXT:    ret
1276   %val = call %struct.__neon_int32x4x2_t @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr %addr)
1277   ret %struct.__neon_int32x4x2_t %val
1280 define %struct.__neon_float32x4x2_t @ld1_x2_v4f32(ptr %addr) {
1281 ; CHECK-LABEL: ld1_x2_v4f32:
1282 ; CHECK:       // %bb.0:
1283 ; CHECK-NEXT:    ld1.4s { v0, v1 }, [x0]
1284 ; CHECK-NEXT:    ret
1285   %val = call %struct.__neon_float32x4x2_t @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr %addr)
1286   ret %struct.__neon_float32x4x2_t %val
1289 define %struct.__neon_int64x2x2_t @ld1_x2_v2i64(ptr %addr) {
1290 ; CHECK-LABEL: ld1_x2_v2i64:
1291 ; CHECK:       // %bb.0:
1292 ; CHECK-NEXT:    ld1.2d { v0, v1 }, [x0]
1293 ; CHECK-NEXT:    ret
1294   %val = call %struct.__neon_int64x2x2_t @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr %addr)
1295   ret %struct.__neon_int64x2x2_t %val
1298 define %struct.__neon_float64x2x2_t @ld1_x2_v2f64(ptr %addr) {
1299 ; CHECK-LABEL: ld1_x2_v2f64:
1300 ; CHECK:       // %bb.0:
1301 ; CHECK-NEXT:    ld1.2d { v0, v1 }, [x0]
1302 ; CHECK-NEXT:    ret
1303   %val = call %struct.__neon_float64x2x2_t @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr %addr)
1304   ret %struct.__neon_float64x2x2_t %val
1307 declare %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr) nounwind readonly
1308 declare %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr) nounwind readonly
1309 declare %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr) nounwind readonly
1310 declare %struct.__neon_float32x2x3_t @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr) nounwind readonly
1311 declare %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr) nounwind readonly
1312 declare %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr) nounwind readonly
1314 define %struct.__neon_int8x8x3_t @ld1_x3_v8i8(ptr %addr) {
1315 ; CHECK-LABEL: ld1_x3_v8i8:
1316 ; CHECK:       // %bb.0:
1317 ; CHECK-NEXT:    ld1.8b { v0, v1, v2 }, [x0]
1318 ; CHECK-NEXT:    ret
1319   %val = call %struct.__neon_int8x8x3_t @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr %addr)
1320   ret %struct.__neon_int8x8x3_t %val
1323 define %struct.__neon_int16x4x3_t @ld1_x3_v4i16(ptr %addr) {
1324 ; CHECK-LABEL: ld1_x3_v4i16:
1325 ; CHECK:       // %bb.0:
1326 ; CHECK-NEXT:    ld1.4h { v0, v1, v2 }, [x0]
1327 ; CHECK-NEXT:    ret
1328   %val = call %struct.__neon_int16x4x3_t @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr %addr)
1329   ret %struct.__neon_int16x4x3_t %val
1332 define %struct.__neon_int32x2x3_t @ld1_x3_v2i32(ptr %addr) {
1333 ; CHECK-LABEL: ld1_x3_v2i32:
1334 ; CHECK:       // %bb.0:
1335 ; CHECK-NEXT:    ld1.2s { v0, v1, v2 }, [x0]
1336 ; CHECK-NEXT:    ret
1337   %val = call %struct.__neon_int32x2x3_t @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr %addr)
1338   ret %struct.__neon_int32x2x3_t %val
1341 define %struct.__neon_float32x2x3_t @ld1_x3_v2f32(ptr %addr) {
1342 ; CHECK-LABEL: ld1_x3_v2f32:
1343 ; CHECK:       // %bb.0:
1344 ; CHECK-NEXT:    ld1.2s { v0, v1, v2 }, [x0]
1345 ; CHECK-NEXT:    ret
1346   %val = call %struct.__neon_float32x2x3_t @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr %addr)
1347   ret %struct.__neon_float32x2x3_t %val
1350 define %struct.__neon_int64x1x3_t @ld1_x3_v1i64(ptr %addr) {
1351 ; CHECK-LABEL: ld1_x3_v1i64:
1352 ; CHECK:       // %bb.0:
1353 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
1354 ; CHECK-NEXT:    ret
1355   %val = call %struct.__neon_int64x1x3_t @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr %addr)
1356   ret %struct.__neon_int64x1x3_t %val
1359 define %struct.__neon_float64x1x3_t @ld1_x3_v1f64(ptr %addr) {
1360 ; CHECK-LABEL: ld1_x3_v1f64:
1361 ; CHECK:       // %bb.0:
1362 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
1363 ; CHECK-NEXT:    ret
1364   %val = call %struct.__neon_float64x1x3_t @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr %addr)
1365   ret %struct.__neon_float64x1x3_t %val
1368 declare %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr) nounwind readonly
1369 declare %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr) nounwind readonly
1370 declare %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr) nounwind readonly
1371 declare %struct.__neon_float32x4x3_t @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr) nounwind readonly
1372 declare %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr) nounwind readonly
1373 declare %struct.__neon_float64x2x3_t @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr) nounwind readonly
1375 define %struct.__neon_int8x16x3_t @ld1_x3_v16i8(ptr %addr) {
1376 ; CHECK-LABEL: ld1_x3_v16i8:
1377 ; CHECK:       // %bb.0:
1378 ; CHECK-NEXT:    ld1.16b { v0, v1, v2 }, [x0]
1379 ; CHECK-NEXT:    ret
1380   %val = call %struct.__neon_int8x16x3_t @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr %addr)
1381   ret %struct.__neon_int8x16x3_t %val
1384 define %struct.__neon_int16x8x3_t @ld1_x3_v8i16(ptr %addr) {
1385 ; CHECK-LABEL: ld1_x3_v8i16:
1386 ; CHECK:       // %bb.0:
1387 ; CHECK-NEXT:    ld1.8h { v0, v1, v2 }, [x0]
1388 ; CHECK-NEXT:    ret
1389   %val = call %struct.__neon_int16x8x3_t @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr %addr)
1390   ret %struct.__neon_int16x8x3_t %val
1393 define %struct.__neon_int32x4x3_t @ld1_x3_v4i32(ptr %addr) {
1394 ; CHECK-LABEL: ld1_x3_v4i32:
1395 ; CHECK:       // %bb.0:
1396 ; CHECK-NEXT:    ld1.4s { v0, v1, v2 }, [x0]
1397 ; CHECK-NEXT:    ret
1398   %val = call %struct.__neon_int32x4x3_t @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr %addr)
1399   ret %struct.__neon_int32x4x3_t %val
1402 define %struct.__neon_float32x4x3_t @ld1_x3_v4f32(ptr %addr) {
1403 ; CHECK-LABEL: ld1_x3_v4f32:
1404 ; CHECK:       // %bb.0:
1405 ; CHECK-NEXT:    ld1.4s { v0, v1, v2 }, [x0]
1406 ; CHECK-NEXT:    ret
1407   %val = call %struct.__neon_float32x4x3_t @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr %addr)
1408   ret %struct.__neon_float32x4x3_t %val
1411 define %struct.__neon_int64x2x3_t @ld1_x3_v2i64(ptr %addr) {
1412 ; CHECK-LABEL: ld1_x3_v2i64:
1413 ; CHECK:       // %bb.0:
1414 ; CHECK-NEXT:    ld1.2d { v0, v1, v2 }, [x0]
1415 ; CHECK-NEXT:    ret
1416   %val = call %struct.__neon_int64x2x3_t @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr %addr)
1417   ret %struct.__neon_int64x2x3_t %val
1420 define %struct.__neon_float64x2x3_t @ld1_x3_v2f64(ptr %addr) {
1421 ; CHECK-LABEL: ld1_x3_v2f64:
1422 ; CHECK:       // %bb.0:
1423 ; CHECK-NEXT:    ld1.2d { v0, v1, v2 }, [x0]
1424 ; CHECK-NEXT:    ret
1425   %val = call %struct.__neon_float64x2x3_t @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr %addr)
1426   ret %struct.__neon_float64x2x3_t %val
1429 declare %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr) nounwind readonly
1430 declare %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr) nounwind readonly
1431 declare %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr) nounwind readonly
1432 declare %struct.__neon_float32x2x4_t @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr) nounwind readonly
1433 declare %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr) nounwind readonly
1434 declare %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr) nounwind readonly
1436 define %struct.__neon_int8x8x4_t @ld1_x4_v8i8(ptr %addr) {
1437 ; CHECK-LABEL: ld1_x4_v8i8:
1438 ; CHECK:       // %bb.0:
1439 ; CHECK-NEXT:    ld1.8b { v0, v1, v2, v3 }, [x0]
1440 ; CHECK-NEXT:    ret
1441   %val = call %struct.__neon_int8x8x4_t @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr %addr)
1442   ret %struct.__neon_int8x8x4_t %val
1445 define %struct.__neon_int16x4x4_t @ld1_x4_v4i16(ptr %addr) {
1446 ; CHECK-LABEL: ld1_x4_v4i16:
1447 ; CHECK:       // %bb.0:
1448 ; CHECK-NEXT:    ld1.4h { v0, v1, v2, v3 }, [x0]
1449 ; CHECK-NEXT:    ret
1450   %val = call %struct.__neon_int16x4x4_t @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr %addr)
1451   ret %struct.__neon_int16x4x4_t %val
1454 define %struct.__neon_int32x2x4_t @ld1_x4_v2i32(ptr %addr) {
1455 ; CHECK-LABEL: ld1_x4_v2i32:
1456 ; CHECK:       // %bb.0:
1457 ; CHECK-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0]
1458 ; CHECK-NEXT:    ret
1459   %val = call %struct.__neon_int32x2x4_t @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr %addr)
1460   ret %struct.__neon_int32x2x4_t %val
1463 define %struct.__neon_float32x2x4_t @ld1_x4_v2f32(ptr %addr) {
1464 ; CHECK-LABEL: ld1_x4_v2f32:
1465 ; CHECK:       // %bb.0:
1466 ; CHECK-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0]
1467 ; CHECK-NEXT:    ret
1468   %val = call %struct.__neon_float32x2x4_t @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr %addr)
1469   ret %struct.__neon_float32x2x4_t %val
1472 define %struct.__neon_int64x1x4_t @ld1_x4_v1i64(ptr %addr) {
1473 ; CHECK-LABEL: ld1_x4_v1i64:
1474 ; CHECK:       // %bb.0:
1475 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
1476 ; CHECK-NEXT:    ret
1477   %val = call %struct.__neon_int64x1x4_t @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr %addr)
1478   ret %struct.__neon_int64x1x4_t %val
1481 define %struct.__neon_float64x1x4_t @ld1_x4_v1f64(ptr %addr) {
1482 ; CHECK-LABEL: ld1_x4_v1f64:
1483 ; CHECK:       // %bb.0:
1484 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
1485 ; CHECK-NEXT:    ret
1486   %val = call %struct.__neon_float64x1x4_t @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr %addr)
1487   ret %struct.__neon_float64x1x4_t %val
1490 declare %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr) nounwind readonly
1491 declare %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr) nounwind readonly
1492 declare %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr) nounwind readonly
1493 declare %struct.__neon_float32x4x4_t @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr) nounwind readonly
1494 declare %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr) nounwind readonly
1495 declare %struct.__neon_float64x2x4_t @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr) nounwind readonly
1497 define %struct.__neon_int8x16x4_t @ld1_x4_v16i8(ptr %addr) {
1498 ; CHECK-LABEL: ld1_x4_v16i8:
1499 ; CHECK:       // %bb.0:
1500 ; CHECK-NEXT:    ld1.16b { v0, v1, v2, v3 }, [x0]
1501 ; CHECK-NEXT:    ret
1502   %val = call %struct.__neon_int8x16x4_t @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr %addr)
1503   ret %struct.__neon_int8x16x4_t %val
1506 define %struct.__neon_int16x8x4_t @ld1_x4_v8i16(ptr %addr) {
1507 ; CHECK-LABEL: ld1_x4_v8i16:
1508 ; CHECK:       // %bb.0:
1509 ; CHECK-NEXT:    ld1.8h { v0, v1, v2, v3 }, [x0]
1510 ; CHECK-NEXT:    ret
1511   %val = call %struct.__neon_int16x8x4_t @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr %addr)
1512   ret %struct.__neon_int16x8x4_t %val
1515 define %struct.__neon_int32x4x4_t @ld1_x4_v4i32(ptr %addr) {
1516 ; CHECK-LABEL: ld1_x4_v4i32:
1517 ; CHECK:       // %bb.0:
1518 ; CHECK-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0]
1519 ; CHECK-NEXT:    ret
1520   %val = call %struct.__neon_int32x4x4_t @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr %addr)
1521   ret %struct.__neon_int32x4x4_t %val
1524 define %struct.__neon_float32x4x4_t @ld1_x4_v4f32(ptr %addr) {
1525 ; CHECK-LABEL: ld1_x4_v4f32:
1526 ; CHECK:       // %bb.0:
1527 ; CHECK-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0]
1528 ; CHECK-NEXT:    ret
1529   %val = call %struct.__neon_float32x4x4_t @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr %addr)
1530   ret %struct.__neon_float32x4x4_t %val
1533 define %struct.__neon_int64x2x4_t @ld1_x4_v2i64(ptr %addr) {
1534 ; CHECK-LABEL: ld1_x4_v2i64:
1535 ; CHECK:       // %bb.0:
1536 ; CHECK-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0]
1537 ; CHECK-NEXT:    ret
1538   %val = call %struct.__neon_int64x2x4_t @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr %addr)
1539   ret %struct.__neon_int64x2x4_t %val
1542 define %struct.__neon_float64x2x4_t @ld1_x4_v2f64(ptr %addr) {
1543 ; CHECK-LABEL: ld1_x4_v2f64:
1544 ; CHECK:       // %bb.0:
1545 ; CHECK-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0]
1546 ; CHECK-NEXT:    ret
1547   %val = call %struct.__neon_float64x2x4_t @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr %addr)
1548   ret %struct.__neon_float64x2x4_t %val