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 {
11 ; CHECK-NEXT: ld2.8b { v0, v1 }, [x0]
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:
22 ; CHECK-NEXT: ld3.8b { v0, v1, v2 }, [x0]
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:
32 ; CHECK-NEXT: ld4.8b { v0, v1, v2, v3 }, [x0]
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:
50 ; CHECK-NEXT: ld2.16b { v0, v1 }, [x0]
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:
60 ; CHECK-NEXT: ld3.16b { v0, v1, v2 }, [x0]
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:
70 ; CHECK-NEXT: ld4.16b { v0, v1, v2, v3 }, [x0]
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:
88 ; CHECK-NEXT: ld2.4h { v0, v1 }, [x0]
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:
98 ; CHECK-NEXT: ld3.4h { v0, v1, v2 }, [x0]
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:
108 ; CHECK-NEXT: ld4.4h { v0, v1, v2, v3 }, [x0]
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:
126 ; CHECK-NEXT: ld2.8h { v0, v1 }, [x0]
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:
136 ; CHECK-NEXT: ld3.8h { v0, v1, v2 }, [x0]
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:
146 ; CHECK-NEXT: ld4.8h { v0, v1, v2, v3 }, [x0]
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:
164 ; CHECK-NEXT: ld2.2s { v0, v1 }, [x0]
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:
174 ; CHECK-NEXT: ld3.2s { v0, v1, v2 }, [x0]
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:
184 ; CHECK-NEXT: ld4.2s { v0, v1, v2, v3 }, [x0]
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:
202 ; CHECK-NEXT: ld2.4s { v0, v1 }, [x0]
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:
212 ; CHECK-NEXT: ld3.4s { v0, v1, v2 }, [x0]
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:
222 ; CHECK-NEXT: ld4.4s { v0, v1, v2, v3 }, [x0]
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:
240 ; CHECK-NEXT: ld2.2d { v0, v1 }, [x0]
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:
250 ; CHECK-NEXT: ld3.2d { v0, v1, v2 }, [x0]
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:
260 ; CHECK-NEXT: ld4.2d { v0, v1, v2, v3 }, [x0]
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:
279 ; CHECK-NEXT: ld1.1d { v0, v1 }, [x0]
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:
289 ; CHECK-NEXT: ld1.1d { v0, v1, v2 }, [x0]
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:
299 ; CHECK-NEXT: ld1.1d { v0, v1, v2, v3 }, [x0]
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:
319 ; CHECK-NEXT: ld1.1d { v0, v1 }, [x0]
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:
329 ; CHECK-NEXT: ld1.1d { v0, v1, v2 }, [x0]
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:
339 ; CHECK-NEXT: ld1.1d { v0, v1, v2, v3 }, [x0]
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:
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]
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:
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]
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:
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]
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:
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]
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:
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]
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:
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]
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:
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]
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:
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]
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:
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]
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:
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]
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:
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]
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:
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]
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:
526 ; CHECK-NEXT: ld1r.8b { v0 }, [x0]
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
541 define <16 x i8> @ld1r_16b(ptr %bar) {
542 ; CHECK-LABEL: ld1r_16b:
544 ; CHECK-NEXT: ld1r.16b { v0 }, [x0]
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
567 define <4 x i16> @ld1r_4h(ptr %bar) {
568 ; CHECK-LABEL: ld1r_4h:
570 ; CHECK-NEXT: ld1r.4h { v0 }, [x0]
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
581 define <8 x i16> @ld1r_8h(ptr %bar) {
582 ; CHECK-LABEL: ld1r_8h:
584 ; CHECK-NEXT: ld1r.8h { v0 }, [x0]
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
599 define <2 x i32> @ld1r_2s(ptr %bar) {
600 ; CHECK-LABEL: ld1r_2s:
602 ; CHECK-NEXT: ld1r.2s { v0 }, [x0]
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
611 define <4 x i32> @ld1r_4s(ptr %bar) {
612 ; CHECK-LABEL: ld1r_4s:
614 ; CHECK-NEXT: ld1r.4s { v0 }, [x0]
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
625 define <2 x i64> @ld1r_2d(ptr %bar) {
626 ; CHECK-LABEL: ld1r_2d:
628 ; CHECK-NEXT: ld1r.2d { v0 }, [x0]
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
637 define %struct.__neon_int8x8x2_t @ld2r_8b(ptr %A) nounwind {
638 ; CHECK-LABEL: ld2r_8b:
640 ; CHECK-NEXT: ld2r.8b { v0, v1 }, [x0]
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:
650 ; CHECK-NEXT: ld3r.8b { v0, v1, v2 }, [x0]
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:
660 ; CHECK-NEXT: ld4r.8b { v0, v1, v2, v3 }, [x0]
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:
674 ; CHECK-NEXT: ld2r.16b { v0, v1 }, [x0]
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:
684 ; CHECK-NEXT: ld3r.16b { v0, v1, v2 }, [x0]
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:
694 ; CHECK-NEXT: ld4r.16b { v0, v1, v2, v3 }, [x0]
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:
708 ; CHECK-NEXT: ld2r.4h { v0, v1 }, [x0]
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:
718 ; CHECK-NEXT: ld3r.4h { v0, v1, v2 }, [x0]
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:
728 ; CHECK-NEXT: ld4r.4h { v0, v1, v2, v3 }, [x0]
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:
742 ; CHECK-NEXT: ld2r.8h { v0, v1 }, [x0]
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:
752 ; CHECK-NEXT: ld3r.8h { v0, v1, v2 }, [x0]
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:
762 ; CHECK-NEXT: ld4r.8h { v0, v1, v2, v3 }, [x0]
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:
776 ; CHECK-NEXT: ld2r.2s { v0, v1 }, [x0]
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:
786 ; CHECK-NEXT: ld3r.2s { v0, v1, v2 }, [x0]
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:
796 ; CHECK-NEXT: ld4r.2s { v0, v1, v2, v3 }, [x0]
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:
810 ; CHECK-NEXT: ld2r.4s { v0, v1 }, [x0]
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:
820 ; CHECK-NEXT: ld3r.4s { v0, v1, v2 }, [x0]
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:
830 ; CHECK-NEXT: ld4r.4s { v0, v1, v2, v3 }, [x0]
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:
844 ; CHECK-NEXT: ld2r.1d { v0, v1 }, [x0]
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:
854 ; CHECK-NEXT: ld3r.1d { v0, v1, v2 }, [x0]
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:
864 ; CHECK-NEXT: ld4r.1d { v0, v1, v2, v3 }, [x0]
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:
878 ; CHECK-NEXT: ld2r.2d { v0, v1 }, [x0]
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:
888 ; CHECK-NEXT: ld3r.2d { v0, v1, v2 }, [x0]
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:
898 ; CHECK-NEXT: ld4r.2d { v0, v1, v2, v3 }, [x0]
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:
912 ; CHECK-NEXT: ld1.b { v0 }[0], [x0]
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
920 define <8 x i16> @ld1_8h(<8 x i16> %V, ptr %bar) {
921 ; CHECK-LABEL: ld1_8h:
923 ; CHECK-NEXT: ld1.h { v0 }[0], [x0]
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
931 define <4 x i32> @ld1_4s(<4 x i32> %V, ptr %bar) {
932 ; CHECK-LABEL: ld1_4s:
934 ; CHECK-NEXT: ld1.s { v0 }[0], [x0]
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
942 define <4 x float> @ld1_4s_float(<4 x float> %V, ptr %bar) {
943 ; CHECK-LABEL: ld1_4s_float:
945 ; CHECK-NEXT: ld1.s { v0 }[0], [x0]
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:
956 ; CHECK-NEXT: ld1.d { v0 }[0], [x0]
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
964 define <2 x double> @ld1_2d_double(<2 x double> %V, ptr %bar) {
965 ; CHECK-LABEL: ld1_2d_double:
967 ; CHECK-NEXT: ld1.d { v0 }[0], [x0]
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:
978 ; CHECK-NEXT: ldr d0, [x0]
980 ; Make sure we are using the operands defined by the ABI
981 %tmp = load <1 x i64>, ptr %p, align 8
985 define <8 x i8> @ld1_8b(<8 x i8> %V, ptr %bar) {
986 ; CHECK-LABEL: ld1_8b:
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
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
998 define <4 x i16> @ld1_4h(<4 x i16> %V, ptr %bar) {
999 ; CHECK-LABEL: ld1_4h:
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
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
1011 define <2 x i32> @ld1_2s(<2 x i32> %V, ptr %bar) {
1012 ; CHECK-LABEL: ld1_2s:
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
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
1024 define <2 x float> @ld1_2s_float(<2 x float> %V, ptr %bar) {
1025 ; CHECK-LABEL: ld1_2s_float:
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
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]
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
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]
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]
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]
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]
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]
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]
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]
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]
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:
1186 ; CHECK-NEXT: ld1.8b { v0, v1 }, [x0]
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:
1195 ; CHECK-NEXT: ld1.4h { v0, v1 }, [x0]
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:
1204 ; CHECK-NEXT: ld1.2s { v0, v1 }, [x0]
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:
1213 ; CHECK-NEXT: ld1.2s { v0, v1 }, [x0]
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:
1222 ; CHECK-NEXT: ld1.1d { v0, v1 }, [x0]
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:
1231 ; CHECK-NEXT: ld1.1d { v0, v1 }, [x0]
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:
1256 ; CHECK-NEXT: ld1.16b { v0, v1 }, [x0]
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:
1265 ; CHECK-NEXT: ld1.8h { v0, v1 }, [x0]
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:
1274 ; CHECK-NEXT: ld1.4s { v0, v1 }, [x0]
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:
1283 ; CHECK-NEXT: ld1.4s { v0, v1 }, [x0]
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:
1292 ; CHECK-NEXT: ld1.2d { v0, v1 }, [x0]
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:
1301 ; CHECK-NEXT: ld1.2d { v0, v1 }, [x0]
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:
1317 ; CHECK-NEXT: ld1.8b { v0, v1, v2 }, [x0]
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:
1326 ; CHECK-NEXT: ld1.4h { v0, v1, v2 }, [x0]
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:
1335 ; CHECK-NEXT: ld1.2s { v0, v1, v2 }, [x0]
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:
1344 ; CHECK-NEXT: ld1.2s { v0, v1, v2 }, [x0]
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:
1353 ; CHECK-NEXT: ld1.1d { v0, v1, v2 }, [x0]
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:
1362 ; CHECK-NEXT: ld1.1d { v0, v1, v2 }, [x0]
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:
1378 ; CHECK-NEXT: ld1.16b { v0, v1, v2 }, [x0]
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:
1387 ; CHECK-NEXT: ld1.8h { v0, v1, v2 }, [x0]
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:
1396 ; CHECK-NEXT: ld1.4s { v0, v1, v2 }, [x0]
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:
1405 ; CHECK-NEXT: ld1.4s { v0, v1, v2 }, [x0]
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:
1414 ; CHECK-NEXT: ld1.2d { v0, v1, v2 }, [x0]
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:
1423 ; CHECK-NEXT: ld1.2d { v0, v1, v2 }, [x0]
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:
1439 ; CHECK-NEXT: ld1.8b { v0, v1, v2, v3 }, [x0]
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:
1448 ; CHECK-NEXT: ld1.4h { v0, v1, v2, v3 }, [x0]
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:
1457 ; CHECK-NEXT: ld1.2s { v0, v1, v2, v3 }, [x0]
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:
1466 ; CHECK-NEXT: ld1.2s { v0, v1, v2, v3 }, [x0]
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:
1475 ; CHECK-NEXT: ld1.1d { v0, v1, v2, v3 }, [x0]
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:
1484 ; CHECK-NEXT: ld1.1d { v0, v1, v2, v3 }, [x0]
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:
1500 ; CHECK-NEXT: ld1.16b { v0, v1, v2, v3 }, [x0]
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:
1509 ; CHECK-NEXT: ld1.8h { v0, v1, v2, v3 }, [x0]
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:
1518 ; CHECK-NEXT: ld1.4s { v0, v1, v2, v3 }, [x0]
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:
1527 ; CHECK-NEXT: ld1.4s { v0, v1, v2, v3 }, [x0]
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:
1536 ; CHECK-NEXT: ld1.2d { v0, v1, v2, v3 }, [x0]
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:
1545 ; CHECK-NEXT: ld1.2d { v0, v1, v2, v3 }, [x0]
1547 %val = call %struct.__neon_float64x2x4_t @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr %addr)
1548 ret %struct.__neon_float64x2x4_t %val