[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-indexed-vector-ldst.ll
blob5ac8ad55906432d0db7564d1c19805087b7d59f3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=arm64-apple-ios7.0 -o - %s | FileCheck %s
4 @ptr = global ptr null
6 define <8 x i8> @test_v8i8_pre_load(ptr %addr) {
7 ; CHECK-LABEL: test_v8i8_pre_load:
8 ; CHECK:       ; %bb.0:
9 ; CHECK-NEXT:    ldr d0, [x0, #40]!
10 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
11 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
12 ; CHECK-NEXT:    ret
13   %newaddr = getelementptr <8 x i8>, ptr %addr, i32 5
14   %val = load <8 x i8>, ptr %newaddr, align 8
15   store ptr %newaddr, ptr @ptr
16   ret <8 x i8> %val
19 define <8 x i8> @test_v8i8_post_load(ptr %addr) {
20 ; CHECK-LABEL: test_v8i8_post_load:
21 ; CHECK:       ; %bb.0:
22 ; CHECK-NEXT:    ldr d0, [x0], #40
23 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
24 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
25 ; CHECK-NEXT:    ret
26   %newaddr = getelementptr <8 x i8>, ptr %addr, i32 5
27   %val = load <8 x i8>, ptr %addr, align 8
28   store ptr %newaddr, ptr @ptr
29   ret <8 x i8> %val
32 define void @test_v8i8_pre_store(<8 x i8> %in, ptr %addr) {
33 ; CHECK-LABEL: test_v8i8_pre_store:
34 ; CHECK:       ; %bb.0:
35 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
36 ; CHECK-NEXT:    str d0, [x0, #40]!
37 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
38 ; CHECK-NEXT:    ret
39   %newaddr = getelementptr <8 x i8>, ptr %addr, i32 5
40   store <8 x i8> %in, ptr %newaddr, align 8
41   store ptr %newaddr, ptr @ptr
42   ret void
45 define void @test_v8i8_post_store(<8 x i8> %in, ptr %addr) {
46 ; CHECK-LABEL: test_v8i8_post_store:
47 ; CHECK:       ; %bb.0:
48 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
49 ; CHECK-NEXT:    str d0, [x0], #40
50 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
51 ; CHECK-NEXT:    ret
52   %newaddr = getelementptr <8 x i8>, ptr %addr, i32 5
53   store <8 x i8> %in, ptr %addr, align 8
54   store ptr %newaddr, ptr @ptr
55   ret void
58 define <4 x i16> @test_v4i16_pre_load(ptr %addr) {
59 ; CHECK-LABEL: test_v4i16_pre_load:
60 ; CHECK:       ; %bb.0:
61 ; CHECK-NEXT:    ldr d0, [x0, #40]!
62 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
63 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
64 ; CHECK-NEXT:    ret
65   %newaddr = getelementptr <4 x i16>, ptr %addr, i32 5
66   %val = load <4 x i16>, ptr %newaddr, align 8
67   store ptr %newaddr, ptr @ptr
68   ret <4 x i16> %val
71 define <4 x i16> @test_v4i16_post_load(ptr %addr) {
72 ; CHECK-LABEL: test_v4i16_post_load:
73 ; CHECK:       ; %bb.0:
74 ; CHECK-NEXT:    ldr d0, [x0], #40
75 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
76 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
77 ; CHECK-NEXT:    ret
78   %newaddr = getelementptr <4 x i16>, ptr %addr, i32 5
79   %val = load <4 x i16>, ptr %addr, align 8
80   store ptr %newaddr, ptr @ptr
81   ret <4 x i16> %val
84 define void @test_v4i16_pre_store(<4 x i16> %in, ptr %addr) {
85 ; CHECK-LABEL: test_v4i16_pre_store:
86 ; CHECK:       ; %bb.0:
87 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
88 ; CHECK-NEXT:    str d0, [x0, #40]!
89 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
90 ; CHECK-NEXT:    ret
91   %newaddr = getelementptr <4 x i16>, ptr %addr, i32 5
92   store <4 x i16> %in, ptr %newaddr, align 8
93   store ptr %newaddr, ptr @ptr
94   ret void
97 define void @test_v4i16_post_store(<4 x i16> %in, ptr %addr) {
98 ; CHECK-LABEL: test_v4i16_post_store:
99 ; CHECK:       ; %bb.0:
100 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
101 ; CHECK-NEXT:    str d0, [x0], #40
102 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
103 ; CHECK-NEXT:    ret
104   %newaddr = getelementptr <4 x i16>, ptr %addr, i32 5
105   store <4 x i16> %in, ptr %addr, align 8
106   store ptr %newaddr, ptr @ptr
107   ret void
110 define <2 x i32> @test_v2i32_pre_load(ptr %addr) {
111 ; CHECK-LABEL: test_v2i32_pre_load:
112 ; CHECK:       ; %bb.0:
113 ; CHECK-NEXT:    ldr d0, [x0, #40]!
114 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
115 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
116 ; CHECK-NEXT:    ret
117   %newaddr = getelementptr <2 x i32>, ptr %addr, i32 5
118   %val = load <2 x i32>, ptr %newaddr, align 8
119   store ptr %newaddr, ptr @ptr
120   ret <2 x i32> %val
123 define <2 x i32> @test_v2i32_post_load(ptr %addr) {
124 ; CHECK-LABEL: test_v2i32_post_load:
125 ; CHECK:       ; %bb.0:
126 ; CHECK-NEXT:    ldr d0, [x0], #40
127 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
128 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
129 ; CHECK-NEXT:    ret
130   %newaddr = getelementptr <2 x i32>, ptr %addr, i32 5
131   %val = load <2 x i32>, ptr %addr, align 8
132   store ptr %newaddr, ptr @ptr
133   ret <2 x i32> %val
136 define void @test_v2i32_pre_store(<2 x i32> %in, ptr %addr) {
137 ; CHECK-LABEL: test_v2i32_pre_store:
138 ; CHECK:       ; %bb.0:
139 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
140 ; CHECK-NEXT:    str d0, [x0, #40]!
141 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
142 ; CHECK-NEXT:    ret
143   %newaddr = getelementptr <2 x i32>, ptr %addr, i32 5
144   store <2 x i32> %in, ptr %newaddr, align 8
145   store ptr %newaddr, ptr @ptr
146   ret void
149 define void @test_v2i32_post_store(<2 x i32> %in, ptr %addr) {
150 ; CHECK-LABEL: test_v2i32_post_store:
151 ; CHECK:       ; %bb.0:
152 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
153 ; CHECK-NEXT:    str d0, [x0], #40
154 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
155 ; CHECK-NEXT:    ret
156   %newaddr = getelementptr <2 x i32>, ptr %addr, i32 5
157   store <2 x i32> %in, ptr %addr, align 8
158   store ptr %newaddr, ptr @ptr
159   ret void
162 define <2 x float> @test_v2f32_pre_load(ptr %addr) {
163 ; CHECK-LABEL: test_v2f32_pre_load:
164 ; CHECK:       ; %bb.0:
165 ; CHECK-NEXT:    ldr d0, [x0, #40]!
166 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
167 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
168 ; CHECK-NEXT:    ret
169   %newaddr = getelementptr <2 x float>, ptr %addr, i32 5
170   %val = load <2 x float>, ptr %newaddr, align 8
171   store ptr %newaddr, ptr @ptr
172   ret <2 x float> %val
175 define <2 x float> @test_v2f32_post_load(ptr %addr) {
176 ; CHECK-LABEL: test_v2f32_post_load:
177 ; CHECK:       ; %bb.0:
178 ; CHECK-NEXT:    ldr d0, [x0], #40
179 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
180 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
181 ; CHECK-NEXT:    ret
182   %newaddr = getelementptr <2 x float>, ptr %addr, i32 5
183   %val = load <2 x float>, ptr %addr, align 8
184   store ptr %newaddr, ptr @ptr
185   ret <2 x float> %val
188 define void @test_v2f32_pre_store(<2 x float> %in, ptr %addr) {
189 ; CHECK-LABEL: test_v2f32_pre_store:
190 ; CHECK:       ; %bb.0:
191 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
192 ; CHECK-NEXT:    str d0, [x0, #40]!
193 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
194 ; CHECK-NEXT:    ret
195   %newaddr = getelementptr <2 x float>, ptr %addr, i32 5
196   store <2 x float> %in, ptr %newaddr, align 8
197   store ptr %newaddr, ptr @ptr
198   ret void
201 define void @test_v2f32_post_store(<2 x float> %in, ptr %addr) {
202 ; CHECK-LABEL: test_v2f32_post_store:
203 ; CHECK:       ; %bb.0:
204 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
205 ; CHECK-NEXT:    str d0, [x0], #40
206 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
207 ; CHECK-NEXT:    ret
208   %newaddr = getelementptr <2 x float>, ptr %addr, i32 5
209   store <2 x float> %in, ptr %addr, align 8
210   store ptr %newaddr, ptr @ptr
211   ret void
214 define <1 x i64> @test_v1i64_pre_load(ptr %addr) {
215 ; CHECK-LABEL: test_v1i64_pre_load:
216 ; CHECK:       ; %bb.0:
217 ; CHECK-NEXT:    ldr d0, [x0, #40]!
218 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
219 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
220 ; CHECK-NEXT:    ret
221   %newaddr = getelementptr <1 x i64>, ptr %addr, i32 5
222   %val = load <1 x i64>, ptr %newaddr, align 8
223   store ptr %newaddr, ptr @ptr
224   ret <1 x i64> %val
227 define <1 x i64> @test_v1i64_post_load(ptr %addr) {
228 ; CHECK-LABEL: test_v1i64_post_load:
229 ; CHECK:       ; %bb.0:
230 ; CHECK-NEXT:    ldr d0, [x0], #40
231 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
232 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
233 ; CHECK-NEXT:    ret
234   %newaddr = getelementptr <1 x i64>, ptr %addr, i32 5
235   %val = load <1 x i64>, ptr %addr, align 8
236   store ptr %newaddr, ptr @ptr
237   ret <1 x i64> %val
240 define void @test_v1i64_pre_store(<1 x i64> %in, ptr %addr) {
241 ; CHECK-LABEL: test_v1i64_pre_store:
242 ; CHECK:       ; %bb.0:
243 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
244 ; CHECK-NEXT:    str d0, [x0, #40]!
245 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
246 ; CHECK-NEXT:    ret
247   %newaddr = getelementptr <1 x i64>, ptr %addr, i32 5
248   store <1 x i64> %in, ptr %newaddr, align 8
249   store ptr %newaddr, ptr @ptr
250   ret void
253 define void @test_v1i64_post_store(<1 x i64> %in, ptr %addr) {
254 ; CHECK-LABEL: test_v1i64_post_store:
255 ; CHECK:       ; %bb.0:
256 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
257 ; CHECK-NEXT:    str d0, [x0], #40
258 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
259 ; CHECK-NEXT:    ret
260   %newaddr = getelementptr <1 x i64>, ptr %addr, i32 5
261   store <1 x i64> %in, ptr %addr, align 8
262   store ptr %newaddr, ptr @ptr
263   ret void
266 define <16 x i8> @test_v16i8_pre_load(ptr %addr) {
267 ; CHECK-LABEL: test_v16i8_pre_load:
268 ; CHECK:       ; %bb.0:
269 ; CHECK-NEXT:    ldr q0, [x0, #80]!
270 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
271 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
272 ; CHECK-NEXT:    ret
273   %newaddr = getelementptr <16 x i8>, ptr %addr, i32 5
274   %val = load <16 x i8>, ptr %newaddr, align 8
275   store ptr %newaddr, ptr @ptr
276   ret <16 x i8> %val
279 define <16 x i8> @test_v16i8_post_load(ptr %addr) {
280 ; CHECK-LABEL: test_v16i8_post_load:
281 ; CHECK:       ; %bb.0:
282 ; CHECK-NEXT:    ldr q0, [x0], #80
283 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
284 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
285 ; CHECK-NEXT:    ret
286   %newaddr = getelementptr <16 x i8>, ptr %addr, i32 5
287   %val = load <16 x i8>, ptr %addr, align 8
288   store ptr %newaddr, ptr @ptr
289   ret <16 x i8> %val
292 define void @test_v16i8_pre_store(<16 x i8> %in, ptr %addr) {
293 ; CHECK-LABEL: test_v16i8_pre_store:
294 ; CHECK:       ; %bb.0:
295 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
296 ; CHECK-NEXT:    str q0, [x0, #80]!
297 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
298 ; CHECK-NEXT:    ret
299   %newaddr = getelementptr <16 x i8>, ptr %addr, i32 5
300   store <16 x i8> %in, ptr %newaddr, align 8
301   store ptr %newaddr, ptr @ptr
302   ret void
305 define void @test_v16i8_post_store(<16 x i8> %in, ptr %addr) {
306 ; CHECK-LABEL: test_v16i8_post_store:
307 ; CHECK:       ; %bb.0:
308 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
309 ; CHECK-NEXT:    str q0, [x0], #80
310 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
311 ; CHECK-NEXT:    ret
312   %newaddr = getelementptr <16 x i8>, ptr %addr, i32 5
313   store <16 x i8> %in, ptr %addr, align 8
314   store ptr %newaddr, ptr @ptr
315   ret void
318 define <8 x i16> @test_v8i16_pre_load(ptr %addr) {
319 ; CHECK-LABEL: test_v8i16_pre_load:
320 ; CHECK:       ; %bb.0:
321 ; CHECK-NEXT:    ldr q0, [x0, #80]!
322 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
323 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
324 ; CHECK-NEXT:    ret
325   %newaddr = getelementptr <8 x i16>, ptr %addr, i32 5
326   %val = load <8 x i16>, ptr %newaddr, align 8
327   store ptr %newaddr, ptr @ptr
328   ret <8 x i16> %val
331 define <8 x i16> @test_v8i16_post_load(ptr %addr) {
332 ; CHECK-LABEL: test_v8i16_post_load:
333 ; CHECK:       ; %bb.0:
334 ; CHECK-NEXT:    ldr q0, [x0], #80
335 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
336 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
337 ; CHECK-NEXT:    ret
338   %newaddr = getelementptr <8 x i16>, ptr %addr, i32 5
339   %val = load <8 x i16>, ptr %addr, align 8
340   store ptr %newaddr, ptr @ptr
341   ret <8 x i16> %val
344 define void @test_v8i16_pre_store(<8 x i16> %in, ptr %addr) {
345 ; CHECK-LABEL: test_v8i16_pre_store:
346 ; CHECK:       ; %bb.0:
347 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
348 ; CHECK-NEXT:    str q0, [x0, #80]!
349 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
350 ; CHECK-NEXT:    ret
351   %newaddr = getelementptr <8 x i16>, ptr %addr, i32 5
352   store <8 x i16> %in, ptr %newaddr, align 8
353   store ptr %newaddr, ptr @ptr
354   ret void
357 define void @test_v8i16_post_store(<8 x i16> %in, ptr %addr) {
358 ; CHECK-LABEL: test_v8i16_post_store:
359 ; CHECK:       ; %bb.0:
360 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
361 ; CHECK-NEXT:    str q0, [x0], #80
362 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
363 ; CHECK-NEXT:    ret
364   %newaddr = getelementptr <8 x i16>, ptr %addr, i32 5
365   store <8 x i16> %in, ptr %addr, align 8
366   store ptr %newaddr, ptr @ptr
367   ret void
370 define <4 x i32> @test_v4i32_pre_load(ptr %addr) {
371 ; CHECK-LABEL: test_v4i32_pre_load:
372 ; CHECK:       ; %bb.0:
373 ; CHECK-NEXT:    ldr q0, [x0, #80]!
374 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
375 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
376 ; CHECK-NEXT:    ret
377   %newaddr = getelementptr <4 x i32>, ptr %addr, i32 5
378   %val = load <4 x i32>, ptr %newaddr, align 8
379   store ptr %newaddr, ptr @ptr
380   ret <4 x i32> %val
383 define <4 x i32> @test_v4i32_post_load(ptr %addr) {
384 ; CHECK-LABEL: test_v4i32_post_load:
385 ; CHECK:       ; %bb.0:
386 ; CHECK-NEXT:    ldr q0, [x0], #80
387 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
388 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
389 ; CHECK-NEXT:    ret
390   %newaddr = getelementptr <4 x i32>, ptr %addr, i32 5
391   %val = load <4 x i32>, ptr %addr, align 8
392   store ptr %newaddr, ptr @ptr
393   ret <4 x i32> %val
396 define void @test_v4i32_pre_store(<4 x i32> %in, ptr %addr) {
397 ; CHECK-LABEL: test_v4i32_pre_store:
398 ; CHECK:       ; %bb.0:
399 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
400 ; CHECK-NEXT:    str q0, [x0, #80]!
401 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
402 ; CHECK-NEXT:    ret
403   %newaddr = getelementptr <4 x i32>, ptr %addr, i32 5
404   store <4 x i32> %in, ptr %newaddr, align 8
405   store ptr %newaddr, ptr @ptr
406   ret void
409 define void @test_v4i32_post_store(<4 x i32> %in, ptr %addr) {
410 ; CHECK-LABEL: test_v4i32_post_store:
411 ; CHECK:       ; %bb.0:
412 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
413 ; CHECK-NEXT:    str q0, [x0], #80
414 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
415 ; CHECK-NEXT:    ret
416   %newaddr = getelementptr <4 x i32>, ptr %addr, i32 5
417   store <4 x i32> %in, ptr %addr, align 8
418   store ptr %newaddr, ptr @ptr
419   ret void
423 define <4 x float> @test_v4f32_pre_load(ptr %addr) {
424 ; CHECK-LABEL: test_v4f32_pre_load:
425 ; CHECK:       ; %bb.0:
426 ; CHECK-NEXT:    ldr q0, [x0, #80]!
427 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
428 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
429 ; CHECK-NEXT:    ret
430   %newaddr = getelementptr <4 x float>, ptr %addr, i32 5
431   %val = load <4 x float>, ptr %newaddr, align 8
432   store ptr %newaddr, ptr @ptr
433   ret <4 x float> %val
436 define <4 x float> @test_v4f32_post_load(ptr %addr) {
437 ; CHECK-LABEL: test_v4f32_post_load:
438 ; CHECK:       ; %bb.0:
439 ; CHECK-NEXT:    ldr q0, [x0], #80
440 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
441 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
442 ; CHECK-NEXT:    ret
443   %newaddr = getelementptr <4 x float>, ptr %addr, i32 5
444   %val = load <4 x float>, ptr %addr, align 8
445   store ptr %newaddr, ptr @ptr
446   ret <4 x float> %val
449 define void @test_v4f32_pre_store(<4 x float> %in, ptr %addr) {
450 ; CHECK-LABEL: test_v4f32_pre_store:
451 ; CHECK:       ; %bb.0:
452 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
453 ; CHECK-NEXT:    str q0, [x0, #80]!
454 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
455 ; CHECK-NEXT:    ret
456   %newaddr = getelementptr <4 x float>, ptr %addr, i32 5
457   store <4 x float> %in, ptr %newaddr, align 8
458   store ptr %newaddr, ptr @ptr
459   ret void
462 define void @test_v4f32_post_store(<4 x float> %in, ptr %addr) {
463 ; CHECK-LABEL: test_v4f32_post_store:
464 ; CHECK:       ; %bb.0:
465 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
466 ; CHECK-NEXT:    str q0, [x0], #80
467 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
468 ; CHECK-NEXT:    ret
469   %newaddr = getelementptr <4 x float>, ptr %addr, i32 5
470   store <4 x float> %in, ptr %addr, align 8
471   store ptr %newaddr, ptr @ptr
472   ret void
476 define <2 x i64> @test_v2i64_pre_load(ptr %addr) {
477 ; CHECK-LABEL: test_v2i64_pre_load:
478 ; CHECK:       ; %bb.0:
479 ; CHECK-NEXT:    ldr q0, [x0, #80]!
480 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
481 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
482 ; CHECK-NEXT:    ret
483   %newaddr = getelementptr <2 x i64>, ptr %addr, i32 5
484   %val = load <2 x i64>, ptr %newaddr, align 8
485   store ptr %newaddr, ptr @ptr
486   ret <2 x i64> %val
489 define <2 x i64> @test_v2i64_post_load(ptr %addr) {
490 ; CHECK-LABEL: test_v2i64_post_load:
491 ; CHECK:       ; %bb.0:
492 ; CHECK-NEXT:    ldr q0, [x0], #80
493 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
494 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
495 ; CHECK-NEXT:    ret
496   %newaddr = getelementptr <2 x i64>, ptr %addr, i32 5
497   %val = load <2 x i64>, ptr %addr, align 8
498   store ptr %newaddr, ptr @ptr
499   ret <2 x i64> %val
502 define void @test_v2i64_pre_store(<2 x i64> %in, ptr %addr) {
503 ; CHECK-LABEL: test_v2i64_pre_store:
504 ; CHECK:       ; %bb.0:
505 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
506 ; CHECK-NEXT:    str q0, [x0, #80]!
507 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
508 ; CHECK-NEXT:    ret
509   %newaddr = getelementptr <2 x i64>, ptr %addr, i32 5
510   store <2 x i64> %in, ptr %newaddr, align 8
511   store ptr %newaddr, ptr @ptr
512   ret void
515 define void @test_v2i64_post_store(<2 x i64> %in, ptr %addr) {
516 ; CHECK-LABEL: test_v2i64_post_store:
517 ; CHECK:       ; %bb.0:
518 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
519 ; CHECK-NEXT:    str q0, [x0], #80
520 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
521 ; CHECK-NEXT:    ret
522   %newaddr = getelementptr <2 x i64>, ptr %addr, i32 5
523   store <2 x i64> %in, ptr %addr, align 8
524   store ptr %newaddr, ptr @ptr
525   ret void
529 define <2 x double> @test_v2f64_pre_load(ptr %addr) {
530 ; CHECK-LABEL: test_v2f64_pre_load:
531 ; CHECK:       ; %bb.0:
532 ; CHECK-NEXT:    ldr q0, [x0, #80]!
533 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
534 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
535 ; CHECK-NEXT:    ret
536   %newaddr = getelementptr <2 x double>, ptr %addr, i32 5
537   %val = load <2 x double>, ptr %newaddr, align 8
538   store ptr %newaddr, ptr @ptr
539   ret <2 x double> %val
542 define <2 x double> @test_v2f64_post_load(ptr %addr) {
543 ; CHECK-LABEL: test_v2f64_post_load:
544 ; CHECK:       ; %bb.0:
545 ; CHECK-NEXT:    ldr q0, [x0], #80
546 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
547 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
548 ; CHECK-NEXT:    ret
549   %newaddr = getelementptr <2 x double>, ptr %addr, i32 5
550   %val = load <2 x double>, ptr %addr, align 8
551   store ptr %newaddr, ptr @ptr
552   ret <2 x double> %val
555 define void @test_v2f64_pre_store(<2 x double> %in, ptr %addr) {
556 ; CHECK-LABEL: test_v2f64_pre_store:
557 ; CHECK:       ; %bb.0:
558 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
559 ; CHECK-NEXT:    str q0, [x0, #80]!
560 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
561 ; CHECK-NEXT:    ret
562   %newaddr = getelementptr <2 x double>, ptr %addr, i32 5
563   store <2 x double> %in, ptr %newaddr, align 8
564   store ptr %newaddr, ptr @ptr
565   ret void
568 define void @test_v2f64_post_store(<2 x double> %in, ptr %addr) {
569 ; CHECK-LABEL: test_v2f64_post_store:
570 ; CHECK:       ; %bb.0:
571 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
572 ; CHECK-NEXT:    str q0, [x0], #80
573 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
574 ; CHECK-NEXT:    ret
575   %newaddr = getelementptr <2 x double>, ptr %addr, i32 5
576   store <2 x double> %in, ptr %addr, align 8
577   store ptr %newaddr, ptr @ptr
578   ret void
581 define ptr @test_v16i8_post_imm_st1_lane(<16 x i8> %in, ptr %addr) {
582 ; CHECK-LABEL: test_v16i8_post_imm_st1_lane:
583 ; CHECK:       ; %bb.0:
584 ; CHECK-NEXT:    st1.b { v0 }[3], [x0], #1
585 ; CHECK-NEXT:    ret
586   %elt = extractelement <16 x i8> %in, i32 3
587   store i8 %elt, ptr %addr
589   %newaddr = getelementptr i8, ptr %addr, i32 1
590   ret ptr %newaddr
593 define ptr @test_v16i8_post_reg_st1_lane(<16 x i8> %in, ptr %addr) {
594 ; CHECK-LABEL: test_v16i8_post_reg_st1_lane:
595 ; CHECK:       ; %bb.0:
596 ; CHECK-NEXT:    mov w8, #2 ; =0x2
597 ; CHECK-NEXT:    st1.b { v0 }[3], [x0], x8
598 ; CHECK-NEXT:    ret
599   %elt = extractelement <16 x i8> %in, i32 3
600   store i8 %elt, ptr %addr
602   %newaddr = getelementptr i8, ptr %addr, i32 2
603   ret ptr %newaddr
607 define ptr @test_v8i16_post_imm_st1_lane(<8 x i16> %in, ptr %addr) {
608 ; CHECK-LABEL: test_v8i16_post_imm_st1_lane:
609 ; CHECK:       ; %bb.0:
610 ; CHECK-NEXT:    st1.h { v0 }[3], [x0], #2
611 ; CHECK-NEXT:    ret
612   %elt = extractelement <8 x i16> %in, i32 3
613   store i16 %elt, ptr %addr
615   %newaddr = getelementptr i16, ptr %addr, i32 1
616   ret ptr %newaddr
619 define ptr @test_v8i16_post_reg_st1_lane(<8 x i16> %in, ptr %addr) {
620 ; CHECK-LABEL: test_v8i16_post_reg_st1_lane:
621 ; CHECK:       ; %bb.0:
622 ; CHECK-NEXT:    mov w8, #4 ; =0x4
623 ; CHECK-NEXT:    st1.h { v0 }[3], [x0], x8
624 ; CHECK-NEXT:    ret
625   %elt = extractelement <8 x i16> %in, i32 3
626   store i16 %elt, ptr %addr
628   %newaddr = getelementptr i16, ptr %addr, i32 2
629   ret ptr %newaddr
632 define ptr @test_v4i32_post_imm_st1_lane(<4 x i32> %in, ptr %addr) {
633 ; CHECK-LABEL: test_v4i32_post_imm_st1_lane:
634 ; CHECK:       ; %bb.0:
635 ; CHECK-NEXT:    st1.s { v0 }[3], [x0], #4
636 ; CHECK-NEXT:    ret
637   %elt = extractelement <4 x i32> %in, i32 3
638   store i32 %elt, ptr %addr
640   %newaddr = getelementptr i32, ptr %addr, i32 1
641   ret ptr %newaddr
644 define ptr @test_v4i32_post_reg_st1_lane(<4 x i32> %in, ptr %addr) {
645 ; CHECK-LABEL: test_v4i32_post_reg_st1_lane:
646 ; CHECK:       ; %bb.0:
647 ; CHECK-NEXT:    mov w8, #8 ; =0x8
648 ; CHECK-NEXT:    st1.s { v0 }[3], [x0], x8
649 ; CHECK-NEXT:    ret
650   %elt = extractelement <4 x i32> %in, i32 3
651   store i32 %elt, ptr %addr
653   %newaddr = getelementptr i32, ptr %addr, i32 2
654   ret ptr %newaddr
657 define ptr @test_v4f32_post_imm_st1_lane(<4 x float> %in, ptr %addr) {
658 ; CHECK-LABEL: test_v4f32_post_imm_st1_lane:
659 ; CHECK:       ; %bb.0:
660 ; CHECK-NEXT:    st1.s { v0 }[3], [x0], #4
661 ; CHECK-NEXT:    ret
662   %elt = extractelement <4 x float> %in, i32 3
663   store float %elt, ptr %addr
665   %newaddr = getelementptr float, ptr %addr, i32 1
666   ret ptr %newaddr
669 define ptr @test_v4f32_post_reg_st1_lane(<4 x float> %in, ptr %addr) {
670 ; CHECK-LABEL: test_v4f32_post_reg_st1_lane:
671 ; CHECK:       ; %bb.0:
672 ; CHECK-NEXT:    mov w8, #8 ; =0x8
673 ; CHECK-NEXT:    st1.s { v0 }[3], [x0], x8
674 ; CHECK-NEXT:    ret
675   %elt = extractelement <4 x float> %in, i32 3
676   store float %elt, ptr %addr
678   %newaddr = getelementptr float, ptr %addr, i32 2
679   ret ptr %newaddr
682 define ptr @test_v2i64_post_imm_st1_lane(<2 x i64> %in, ptr %addr) {
683 ; CHECK-LABEL: test_v2i64_post_imm_st1_lane:
684 ; CHECK:       ; %bb.0:
685 ; CHECK-NEXT:    st1.d { v0 }[1], [x0], #8
686 ; CHECK-NEXT:    ret
687   %elt = extractelement <2 x i64> %in, i64 1
688   store i64 %elt, ptr %addr
690   %newaddr = getelementptr i64, ptr %addr, i64 1
691   ret ptr %newaddr
694 define ptr @test_v2i64_post_reg_st1_lane(<2 x i64> %in, ptr %addr) {
695 ; CHECK-LABEL: test_v2i64_post_reg_st1_lane:
696 ; CHECK:       ; %bb.0:
697 ; CHECK-NEXT:    mov w8, #16 ; =0x10
698 ; CHECK-NEXT:    st1.d { v0 }[1], [x0], x8
699 ; CHECK-NEXT:    ret
700   %elt = extractelement <2 x i64> %in, i64 1
701   store i64 %elt, ptr %addr
703   %newaddr = getelementptr i64, ptr %addr, i64 2
704   ret ptr %newaddr
707 define ptr @test_v2f64_post_imm_st1_lane(<2 x double> %in, ptr %addr) {
708 ; CHECK-LABEL: test_v2f64_post_imm_st1_lane:
709 ; CHECK:       ; %bb.0:
710 ; CHECK-NEXT:    st1.d { v0 }[1], [x0], #8
711 ; CHECK-NEXT:    ret
712   %elt = extractelement <2 x double> %in, i32 1
713   store double %elt, ptr %addr
715   %newaddr = getelementptr double, ptr %addr, i32 1
716   ret ptr %newaddr
719 define ptr @test_v2f64_post_reg_st1_lane(<2 x double> %in, ptr %addr) {
720 ; CHECK-LABEL: test_v2f64_post_reg_st1_lane:
721 ; CHECK:       ; %bb.0:
722 ; CHECK-NEXT:    mov w8, #16 ; =0x10
723 ; CHECK-NEXT:    st1.d { v0 }[1], [x0], x8
724 ; CHECK-NEXT:    ret
725   %elt = extractelement <2 x double> %in, i32 1
726   store double %elt, ptr %addr
728   %newaddr = getelementptr double, ptr %addr, i32 2
729   ret ptr %newaddr
732 define ptr @test_v8i8_post_imm_st1_lane(<8 x i8> %in, ptr %addr) {
733 ; CHECK-LABEL: test_v8i8_post_imm_st1_lane:
734 ; CHECK:       ; %bb.0:
735 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
736 ; CHECK-NEXT:    st1.b { v0 }[3], [x0], #1
737 ; CHECK-NEXT:    ret
738   %elt = extractelement <8 x i8> %in, i32 3
739   store i8 %elt, ptr %addr
741   %newaddr = getelementptr i8, ptr %addr, i32 1
742   ret ptr %newaddr
745 define ptr @test_v8i8_post_reg_st1_lane(<8 x i8> %in, ptr %addr) {
746 ; CHECK-LABEL: test_v8i8_post_reg_st1_lane:
747 ; CHECK:       ; %bb.0:
748 ; CHECK-NEXT:    mov w8, #2 ; =0x2
749 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
750 ; CHECK-NEXT:    st1.b { v0 }[3], [x0], x8
751 ; CHECK-NEXT:    ret
752   %elt = extractelement <8 x i8> %in, i32 3
753   store i8 %elt, ptr %addr
755   %newaddr = getelementptr i8, ptr %addr, i32 2
756   ret ptr %newaddr
759 define ptr @test_v4i16_post_imm_st1_lane(<4 x i16> %in, ptr %addr) {
760 ; CHECK-LABEL: test_v4i16_post_imm_st1_lane:
761 ; CHECK:       ; %bb.0:
762 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
763 ; CHECK-NEXT:    st1.h { v0 }[3], [x0], #2
764 ; CHECK-NEXT:    ret
765   %elt = extractelement <4 x i16> %in, i32 3
766   store i16 %elt, ptr %addr
768   %newaddr = getelementptr i16, ptr %addr, i32 1
769   ret ptr %newaddr
772 define ptr @test_v4i16_post_reg_st1_lane(<4 x i16> %in, ptr %addr) {
773 ; CHECK-LABEL: test_v4i16_post_reg_st1_lane:
774 ; CHECK:       ; %bb.0:
775 ; CHECK-NEXT:    mov w8, #4 ; =0x4
776 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
777 ; CHECK-NEXT:    st1.h { v0 }[3], [x0], x8
778 ; CHECK-NEXT:    ret
779   %elt = extractelement <4 x i16> %in, i32 3
780   store i16 %elt, ptr %addr
782   %newaddr = getelementptr i16, ptr %addr, i32 2
783   ret ptr %newaddr
786 define ptr @test_v2i32_post_imm_st1_lane(<2 x i32> %in, ptr %addr) {
787 ; CHECK-LABEL: test_v2i32_post_imm_st1_lane:
788 ; CHECK:       ; %bb.0:
789 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
790 ; CHECK-NEXT:    st1.s { v0 }[1], [x0], #4
791 ; CHECK-NEXT:    ret
792   %elt = extractelement <2 x i32> %in, i32 1
793   store i32 %elt, ptr %addr
795   %newaddr = getelementptr i32, ptr %addr, i32 1
796   ret ptr %newaddr
799 define ptr @test_v2i32_post_reg_st1_lane(<2 x i32> %in, ptr %addr) {
800 ; CHECK-LABEL: test_v2i32_post_reg_st1_lane:
801 ; CHECK:       ; %bb.0:
802 ; CHECK-NEXT:    mov w8, #8 ; =0x8
803 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
804 ; CHECK-NEXT:    st1.s { v0 }[1], [x0], x8
805 ; CHECK-NEXT:    ret
806   %elt = extractelement <2 x i32> %in, i32 1
807   store i32 %elt, ptr %addr
809   %newaddr = getelementptr i32, ptr %addr, i32 2
810   ret ptr %newaddr
813 define ptr @test_v2f32_post_imm_st1_lane(<2 x float> %in, ptr %addr) {
814 ; CHECK-LABEL: test_v2f32_post_imm_st1_lane:
815 ; CHECK:       ; %bb.0:
816 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
817 ; CHECK-NEXT:    st1.s { v0 }[1], [x0], #4
818 ; CHECK-NEXT:    ret
819   %elt = extractelement <2 x float> %in, i32 1
820   store float %elt, ptr %addr
822   %newaddr = getelementptr float, ptr %addr, i32 1
823   ret ptr %newaddr
826 define ptr @test_v2f32_post_reg_st1_lane(<2 x float> %in, ptr %addr) {
827 ; CHECK-LABEL: test_v2f32_post_reg_st1_lane:
828 ; CHECK:       ; %bb.0:
829 ; CHECK-NEXT:    mov w8, #8 ; =0x8
830 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
831 ; CHECK-NEXT:    st1.s { v0 }[1], [x0], x8
832 ; CHECK-NEXT:    ret
833   %elt = extractelement <2 x float> %in, i32 1
834   store float %elt, ptr %addr
836   %newaddr = getelementptr float, ptr %addr, i32 2
837   ret ptr %newaddr
840 define { <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld2(ptr %A, ptr %ptr) {
841 ; CHECK-LABEL: test_v16i8_post_imm_ld2:
842 ; CHECK:       ; %bb.0:
843 ; CHECK-NEXT:    ld2.16b { v0, v1 }, [x0], #32
844 ; CHECK-NEXT:    str x0, [x1]
845 ; CHECK-NEXT:    ret
846   %ld2 = tail call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2.v16i8.p0(ptr %A)
847   %tmp = getelementptr i8, ptr %A, i32 32
848   store ptr %tmp, ptr %ptr
849   ret { <16 x i8>, <16 x i8> } %ld2
852 define { <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
853 ; CHECK-LABEL: test_v16i8_post_reg_ld2:
854 ; CHECK:       ; %bb.0:
855 ; CHECK-NEXT:    ld2.16b { v0, v1 }, [x0], x2
856 ; CHECK-NEXT:    str x0, [x1]
857 ; CHECK-NEXT:    ret
858   %ld2 = tail call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2.v16i8.p0(ptr %A)
859   %tmp = getelementptr i8, ptr %A, i64 %inc
860   store ptr %tmp, ptr %ptr
861   ret { <16 x i8>, <16 x i8> } %ld2
864 declare { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2.v16i8.p0(ptr)
867 define { <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld2(ptr %A, ptr %ptr) {
868 ; CHECK-LABEL: test_v8i8_post_imm_ld2:
869 ; CHECK:       ; %bb.0:
870 ; CHECK-NEXT:    ld2.8b { v0, v1 }, [x0], #16
871 ; CHECK-NEXT:    str x0, [x1]
872 ; CHECK-NEXT:    ret
873   %ld2 = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0(ptr %A)
874   %tmp = getelementptr i8, ptr %A, i32 16
875   store ptr %tmp, ptr %ptr
876   ret { <8 x i8>, <8 x i8> } %ld2
879 define { <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
880 ; CHECK-LABEL: test_v8i8_post_reg_ld2:
881 ; CHECK:       ; %bb.0:
882 ; CHECK-NEXT:    ld2.8b { v0, v1 }, [x0], x2
883 ; CHECK-NEXT:    str x0, [x1]
884 ; CHECK-NEXT:    ret
885   %ld2 = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0(ptr %A)
886   %tmp = getelementptr i8, ptr %A, i64 %inc
887   store ptr %tmp, ptr %ptr
888   ret { <8 x i8>, <8 x i8> } %ld2
891 declare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0(ptr)
894 define { <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld2(ptr %A, ptr %ptr) {
895 ; CHECK-LABEL: test_v8i16_post_imm_ld2:
896 ; CHECK:       ; %bb.0:
897 ; CHECK-NEXT:    ld2.8h { v0, v1 }, [x0], #32
898 ; CHECK-NEXT:    str x0, [x1]
899 ; CHECK-NEXT:    ret
900   %ld2 = tail call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2.v8i16.p0(ptr %A)
901   %tmp = getelementptr i16, ptr %A, i32 16
902   store ptr %tmp, ptr %ptr
903   ret { <8 x i16>, <8 x i16> } %ld2
906 define { <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
907 ; CHECK-LABEL: test_v8i16_post_reg_ld2:
908 ; CHECK:       ; %bb.0:
909 ; CHECK-NEXT:    lsl x8, x2, #1
910 ; CHECK-NEXT:    ld2.8h { v0, v1 }, [x0], x8
911 ; CHECK-NEXT:    str x0, [x1]
912 ; CHECK-NEXT:    ret
913   %ld2 = tail call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2.v8i16.p0(ptr %A)
914   %tmp = getelementptr i16, ptr %A, i64 %inc
915   store ptr %tmp, ptr %ptr
916   ret { <8 x i16>, <8 x i16> } %ld2
919 declare { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2.v8i16.p0(ptr)
922 define { <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld2(ptr %A, ptr %ptr) {
923 ; CHECK-LABEL: test_v4i16_post_imm_ld2:
924 ; CHECK:       ; %bb.0:
925 ; CHECK-NEXT:    ld2.4h { v0, v1 }, [x0], #16
926 ; CHECK-NEXT:    str x0, [x1]
927 ; CHECK-NEXT:    ret
928   %ld2 = tail call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2.v4i16.p0(ptr %A)
929   %tmp = getelementptr i16, ptr %A, i32 8
930   store ptr %tmp, ptr %ptr
931   ret { <4 x i16>, <4 x i16> } %ld2
934 define { <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
935 ; CHECK-LABEL: test_v4i16_post_reg_ld2:
936 ; CHECK:       ; %bb.0:
937 ; CHECK-NEXT:    lsl x8, x2, #1
938 ; CHECK-NEXT:    ld2.4h { v0, v1 }, [x0], x8
939 ; CHECK-NEXT:    str x0, [x1]
940 ; CHECK-NEXT:    ret
941   %ld2 = tail call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2.v4i16.p0(ptr %A)
942   %tmp = getelementptr i16, ptr %A, i64 %inc
943   store ptr %tmp, ptr %ptr
944   ret { <4 x i16>, <4 x i16> } %ld2
947 declare { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2.v4i16.p0(ptr)
950 define { <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld2(ptr %A, ptr %ptr) {
951 ; CHECK-LABEL: test_v4i32_post_imm_ld2:
952 ; CHECK:       ; %bb.0:
953 ; CHECK-NEXT:    ld2.4s { v0, v1 }, [x0], #32
954 ; CHECK-NEXT:    str x0, [x1]
955 ; CHECK-NEXT:    ret
956   %ld2 = tail call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr %A)
957   %tmp = getelementptr i32, ptr %A, i32 8
958   store ptr %tmp, ptr %ptr
959   ret { <4 x i32>, <4 x i32> } %ld2
962 define { <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
963 ; CHECK-LABEL: test_v4i32_post_reg_ld2:
964 ; CHECK:       ; %bb.0:
965 ; CHECK-NEXT:    lsl x8, x2, #2
966 ; CHECK-NEXT:    ld2.4s { v0, v1 }, [x0], x8
967 ; CHECK-NEXT:    str x0, [x1]
968 ; CHECK-NEXT:    ret
969   %ld2 = tail call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr %A)
970   %tmp = getelementptr i32, ptr %A, i64 %inc
971   store ptr %tmp, ptr %ptr
972   ret { <4 x i32>, <4 x i32> } %ld2
975 declare { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr)
978 define { <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld2(ptr %A, ptr %ptr) {
979 ; CHECK-LABEL: test_v2i32_post_imm_ld2:
980 ; CHECK:       ; %bb.0:
981 ; CHECK-NEXT:    ld2.2s { v0, v1 }, [x0], #16
982 ; CHECK-NEXT:    str x0, [x1]
983 ; CHECK-NEXT:    ret
984   %ld2 = tail call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2.v2i32.p0(ptr %A)
985   %tmp = getelementptr i32, ptr %A, i32 4
986   store ptr %tmp, ptr %ptr
987   ret { <2 x i32>, <2 x i32> } %ld2
990 define { <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
991 ; CHECK-LABEL: test_v2i32_post_reg_ld2:
992 ; CHECK:       ; %bb.0:
993 ; CHECK-NEXT:    lsl x8, x2, #2
994 ; CHECK-NEXT:    ld2.2s { v0, v1 }, [x0], x8
995 ; CHECK-NEXT:    str x0, [x1]
996 ; CHECK-NEXT:    ret
997   %ld2 = tail call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2.v2i32.p0(ptr %A)
998   %tmp = getelementptr i32, ptr %A, i64 %inc
999   store ptr %tmp, ptr %ptr
1000   ret { <2 x i32>, <2 x i32> } %ld2
1003 declare { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2.v2i32.p0(ptr)
1006 define { <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld2(ptr %A, ptr %ptr) {
1007 ; CHECK-LABEL: test_v2i64_post_imm_ld2:
1008 ; CHECK:       ; %bb.0:
1009 ; CHECK-NEXT:    ld2.2d { v0, v1 }, [x0], #32
1010 ; CHECK-NEXT:    str x0, [x1]
1011 ; CHECK-NEXT:    ret
1012   %ld2 = tail call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2.v2i64.p0(ptr %A)
1013   %tmp = getelementptr i64, ptr %A, i32 4
1014   store ptr %tmp, ptr %ptr
1015   ret { <2 x i64>, <2 x i64> } %ld2
1018 define { <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1019 ; CHECK-LABEL: test_v2i64_post_reg_ld2:
1020 ; CHECK:       ; %bb.0:
1021 ; CHECK-NEXT:    lsl x8, x2, #3
1022 ; CHECK-NEXT:    ld2.2d { v0, v1 }, [x0], x8
1023 ; CHECK-NEXT:    str x0, [x1]
1024 ; CHECK-NEXT:    ret
1025   %ld2 = tail call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2.v2i64.p0(ptr %A)
1026   %tmp = getelementptr i64, ptr %A, i64 %inc
1027   store ptr %tmp, ptr %ptr
1028   ret { <2 x i64>, <2 x i64> } %ld2
1031 declare { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2.v2i64.p0(ptr)
1034 define { <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld2(ptr %A, ptr %ptr) {
1035 ; CHECK-LABEL: test_v1i64_post_imm_ld2:
1036 ; CHECK:       ; %bb.0:
1037 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0], #16
1038 ; CHECK-NEXT:    str x0, [x1]
1039 ; CHECK-NEXT:    ret
1040   %ld2 = tail call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2.v1i64.p0(ptr %A)
1041   %tmp = getelementptr i64, ptr %A, i32 2
1042   store ptr %tmp, ptr %ptr
1043   ret { <1 x i64>, <1 x i64> } %ld2
1046 define { <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1047 ; CHECK-LABEL: test_v1i64_post_reg_ld2:
1048 ; CHECK:       ; %bb.0:
1049 ; CHECK-NEXT:    lsl x8, x2, #3
1050 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0], x8
1051 ; CHECK-NEXT:    str x0, [x1]
1052 ; CHECK-NEXT:    ret
1053   %ld2 = tail call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2.v1i64.p0(ptr %A)
1054   %tmp = getelementptr i64, ptr %A, i64 %inc
1055   store ptr %tmp, ptr %ptr
1056   ret { <1 x i64>, <1 x i64> } %ld2
1059 declare { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2.v1i64.p0(ptr)
1062 define { <4 x float>, <4 x float> } @test_v4f32_post_imm_ld2(ptr %A, ptr %ptr) {
1063 ; CHECK-LABEL: test_v4f32_post_imm_ld2:
1064 ; CHECK:       ; %bb.0:
1065 ; CHECK-NEXT:    ld2.4s { v0, v1 }, [x0], #32
1066 ; CHECK-NEXT:    str x0, [x1]
1067 ; CHECK-NEXT:    ret
1068   %ld2 = tail call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2.v4f32.p0(ptr %A)
1069   %tmp = getelementptr float, ptr %A, i32 8
1070   store ptr %tmp, ptr %ptr
1071   ret { <4 x float>, <4 x float> } %ld2
1074 define { <4 x float>, <4 x float> } @test_v4f32_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1075 ; CHECK-LABEL: test_v4f32_post_reg_ld2:
1076 ; CHECK:       ; %bb.0:
1077 ; CHECK-NEXT:    lsl x8, x2, #2
1078 ; CHECK-NEXT:    ld2.4s { v0, v1 }, [x0], x8
1079 ; CHECK-NEXT:    str x0, [x1]
1080 ; CHECK-NEXT:    ret
1081   %ld2 = tail call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2.v4f32.p0(ptr %A)
1082   %tmp = getelementptr float, ptr %A, i64 %inc
1083   store ptr %tmp, ptr %ptr
1084   ret { <4 x float>, <4 x float> } %ld2
1087 declare { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2.v4f32.p0(ptr)
1090 define { <2 x float>, <2 x float> } @test_v2f32_post_imm_ld2(ptr %A, ptr %ptr) {
1091 ; CHECK-LABEL: test_v2f32_post_imm_ld2:
1092 ; CHECK:       ; %bb.0:
1093 ; CHECK-NEXT:    ld2.2s { v0, v1 }, [x0], #16
1094 ; CHECK-NEXT:    str x0, [x1]
1095 ; CHECK-NEXT:    ret
1096   %ld2 = tail call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2.v2f32.p0(ptr %A)
1097   %tmp = getelementptr float, ptr %A, i32 4
1098   store ptr %tmp, ptr %ptr
1099   ret { <2 x float>, <2 x float> } %ld2
1102 define { <2 x float>, <2 x float> } @test_v2f32_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1103 ; CHECK-LABEL: test_v2f32_post_reg_ld2:
1104 ; CHECK:       ; %bb.0:
1105 ; CHECK-NEXT:    lsl x8, x2, #2
1106 ; CHECK-NEXT:    ld2.2s { v0, v1 }, [x0], x8
1107 ; CHECK-NEXT:    str x0, [x1]
1108 ; CHECK-NEXT:    ret
1109   %ld2 = tail call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2.v2f32.p0(ptr %A)
1110   %tmp = getelementptr float, ptr %A, i64 %inc
1111   store ptr %tmp, ptr %ptr
1112   ret { <2 x float>, <2 x float> } %ld2
1115 declare { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2.v2f32.p0(ptr)
1118 define { <2 x double>, <2 x double> } @test_v2f64_post_imm_ld2(ptr %A, ptr %ptr) {
1119 ; CHECK-LABEL: test_v2f64_post_imm_ld2:
1120 ; CHECK:       ; %bb.0:
1121 ; CHECK-NEXT:    ld2.2d { v0, v1 }, [x0], #32
1122 ; CHECK-NEXT:    str x0, [x1]
1123 ; CHECK-NEXT:    ret
1124   %ld2 = tail call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2.v2f64.p0(ptr %A)
1125   %tmp = getelementptr double, ptr %A, i32 4
1126   store ptr %tmp, ptr %ptr
1127   ret { <2 x double>, <2 x double> } %ld2
1130 define { <2 x double>, <2 x double> } @test_v2f64_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1131 ; CHECK-LABEL: test_v2f64_post_reg_ld2:
1132 ; CHECK:       ; %bb.0:
1133 ; CHECK-NEXT:    lsl x8, x2, #3
1134 ; CHECK-NEXT:    ld2.2d { v0, v1 }, [x0], x8
1135 ; CHECK-NEXT:    str x0, [x1]
1136 ; CHECK-NEXT:    ret
1137   %ld2 = tail call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2.v2f64.p0(ptr %A)
1138   %tmp = getelementptr double, ptr %A, i64 %inc
1139   store ptr %tmp, ptr %ptr
1140   ret { <2 x double>, <2 x double> } %ld2
1143 declare { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2.v2f64.p0(ptr)
1146 define { <1 x double>, <1 x double> } @test_v1f64_post_imm_ld2(ptr %A, ptr %ptr) {
1147 ; CHECK-LABEL: test_v1f64_post_imm_ld2:
1148 ; CHECK:       ; %bb.0:
1149 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0], #16
1150 ; CHECK-NEXT:    str x0, [x1]
1151 ; CHECK-NEXT:    ret
1152   %ld2 = tail call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2.v1f64.p0(ptr %A)
1153   %tmp = getelementptr double, ptr %A, i32 2
1154   store ptr %tmp, ptr %ptr
1155   ret { <1 x double>, <1 x double> } %ld2
1158 define { <1 x double>, <1 x double> } @test_v1f64_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1159 ; CHECK-LABEL: test_v1f64_post_reg_ld2:
1160 ; CHECK:       ; %bb.0:
1161 ; CHECK-NEXT:    lsl x8, x2, #3
1162 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0], x8
1163 ; CHECK-NEXT:    str x0, [x1]
1164 ; CHECK-NEXT:    ret
1165   %ld2 = tail call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2.v1f64.p0(ptr %A)
1166   %tmp = getelementptr double, ptr %A, i64 %inc
1167   store ptr %tmp, ptr %ptr
1168   ret { <1 x double>, <1 x double> } %ld2
1171 declare { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2.v1f64.p0(ptr)
1174 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld3(ptr %A, ptr %ptr) {
1175 ; CHECK-LABEL: test_v16i8_post_imm_ld3:
1176 ; CHECK:       ; %bb.0:
1177 ; CHECK-NEXT:    ld3.16b { v0, v1, v2 }, [x0], #48
1178 ; CHECK-NEXT:    str x0, [x1]
1179 ; CHECK-NEXT:    ret
1180   %ld3 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0(ptr %A)
1181   %tmp = getelementptr i8, ptr %A, i32 48
1182   store ptr %tmp, ptr %ptr
1183   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
1186 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1187 ; CHECK-LABEL: test_v16i8_post_reg_ld3:
1188 ; CHECK:       ; %bb.0:
1189 ; CHECK-NEXT:    ld3.16b { v0, v1, v2 }, [x0], x2
1190 ; CHECK-NEXT:    str x0, [x1]
1191 ; CHECK-NEXT:    ret
1192   %ld3 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0(ptr %A)
1193   %tmp = getelementptr i8, ptr %A, i64 %inc
1194   store ptr %tmp, ptr %ptr
1195   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
1198 declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0(ptr)
1201 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld3(ptr %A, ptr %ptr) {
1202 ; CHECK-LABEL: test_v8i8_post_imm_ld3:
1203 ; CHECK:       ; %bb.0:
1204 ; CHECK-NEXT:    ld3.8b { v0, v1, v2 }, [x0], #24
1205 ; CHECK-NEXT:    str x0, [x1]
1206 ; CHECK-NEXT:    ret
1207   %ld3 = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0(ptr %A)
1208   %tmp = getelementptr i8, ptr %A, i32 24
1209   store ptr %tmp, ptr %ptr
1210   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
1213 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1214 ; CHECK-LABEL: test_v8i8_post_reg_ld3:
1215 ; CHECK:       ; %bb.0:
1216 ; CHECK-NEXT:    ld3.8b { v0, v1, v2 }, [x0], x2
1217 ; CHECK-NEXT:    str x0, [x1]
1218 ; CHECK-NEXT:    ret
1219   %ld3 = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0(ptr %A)
1220   %tmp = getelementptr i8, ptr %A, i64 %inc
1221   store ptr %tmp, ptr %ptr
1222   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
1225 declare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0(ptr)
1228 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld3(ptr %A, ptr %ptr) {
1229 ; CHECK-LABEL: test_v8i16_post_imm_ld3:
1230 ; CHECK:       ; %bb.0:
1231 ; CHECK-NEXT:    ld3.8h { v0, v1, v2 }, [x0], #48
1232 ; CHECK-NEXT:    str x0, [x1]
1233 ; CHECK-NEXT:    ret
1234   %ld3 = tail call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3.v8i16.p0(ptr %A)
1235   %tmp = getelementptr i16, ptr %A, i32 24
1236   store ptr %tmp, ptr %ptr
1237   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
1240 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1241 ; CHECK-LABEL: test_v8i16_post_reg_ld3:
1242 ; CHECK:       ; %bb.0:
1243 ; CHECK-NEXT:    lsl x8, x2, #1
1244 ; CHECK-NEXT:    ld3.8h { v0, v1, v2 }, [x0], x8
1245 ; CHECK-NEXT:    str x0, [x1]
1246 ; CHECK-NEXT:    ret
1247   %ld3 = tail call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3.v8i16.p0(ptr %A)
1248   %tmp = getelementptr i16, ptr %A, i64 %inc
1249   store ptr %tmp, ptr %ptr
1250   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
1253 declare { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3.v8i16.p0(ptr)
1256 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld3(ptr %A, ptr %ptr) {
1257 ; CHECK-LABEL: test_v4i16_post_imm_ld3:
1258 ; CHECK:       ; %bb.0:
1259 ; CHECK-NEXT:    ld3.4h { v0, v1, v2 }, [x0], #24
1260 ; CHECK-NEXT:    str x0, [x1]
1261 ; CHECK-NEXT:    ret
1262   %ld3 = tail call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3.v4i16.p0(ptr %A)
1263   %tmp = getelementptr i16, ptr %A, i32 12
1264   store ptr %tmp, ptr %ptr
1265   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
1268 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1269 ; CHECK-LABEL: test_v4i16_post_reg_ld3:
1270 ; CHECK:       ; %bb.0:
1271 ; CHECK-NEXT:    lsl x8, x2, #1
1272 ; CHECK-NEXT:    ld3.4h { v0, v1, v2 }, [x0], x8
1273 ; CHECK-NEXT:    str x0, [x1]
1274 ; CHECK-NEXT:    ret
1275   %ld3 = tail call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3.v4i16.p0(ptr %A)
1276   %tmp = getelementptr i16, ptr %A, i64 %inc
1277   store ptr %tmp, ptr %ptr
1278   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
1281 declare { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3.v4i16.p0(ptr)
1284 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld3(ptr %A, ptr %ptr) {
1285 ; CHECK-LABEL: test_v4i32_post_imm_ld3:
1286 ; CHECK:       ; %bb.0:
1287 ; CHECK-NEXT:    ld3.4s { v0, v1, v2 }, [x0], #48
1288 ; CHECK-NEXT:    str x0, [x1]
1289 ; CHECK-NEXT:    ret
1290   %ld3 = tail call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr %A)
1291   %tmp = getelementptr i32, ptr %A, i32 12
1292   store ptr %tmp, ptr %ptr
1293   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
1296 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1297 ; CHECK-LABEL: test_v4i32_post_reg_ld3:
1298 ; CHECK:       ; %bb.0:
1299 ; CHECK-NEXT:    lsl x8, x2, #2
1300 ; CHECK-NEXT:    ld3.4s { v0, v1, v2 }, [x0], x8
1301 ; CHECK-NEXT:    str x0, [x1]
1302 ; CHECK-NEXT:    ret
1303   %ld3 = tail call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr %A)
1304   %tmp = getelementptr i32, ptr %A, i64 %inc
1305   store ptr %tmp, ptr %ptr
1306   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
1309 declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr)
1312 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld3(ptr %A, ptr %ptr) {
1313 ; CHECK-LABEL: test_v2i32_post_imm_ld3:
1314 ; CHECK:       ; %bb.0:
1315 ; CHECK-NEXT:    ld3.2s { v0, v1, v2 }, [x0], #24
1316 ; CHECK-NEXT:    str x0, [x1]
1317 ; CHECK-NEXT:    ret
1318   %ld3 = tail call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3.v2i32.p0(ptr %A)
1319   %tmp = getelementptr i32, ptr %A, i32 6
1320   store ptr %tmp, ptr %ptr
1321   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
1324 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1325 ; CHECK-LABEL: test_v2i32_post_reg_ld3:
1326 ; CHECK:       ; %bb.0:
1327 ; CHECK-NEXT:    lsl x8, x2, #2
1328 ; CHECK-NEXT:    ld3.2s { v0, v1, v2 }, [x0], x8
1329 ; CHECK-NEXT:    str x0, [x1]
1330 ; CHECK-NEXT:    ret
1331   %ld3 = tail call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3.v2i32.p0(ptr %A)
1332   %tmp = getelementptr i32, ptr %A, i64 %inc
1333   store ptr %tmp, ptr %ptr
1334   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
1337 declare { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3.v2i32.p0(ptr)
1340 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld3(ptr %A, ptr %ptr) {
1341 ; CHECK-LABEL: test_v2i64_post_imm_ld3:
1342 ; CHECK:       ; %bb.0:
1343 ; CHECK-NEXT:    ld3.2d { v0, v1, v2 }, [x0], #48
1344 ; CHECK-NEXT:    str x0, [x1]
1345 ; CHECK-NEXT:    ret
1346   %ld3 = tail call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr %A)
1347   %tmp = getelementptr i64, ptr %A, i32 6
1348   store ptr %tmp, ptr %ptr
1349   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
1352 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1353 ; CHECK-LABEL: test_v2i64_post_reg_ld3:
1354 ; CHECK:       ; %bb.0:
1355 ; CHECK-NEXT:    lsl x8, x2, #3
1356 ; CHECK-NEXT:    ld3.2d { v0, v1, v2 }, [x0], x8
1357 ; CHECK-NEXT:    str x0, [x1]
1358 ; CHECK-NEXT:    ret
1359   %ld3 = tail call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr %A)
1360   %tmp = getelementptr i64, ptr %A, i64 %inc
1361   store ptr %tmp, ptr %ptr
1362   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
1365 declare { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr)
1368 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld3(ptr %A, ptr %ptr) {
1369 ; CHECK-LABEL: test_v1i64_post_imm_ld3:
1370 ; CHECK:       ; %bb.0:
1371 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0], #24
1372 ; CHECK-NEXT:    str x0, [x1]
1373 ; CHECK-NEXT:    ret
1374   %ld3 = tail call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3.v1i64.p0(ptr %A)
1375   %tmp = getelementptr i64, ptr %A, i32 3
1376   store ptr %tmp, ptr %ptr
1377   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
1380 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1381 ; CHECK-LABEL: test_v1i64_post_reg_ld3:
1382 ; CHECK:       ; %bb.0:
1383 ; CHECK-NEXT:    lsl x8, x2, #3
1384 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0], x8
1385 ; CHECK-NEXT:    str x0, [x1]
1386 ; CHECK-NEXT:    ret
1387   %ld3 = tail call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3.v1i64.p0(ptr %A)
1388   %tmp = getelementptr i64, ptr %A, i64 %inc
1389   store ptr %tmp, ptr %ptr
1390   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
1393 declare { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3.v1i64.p0(ptr)
1396 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld3(ptr %A, ptr %ptr) {
1397 ; CHECK-LABEL: test_v4f32_post_imm_ld3:
1398 ; CHECK:       ; %bb.0:
1399 ; CHECK-NEXT:    ld3.4s { v0, v1, v2 }, [x0], #48
1400 ; CHECK-NEXT:    str x0, [x1]
1401 ; CHECK-NEXT:    ret
1402   %ld3 = tail call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3.v4f32.p0(ptr %A)
1403   %tmp = getelementptr float, ptr %A, i32 12
1404   store ptr %tmp, ptr %ptr
1405   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
1408 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1409 ; CHECK-LABEL: test_v4f32_post_reg_ld3:
1410 ; CHECK:       ; %bb.0:
1411 ; CHECK-NEXT:    lsl x8, x2, #2
1412 ; CHECK-NEXT:    ld3.4s { v0, v1, v2 }, [x0], x8
1413 ; CHECK-NEXT:    str x0, [x1]
1414 ; CHECK-NEXT:    ret
1415   %ld3 = tail call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3.v4f32.p0(ptr %A)
1416   %tmp = getelementptr float, ptr %A, i64 %inc
1417   store ptr %tmp, ptr %ptr
1418   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
1421 declare { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3.v4f32.p0(ptr)
1424 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld3(ptr %A, ptr %ptr) {
1425 ; CHECK-LABEL: test_v2f32_post_imm_ld3:
1426 ; CHECK:       ; %bb.0:
1427 ; CHECK-NEXT:    ld3.2s { v0, v1, v2 }, [x0], #24
1428 ; CHECK-NEXT:    str x0, [x1]
1429 ; CHECK-NEXT:    ret
1430   %ld3 = tail call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3.v2f32.p0(ptr %A)
1431   %tmp = getelementptr float, ptr %A, i32 6
1432   store ptr %tmp, ptr %ptr
1433   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
1436 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1437 ; CHECK-LABEL: test_v2f32_post_reg_ld3:
1438 ; CHECK:       ; %bb.0:
1439 ; CHECK-NEXT:    lsl x8, x2, #2
1440 ; CHECK-NEXT:    ld3.2s { v0, v1, v2 }, [x0], x8
1441 ; CHECK-NEXT:    str x0, [x1]
1442 ; CHECK-NEXT:    ret
1443   %ld3 = tail call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3.v2f32.p0(ptr %A)
1444   %tmp = getelementptr float, ptr %A, i64 %inc
1445   store ptr %tmp, ptr %ptr
1446   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
1449 declare { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3.v2f32.p0(ptr)
1452 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld3(ptr %A, ptr %ptr) {
1453 ; CHECK-LABEL: test_v2f64_post_imm_ld3:
1454 ; CHECK:       ; %bb.0:
1455 ; CHECK-NEXT:    ld3.2d { v0, v1, v2 }, [x0], #48
1456 ; CHECK-NEXT:    str x0, [x1]
1457 ; CHECK-NEXT:    ret
1458   %ld3 = tail call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3.v2f64.p0(ptr %A)
1459   %tmp = getelementptr double, ptr %A, i32 6
1460   store ptr %tmp, ptr %ptr
1461   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
1464 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1465 ; CHECK-LABEL: test_v2f64_post_reg_ld3:
1466 ; CHECK:       ; %bb.0:
1467 ; CHECK-NEXT:    lsl x8, x2, #3
1468 ; CHECK-NEXT:    ld3.2d { v0, v1, v2 }, [x0], x8
1469 ; CHECK-NEXT:    str x0, [x1]
1470 ; CHECK-NEXT:    ret
1471   %ld3 = tail call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3.v2f64.p0(ptr %A)
1472   %tmp = getelementptr double, ptr %A, i64 %inc
1473   store ptr %tmp, ptr %ptr
1474   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
1477 declare { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3.v2f64.p0(ptr)
1480 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld3(ptr %A, ptr %ptr) {
1481 ; CHECK-LABEL: test_v1f64_post_imm_ld3:
1482 ; CHECK:       ; %bb.0:
1483 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0], #24
1484 ; CHECK-NEXT:    str x0, [x1]
1485 ; CHECK-NEXT:    ret
1486   %ld3 = tail call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3.v1f64.p0(ptr %A)
1487   %tmp = getelementptr double, ptr %A, i32 3
1488   store ptr %tmp, ptr %ptr
1489   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
1492 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
1493 ; CHECK-LABEL: test_v1f64_post_reg_ld3:
1494 ; CHECK:       ; %bb.0:
1495 ; CHECK-NEXT:    lsl x8, x2, #3
1496 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0], x8
1497 ; CHECK-NEXT:    str x0, [x1]
1498 ; CHECK-NEXT:    ret
1499   %ld3 = tail call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3.v1f64.p0(ptr %A)
1500   %tmp = getelementptr double, ptr %A, i64 %inc
1501   store ptr %tmp, ptr %ptr
1502   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
1505 declare { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3.v1f64.p0(ptr)
1508 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld4(ptr %A, ptr %ptr) {
1509 ; CHECK-LABEL: test_v16i8_post_imm_ld4:
1510 ; CHECK:       ; %bb.0:
1511 ; CHECK-NEXT:    ld4.16b { v0, v1, v2, v3 }, [x0], #64
1512 ; CHECK-NEXT:    str x0, [x1]
1513 ; CHECK-NEXT:    ret
1514   %ld4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0(ptr %A)
1515   %tmp = getelementptr i8, ptr %A, i32 64
1516   store ptr %tmp, ptr %ptr
1517   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
1520 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1521 ; CHECK-LABEL: test_v16i8_post_reg_ld4:
1522 ; CHECK:       ; %bb.0:
1523 ; CHECK-NEXT:    ld4.16b { v0, v1, v2, v3 }, [x0], x2
1524 ; CHECK-NEXT:    str x0, [x1]
1525 ; CHECK-NEXT:    ret
1526   %ld4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0(ptr %A)
1527   %tmp = getelementptr i8, ptr %A, i64 %inc
1528   store ptr %tmp, ptr %ptr
1529   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
1532 declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0(ptr)
1535 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld4(ptr %A, ptr %ptr) {
1536 ; CHECK-LABEL: test_v8i8_post_imm_ld4:
1537 ; CHECK:       ; %bb.0:
1538 ; CHECK-NEXT:    ld4.8b { v0, v1, v2, v3 }, [x0], #32
1539 ; CHECK-NEXT:    str x0, [x1]
1540 ; CHECK-NEXT:    ret
1541   %ld4 = tail call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4.v8i8.p0(ptr %A)
1542   %tmp = getelementptr i8, ptr %A, i32 32
1543   store ptr %tmp, ptr %ptr
1544   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
1547 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1548 ; CHECK-LABEL: test_v8i8_post_reg_ld4:
1549 ; CHECK:       ; %bb.0:
1550 ; CHECK-NEXT:    ld4.8b { v0, v1, v2, v3 }, [x0], x2
1551 ; CHECK-NEXT:    str x0, [x1]
1552 ; CHECK-NEXT:    ret
1553   %ld4 = tail call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4.v8i8.p0(ptr %A)
1554   %tmp = getelementptr i8, ptr %A, i64 %inc
1555   store ptr %tmp, ptr %ptr
1556   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
1559 declare { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4.v8i8.p0(ptr)
1562 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld4(ptr %A, ptr %ptr) {
1563 ; CHECK-LABEL: test_v8i16_post_imm_ld4:
1564 ; CHECK:       ; %bb.0:
1565 ; CHECK-NEXT:    ld4.8h { v0, v1, v2, v3 }, [x0], #64
1566 ; CHECK-NEXT:    str x0, [x1]
1567 ; CHECK-NEXT:    ret
1568   %ld4 = tail call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4.v8i16.p0(ptr %A)
1569   %tmp = getelementptr i16, ptr %A, i32 32
1570   store ptr %tmp, ptr %ptr
1571   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
1574 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1575 ; CHECK-LABEL: test_v8i16_post_reg_ld4:
1576 ; CHECK:       ; %bb.0:
1577 ; CHECK-NEXT:    lsl x8, x2, #1
1578 ; CHECK-NEXT:    ld4.8h { v0, v1, v2, v3 }, [x0], x8
1579 ; CHECK-NEXT:    str x0, [x1]
1580 ; CHECK-NEXT:    ret
1581   %ld4 = tail call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4.v8i16.p0(ptr %A)
1582   %tmp = getelementptr i16, ptr %A, i64 %inc
1583   store ptr %tmp, ptr %ptr
1584   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
1587 declare { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4.v8i16.p0(ptr)
1590 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld4(ptr %A, ptr %ptr) {
1591 ; CHECK-LABEL: test_v4i16_post_imm_ld4:
1592 ; CHECK:       ; %bb.0:
1593 ; CHECK-NEXT:    ld4.4h { v0, v1, v2, v3 }, [x0], #32
1594 ; CHECK-NEXT:    str x0, [x1]
1595 ; CHECK-NEXT:    ret
1596   %ld4 = tail call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4.v4i16.p0(ptr %A)
1597   %tmp = getelementptr i16, ptr %A, i32 16
1598   store ptr %tmp, ptr %ptr
1599   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
1602 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1603 ; CHECK-LABEL: test_v4i16_post_reg_ld4:
1604 ; CHECK:       ; %bb.0:
1605 ; CHECK-NEXT:    lsl x8, x2, #1
1606 ; CHECK-NEXT:    ld4.4h { v0, v1, v2, v3 }, [x0], x8
1607 ; CHECK-NEXT:    str x0, [x1]
1608 ; CHECK-NEXT:    ret
1609   %ld4 = tail call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4.v4i16.p0(ptr %A)
1610   %tmp = getelementptr i16, ptr %A, i64 %inc
1611   store ptr %tmp, ptr %ptr
1612   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
1615 declare { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4.v4i16.p0(ptr)
1618 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld4(ptr %A, ptr %ptr) {
1619 ; CHECK-LABEL: test_v4i32_post_imm_ld4:
1620 ; CHECK:       ; %bb.0:
1621 ; CHECK-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0], #64
1622 ; CHECK-NEXT:    str x0, [x1]
1623 ; CHECK-NEXT:    ret
1624   %ld4 = tail call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr %A)
1625   %tmp = getelementptr i32, ptr %A, i32 16
1626   store ptr %tmp, ptr %ptr
1627   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
1630 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1631 ; CHECK-LABEL: test_v4i32_post_reg_ld4:
1632 ; CHECK:       ; %bb.0:
1633 ; CHECK-NEXT:    lsl x8, x2, #2
1634 ; CHECK-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0], x8
1635 ; CHECK-NEXT:    str x0, [x1]
1636 ; CHECK-NEXT:    ret
1637   %ld4 = tail call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr %A)
1638   %tmp = getelementptr i32, ptr %A, i64 %inc
1639   store ptr %tmp, ptr %ptr
1640   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
1643 declare { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr)
1646 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld4(ptr %A, ptr %ptr) {
1647 ; CHECK-LABEL: test_v2i32_post_imm_ld4:
1648 ; CHECK:       ; %bb.0:
1649 ; CHECK-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0], #32
1650 ; CHECK-NEXT:    str x0, [x1]
1651 ; CHECK-NEXT:    ret
1652   %ld4 = tail call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4.v2i32.p0(ptr %A)
1653   %tmp = getelementptr i32, ptr %A, i32 8
1654   store ptr %tmp, ptr %ptr
1655   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
1658 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1659 ; CHECK-LABEL: test_v2i32_post_reg_ld4:
1660 ; CHECK:       ; %bb.0:
1661 ; CHECK-NEXT:    lsl x8, x2, #2
1662 ; CHECK-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0], x8
1663 ; CHECK-NEXT:    str x0, [x1]
1664 ; CHECK-NEXT:    ret
1665   %ld4 = tail call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4.v2i32.p0(ptr %A)
1666   %tmp = getelementptr i32, ptr %A, i64 %inc
1667   store ptr %tmp, ptr %ptr
1668   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
1671 declare { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4.v2i32.p0(ptr)
1674 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld4(ptr %A, ptr %ptr) {
1675 ; CHECK-LABEL: test_v2i64_post_imm_ld4:
1676 ; CHECK:       ; %bb.0:
1677 ; CHECK-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0], #64
1678 ; CHECK-NEXT:    str x0, [x1]
1679 ; CHECK-NEXT:    ret
1680   %ld4 = tail call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4.v2i64.p0(ptr %A)
1681   %tmp = getelementptr i64, ptr %A, i32 8
1682   store ptr %tmp, ptr %ptr
1683   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
1686 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1687 ; CHECK-LABEL: test_v2i64_post_reg_ld4:
1688 ; CHECK:       ; %bb.0:
1689 ; CHECK-NEXT:    lsl x8, x2, #3
1690 ; CHECK-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0], x8
1691 ; CHECK-NEXT:    str x0, [x1]
1692 ; CHECK-NEXT:    ret
1693   %ld4 = tail call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4.v2i64.p0(ptr %A)
1694   %tmp = getelementptr i64, ptr %A, i64 %inc
1695   store ptr %tmp, ptr %ptr
1696   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
1699 declare { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4.v2i64.p0(ptr)
1702 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld4(ptr %A, ptr %ptr) {
1703 ; CHECK-LABEL: test_v1i64_post_imm_ld4:
1704 ; CHECK:       ; %bb.0:
1705 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], #32
1706 ; CHECK-NEXT:    str x0, [x1]
1707 ; CHECK-NEXT:    ret
1708   %ld4 = tail call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4.v1i64.p0(ptr %A)
1709   %tmp = getelementptr i64, ptr %A, i32 4
1710   store ptr %tmp, ptr %ptr
1711   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
1714 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1715 ; CHECK-LABEL: test_v1i64_post_reg_ld4:
1716 ; CHECK:       ; %bb.0:
1717 ; CHECK-NEXT:    lsl x8, x2, #3
1718 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], x8
1719 ; CHECK-NEXT:    str x0, [x1]
1720 ; CHECK-NEXT:    ret
1721   %ld4 = tail call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4.v1i64.p0(ptr %A)
1722   %tmp = getelementptr i64, ptr %A, i64 %inc
1723   store ptr %tmp, ptr %ptr
1724   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
1727 declare { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4.v1i64.p0(ptr)
1730 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld4(ptr %A, ptr %ptr) {
1731 ; CHECK-LABEL: test_v4f32_post_imm_ld4:
1732 ; CHECK:       ; %bb.0:
1733 ; CHECK-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0], #64
1734 ; CHECK-NEXT:    str x0, [x1]
1735 ; CHECK-NEXT:    ret
1736   %ld4 = tail call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4.v4f32.p0(ptr %A)
1737   %tmp = getelementptr float, ptr %A, i32 16
1738   store ptr %tmp, ptr %ptr
1739   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
1742 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1743 ; CHECK-LABEL: test_v4f32_post_reg_ld4:
1744 ; CHECK:       ; %bb.0:
1745 ; CHECK-NEXT:    lsl x8, x2, #2
1746 ; CHECK-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0], x8
1747 ; CHECK-NEXT:    str x0, [x1]
1748 ; CHECK-NEXT:    ret
1749   %ld4 = tail call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4.v4f32.p0(ptr %A)
1750   %tmp = getelementptr float, ptr %A, i64 %inc
1751   store ptr %tmp, ptr %ptr
1752   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
1755 declare { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4.v4f32.p0(ptr)
1758 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld4(ptr %A, ptr %ptr) {
1759 ; CHECK-LABEL: test_v2f32_post_imm_ld4:
1760 ; CHECK:       ; %bb.0:
1761 ; CHECK-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0], #32
1762 ; CHECK-NEXT:    str x0, [x1]
1763 ; CHECK-NEXT:    ret
1764   %ld4 = tail call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4.v2f32.p0(ptr %A)
1765   %tmp = getelementptr float, ptr %A, i32 8
1766   store ptr %tmp, ptr %ptr
1767   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
1770 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1771 ; CHECK-LABEL: test_v2f32_post_reg_ld4:
1772 ; CHECK:       ; %bb.0:
1773 ; CHECK-NEXT:    lsl x8, x2, #2
1774 ; CHECK-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0], x8
1775 ; CHECK-NEXT:    str x0, [x1]
1776 ; CHECK-NEXT:    ret
1777   %ld4 = tail call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4.v2f32.p0(ptr %A)
1778   %tmp = getelementptr float, ptr %A, i64 %inc
1779   store ptr %tmp, ptr %ptr
1780   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
1783 declare { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4.v2f32.p0(ptr)
1786 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld4(ptr %A, ptr %ptr) {
1787 ; CHECK-LABEL: test_v2f64_post_imm_ld4:
1788 ; CHECK:       ; %bb.0:
1789 ; CHECK-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0], #64
1790 ; CHECK-NEXT:    str x0, [x1]
1791 ; CHECK-NEXT:    ret
1792   %ld4 = tail call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4.v2f64.p0(ptr %A)
1793   %tmp = getelementptr double, ptr %A, i32 8
1794   store ptr %tmp, ptr %ptr
1795   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
1798 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1799 ; CHECK-LABEL: test_v2f64_post_reg_ld4:
1800 ; CHECK:       ; %bb.0:
1801 ; CHECK-NEXT:    lsl x8, x2, #3
1802 ; CHECK-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0], x8
1803 ; CHECK-NEXT:    str x0, [x1]
1804 ; CHECK-NEXT:    ret
1805   %ld4 = tail call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4.v2f64.p0(ptr %A)
1806   %tmp = getelementptr double, ptr %A, i64 %inc
1807   store ptr %tmp, ptr %ptr
1808   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
1811 declare { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4.v2f64.p0(ptr)
1814 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld4(ptr %A, ptr %ptr) {
1815 ; CHECK-LABEL: test_v1f64_post_imm_ld4:
1816 ; CHECK:       ; %bb.0:
1817 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], #32
1818 ; CHECK-NEXT:    str x0, [x1]
1819 ; CHECK-NEXT:    ret
1820   %ld4 = tail call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4.v1f64.p0(ptr %A)
1821   %tmp = getelementptr double, ptr %A, i32 4
1822   store ptr %tmp, ptr %ptr
1823   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
1826 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
1827 ; CHECK-LABEL: test_v1f64_post_reg_ld4:
1828 ; CHECK:       ; %bb.0:
1829 ; CHECK-NEXT:    lsl x8, x2, #3
1830 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], x8
1831 ; CHECK-NEXT:    str x0, [x1]
1832 ; CHECK-NEXT:    ret
1833   %ld4 = tail call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4.v1f64.p0(ptr %A)
1834   %tmp = getelementptr double, ptr %A, i64 %inc
1835   store ptr %tmp, ptr %ptr
1836   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
1839 declare { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4.v1f64.p0(ptr)
1841 define { <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld1x2(ptr %A, ptr %ptr) {
1842 ; CHECK-LABEL: test_v16i8_post_imm_ld1x2:
1843 ; CHECK:       ; %bb.0:
1844 ; CHECK-NEXT:    ld1.16b { v0, v1 }, [x0], #32
1845 ; CHECK-NEXT:    str x0, [x1]
1846 ; CHECK-NEXT:    ret
1847   %ld1x2 = tail call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr %A)
1848   %tmp = getelementptr i8, ptr %A, i32 32
1849   store ptr %tmp, ptr %ptr
1850   ret { <16 x i8>, <16 x i8> } %ld1x2
1853 define { <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
1854 ; CHECK-LABEL: test_v16i8_post_reg_ld1x2:
1855 ; CHECK:       ; %bb.0:
1856 ; CHECK-NEXT:    ld1.16b { v0, v1 }, [x0], x2
1857 ; CHECK-NEXT:    str x0, [x1]
1858 ; CHECK-NEXT:    ret
1859   %ld1x2 = tail call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr %A)
1860   %tmp = getelementptr i8, ptr %A, i64 %inc
1861   store ptr %tmp, ptr %ptr
1862   ret { <16 x i8>, <16 x i8> } %ld1x2
1865 declare { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr)
1868 define { <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld1x2(ptr %A, ptr %ptr) {
1869 ; CHECK-LABEL: test_v8i8_post_imm_ld1x2:
1870 ; CHECK:       ; %bb.0:
1871 ; CHECK-NEXT:    ld1.8b { v0, v1 }, [x0], #16
1872 ; CHECK-NEXT:    str x0, [x1]
1873 ; CHECK-NEXT:    ret
1874   %ld1x2 = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr %A)
1875   %tmp = getelementptr i8, ptr %A, i32 16
1876   store ptr %tmp, ptr %ptr
1877   ret { <8 x i8>, <8 x i8> } %ld1x2
1880 define { <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
1881 ; CHECK-LABEL: test_v8i8_post_reg_ld1x2:
1882 ; CHECK:       ; %bb.0:
1883 ; CHECK-NEXT:    ld1.8b { v0, v1 }, [x0], x2
1884 ; CHECK-NEXT:    str x0, [x1]
1885 ; CHECK-NEXT:    ret
1886   %ld1x2 = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr %A)
1887   %tmp = getelementptr i8, ptr %A, i64 %inc
1888   store ptr %tmp, ptr %ptr
1889   ret { <8 x i8>, <8 x i8> } %ld1x2
1892 declare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr)
1895 define { <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld1x2(ptr %A, ptr %ptr) {
1896 ; CHECK-LABEL: test_v8i16_post_imm_ld1x2:
1897 ; CHECK:       ; %bb.0:
1898 ; CHECK-NEXT:    ld1.8h { v0, v1 }, [x0], #32
1899 ; CHECK-NEXT:    str x0, [x1]
1900 ; CHECK-NEXT:    ret
1901   %ld1x2 = tail call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr %A)
1902   %tmp = getelementptr i16, ptr %A, i32 16
1903   store ptr %tmp, ptr %ptr
1904   ret { <8 x i16>, <8 x i16> } %ld1x2
1907 define { <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
1908 ; CHECK-LABEL: test_v8i16_post_reg_ld1x2:
1909 ; CHECK:       ; %bb.0:
1910 ; CHECK-NEXT:    lsl x8, x2, #1
1911 ; CHECK-NEXT:    ld1.8h { v0, v1 }, [x0], x8
1912 ; CHECK-NEXT:    str x0, [x1]
1913 ; CHECK-NEXT:    ret
1914   %ld1x2 = tail call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr %A)
1915   %tmp = getelementptr i16, ptr %A, i64 %inc
1916   store ptr %tmp, ptr %ptr
1917   ret { <8 x i16>, <8 x i16> } %ld1x2
1920 declare { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr)
1923 define { <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld1x2(ptr %A, ptr %ptr) {
1924 ; CHECK-LABEL: test_v4i16_post_imm_ld1x2:
1925 ; CHECK:       ; %bb.0:
1926 ; CHECK-NEXT:    ld1.4h { v0, v1 }, [x0], #16
1927 ; CHECK-NEXT:    str x0, [x1]
1928 ; CHECK-NEXT:    ret
1929   %ld1x2 = tail call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr %A)
1930   %tmp = getelementptr i16, ptr %A, i32 8
1931   store ptr %tmp, ptr %ptr
1932   ret { <4 x i16>, <4 x i16> } %ld1x2
1935 define { <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
1936 ; CHECK-LABEL: test_v4i16_post_reg_ld1x2:
1937 ; CHECK:       ; %bb.0:
1938 ; CHECK-NEXT:    lsl x8, x2, #1
1939 ; CHECK-NEXT:    ld1.4h { v0, v1 }, [x0], x8
1940 ; CHECK-NEXT:    str x0, [x1]
1941 ; CHECK-NEXT:    ret
1942   %ld1x2 = tail call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr %A)
1943   %tmp = getelementptr i16, ptr %A, i64 %inc
1944   store ptr %tmp, ptr %ptr
1945   ret { <4 x i16>, <4 x i16> } %ld1x2
1948 declare { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr)
1951 define { <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld1x2(ptr %A, ptr %ptr) {
1952 ; CHECK-LABEL: test_v4i32_post_imm_ld1x2:
1953 ; CHECK:       ; %bb.0:
1954 ; CHECK-NEXT:    ld1.4s { v0, v1 }, [x0], #32
1955 ; CHECK-NEXT:    str x0, [x1]
1956 ; CHECK-NEXT:    ret
1957   %ld1x2 = tail call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr %A)
1958   %tmp = getelementptr i32, ptr %A, i32 8
1959   store ptr %tmp, ptr %ptr
1960   ret { <4 x i32>, <4 x i32> } %ld1x2
1963 define { <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
1964 ; CHECK-LABEL: test_v4i32_post_reg_ld1x2:
1965 ; CHECK:       ; %bb.0:
1966 ; CHECK-NEXT:    lsl x8, x2, #2
1967 ; CHECK-NEXT:    ld1.4s { v0, v1 }, [x0], x8
1968 ; CHECK-NEXT:    str x0, [x1]
1969 ; CHECK-NEXT:    ret
1970   %ld1x2 = tail call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr %A)
1971   %tmp = getelementptr i32, ptr %A, i64 %inc
1972   store ptr %tmp, ptr %ptr
1973   ret { <4 x i32>, <4 x i32> } %ld1x2
1976 declare { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr)
1979 define { <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld1x2(ptr %A, ptr %ptr) {
1980 ; CHECK-LABEL: test_v2i32_post_imm_ld1x2:
1981 ; CHECK:       ; %bb.0:
1982 ; CHECK-NEXT:    ld1.2s { v0, v1 }, [x0], #16
1983 ; CHECK-NEXT:    str x0, [x1]
1984 ; CHECK-NEXT:    ret
1985   %ld1x2 = tail call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr %A)
1986   %tmp = getelementptr i32, ptr %A, i32 4
1987   store ptr %tmp, ptr %ptr
1988   ret { <2 x i32>, <2 x i32> } %ld1x2
1991 define { <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
1992 ; CHECK-LABEL: test_v2i32_post_reg_ld1x2:
1993 ; CHECK:       ; %bb.0:
1994 ; CHECK-NEXT:    lsl x8, x2, #2
1995 ; CHECK-NEXT:    ld1.2s { v0, v1 }, [x0], x8
1996 ; CHECK-NEXT:    str x0, [x1]
1997 ; CHECK-NEXT:    ret
1998   %ld1x2 = tail call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr %A)
1999   %tmp = getelementptr i32, ptr %A, i64 %inc
2000   store ptr %tmp, ptr %ptr
2001   ret { <2 x i32>, <2 x i32> } %ld1x2
2004 declare { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr)
2007 define { <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld1x2(ptr %A, ptr %ptr) {
2008 ; CHECK-LABEL: test_v2i64_post_imm_ld1x2:
2009 ; CHECK:       ; %bb.0:
2010 ; CHECK-NEXT:    ld1.2d { v0, v1 }, [x0], #32
2011 ; CHECK-NEXT:    str x0, [x1]
2012 ; CHECK-NEXT:    ret
2013   %ld1x2 = tail call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr %A)
2014   %tmp = getelementptr i64, ptr %A, i32 4
2015   store ptr %tmp, ptr %ptr
2016   ret { <2 x i64>, <2 x i64> } %ld1x2
2019 define { <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
2020 ; CHECK-LABEL: test_v2i64_post_reg_ld1x2:
2021 ; CHECK:       ; %bb.0:
2022 ; CHECK-NEXT:    lsl x8, x2, #3
2023 ; CHECK-NEXT:    ld1.2d { v0, v1 }, [x0], x8
2024 ; CHECK-NEXT:    str x0, [x1]
2025 ; CHECK-NEXT:    ret
2026   %ld1x2 = tail call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr %A)
2027   %tmp = getelementptr i64, ptr %A, i64 %inc
2028   store ptr %tmp, ptr %ptr
2029   ret { <2 x i64>, <2 x i64> } %ld1x2
2032 declare { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr)
2035 define { <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld1x2(ptr %A, ptr %ptr) {
2036 ; CHECK-LABEL: test_v1i64_post_imm_ld1x2:
2037 ; CHECK:       ; %bb.0:
2038 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0], #16
2039 ; CHECK-NEXT:    str x0, [x1]
2040 ; CHECK-NEXT:    ret
2041   %ld1x2 = tail call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr %A)
2042   %tmp = getelementptr i64, ptr %A, i32 2
2043   store ptr %tmp, ptr %ptr
2044   ret { <1 x i64>, <1 x i64> } %ld1x2
2047 define { <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
2048 ; CHECK-LABEL: test_v1i64_post_reg_ld1x2:
2049 ; CHECK:       ; %bb.0:
2050 ; CHECK-NEXT:    lsl x8, x2, #3
2051 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0], x8
2052 ; CHECK-NEXT:    str x0, [x1]
2053 ; CHECK-NEXT:    ret
2054   %ld1x2 = tail call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr %A)
2055   %tmp = getelementptr i64, ptr %A, i64 %inc
2056   store ptr %tmp, ptr %ptr
2057   ret { <1 x i64>, <1 x i64> } %ld1x2
2060 declare { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr)
2063 define { <4 x float>, <4 x float> } @test_v4f32_post_imm_ld1x2(ptr %A, ptr %ptr) {
2064 ; CHECK-LABEL: test_v4f32_post_imm_ld1x2:
2065 ; CHECK:       ; %bb.0:
2066 ; CHECK-NEXT:    ld1.4s { v0, v1 }, [x0], #32
2067 ; CHECK-NEXT:    str x0, [x1]
2068 ; CHECK-NEXT:    ret
2069   %ld1x2 = tail call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr %A)
2070   %tmp = getelementptr float, ptr %A, i32 8
2071   store ptr %tmp, ptr %ptr
2072   ret { <4 x float>, <4 x float> } %ld1x2
2075 define { <4 x float>, <4 x float> } @test_v4f32_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
2076 ; CHECK-LABEL: test_v4f32_post_reg_ld1x2:
2077 ; CHECK:       ; %bb.0:
2078 ; CHECK-NEXT:    lsl x8, x2, #2
2079 ; CHECK-NEXT:    ld1.4s { v0, v1 }, [x0], x8
2080 ; CHECK-NEXT:    str x0, [x1]
2081 ; CHECK-NEXT:    ret
2082   %ld1x2 = tail call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr %A)
2083   %tmp = getelementptr float, ptr %A, i64 %inc
2084   store ptr %tmp, ptr %ptr
2085   ret { <4 x float>, <4 x float> } %ld1x2
2088 declare { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr)
2091 define { <2 x float>, <2 x float> } @test_v2f32_post_imm_ld1x2(ptr %A, ptr %ptr) {
2092 ; CHECK-LABEL: test_v2f32_post_imm_ld1x2:
2093 ; CHECK:       ; %bb.0:
2094 ; CHECK-NEXT:    ld1.2s { v0, v1 }, [x0], #16
2095 ; CHECK-NEXT:    str x0, [x1]
2096 ; CHECK-NEXT:    ret
2097   %ld1x2 = tail call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr %A)
2098   %tmp = getelementptr float, ptr %A, i32 4
2099   store ptr %tmp, ptr %ptr
2100   ret { <2 x float>, <2 x float> } %ld1x2
2103 define { <2 x float>, <2 x float> } @test_v2f32_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
2104 ; CHECK-LABEL: test_v2f32_post_reg_ld1x2:
2105 ; CHECK:       ; %bb.0:
2106 ; CHECK-NEXT:    lsl x8, x2, #2
2107 ; CHECK-NEXT:    ld1.2s { v0, v1 }, [x0], x8
2108 ; CHECK-NEXT:    str x0, [x1]
2109 ; CHECK-NEXT:    ret
2110   %ld1x2 = tail call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr %A)
2111   %tmp = getelementptr float, ptr %A, i64 %inc
2112   store ptr %tmp, ptr %ptr
2113   ret { <2 x float>, <2 x float> } %ld1x2
2116 declare { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr)
2119 define { <2 x double>, <2 x double> } @test_v2f64_post_imm_ld1x2(ptr %A, ptr %ptr) {
2120 ; CHECK-LABEL: test_v2f64_post_imm_ld1x2:
2121 ; CHECK:       ; %bb.0:
2122 ; CHECK-NEXT:    ld1.2d { v0, v1 }, [x0], #32
2123 ; CHECK-NEXT:    str x0, [x1]
2124 ; CHECK-NEXT:    ret
2125   %ld1x2 = tail call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr %A)
2126   %tmp = getelementptr double, ptr %A, i32 4
2127   store ptr %tmp, ptr %ptr
2128   ret { <2 x double>, <2 x double> } %ld1x2
2131 define { <2 x double>, <2 x double> } @test_v2f64_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
2132 ; CHECK-LABEL: test_v2f64_post_reg_ld1x2:
2133 ; CHECK:       ; %bb.0:
2134 ; CHECK-NEXT:    lsl x8, x2, #3
2135 ; CHECK-NEXT:    ld1.2d { v0, v1 }, [x0], x8
2136 ; CHECK-NEXT:    str x0, [x1]
2137 ; CHECK-NEXT:    ret
2138   %ld1x2 = tail call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr %A)
2139   %tmp = getelementptr double, ptr %A, i64 %inc
2140   store ptr %tmp, ptr %ptr
2141   ret { <2 x double>, <2 x double> } %ld1x2
2144 declare { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr)
2147 define { <1 x double>, <1 x double> } @test_v1f64_post_imm_ld1x2(ptr %A, ptr %ptr) {
2148 ; CHECK-LABEL: test_v1f64_post_imm_ld1x2:
2149 ; CHECK:       ; %bb.0:
2150 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0], #16
2151 ; CHECK-NEXT:    str x0, [x1]
2152 ; CHECK-NEXT:    ret
2153   %ld1x2 = tail call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr %A)
2154   %tmp = getelementptr double, ptr %A, i32 2
2155   store ptr %tmp, ptr %ptr
2156   ret { <1 x double>, <1 x double> } %ld1x2
2159 define { <1 x double>, <1 x double> } @test_v1f64_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
2160 ; CHECK-LABEL: test_v1f64_post_reg_ld1x2:
2161 ; CHECK:       ; %bb.0:
2162 ; CHECK-NEXT:    lsl x8, x2, #3
2163 ; CHECK-NEXT:    ld1.1d { v0, v1 }, [x0], x8
2164 ; CHECK-NEXT:    str x0, [x1]
2165 ; CHECK-NEXT:    ret
2166   %ld1x2 = tail call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr %A)
2167   %tmp = getelementptr double, ptr %A, i64 %inc
2168   store ptr %tmp, ptr %ptr
2169   ret { <1 x double>, <1 x double> } %ld1x2
2172 declare { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr)
2175 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld1x3(ptr %A, ptr %ptr) {
2176 ; CHECK-LABEL: test_v16i8_post_imm_ld1x3:
2177 ; CHECK:       ; %bb.0:
2178 ; CHECK-NEXT:    ld1.16b { v0, v1, v2 }, [x0], #48
2179 ; CHECK-NEXT:    str x0, [x1]
2180 ; CHECK-NEXT:    ret
2181   %ld1x3 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr %A)
2182   %tmp = getelementptr i8, ptr %A, i32 48
2183   store ptr %tmp, ptr %ptr
2184   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld1x3
2187 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2188 ; CHECK-LABEL: test_v16i8_post_reg_ld1x3:
2189 ; CHECK:       ; %bb.0:
2190 ; CHECK-NEXT:    ld1.16b { v0, v1, v2 }, [x0], x2
2191 ; CHECK-NEXT:    str x0, [x1]
2192 ; CHECK-NEXT:    ret
2193   %ld1x3 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr %A)
2194   %tmp = getelementptr i8, ptr %A, i64 %inc
2195   store ptr %tmp, ptr %ptr
2196   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld1x3
2199 declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr)
2202 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld1x3(ptr %A, ptr %ptr) {
2203 ; CHECK-LABEL: test_v8i8_post_imm_ld1x3:
2204 ; CHECK:       ; %bb.0:
2205 ; CHECK-NEXT:    ld1.8b { v0, v1, v2 }, [x0], #24
2206 ; CHECK-NEXT:    str x0, [x1]
2207 ; CHECK-NEXT:    ret
2208   %ld1x3 = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr %A)
2209   %tmp = getelementptr i8, ptr %A, i32 24
2210   store ptr %tmp, ptr %ptr
2211   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld1x3
2214 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2215 ; CHECK-LABEL: test_v8i8_post_reg_ld1x3:
2216 ; CHECK:       ; %bb.0:
2217 ; CHECK-NEXT:    ld1.8b { v0, v1, v2 }, [x0], x2
2218 ; CHECK-NEXT:    str x0, [x1]
2219 ; CHECK-NEXT:    ret
2220   %ld1x3 = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr %A)
2221   %tmp = getelementptr i8, ptr %A, i64 %inc
2222   store ptr %tmp, ptr %ptr
2223   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld1x3
2226 declare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr)
2229 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld1x3(ptr %A, ptr %ptr) {
2230 ; CHECK-LABEL: test_v8i16_post_imm_ld1x3:
2231 ; CHECK:       ; %bb.0:
2232 ; CHECK-NEXT:    ld1.8h { v0, v1, v2 }, [x0], #48
2233 ; CHECK-NEXT:    str x0, [x1]
2234 ; CHECK-NEXT:    ret
2235   %ld1x3 = tail call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr %A)
2236   %tmp = getelementptr i16, ptr %A, i32 24
2237   store ptr %tmp, ptr %ptr
2238   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld1x3
2241 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2242 ; CHECK-LABEL: test_v8i16_post_reg_ld1x3:
2243 ; CHECK:       ; %bb.0:
2244 ; CHECK-NEXT:    lsl x8, x2, #1
2245 ; CHECK-NEXT:    ld1.8h { v0, v1, v2 }, [x0], x8
2246 ; CHECK-NEXT:    str x0, [x1]
2247 ; CHECK-NEXT:    ret
2248   %ld1x3 = tail call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr %A)
2249   %tmp = getelementptr i16, ptr %A, i64 %inc
2250   store ptr %tmp, ptr %ptr
2251   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld1x3
2254 declare { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr)
2257 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld1x3(ptr %A, ptr %ptr) {
2258 ; CHECK-LABEL: test_v4i16_post_imm_ld1x3:
2259 ; CHECK:       ; %bb.0:
2260 ; CHECK-NEXT:    ld1.4h { v0, v1, v2 }, [x0], #24
2261 ; CHECK-NEXT:    str x0, [x1]
2262 ; CHECK-NEXT:    ret
2263   %ld1x3 = tail call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr %A)
2264   %tmp = getelementptr i16, ptr %A, i32 12
2265   store ptr %tmp, ptr %ptr
2266   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld1x3
2269 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2270 ; CHECK-LABEL: test_v4i16_post_reg_ld1x3:
2271 ; CHECK:       ; %bb.0:
2272 ; CHECK-NEXT:    lsl x8, x2, #1
2273 ; CHECK-NEXT:    ld1.4h { v0, v1, v2 }, [x0], x8
2274 ; CHECK-NEXT:    str x0, [x1]
2275 ; CHECK-NEXT:    ret
2276   %ld1x3 = tail call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr %A)
2277   %tmp = getelementptr i16, ptr %A, i64 %inc
2278   store ptr %tmp, ptr %ptr
2279   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld1x3
2282 declare { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr)
2285 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld1x3(ptr %A, ptr %ptr) {
2286 ; CHECK-LABEL: test_v4i32_post_imm_ld1x3:
2287 ; CHECK:       ; %bb.0:
2288 ; CHECK-NEXT:    ld1.4s { v0, v1, v2 }, [x0], #48
2289 ; CHECK-NEXT:    str x0, [x1]
2290 ; CHECK-NEXT:    ret
2291   %ld1x3 = tail call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr %A)
2292   %tmp = getelementptr i32, ptr %A, i32 12
2293   store ptr %tmp, ptr %ptr
2294   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld1x3
2297 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2298 ; CHECK-LABEL: test_v4i32_post_reg_ld1x3:
2299 ; CHECK:       ; %bb.0:
2300 ; CHECK-NEXT:    lsl x8, x2, #2
2301 ; CHECK-NEXT:    ld1.4s { v0, v1, v2 }, [x0], x8
2302 ; CHECK-NEXT:    str x0, [x1]
2303 ; CHECK-NEXT:    ret
2304   %ld1x3 = tail call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr %A)
2305   %tmp = getelementptr i32, ptr %A, i64 %inc
2306   store ptr %tmp, ptr %ptr
2307   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld1x3
2310 declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr)
2313 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld1x3(ptr %A, ptr %ptr) {
2314 ; CHECK-LABEL: test_v2i32_post_imm_ld1x3:
2315 ; CHECK:       ; %bb.0:
2316 ; CHECK-NEXT:    ld1.2s { v0, v1, v2 }, [x0], #24
2317 ; CHECK-NEXT:    str x0, [x1]
2318 ; CHECK-NEXT:    ret
2319   %ld1x3 = tail call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr %A)
2320   %tmp = getelementptr i32, ptr %A, i32 6
2321   store ptr %tmp, ptr %ptr
2322   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld1x3
2325 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2326 ; CHECK-LABEL: test_v2i32_post_reg_ld1x3:
2327 ; CHECK:       ; %bb.0:
2328 ; CHECK-NEXT:    lsl x8, x2, #2
2329 ; CHECK-NEXT:    ld1.2s { v0, v1, v2 }, [x0], x8
2330 ; CHECK-NEXT:    str x0, [x1]
2331 ; CHECK-NEXT:    ret
2332   %ld1x3 = tail call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr %A)
2333   %tmp = getelementptr i32, ptr %A, i64 %inc
2334   store ptr %tmp, ptr %ptr
2335   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld1x3
2338 declare { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr)
2341 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld1x3(ptr %A, ptr %ptr) {
2342 ; CHECK-LABEL: test_v2i64_post_imm_ld1x3:
2343 ; CHECK:       ; %bb.0:
2344 ; CHECK-NEXT:    ld1.2d { v0, v1, v2 }, [x0], #48
2345 ; CHECK-NEXT:    str x0, [x1]
2346 ; CHECK-NEXT:    ret
2347   %ld1x3 = tail call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr %A)
2348   %tmp = getelementptr i64, ptr %A, i32 6
2349   store ptr %tmp, ptr %ptr
2350   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld1x3
2353 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2354 ; CHECK-LABEL: test_v2i64_post_reg_ld1x3:
2355 ; CHECK:       ; %bb.0:
2356 ; CHECK-NEXT:    lsl x8, x2, #3
2357 ; CHECK-NEXT:    ld1.2d { v0, v1, v2 }, [x0], x8
2358 ; CHECK-NEXT:    str x0, [x1]
2359 ; CHECK-NEXT:    ret
2360   %ld1x3 = tail call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr %A)
2361   %tmp = getelementptr i64, ptr %A, i64 %inc
2362   store ptr %tmp, ptr %ptr
2363   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld1x3
2366 declare { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr)
2369 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld1x3(ptr %A, ptr %ptr) {
2370 ; CHECK-LABEL: test_v1i64_post_imm_ld1x3:
2371 ; CHECK:       ; %bb.0:
2372 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0], #24
2373 ; CHECK-NEXT:    str x0, [x1]
2374 ; CHECK-NEXT:    ret
2375   %ld1x3 = tail call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr %A)
2376   %tmp = getelementptr i64, ptr %A, i32 3
2377   store ptr %tmp, ptr %ptr
2378   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld1x3
2381 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2382 ; CHECK-LABEL: test_v1i64_post_reg_ld1x3:
2383 ; CHECK:       ; %bb.0:
2384 ; CHECK-NEXT:    lsl x8, x2, #3
2385 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0], x8
2386 ; CHECK-NEXT:    str x0, [x1]
2387 ; CHECK-NEXT:    ret
2388   %ld1x3 = tail call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr %A)
2389   %tmp = getelementptr i64, ptr %A, i64 %inc
2390   store ptr %tmp, ptr %ptr
2391   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld1x3
2394 declare { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr)
2397 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld1x3(ptr %A, ptr %ptr) {
2398 ; CHECK-LABEL: test_v4f32_post_imm_ld1x3:
2399 ; CHECK:       ; %bb.0:
2400 ; CHECK-NEXT:    ld1.4s { v0, v1, v2 }, [x0], #48
2401 ; CHECK-NEXT:    str x0, [x1]
2402 ; CHECK-NEXT:    ret
2403   %ld1x3 = tail call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr %A)
2404   %tmp = getelementptr float, ptr %A, i32 12
2405   store ptr %tmp, ptr %ptr
2406   ret { <4 x float>, <4 x float>, <4 x float> } %ld1x3
2409 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2410 ; CHECK-LABEL: test_v4f32_post_reg_ld1x3:
2411 ; CHECK:       ; %bb.0:
2412 ; CHECK-NEXT:    lsl x8, x2, #2
2413 ; CHECK-NEXT:    ld1.4s { v0, v1, v2 }, [x0], x8
2414 ; CHECK-NEXT:    str x0, [x1]
2415 ; CHECK-NEXT:    ret
2416   %ld1x3 = tail call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr %A)
2417   %tmp = getelementptr float, ptr %A, i64 %inc
2418   store ptr %tmp, ptr %ptr
2419   ret { <4 x float>, <4 x float>, <4 x float> } %ld1x3
2422 declare { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr)
2425 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld1x3(ptr %A, ptr %ptr) {
2426 ; CHECK-LABEL: test_v2f32_post_imm_ld1x3:
2427 ; CHECK:       ; %bb.0:
2428 ; CHECK-NEXT:    ld1.2s { v0, v1, v2 }, [x0], #24
2429 ; CHECK-NEXT:    str x0, [x1]
2430 ; CHECK-NEXT:    ret
2431   %ld1x3 = tail call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr %A)
2432   %tmp = getelementptr float, ptr %A, i32 6
2433   store ptr %tmp, ptr %ptr
2434   ret { <2 x float>, <2 x float>, <2 x float> } %ld1x3
2437 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2438 ; CHECK-LABEL: test_v2f32_post_reg_ld1x3:
2439 ; CHECK:       ; %bb.0:
2440 ; CHECK-NEXT:    lsl x8, x2, #2
2441 ; CHECK-NEXT:    ld1.2s { v0, v1, v2 }, [x0], x8
2442 ; CHECK-NEXT:    str x0, [x1]
2443 ; CHECK-NEXT:    ret
2444   %ld1x3 = tail call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr %A)
2445   %tmp = getelementptr float, ptr %A, i64 %inc
2446   store ptr %tmp, ptr %ptr
2447   ret { <2 x float>, <2 x float>, <2 x float> } %ld1x3
2450 declare { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr)
2453 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld1x3(ptr %A, ptr %ptr) {
2454 ; CHECK-LABEL: test_v2f64_post_imm_ld1x3:
2455 ; CHECK:       ; %bb.0:
2456 ; CHECK-NEXT:    ld1.2d { v0, v1, v2 }, [x0], #48
2457 ; CHECK-NEXT:    str x0, [x1]
2458 ; CHECK-NEXT:    ret
2459   %ld1x3 = tail call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr %A)
2460   %tmp = getelementptr double, ptr %A, i32 6
2461   store ptr %tmp, ptr %ptr
2462   ret { <2 x double>, <2 x double>, <2 x double> } %ld1x3
2465 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2466 ; CHECK-LABEL: test_v2f64_post_reg_ld1x3:
2467 ; CHECK:       ; %bb.0:
2468 ; CHECK-NEXT:    lsl x8, x2, #3
2469 ; CHECK-NEXT:    ld1.2d { v0, v1, v2 }, [x0], x8
2470 ; CHECK-NEXT:    str x0, [x1]
2471 ; CHECK-NEXT:    ret
2472   %ld1x3 = tail call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr %A)
2473   %tmp = getelementptr double, ptr %A, i64 %inc
2474   store ptr %tmp, ptr %ptr
2475   ret { <2 x double>, <2 x double>, <2 x double> } %ld1x3
2478 declare { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr)
2481 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld1x3(ptr %A, ptr %ptr) {
2482 ; CHECK-LABEL: test_v1f64_post_imm_ld1x3:
2483 ; CHECK:       ; %bb.0:
2484 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0], #24
2485 ; CHECK-NEXT:    str x0, [x1]
2486 ; CHECK-NEXT:    ret
2487   %ld1x3 = tail call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr %A)
2488   %tmp = getelementptr double, ptr %A, i32 3
2489   store ptr %tmp, ptr %ptr
2490   ret { <1 x double>, <1 x double>, <1 x double> } %ld1x3
2493 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
2494 ; CHECK-LABEL: test_v1f64_post_reg_ld1x3:
2495 ; CHECK:       ; %bb.0:
2496 ; CHECK-NEXT:    lsl x8, x2, #3
2497 ; CHECK-NEXT:    ld1.1d { v0, v1, v2 }, [x0], x8
2498 ; CHECK-NEXT:    str x0, [x1]
2499 ; CHECK-NEXT:    ret
2500   %ld1x3 = tail call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr %A)
2501   %tmp = getelementptr double, ptr %A, i64 %inc
2502   store ptr %tmp, ptr %ptr
2503   ret { <1 x double>, <1 x double>, <1 x double> } %ld1x3
2506 declare { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr)
2509 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld1x4(ptr %A, ptr %ptr) {
2510 ; CHECK-LABEL: test_v16i8_post_imm_ld1x4:
2511 ; CHECK:       ; %bb.0:
2512 ; CHECK-NEXT:    ld1.16b { v0, v1, v2, v3 }, [x0], #64
2513 ; CHECK-NEXT:    str x0, [x1]
2514 ; CHECK-NEXT:    ret
2515   %ld1x4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr %A)
2516   %tmp = getelementptr i8, ptr %A, i32 64
2517   store ptr %tmp, ptr %ptr
2518   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld1x4
2521 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2522 ; CHECK-LABEL: test_v16i8_post_reg_ld1x4:
2523 ; CHECK:       ; %bb.0:
2524 ; CHECK-NEXT:    ld1.16b { v0, v1, v2, v3 }, [x0], x2
2525 ; CHECK-NEXT:    str x0, [x1]
2526 ; CHECK-NEXT:    ret
2527   %ld1x4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr %A)
2528   %tmp = getelementptr i8, ptr %A, i64 %inc
2529   store ptr %tmp, ptr %ptr
2530   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld1x4
2533 declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr)
2536 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld1x4(ptr %A, ptr %ptr) {
2537 ; CHECK-LABEL: test_v8i8_post_imm_ld1x4:
2538 ; CHECK:       ; %bb.0:
2539 ; CHECK-NEXT:    ld1.8b { v0, v1, v2, v3 }, [x0], #32
2540 ; CHECK-NEXT:    str x0, [x1]
2541 ; CHECK-NEXT:    ret
2542   %ld1x4 = tail call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr %A)
2543   %tmp = getelementptr i8, ptr %A, i32 32
2544   store ptr %tmp, ptr %ptr
2545   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld1x4
2548 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2549 ; CHECK-LABEL: test_v8i8_post_reg_ld1x4:
2550 ; CHECK:       ; %bb.0:
2551 ; CHECK-NEXT:    ld1.8b { v0, v1, v2, v3 }, [x0], x2
2552 ; CHECK-NEXT:    str x0, [x1]
2553 ; CHECK-NEXT:    ret
2554   %ld1x4 = tail call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr %A)
2555   %tmp = getelementptr i8, ptr %A, i64 %inc
2556   store ptr %tmp, ptr %ptr
2557   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld1x4
2560 declare { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr)
2563 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld1x4(ptr %A, ptr %ptr) {
2564 ; CHECK-LABEL: test_v8i16_post_imm_ld1x4:
2565 ; CHECK:       ; %bb.0:
2566 ; CHECK-NEXT:    ld1.8h { v0, v1, v2, v3 }, [x0], #64
2567 ; CHECK-NEXT:    str x0, [x1]
2568 ; CHECK-NEXT:    ret
2569   %ld1x4 = tail call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr %A)
2570   %tmp = getelementptr i16, ptr %A, i32 32
2571   store ptr %tmp, ptr %ptr
2572   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld1x4
2575 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2576 ; CHECK-LABEL: test_v8i16_post_reg_ld1x4:
2577 ; CHECK:       ; %bb.0:
2578 ; CHECK-NEXT:    lsl x8, x2, #1
2579 ; CHECK-NEXT:    ld1.8h { v0, v1, v2, v3 }, [x0], x8
2580 ; CHECK-NEXT:    str x0, [x1]
2581 ; CHECK-NEXT:    ret
2582   %ld1x4 = tail call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr %A)
2583   %tmp = getelementptr i16, ptr %A, i64 %inc
2584   store ptr %tmp, ptr %ptr
2585   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld1x4
2588 declare { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr)
2591 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld1x4(ptr %A, ptr %ptr) {
2592 ; CHECK-LABEL: test_v4i16_post_imm_ld1x4:
2593 ; CHECK:       ; %bb.0:
2594 ; CHECK-NEXT:    ld1.4h { v0, v1, v2, v3 }, [x0], #32
2595 ; CHECK-NEXT:    str x0, [x1]
2596 ; CHECK-NEXT:    ret
2597   %ld1x4 = tail call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr %A)
2598   %tmp = getelementptr i16, ptr %A, i32 16
2599   store ptr %tmp, ptr %ptr
2600   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld1x4
2603 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2604 ; CHECK-LABEL: test_v4i16_post_reg_ld1x4:
2605 ; CHECK:       ; %bb.0:
2606 ; CHECK-NEXT:    lsl x8, x2, #1
2607 ; CHECK-NEXT:    ld1.4h { v0, v1, v2, v3 }, [x0], x8
2608 ; CHECK-NEXT:    str x0, [x1]
2609 ; CHECK-NEXT:    ret
2610   %ld1x4 = tail call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr %A)
2611   %tmp = getelementptr i16, ptr %A, i64 %inc
2612   store ptr %tmp, ptr %ptr
2613   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld1x4
2616 declare { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr)
2619 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld1x4(ptr %A, ptr %ptr) {
2620 ; CHECK-LABEL: test_v4i32_post_imm_ld1x4:
2621 ; CHECK:       ; %bb.0:
2622 ; CHECK-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0], #64
2623 ; CHECK-NEXT:    str x0, [x1]
2624 ; CHECK-NEXT:    ret
2625   %ld1x4 = tail call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr %A)
2626   %tmp = getelementptr i32, ptr %A, i32 16
2627   store ptr %tmp, ptr %ptr
2628   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld1x4
2631 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2632 ; CHECK-LABEL: test_v4i32_post_reg_ld1x4:
2633 ; CHECK:       ; %bb.0:
2634 ; CHECK-NEXT:    lsl x8, x2, #2
2635 ; CHECK-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0], x8
2636 ; CHECK-NEXT:    str x0, [x1]
2637 ; CHECK-NEXT:    ret
2638   %ld1x4 = tail call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr %A)
2639   %tmp = getelementptr i32, ptr %A, i64 %inc
2640   store ptr %tmp, ptr %ptr
2641   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld1x4
2644 declare { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr)
2647 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld1x4(ptr %A, ptr %ptr) {
2648 ; CHECK-LABEL: test_v2i32_post_imm_ld1x4:
2649 ; CHECK:       ; %bb.0:
2650 ; CHECK-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0], #32
2651 ; CHECK-NEXT:    str x0, [x1]
2652 ; CHECK-NEXT:    ret
2653   %ld1x4 = tail call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr %A)
2654   %tmp = getelementptr i32, ptr %A, i32 8
2655   store ptr %tmp, ptr %ptr
2656   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld1x4
2659 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2660 ; CHECK-LABEL: test_v2i32_post_reg_ld1x4:
2661 ; CHECK:       ; %bb.0:
2662 ; CHECK-NEXT:    lsl x8, x2, #2
2663 ; CHECK-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0], x8
2664 ; CHECK-NEXT:    str x0, [x1]
2665 ; CHECK-NEXT:    ret
2666   %ld1x4 = tail call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr %A)
2667   %tmp = getelementptr i32, ptr %A, i64 %inc
2668   store ptr %tmp, ptr %ptr
2669   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld1x4
2672 declare { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr)
2675 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld1x4(ptr %A, ptr %ptr) {
2676 ; CHECK-LABEL: test_v2i64_post_imm_ld1x4:
2677 ; CHECK:       ; %bb.0:
2678 ; CHECK-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0], #64
2679 ; CHECK-NEXT:    str x0, [x1]
2680 ; CHECK-NEXT:    ret
2681   %ld1x4 = tail call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr %A)
2682   %tmp = getelementptr i64, ptr %A, i32 8
2683   store ptr %tmp, ptr %ptr
2684   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld1x4
2687 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2688 ; CHECK-LABEL: test_v2i64_post_reg_ld1x4:
2689 ; CHECK:       ; %bb.0:
2690 ; CHECK-NEXT:    lsl x8, x2, #3
2691 ; CHECK-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0], x8
2692 ; CHECK-NEXT:    str x0, [x1]
2693 ; CHECK-NEXT:    ret
2694   %ld1x4 = tail call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr %A)
2695   %tmp = getelementptr i64, ptr %A, i64 %inc
2696   store ptr %tmp, ptr %ptr
2697   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld1x4
2700 declare { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr)
2703 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld1x4(ptr %A, ptr %ptr) {
2704 ; CHECK-LABEL: test_v1i64_post_imm_ld1x4:
2705 ; CHECK:       ; %bb.0:
2706 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], #32
2707 ; CHECK-NEXT:    str x0, [x1]
2708 ; CHECK-NEXT:    ret
2709   %ld1x4 = tail call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr %A)
2710   %tmp = getelementptr i64, ptr %A, i32 4
2711   store ptr %tmp, ptr %ptr
2712   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld1x4
2715 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2716 ; CHECK-LABEL: test_v1i64_post_reg_ld1x4:
2717 ; CHECK:       ; %bb.0:
2718 ; CHECK-NEXT:    lsl x8, x2, #3
2719 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], x8
2720 ; CHECK-NEXT:    str x0, [x1]
2721 ; CHECK-NEXT:    ret
2722   %ld1x4 = tail call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr %A)
2723   %tmp = getelementptr i64, ptr %A, i64 %inc
2724   store ptr %tmp, ptr %ptr
2725   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld1x4
2728 declare { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr)
2731 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld1x4(ptr %A, ptr %ptr) {
2732 ; CHECK-LABEL: test_v4f32_post_imm_ld1x4:
2733 ; CHECK:       ; %bb.0:
2734 ; CHECK-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0], #64
2735 ; CHECK-NEXT:    str x0, [x1]
2736 ; CHECK-NEXT:    ret
2737   %ld1x4 = tail call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr %A)
2738   %tmp = getelementptr float, ptr %A, i32 16
2739   store ptr %tmp, ptr %ptr
2740   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld1x4
2743 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2744 ; CHECK-LABEL: test_v4f32_post_reg_ld1x4:
2745 ; CHECK:       ; %bb.0:
2746 ; CHECK-NEXT:    lsl x8, x2, #2
2747 ; CHECK-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0], x8
2748 ; CHECK-NEXT:    str x0, [x1]
2749 ; CHECK-NEXT:    ret
2750   %ld1x4 = tail call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr %A)
2751   %tmp = getelementptr float, ptr %A, i64 %inc
2752   store ptr %tmp, ptr %ptr
2753   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld1x4
2756 declare { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr)
2759 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld1x4(ptr %A, ptr %ptr) {
2760 ; CHECK-LABEL: test_v2f32_post_imm_ld1x4:
2761 ; CHECK:       ; %bb.0:
2762 ; CHECK-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0], #32
2763 ; CHECK-NEXT:    str x0, [x1]
2764 ; CHECK-NEXT:    ret
2765   %ld1x4 = tail call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr %A)
2766   %tmp = getelementptr float, ptr %A, i32 8
2767   store ptr %tmp, ptr %ptr
2768   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld1x4
2771 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2772 ; CHECK-LABEL: test_v2f32_post_reg_ld1x4:
2773 ; CHECK:       ; %bb.0:
2774 ; CHECK-NEXT:    lsl x8, x2, #2
2775 ; CHECK-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0], x8
2776 ; CHECK-NEXT:    str x0, [x1]
2777 ; CHECK-NEXT:    ret
2778   %ld1x4 = tail call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr %A)
2779   %tmp = getelementptr float, ptr %A, i64 %inc
2780   store ptr %tmp, ptr %ptr
2781   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld1x4
2784 declare { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr)
2787 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld1x4(ptr %A, ptr %ptr) {
2788 ; CHECK-LABEL: test_v2f64_post_imm_ld1x4:
2789 ; CHECK:       ; %bb.0:
2790 ; CHECK-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0], #64
2791 ; CHECK-NEXT:    str x0, [x1]
2792 ; CHECK-NEXT:    ret
2793   %ld1x4 = tail call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr %A)
2794   %tmp = getelementptr double, ptr %A, i32 8
2795   store ptr %tmp, ptr %ptr
2796   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld1x4
2799 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2800 ; CHECK-LABEL: test_v2f64_post_reg_ld1x4:
2801 ; CHECK:       ; %bb.0:
2802 ; CHECK-NEXT:    lsl x8, x2, #3
2803 ; CHECK-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0], x8
2804 ; CHECK-NEXT:    str x0, [x1]
2805 ; CHECK-NEXT:    ret
2806   %ld1x4 = tail call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr %A)
2807   %tmp = getelementptr double, ptr %A, i64 %inc
2808   store ptr %tmp, ptr %ptr
2809   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld1x4
2812 declare { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr)
2815 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld1x4(ptr %A, ptr %ptr) {
2816 ; CHECK-LABEL: test_v1f64_post_imm_ld1x4:
2817 ; CHECK:       ; %bb.0:
2818 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], #32
2819 ; CHECK-NEXT:    str x0, [x1]
2820 ; CHECK-NEXT:    ret
2821   %ld1x4 = tail call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr %A)
2822   %tmp = getelementptr double, ptr %A, i32 4
2823   store ptr %tmp, ptr %ptr
2824   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld1x4
2827 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
2828 ; CHECK-LABEL: test_v1f64_post_reg_ld1x4:
2829 ; CHECK:       ; %bb.0:
2830 ; CHECK-NEXT:    lsl x8, x2, #3
2831 ; CHECK-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], x8
2832 ; CHECK-NEXT:    str x0, [x1]
2833 ; CHECK-NEXT:    ret
2834   %ld1x4 = tail call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr %A)
2835   %tmp = getelementptr double, ptr %A, i64 %inc
2836   store ptr %tmp, ptr %ptr
2837   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld1x4
2840 declare { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr)
2843 define { <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
2844 ; CHECK-LABEL: test_v16i8_post_imm_ld2r:
2845 ; CHECK:       ; %bb.0:
2846 ; CHECK-NEXT:    ld2r.16b { v0, v1 }, [x0], #2
2847 ; CHECK-NEXT:    str x0, [x1]
2848 ; CHECK-NEXT:    ret
2849   %ld2 = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2r.v16i8.p0(ptr %A)
2850   %tmp = getelementptr i8, ptr %A, i32 2
2851   store ptr %tmp, ptr %ptr
2852   ret { <16 x i8>, <16 x i8> } %ld2
2855 define { <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
2856 ; CHECK-LABEL: test_v16i8_post_reg_ld2r:
2857 ; CHECK:       ; %bb.0:
2858 ; CHECK-NEXT:    ld2r.16b { v0, v1 }, [x0], x2
2859 ; CHECK-NEXT:    str x0, [x1]
2860 ; CHECK-NEXT:    ret
2861   %ld2 = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2r.v16i8.p0(ptr %A)
2862   %tmp = getelementptr i8, ptr %A, i64 %inc
2863   store ptr %tmp, ptr %ptr
2864   ret { <16 x i8>, <16 x i8> } %ld2
2867 declare { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2r.v16i8.p0(ptr) nounwind readonly
2870 define { <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
2871 ; CHECK-LABEL: test_v8i8_post_imm_ld2r:
2872 ; CHECK:       ; %bb.0:
2873 ; CHECK-NEXT:    ld2r.8b { v0, v1 }, [x0], #2
2874 ; CHECK-NEXT:    str x0, [x1]
2875 ; CHECK-NEXT:    ret
2876   %ld2 = call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2r.v8i8.p0(ptr %A)
2877   %tmp = getelementptr i8, ptr %A, i32 2
2878   store ptr %tmp, ptr %ptr
2879   ret { <8 x i8>, <8 x i8> } %ld2
2882 define { <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
2883 ; CHECK-LABEL: test_v8i8_post_reg_ld2r:
2884 ; CHECK:       ; %bb.0:
2885 ; CHECK-NEXT:    ld2r.8b { v0, v1 }, [x0], x2
2886 ; CHECK-NEXT:    str x0, [x1]
2887 ; CHECK-NEXT:    ret
2888   %ld2 = call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2r.v8i8.p0(ptr %A)
2889   %tmp = getelementptr i8, ptr %A, i64 %inc
2890   store ptr %tmp, ptr %ptr
2891   ret { <8 x i8>, <8 x i8> } %ld2
2894 declare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2r.v8i8.p0(ptr) nounwind readonly
2897 define { <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
2898 ; CHECK-LABEL: test_v8i16_post_imm_ld2r:
2899 ; CHECK:       ; %bb.0:
2900 ; CHECK-NEXT:    ld2r.8h { v0, v1 }, [x0], #4
2901 ; CHECK-NEXT:    str x0, [x1]
2902 ; CHECK-NEXT:    ret
2903   %ld2 = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2r.v8i16.p0(ptr %A)
2904   %tmp = getelementptr i16, ptr %A, i32 2
2905   store ptr %tmp, ptr %ptr
2906   ret { <8 x i16>, <8 x i16> } %ld2
2909 define { <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
2910 ; CHECK-LABEL: test_v8i16_post_reg_ld2r:
2911 ; CHECK:       ; %bb.0:
2912 ; CHECK-NEXT:    lsl x8, x2, #1
2913 ; CHECK-NEXT:    ld2r.8h { v0, v1 }, [x0], x8
2914 ; CHECK-NEXT:    str x0, [x1]
2915 ; CHECK-NEXT:    ret
2916   %ld2 = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2r.v8i16.p0(ptr %A)
2917   %tmp = getelementptr i16, ptr %A, i64 %inc
2918   store ptr %tmp, ptr %ptr
2919   ret { <8 x i16>, <8 x i16> } %ld2
2922 declare { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2r.v8i16.p0(ptr) nounwind readonly
2925 define { <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
2926 ; CHECK-LABEL: test_v4i16_post_imm_ld2r:
2927 ; CHECK:       ; %bb.0:
2928 ; CHECK-NEXT:    ld2r.4h { v0, v1 }, [x0], #4
2929 ; CHECK-NEXT:    str x0, [x1]
2930 ; CHECK-NEXT:    ret
2931   %ld2 = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2r.v4i16.p0(ptr %A)
2932   %tmp = getelementptr i16, ptr %A, i32 2
2933   store ptr %tmp, ptr %ptr
2934   ret { <4 x i16>, <4 x i16> } %ld2
2937 define { <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
2938 ; CHECK-LABEL: test_v4i16_post_reg_ld2r:
2939 ; CHECK:       ; %bb.0:
2940 ; CHECK-NEXT:    lsl x8, x2, #1
2941 ; CHECK-NEXT:    ld2r.4h { v0, v1 }, [x0], x8
2942 ; CHECK-NEXT:    str x0, [x1]
2943 ; CHECK-NEXT:    ret
2944   %ld2 = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2r.v4i16.p0(ptr %A)
2945   %tmp = getelementptr i16, ptr %A, i64 %inc
2946   store ptr %tmp, ptr %ptr
2947   ret { <4 x i16>, <4 x i16> } %ld2
2950 declare { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2r.v4i16.p0(ptr) nounwind readonly
2953 define { <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
2954 ; CHECK-LABEL: test_v4i32_post_imm_ld2r:
2955 ; CHECK:       ; %bb.0:
2956 ; CHECK-NEXT:    ld2r.4s { v0, v1 }, [x0], #8
2957 ; CHECK-NEXT:    str x0, [x1]
2958 ; CHECK-NEXT:    ret
2959   %ld2 = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2r.v4i32.p0(ptr %A)
2960   %tmp = getelementptr i32, ptr %A, i32 2
2961   store ptr %tmp, ptr %ptr
2962   ret { <4 x i32>, <4 x i32> } %ld2
2965 define { <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
2966 ; CHECK-LABEL: test_v4i32_post_reg_ld2r:
2967 ; CHECK:       ; %bb.0:
2968 ; CHECK-NEXT:    lsl x8, x2, #2
2969 ; CHECK-NEXT:    ld2r.4s { v0, v1 }, [x0], x8
2970 ; CHECK-NEXT:    str x0, [x1]
2971 ; CHECK-NEXT:    ret
2972   %ld2 = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2r.v4i32.p0(ptr %A)
2973   %tmp = getelementptr i32, ptr %A, i64 %inc
2974   store ptr %tmp, ptr %ptr
2975   ret { <4 x i32>, <4 x i32> } %ld2
2978 declare { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2r.v4i32.p0(ptr) nounwind readonly
2980 define { <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
2981 ; CHECK-LABEL: test_v2i32_post_imm_ld2r:
2982 ; CHECK:       ; %bb.0:
2983 ; CHECK-NEXT:    ld2r.2s { v0, v1 }, [x0], #8
2984 ; CHECK-NEXT:    str x0, [x1]
2985 ; CHECK-NEXT:    ret
2986   %ld2 = call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2r.v2i32.p0(ptr %A)
2987   %tmp = getelementptr i32, ptr %A, i32 2
2988   store ptr %tmp, ptr %ptr
2989   ret { <2 x i32>, <2 x i32> } %ld2
2992 define { <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
2993 ; CHECK-LABEL: test_v2i32_post_reg_ld2r:
2994 ; CHECK:       ; %bb.0:
2995 ; CHECK-NEXT:    lsl x8, x2, #2
2996 ; CHECK-NEXT:    ld2r.2s { v0, v1 }, [x0], x8
2997 ; CHECK-NEXT:    str x0, [x1]
2998 ; CHECK-NEXT:    ret
2999   %ld2 = call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2r.v2i32.p0(ptr %A)
3000   %tmp = getelementptr i32, ptr %A, i64 %inc
3001   store ptr %tmp, ptr %ptr
3002   ret { <2 x i32>, <2 x i32> } %ld2
3005 declare { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2r.v2i32.p0(ptr) nounwind readonly
3008 define { <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
3009 ; CHECK-LABEL: test_v2i64_post_imm_ld2r:
3010 ; CHECK:       ; %bb.0:
3011 ; CHECK-NEXT:    ld2r.2d { v0, v1 }, [x0], #16
3012 ; CHECK-NEXT:    str x0, [x1]
3013 ; CHECK-NEXT:    ret
3014   %ld2 = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2r.v2i64.p0(ptr %A)
3015   %tmp = getelementptr i64, ptr %A, i32 2
3016   store ptr %tmp, ptr %ptr
3017   ret { <2 x i64>, <2 x i64> } %ld2
3020 define { <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3021 ; CHECK-LABEL: test_v2i64_post_reg_ld2r:
3022 ; CHECK:       ; %bb.0:
3023 ; CHECK-NEXT:    lsl x8, x2, #3
3024 ; CHECK-NEXT:    ld2r.2d { v0, v1 }, [x0], x8
3025 ; CHECK-NEXT:    str x0, [x1]
3026 ; CHECK-NEXT:    ret
3027   %ld2 = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2r.v2i64.p0(ptr %A)
3028   %tmp = getelementptr i64, ptr %A, i64 %inc
3029   store ptr %tmp, ptr %ptr
3030   ret { <2 x i64>, <2 x i64> } %ld2
3033 declare { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2r.v2i64.p0(ptr) nounwind readonly
3035 define { <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
3036 ; CHECK-LABEL: test_v1i64_post_imm_ld2r:
3037 ; CHECK:       ; %bb.0:
3038 ; CHECK-NEXT:    ld2r.1d { v0, v1 }, [x0], #16
3039 ; CHECK-NEXT:    str x0, [x1]
3040 ; CHECK-NEXT:    ret
3041   %ld2 = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2r.v1i64.p0(ptr %A)
3042   %tmp = getelementptr i64, ptr %A, i32 2
3043   store ptr %tmp, ptr %ptr
3044   ret { <1 x i64>, <1 x i64> } %ld2
3047 define { <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3048 ; CHECK-LABEL: test_v1i64_post_reg_ld2r:
3049 ; CHECK:       ; %bb.0:
3050 ; CHECK-NEXT:    lsl x8, x2, #3
3051 ; CHECK-NEXT:    ld2r.1d { v0, v1 }, [x0], x8
3052 ; CHECK-NEXT:    str x0, [x1]
3053 ; CHECK-NEXT:    ret
3054   %ld2 = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2r.v1i64.p0(ptr %A)
3055   %tmp = getelementptr i64, ptr %A, i64 %inc
3056   store ptr %tmp, ptr %ptr
3057   ret { <1 x i64>, <1 x i64> } %ld2
3060 declare { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2r.v1i64.p0(ptr) nounwind readonly
3063 define { <4 x float>, <4 x float> } @test_v4f32_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
3064 ; CHECK-LABEL: test_v4f32_post_imm_ld2r:
3065 ; CHECK:       ; %bb.0:
3066 ; CHECK-NEXT:    ld2r.4s { v0, v1 }, [x0], #8
3067 ; CHECK-NEXT:    str x0, [x1]
3068 ; CHECK-NEXT:    ret
3069   %ld2 = call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2r.v4f32.p0(ptr %A)
3070   %tmp = getelementptr float, ptr %A, i32 2
3071   store ptr %tmp, ptr %ptr
3072   ret { <4 x float>, <4 x float> } %ld2
3075 define { <4 x float>, <4 x float> } @test_v4f32_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3076 ; CHECK-LABEL: test_v4f32_post_reg_ld2r:
3077 ; CHECK:       ; %bb.0:
3078 ; CHECK-NEXT:    lsl x8, x2, #2
3079 ; CHECK-NEXT:    ld2r.4s { v0, v1 }, [x0], x8
3080 ; CHECK-NEXT:    str x0, [x1]
3081 ; CHECK-NEXT:    ret
3082   %ld2 = call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2r.v4f32.p0(ptr %A)
3083   %tmp = getelementptr float, ptr %A, i64 %inc
3084   store ptr %tmp, ptr %ptr
3085   ret { <4 x float>, <4 x float> } %ld2
3088 declare { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2r.v4f32.p0(ptr) nounwind readonly
3090 define { <2 x float>, <2 x float> } @test_v2f32_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
3091 ; CHECK-LABEL: test_v2f32_post_imm_ld2r:
3092 ; CHECK:       ; %bb.0:
3093 ; CHECK-NEXT:    ld2r.2s { v0, v1 }, [x0], #8
3094 ; CHECK-NEXT:    str x0, [x1]
3095 ; CHECK-NEXT:    ret
3096   %ld2 = call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2r.v2f32.p0(ptr %A)
3097   %tmp = getelementptr float, ptr %A, i32 2
3098   store ptr %tmp, ptr %ptr
3099   ret { <2 x float>, <2 x float> } %ld2
3102 define { <2 x float>, <2 x float> } @test_v2f32_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3103 ; CHECK-LABEL: test_v2f32_post_reg_ld2r:
3104 ; CHECK:       ; %bb.0:
3105 ; CHECK-NEXT:    lsl x8, x2, #2
3106 ; CHECK-NEXT:    ld2r.2s { v0, v1 }, [x0], x8
3107 ; CHECK-NEXT:    str x0, [x1]
3108 ; CHECK-NEXT:    ret
3109   %ld2 = call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2r.v2f32.p0(ptr %A)
3110   %tmp = getelementptr float, ptr %A, i64 %inc
3111   store ptr %tmp, ptr %ptr
3112   ret { <2 x float>, <2 x float> } %ld2
3115 declare { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2r.v2f32.p0(ptr) nounwind readonly
3118 define { <2 x double>, <2 x double> } @test_v2f64_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
3119 ; CHECK-LABEL: test_v2f64_post_imm_ld2r:
3120 ; CHECK:       ; %bb.0:
3121 ; CHECK-NEXT:    ld2r.2d { v0, v1 }, [x0], #16
3122 ; CHECK-NEXT:    str x0, [x1]
3123 ; CHECK-NEXT:    ret
3124   %ld2 = call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2r.v2f64.p0(ptr %A)
3125   %tmp = getelementptr double, ptr %A, i32 2
3126   store ptr %tmp, ptr %ptr
3127   ret { <2 x double>, <2 x double> } %ld2
3130 define { <2 x double>, <2 x double> } @test_v2f64_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3131 ; CHECK-LABEL: test_v2f64_post_reg_ld2r:
3132 ; CHECK:       ; %bb.0:
3133 ; CHECK-NEXT:    lsl x8, x2, #3
3134 ; CHECK-NEXT:    ld2r.2d { v0, v1 }, [x0], x8
3135 ; CHECK-NEXT:    str x0, [x1]
3136 ; CHECK-NEXT:    ret
3137   %ld2 = call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2r.v2f64.p0(ptr %A)
3138   %tmp = getelementptr double, ptr %A, i64 %inc
3139   store ptr %tmp, ptr %ptr
3140   ret { <2 x double>, <2 x double> } %ld2
3143 declare { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2r.v2f64.p0(ptr) nounwind readonly
3145 define { <1 x double>, <1 x double> } @test_v1f64_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
3146 ; CHECK-LABEL: test_v1f64_post_imm_ld2r:
3147 ; CHECK:       ; %bb.0:
3148 ; CHECK-NEXT:    ld2r.1d { v0, v1 }, [x0], #16
3149 ; CHECK-NEXT:    str x0, [x1]
3150 ; CHECK-NEXT:    ret
3151   %ld2 = call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2r.v1f64.p0(ptr %A)
3152   %tmp = getelementptr double, ptr %A, i32 2
3153   store ptr %tmp, ptr %ptr
3154   ret { <1 x double>, <1 x double> } %ld2
3157 define { <1 x double>, <1 x double> } @test_v1f64_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3158 ; CHECK-LABEL: test_v1f64_post_reg_ld2r:
3159 ; CHECK:       ; %bb.0:
3160 ; CHECK-NEXT:    lsl x8, x2, #3
3161 ; CHECK-NEXT:    ld2r.1d { v0, v1 }, [x0], x8
3162 ; CHECK-NEXT:    str x0, [x1]
3163 ; CHECK-NEXT:    ret
3164   %ld2 = call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2r.v1f64.p0(ptr %A)
3165   %tmp = getelementptr double, ptr %A, i64 %inc
3166   store ptr %tmp, ptr %ptr
3167   ret { <1 x double>, <1 x double> } %ld2
3170 declare { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2r.v1f64.p0(ptr) nounwind readonly
3173 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3174 ; CHECK-LABEL: test_v16i8_post_imm_ld3r:
3175 ; CHECK:       ; %bb.0:
3176 ; CHECK-NEXT:    ld3r.16b { v0, v1, v2 }, [x0], #3
3177 ; CHECK-NEXT:    str x0, [x1]
3178 ; CHECK-NEXT:    ret
3179   %ld3 = call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3r.v16i8.p0(ptr %A)
3180   %tmp = getelementptr i8, ptr %A, i32 3
3181   store ptr %tmp, ptr %ptr
3182   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
3185 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3186 ; CHECK-LABEL: test_v16i8_post_reg_ld3r:
3187 ; CHECK:       ; %bb.0:
3188 ; CHECK-NEXT:    ld3r.16b { v0, v1, v2 }, [x0], x2
3189 ; CHECK-NEXT:    str x0, [x1]
3190 ; CHECK-NEXT:    ret
3191   %ld3 = call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3r.v16i8.p0(ptr %A)
3192   %tmp = getelementptr i8, ptr %A, i64 %inc
3193   store ptr %tmp, ptr %ptr
3194   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
3197 declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3r.v16i8.p0(ptr) nounwind readonly
3200 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3201 ; CHECK-LABEL: test_v8i8_post_imm_ld3r:
3202 ; CHECK:       ; %bb.0:
3203 ; CHECK-NEXT:    ld3r.8b { v0, v1, v2 }, [x0], #3
3204 ; CHECK-NEXT:    str x0, [x1]
3205 ; CHECK-NEXT:    ret
3206   %ld3 = call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3r.v8i8.p0(ptr %A)
3207   %tmp = getelementptr i8, ptr %A, i32 3
3208   store ptr %tmp, ptr %ptr
3209   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
3212 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3213 ; CHECK-LABEL: test_v8i8_post_reg_ld3r:
3214 ; CHECK:       ; %bb.0:
3215 ; CHECK-NEXT:    ld3r.8b { v0, v1, v2 }, [x0], x2
3216 ; CHECK-NEXT:    str x0, [x1]
3217 ; CHECK-NEXT:    ret
3218   %ld3 = call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3r.v8i8.p0(ptr %A)
3219   %tmp = getelementptr i8, ptr %A, i64 %inc
3220   store ptr %tmp, ptr %ptr
3221   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
3224 declare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3r.v8i8.p0(ptr) nounwind readonly
3227 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3228 ; CHECK-LABEL: test_v8i16_post_imm_ld3r:
3229 ; CHECK:       ; %bb.0:
3230 ; CHECK-NEXT:    ld3r.8h { v0, v1, v2 }, [x0], #6
3231 ; CHECK-NEXT:    str x0, [x1]
3232 ; CHECK-NEXT:    ret
3233   %ld3 = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3r.v8i16.p0(ptr %A)
3234   %tmp = getelementptr i16, ptr %A, i32 3
3235   store ptr %tmp, ptr %ptr
3236   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
3239 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3240 ; CHECK-LABEL: test_v8i16_post_reg_ld3r:
3241 ; CHECK:       ; %bb.0:
3242 ; CHECK-NEXT:    lsl x8, x2, #1
3243 ; CHECK-NEXT:    ld3r.8h { v0, v1, v2 }, [x0], x8
3244 ; CHECK-NEXT:    str x0, [x1]
3245 ; CHECK-NEXT:    ret
3246   %ld3 = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3r.v8i16.p0(ptr %A)
3247   %tmp = getelementptr i16, ptr %A, i64 %inc
3248   store ptr %tmp, ptr %ptr
3249   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
3252 declare { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3r.v8i16.p0(ptr) nounwind readonly
3255 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3256 ; CHECK-LABEL: test_v4i16_post_imm_ld3r:
3257 ; CHECK:       ; %bb.0:
3258 ; CHECK-NEXT:    ld3r.4h { v0, v1, v2 }, [x0], #6
3259 ; CHECK-NEXT:    str x0, [x1]
3260 ; CHECK-NEXT:    ret
3261   %ld3 = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3r.v4i16.p0(ptr %A)
3262   %tmp = getelementptr i16, ptr %A, i32 3
3263   store ptr %tmp, ptr %ptr
3264   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
3267 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3268 ; CHECK-LABEL: test_v4i16_post_reg_ld3r:
3269 ; CHECK:       ; %bb.0:
3270 ; CHECK-NEXT:    lsl x8, x2, #1
3271 ; CHECK-NEXT:    ld3r.4h { v0, v1, v2 }, [x0], x8
3272 ; CHECK-NEXT:    str x0, [x1]
3273 ; CHECK-NEXT:    ret
3274   %ld3 = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3r.v4i16.p0(ptr %A)
3275   %tmp = getelementptr i16, ptr %A, i64 %inc
3276   store ptr %tmp, ptr %ptr
3277   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
3280 declare { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3r.v4i16.p0(ptr) nounwind readonly
3283 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3284 ; CHECK-LABEL: test_v4i32_post_imm_ld3r:
3285 ; CHECK:       ; %bb.0:
3286 ; CHECK-NEXT:    ld3r.4s { v0, v1, v2 }, [x0], #12
3287 ; CHECK-NEXT:    str x0, [x1]
3288 ; CHECK-NEXT:    ret
3289   %ld3 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3r.v4i32.p0(ptr %A)
3290   %tmp = getelementptr i32, ptr %A, i32 3
3291   store ptr %tmp, ptr %ptr
3292   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
3295 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3296 ; CHECK-LABEL: test_v4i32_post_reg_ld3r:
3297 ; CHECK:       ; %bb.0:
3298 ; CHECK-NEXT:    lsl x8, x2, #2
3299 ; CHECK-NEXT:    ld3r.4s { v0, v1, v2 }, [x0], x8
3300 ; CHECK-NEXT:    str x0, [x1]
3301 ; CHECK-NEXT:    ret
3302   %ld3 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3r.v4i32.p0(ptr %A)
3303   %tmp = getelementptr i32, ptr %A, i64 %inc
3304   store ptr %tmp, ptr %ptr
3305   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
3308 declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3r.v4i32.p0(ptr) nounwind readonly
3310 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3311 ; CHECK-LABEL: test_v2i32_post_imm_ld3r:
3312 ; CHECK:       ; %bb.0:
3313 ; CHECK-NEXT:    ld3r.2s { v0, v1, v2 }, [x0], #12
3314 ; CHECK-NEXT:    str x0, [x1]
3315 ; CHECK-NEXT:    ret
3316   %ld3 = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3r.v2i32.p0(ptr %A)
3317   %tmp = getelementptr i32, ptr %A, i32 3
3318   store ptr %tmp, ptr %ptr
3319   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
3322 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3323 ; CHECK-LABEL: test_v2i32_post_reg_ld3r:
3324 ; CHECK:       ; %bb.0:
3325 ; CHECK-NEXT:    lsl x8, x2, #2
3326 ; CHECK-NEXT:    ld3r.2s { v0, v1, v2 }, [x0], x8
3327 ; CHECK-NEXT:    str x0, [x1]
3328 ; CHECK-NEXT:    ret
3329   %ld3 = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3r.v2i32.p0(ptr %A)
3330   %tmp = getelementptr i32, ptr %A, i64 %inc
3331   store ptr %tmp, ptr %ptr
3332   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
3335 declare { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3r.v2i32.p0(ptr) nounwind readonly
3338 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3339 ; CHECK-LABEL: test_v2i64_post_imm_ld3r:
3340 ; CHECK:       ; %bb.0:
3341 ; CHECK-NEXT:    ld3r.2d { v0, v1, v2 }, [x0], #24
3342 ; CHECK-NEXT:    str x0, [x1]
3343 ; CHECK-NEXT:    ret
3344   %ld3 = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3r.v2i64.p0(ptr %A)
3345   %tmp = getelementptr i64, ptr %A, i32 3
3346   store ptr %tmp, ptr %ptr
3347   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
3350 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3351 ; CHECK-LABEL: test_v2i64_post_reg_ld3r:
3352 ; CHECK:       ; %bb.0:
3353 ; CHECK-NEXT:    lsl x8, x2, #3
3354 ; CHECK-NEXT:    ld3r.2d { v0, v1, v2 }, [x0], x8
3355 ; CHECK-NEXT:    str x0, [x1]
3356 ; CHECK-NEXT:    ret
3357   %ld3 = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3r.v2i64.p0(ptr %A)
3358   %tmp = getelementptr i64, ptr %A, i64 %inc
3359   store ptr %tmp, ptr %ptr
3360   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
3363 declare { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3r.v2i64.p0(ptr) nounwind readonly
3365 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3366 ; CHECK-LABEL: test_v1i64_post_imm_ld3r:
3367 ; CHECK:       ; %bb.0:
3368 ; CHECK-NEXT:    ld3r.1d { v0, v1, v2 }, [x0], #24
3369 ; CHECK-NEXT:    str x0, [x1]
3370 ; CHECK-NEXT:    ret
3371   %ld3 = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3r.v1i64.p0(ptr %A)
3372   %tmp = getelementptr i64, ptr %A, i32 3
3373   store ptr %tmp, ptr %ptr
3374   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
3377 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3378 ; CHECK-LABEL: test_v1i64_post_reg_ld3r:
3379 ; CHECK:       ; %bb.0:
3380 ; CHECK-NEXT:    lsl x8, x2, #3
3381 ; CHECK-NEXT:    ld3r.1d { v0, v1, v2 }, [x0], x8
3382 ; CHECK-NEXT:    str x0, [x1]
3383 ; CHECK-NEXT:    ret
3384   %ld3 = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3r.v1i64.p0(ptr %A)
3385   %tmp = getelementptr i64, ptr %A, i64 %inc
3386   store ptr %tmp, ptr %ptr
3387   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
3390 declare { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3r.v1i64.p0(ptr) nounwind readonly
3393 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3394 ; CHECK-LABEL: test_v4f32_post_imm_ld3r:
3395 ; CHECK:       ; %bb.0:
3396 ; CHECK-NEXT:    ld3r.4s { v0, v1, v2 }, [x0], #12
3397 ; CHECK-NEXT:    str x0, [x1]
3398 ; CHECK-NEXT:    ret
3399   %ld3 = call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3r.v4f32.p0(ptr %A)
3400   %tmp = getelementptr float, ptr %A, i32 3
3401   store ptr %tmp, ptr %ptr
3402   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
3405 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3406 ; CHECK-LABEL: test_v4f32_post_reg_ld3r:
3407 ; CHECK:       ; %bb.0:
3408 ; CHECK-NEXT:    lsl x8, x2, #2
3409 ; CHECK-NEXT:    ld3r.4s { v0, v1, v2 }, [x0], x8
3410 ; CHECK-NEXT:    str x0, [x1]
3411 ; CHECK-NEXT:    ret
3412   %ld3 = call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3r.v4f32.p0(ptr %A)
3413   %tmp = getelementptr float, ptr %A, i64 %inc
3414   store ptr %tmp, ptr %ptr
3415   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
3418 declare { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3r.v4f32.p0(ptr) nounwind readonly
3420 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3421 ; CHECK-LABEL: test_v2f32_post_imm_ld3r:
3422 ; CHECK:       ; %bb.0:
3423 ; CHECK-NEXT:    ld3r.2s { v0, v1, v2 }, [x0], #12
3424 ; CHECK-NEXT:    str x0, [x1]
3425 ; CHECK-NEXT:    ret
3426   %ld3 = call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3r.v2f32.p0(ptr %A)
3427   %tmp = getelementptr float, ptr %A, i32 3
3428   store ptr %tmp, ptr %ptr
3429   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
3432 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3433 ; CHECK-LABEL: test_v2f32_post_reg_ld3r:
3434 ; CHECK:       ; %bb.0:
3435 ; CHECK-NEXT:    lsl x8, x2, #2
3436 ; CHECK-NEXT:    ld3r.2s { v0, v1, v2 }, [x0], x8
3437 ; CHECK-NEXT:    str x0, [x1]
3438 ; CHECK-NEXT:    ret
3439   %ld3 = call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3r.v2f32.p0(ptr %A)
3440   %tmp = getelementptr float, ptr %A, i64 %inc
3441   store ptr %tmp, ptr %ptr
3442   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
3445 declare { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3r.v2f32.p0(ptr) nounwind readonly
3448 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3449 ; CHECK-LABEL: test_v2f64_post_imm_ld3r:
3450 ; CHECK:       ; %bb.0:
3451 ; CHECK-NEXT:    ld3r.2d { v0, v1, v2 }, [x0], #24
3452 ; CHECK-NEXT:    str x0, [x1]
3453 ; CHECK-NEXT:    ret
3454   %ld3 = call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3r.v2f64.p0(ptr %A)
3455   %tmp = getelementptr double, ptr %A, i32 3
3456   store ptr %tmp, ptr %ptr
3457   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
3460 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3461 ; CHECK-LABEL: test_v2f64_post_reg_ld3r:
3462 ; CHECK:       ; %bb.0:
3463 ; CHECK-NEXT:    lsl x8, x2, #3
3464 ; CHECK-NEXT:    ld3r.2d { v0, v1, v2 }, [x0], x8
3465 ; CHECK-NEXT:    str x0, [x1]
3466 ; CHECK-NEXT:    ret
3467   %ld3 = call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3r.v2f64.p0(ptr %A)
3468   %tmp = getelementptr double, ptr %A, i64 %inc
3469   store ptr %tmp, ptr %ptr
3470   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
3473 declare { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3r.v2f64.p0(ptr) nounwind readonly
3475 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
3476 ; CHECK-LABEL: test_v1f64_post_imm_ld3r:
3477 ; CHECK:       ; %bb.0:
3478 ; CHECK-NEXT:    ld3r.1d { v0, v1, v2 }, [x0], #24
3479 ; CHECK-NEXT:    str x0, [x1]
3480 ; CHECK-NEXT:    ret
3481   %ld3 = call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3r.v1f64.p0(ptr %A)
3482   %tmp = getelementptr double, ptr %A, i32 3
3483   store ptr %tmp, ptr %ptr
3484   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
3487 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3488 ; CHECK-LABEL: test_v1f64_post_reg_ld3r:
3489 ; CHECK:       ; %bb.0:
3490 ; CHECK-NEXT:    lsl x8, x2, #3
3491 ; CHECK-NEXT:    ld3r.1d { v0, v1, v2 }, [x0], x8
3492 ; CHECK-NEXT:    str x0, [x1]
3493 ; CHECK-NEXT:    ret
3494   %ld3 = call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3r.v1f64.p0(ptr %A)
3495   %tmp = getelementptr double, ptr %A, i64 %inc
3496   store ptr %tmp, ptr %ptr
3497   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
3500 declare { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3r.v1f64.p0(ptr) nounwind readonly
3503 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3504 ; CHECK-LABEL: test_v16i8_post_imm_ld4r:
3505 ; CHECK:       ; %bb.0:
3506 ; CHECK-NEXT:    ld4r.16b { v0, v1, v2, v3 }, [x0], #4
3507 ; CHECK-NEXT:    str x0, [x1]
3508 ; CHECK-NEXT:    ret
3509   %ld4 = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4r.v16i8.p0(ptr %A)
3510   %tmp = getelementptr i8, ptr %A, i32 4
3511   store ptr %tmp, ptr %ptr
3512   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
3515 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3516 ; CHECK-LABEL: test_v16i8_post_reg_ld4r:
3517 ; CHECK:       ; %bb.0:
3518 ; CHECK-NEXT:    ld4r.16b { v0, v1, v2, v3 }, [x0], x2
3519 ; CHECK-NEXT:    str x0, [x1]
3520 ; CHECK-NEXT:    ret
3521   %ld4 = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4r.v16i8.p0(ptr %A)
3522   %tmp = getelementptr i8, ptr %A, i64 %inc
3523   store ptr %tmp, ptr %ptr
3524   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
3527 declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4r.v16i8.p0(ptr) nounwind readonly
3530 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3531 ; CHECK-LABEL: test_v8i8_post_imm_ld4r:
3532 ; CHECK:       ; %bb.0:
3533 ; CHECK-NEXT:    ld4r.8b { v0, v1, v2, v3 }, [x0], #4
3534 ; CHECK-NEXT:    str x0, [x1]
3535 ; CHECK-NEXT:    ret
3536   %ld4 = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4r.v8i8.p0(ptr %A)
3537   %tmp = getelementptr i8, ptr %A, i32 4
3538   store ptr %tmp, ptr %ptr
3539   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
3542 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3543 ; CHECK-LABEL: test_v8i8_post_reg_ld4r:
3544 ; CHECK:       ; %bb.0:
3545 ; CHECK-NEXT:    ld4r.8b { v0, v1, v2, v3 }, [x0], x2
3546 ; CHECK-NEXT:    str x0, [x1]
3547 ; CHECK-NEXT:    ret
3548   %ld4 = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4r.v8i8.p0(ptr %A)
3549   %tmp = getelementptr i8, ptr %A, i64 %inc
3550   store ptr %tmp, ptr %ptr
3551   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
3554 declare { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4r.v8i8.p0(ptr) nounwind readonly
3557 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3558 ; CHECK-LABEL: test_v8i16_post_imm_ld4r:
3559 ; CHECK:       ; %bb.0:
3560 ; CHECK-NEXT:    ld4r.8h { v0, v1, v2, v3 }, [x0], #8
3561 ; CHECK-NEXT:    str x0, [x1]
3562 ; CHECK-NEXT:    ret
3563   %ld4 = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4r.v8i16.p0(ptr %A)
3564   %tmp = getelementptr i16, ptr %A, i32 4
3565   store ptr %tmp, ptr %ptr
3566   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
3569 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3570 ; CHECK-LABEL: test_v8i16_post_reg_ld4r:
3571 ; CHECK:       ; %bb.0:
3572 ; CHECK-NEXT:    lsl x8, x2, #1
3573 ; CHECK-NEXT:    ld4r.8h { v0, v1, v2, v3 }, [x0], x8
3574 ; CHECK-NEXT:    str x0, [x1]
3575 ; CHECK-NEXT:    ret
3576   %ld4 = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4r.v8i16.p0(ptr %A)
3577   %tmp = getelementptr i16, ptr %A, i64 %inc
3578   store ptr %tmp, ptr %ptr
3579   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
3582 declare { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4r.v8i16.p0(ptr) nounwind readonly
3585 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3586 ; CHECK-LABEL: test_v4i16_post_imm_ld4r:
3587 ; CHECK:       ; %bb.0:
3588 ; CHECK-NEXT:    ld4r.4h { v0, v1, v2, v3 }, [x0], #8
3589 ; CHECK-NEXT:    str x0, [x1]
3590 ; CHECK-NEXT:    ret
3591   %ld4 = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4r.v4i16.p0(ptr %A)
3592   %tmp = getelementptr i16, ptr %A, i32 4
3593   store ptr %tmp, ptr %ptr
3594   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
3597 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3598 ; CHECK-LABEL: test_v4i16_post_reg_ld4r:
3599 ; CHECK:       ; %bb.0:
3600 ; CHECK-NEXT:    lsl x8, x2, #1
3601 ; CHECK-NEXT:    ld4r.4h { v0, v1, v2, v3 }, [x0], x8
3602 ; CHECK-NEXT:    str x0, [x1]
3603 ; CHECK-NEXT:    ret
3604   %ld4 = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4r.v4i16.p0(ptr %A)
3605   %tmp = getelementptr i16, ptr %A, i64 %inc
3606   store ptr %tmp, ptr %ptr
3607   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
3610 declare { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4r.v4i16.p0(ptr) nounwind readonly
3613 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3614 ; CHECK-LABEL: test_v4i32_post_imm_ld4r:
3615 ; CHECK:       ; %bb.0:
3616 ; CHECK-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0], #16
3617 ; CHECK-NEXT:    str x0, [x1]
3618 ; CHECK-NEXT:    ret
3619   %ld4 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4r.v4i32.p0(ptr %A)
3620   %tmp = getelementptr i32, ptr %A, i32 4
3621   store ptr %tmp, ptr %ptr
3622   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
3625 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3626 ; CHECK-LABEL: test_v4i32_post_reg_ld4r:
3627 ; CHECK:       ; %bb.0:
3628 ; CHECK-NEXT:    lsl x8, x2, #2
3629 ; CHECK-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0], x8
3630 ; CHECK-NEXT:    str x0, [x1]
3631 ; CHECK-NEXT:    ret
3632   %ld4 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4r.v4i32.p0(ptr %A)
3633   %tmp = getelementptr i32, ptr %A, i64 %inc
3634   store ptr %tmp, ptr %ptr
3635   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
3638 declare { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4r.v4i32.p0(ptr) nounwind readonly
3640 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3641 ; CHECK-LABEL: test_v2i32_post_imm_ld4r:
3642 ; CHECK:       ; %bb.0:
3643 ; CHECK-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0], #16
3644 ; CHECK-NEXT:    str x0, [x1]
3645 ; CHECK-NEXT:    ret
3646   %ld4 = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4r.v2i32.p0(ptr %A)
3647   %tmp = getelementptr i32, ptr %A, i32 4
3648   store ptr %tmp, ptr %ptr
3649   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
3652 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3653 ; CHECK-LABEL: test_v2i32_post_reg_ld4r:
3654 ; CHECK:       ; %bb.0:
3655 ; CHECK-NEXT:    lsl x8, x2, #2
3656 ; CHECK-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0], x8
3657 ; CHECK-NEXT:    str x0, [x1]
3658 ; CHECK-NEXT:    ret
3659   %ld4 = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4r.v2i32.p0(ptr %A)
3660   %tmp = getelementptr i32, ptr %A, i64 %inc
3661   store ptr %tmp, ptr %ptr
3662   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
3665 declare { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4r.v2i32.p0(ptr) nounwind readonly
3668 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3669 ; CHECK-LABEL: test_v2i64_post_imm_ld4r:
3670 ; CHECK:       ; %bb.0:
3671 ; CHECK-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0], #32
3672 ; CHECK-NEXT:    str x0, [x1]
3673 ; CHECK-NEXT:    ret
3674   %ld4 = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4r.v2i64.p0(ptr %A)
3675   %tmp = getelementptr i64, ptr %A, i32 4
3676   store ptr %tmp, ptr %ptr
3677   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
3680 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3681 ; CHECK-LABEL: test_v2i64_post_reg_ld4r:
3682 ; CHECK:       ; %bb.0:
3683 ; CHECK-NEXT:    lsl x8, x2, #3
3684 ; CHECK-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0], x8
3685 ; CHECK-NEXT:    str x0, [x1]
3686 ; CHECK-NEXT:    ret
3687   %ld4 = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4r.v2i64.p0(ptr %A)
3688   %tmp = getelementptr i64, ptr %A, i64 %inc
3689   store ptr %tmp, ptr %ptr
3690   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
3693 declare { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4r.v2i64.p0(ptr) nounwind readonly
3695 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3696 ; CHECK-LABEL: test_v1i64_post_imm_ld4r:
3697 ; CHECK:       ; %bb.0:
3698 ; CHECK-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0], #32
3699 ; CHECK-NEXT:    str x0, [x1]
3700 ; CHECK-NEXT:    ret
3701   %ld4 = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4r.v1i64.p0(ptr %A)
3702   %tmp = getelementptr i64, ptr %A, i32 4
3703   store ptr %tmp, ptr %ptr
3704   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
3707 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3708 ; CHECK-LABEL: test_v1i64_post_reg_ld4r:
3709 ; CHECK:       ; %bb.0:
3710 ; CHECK-NEXT:    lsl x8, x2, #3
3711 ; CHECK-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0], x8
3712 ; CHECK-NEXT:    str x0, [x1]
3713 ; CHECK-NEXT:    ret
3714   %ld4 = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4r.v1i64.p0(ptr %A)
3715   %tmp = getelementptr i64, ptr %A, i64 %inc
3716   store ptr %tmp, ptr %ptr
3717   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
3720 declare { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4r.v1i64.p0(ptr) nounwind readonly
3723 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3724 ; CHECK-LABEL: test_v4f32_post_imm_ld4r:
3725 ; CHECK:       ; %bb.0:
3726 ; CHECK-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0], #16
3727 ; CHECK-NEXT:    str x0, [x1]
3728 ; CHECK-NEXT:    ret
3729   %ld4 = call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4r.v4f32.p0(ptr %A)
3730   %tmp = getelementptr float, ptr %A, i32 4
3731   store ptr %tmp, ptr %ptr
3732   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
3735 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3736 ; CHECK-LABEL: test_v4f32_post_reg_ld4r:
3737 ; CHECK:       ; %bb.0:
3738 ; CHECK-NEXT:    lsl x8, x2, #2
3739 ; CHECK-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0], x8
3740 ; CHECK-NEXT:    str x0, [x1]
3741 ; CHECK-NEXT:    ret
3742   %ld4 = call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4r.v4f32.p0(ptr %A)
3743   %tmp = getelementptr float, ptr %A, i64 %inc
3744   store ptr %tmp, ptr %ptr
3745   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
3748 declare { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4r.v4f32.p0(ptr) nounwind readonly
3750 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3751 ; CHECK-LABEL: test_v2f32_post_imm_ld4r:
3752 ; CHECK:       ; %bb.0:
3753 ; CHECK-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0], #16
3754 ; CHECK-NEXT:    str x0, [x1]
3755 ; CHECK-NEXT:    ret
3756   %ld4 = call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4r.v2f32.p0(ptr %A)
3757   %tmp = getelementptr float, ptr %A, i32 4
3758   store ptr %tmp, ptr %ptr
3759   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
3762 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3763 ; CHECK-LABEL: test_v2f32_post_reg_ld4r:
3764 ; CHECK:       ; %bb.0:
3765 ; CHECK-NEXT:    lsl x8, x2, #2
3766 ; CHECK-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0], x8
3767 ; CHECK-NEXT:    str x0, [x1]
3768 ; CHECK-NEXT:    ret
3769   %ld4 = call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4r.v2f32.p0(ptr %A)
3770   %tmp = getelementptr float, ptr %A, i64 %inc
3771   store ptr %tmp, ptr %ptr
3772   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
3775 declare { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4r.v2f32.p0(ptr) nounwind readonly
3778 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3779 ; CHECK-LABEL: test_v2f64_post_imm_ld4r:
3780 ; CHECK:       ; %bb.0:
3781 ; CHECK-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0], #32
3782 ; CHECK-NEXT:    str x0, [x1]
3783 ; CHECK-NEXT:    ret
3784   %ld4 = call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4r.v2f64.p0(ptr %A)
3785   %tmp = getelementptr double, ptr %A, i32 4
3786   store ptr %tmp, ptr %ptr
3787   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
3790 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3791 ; CHECK-LABEL: test_v2f64_post_reg_ld4r:
3792 ; CHECK:       ; %bb.0:
3793 ; CHECK-NEXT:    lsl x8, x2, #3
3794 ; CHECK-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0], x8
3795 ; CHECK-NEXT:    str x0, [x1]
3796 ; CHECK-NEXT:    ret
3797   %ld4 = call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4r.v2f64.p0(ptr %A)
3798   %tmp = getelementptr double, ptr %A, i64 %inc
3799   store ptr %tmp, ptr %ptr
3800   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
3803 declare { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4r.v2f64.p0(ptr) nounwind readonly
3805 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
3806 ; CHECK-LABEL: test_v1f64_post_imm_ld4r:
3807 ; CHECK:       ; %bb.0:
3808 ; CHECK-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0], #32
3809 ; CHECK-NEXT:    str x0, [x1]
3810 ; CHECK-NEXT:    ret
3811   %ld4 = call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4r.v1f64.p0(ptr %A)
3812   %tmp = getelementptr double, ptr %A, i32 4
3813   store ptr %tmp, ptr %ptr
3814   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
3817 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
3818 ; CHECK-LABEL: test_v1f64_post_reg_ld4r:
3819 ; CHECK:       ; %bb.0:
3820 ; CHECK-NEXT:    lsl x8, x2, #3
3821 ; CHECK-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0], x8
3822 ; CHECK-NEXT:    str x0, [x1]
3823 ; CHECK-NEXT:    ret
3824   %ld4 = call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4r.v1f64.p0(ptr %A)
3825   %tmp = getelementptr double, ptr %A, i64 %inc
3826   store ptr %tmp, ptr %ptr
3827   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
3830 declare { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4r.v1f64.p0(ptr) nounwind readonly
3833 define { <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld2lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C) nounwind {
3834 ; CHECK-LABEL: test_v16i8_post_imm_ld2lane:
3835 ; CHECK:       ; %bb.0:
3836 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
3837 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
3838 ; CHECK-NEXT:    ld2.b { v0, v1 }[0], [x0], #2
3839 ; CHECK-NEXT:    str x0, [x1]
3840 ; CHECK-NEXT:    ret
3841   %ld2 = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, i64 0, ptr %A)
3842   %tmp = getelementptr i8, ptr %A, i32 2
3843   store ptr %tmp, ptr %ptr
3844   ret { <16 x i8>, <16 x i8> } %ld2
3847 define { <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <16 x i8> %B, <16 x i8> %C) nounwind {
3848 ; CHECK-LABEL: test_v16i8_post_reg_ld2lane:
3849 ; CHECK:       ; %bb.0:
3850 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
3851 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
3852 ; CHECK-NEXT:    ld2.b { v0, v1 }[0], [x0], x2
3853 ; CHECK-NEXT:    str x0, [x1]
3854 ; CHECK-NEXT:    ret
3855   %ld2 = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, i64 0, ptr %A)
3856   %tmp = getelementptr i8, ptr %A, i64 %inc
3857   store ptr %tmp, ptr %ptr
3858   ret { <16 x i8>, <16 x i8> } %ld2
3861 declare { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8>, <16 x i8>, i64, ptr) nounwind readonly
3864 define { <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld2lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C) nounwind {
3865 ; CHECK-LABEL: test_v8i8_post_imm_ld2lane:
3866 ; CHECK:       ; %bb.0:
3867 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
3868 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
3869 ; CHECK-NEXT:    ld2.b { v0, v1 }[0], [x0], #2
3870 ; CHECK-NEXT:    str x0, [x1]
3871 ; CHECK-NEXT:    ret
3872   %ld2 = call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, i64 0, ptr %A)
3873   %tmp = getelementptr i8, ptr %A, i32 2
3874   store ptr %tmp, ptr %ptr
3875   ret { <8 x i8>, <8 x i8> } %ld2
3878 define { <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <8 x i8> %B, <8 x i8> %C) nounwind {
3879 ; CHECK-LABEL: test_v8i8_post_reg_ld2lane:
3880 ; CHECK:       ; %bb.0:
3881 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
3882 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
3883 ; CHECK-NEXT:    ld2.b { v0, v1 }[0], [x0], x2
3884 ; CHECK-NEXT:    str x0, [x1]
3885 ; CHECK-NEXT:    ret
3886   %ld2 = call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, i64 0, ptr %A)
3887   %tmp = getelementptr i8, ptr %A, i64 %inc
3888   store ptr %tmp, ptr %ptr
3889   ret { <8 x i8>, <8 x i8> } %ld2
3892 declare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2lane.v8i8.p0(<8 x i8>, <8 x i8>, i64, ptr) nounwind readonly
3895 define { <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld2lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C) nounwind {
3896 ; CHECK-LABEL: test_v8i16_post_imm_ld2lane:
3897 ; CHECK:       ; %bb.0:
3898 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
3899 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
3900 ; CHECK-NEXT:    ld2.h { v0, v1 }[0], [x0], #4
3901 ; CHECK-NEXT:    str x0, [x1]
3902 ; CHECK-NEXT:    ret
3903   %ld2 = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, i64 0, ptr %A)
3904   %tmp = getelementptr i16, ptr %A, i32 2
3905   store ptr %tmp, ptr %ptr
3906   ret { <8 x i16>, <8 x i16> } %ld2
3909 define { <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <8 x i16> %B, <8 x i16> %C) nounwind {
3910 ; CHECK-LABEL: test_v8i16_post_reg_ld2lane:
3911 ; CHECK:       ; %bb.0:
3912 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
3913 ; CHECK-NEXT:    lsl x8, x2, #1
3914 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
3915 ; CHECK-NEXT:    ld2.h { v0, v1 }[0], [x0], x8
3916 ; CHECK-NEXT:    str x0, [x1]
3917 ; CHECK-NEXT:    ret
3918   %ld2 = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, i64 0, ptr %A)
3919   %tmp = getelementptr i16, ptr %A, i64 %inc
3920   store ptr %tmp, ptr %ptr
3921   ret { <8 x i16>, <8 x i16> } %ld2
3924 declare { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16>, <8 x i16>, i64, ptr) nounwind readonly
3927 define { <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld2lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C) nounwind {
3928 ; CHECK-LABEL: test_v4i16_post_imm_ld2lane:
3929 ; CHECK:       ; %bb.0:
3930 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
3931 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
3932 ; CHECK-NEXT:    ld2.h { v0, v1 }[0], [x0], #4
3933 ; CHECK-NEXT:    str x0, [x1]
3934 ; CHECK-NEXT:    ret
3935   %ld2 = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, i64 0, ptr %A)
3936   %tmp = getelementptr i16, ptr %A, i32 2
3937   store ptr %tmp, ptr %ptr
3938   ret { <4 x i16>, <4 x i16> } %ld2
3941 define { <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <4 x i16> %B, <4 x i16> %C) nounwind {
3942 ; CHECK-LABEL: test_v4i16_post_reg_ld2lane:
3943 ; CHECK:       ; %bb.0:
3944 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
3945 ; CHECK-NEXT:    lsl x8, x2, #1
3946 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
3947 ; CHECK-NEXT:    ld2.h { v0, v1 }[0], [x0], x8
3948 ; CHECK-NEXT:    str x0, [x1]
3949 ; CHECK-NEXT:    ret
3950   %ld2 = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, i64 0, ptr %A)
3951   %tmp = getelementptr i16, ptr %A, i64 %inc
3952   store ptr %tmp, ptr %ptr
3953   ret { <4 x i16>, <4 x i16> } %ld2
3956 declare { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2lane.v4i16.p0(<4 x i16>, <4 x i16>, i64, ptr) nounwind readonly
3959 define { <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld2lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C) nounwind {
3960 ; CHECK-LABEL: test_v4i32_post_imm_ld2lane:
3961 ; CHECK:       ; %bb.0:
3962 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
3963 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
3964 ; CHECK-NEXT:    ld2.s { v0, v1 }[0], [x0], #8
3965 ; CHECK-NEXT:    str x0, [x1]
3966 ; CHECK-NEXT:    ret
3967   %ld2 = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, i64 0, ptr %A)
3968   %tmp = getelementptr i32, ptr %A, i32 2
3969   store ptr %tmp, ptr %ptr
3970   ret { <4 x i32>, <4 x i32> } %ld2
3973 define { <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <4 x i32> %B, <4 x i32> %C) nounwind {
3974 ; CHECK-LABEL: test_v4i32_post_reg_ld2lane:
3975 ; CHECK:       ; %bb.0:
3976 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
3977 ; CHECK-NEXT:    lsl x8, x2, #2
3978 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
3979 ; CHECK-NEXT:    ld2.s { v0, v1 }[0], [x0], x8
3980 ; CHECK-NEXT:    str x0, [x1]
3981 ; CHECK-NEXT:    ret
3982   %ld2 = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, i64 0, ptr %A)
3983   %tmp = getelementptr i32, ptr %A, i64 %inc
3984   store ptr %tmp, ptr %ptr
3985   ret { <4 x i32>, <4 x i32> } %ld2
3988 declare { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32>, <4 x i32>, i64, ptr) nounwind readonly
3991 define { <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld2lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C) nounwind {
3992 ; CHECK-LABEL: test_v2i32_post_imm_ld2lane:
3993 ; CHECK:       ; %bb.0:
3994 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
3995 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
3996 ; CHECK-NEXT:    ld2.s { v0, v1 }[0], [x0], #8
3997 ; CHECK-NEXT:    str x0, [x1]
3998 ; CHECK-NEXT:    ret
3999   %ld2 = call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, i64 0, ptr %A)
4000   %tmp = getelementptr i32, ptr %A, i32 2
4001   store ptr %tmp, ptr %ptr
4002   ret { <2 x i32>, <2 x i32> } %ld2
4005 define { <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <2 x i32> %B, <2 x i32> %C) nounwind {
4006 ; CHECK-LABEL: test_v2i32_post_reg_ld2lane:
4007 ; CHECK:       ; %bb.0:
4008 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
4009 ; CHECK-NEXT:    lsl x8, x2, #2
4010 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
4011 ; CHECK-NEXT:    ld2.s { v0, v1 }[0], [x0], x8
4012 ; CHECK-NEXT:    str x0, [x1]
4013 ; CHECK-NEXT:    ret
4014   %ld2 = call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, i64 0, ptr %A)
4015   %tmp = getelementptr i32, ptr %A, i64 %inc
4016   store ptr %tmp, ptr %ptr
4017   ret { <2 x i32>, <2 x i32> } %ld2
4020 declare { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2lane.v2i32.p0(<2 x i32>, <2 x i32>, i64, ptr) nounwind readonly
4023 define { <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld2lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C) nounwind {
4024 ; CHECK-LABEL: test_v2i64_post_imm_ld2lane:
4025 ; CHECK:       ; %bb.0:
4026 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
4027 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
4028 ; CHECK-NEXT:    ld2.d { v0, v1 }[0], [x0], #16
4029 ; CHECK-NEXT:    str x0, [x1]
4030 ; CHECK-NEXT:    ret
4031   %ld2 = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, i64 0, ptr %A)
4032   %tmp = getelementptr i64, ptr %A, i32 2
4033   store ptr %tmp, ptr %ptr
4034   ret { <2 x i64>, <2 x i64> } %ld2
4037 define { <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <2 x i64> %B, <2 x i64> %C) nounwind {
4038 ; CHECK-LABEL: test_v2i64_post_reg_ld2lane:
4039 ; CHECK:       ; %bb.0:
4040 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
4041 ; CHECK-NEXT:    lsl x8, x2, #3
4042 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
4043 ; CHECK-NEXT:    ld2.d { v0, v1 }[0], [x0], x8
4044 ; CHECK-NEXT:    str x0, [x1]
4045 ; CHECK-NEXT:    ret
4046   %ld2 = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, i64 0, ptr %A)
4047   %tmp = getelementptr i64, ptr %A, i64 %inc
4048   store ptr %tmp, ptr %ptr
4049   ret { <2 x i64>, <2 x i64> } %ld2
4052 declare { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64>, <2 x i64>, i64, ptr) nounwind readonly
4055 define { <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld2lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C) nounwind {
4056 ; CHECK-LABEL: test_v1i64_post_imm_ld2lane:
4057 ; CHECK:       ; %bb.0:
4058 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
4059 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
4060 ; CHECK-NEXT:    ld2.d { v0, v1 }[0], [x0], #16
4061 ; CHECK-NEXT:    str x0, [x1]
4062 ; CHECK-NEXT:    ret
4063   %ld2 = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, i64 0, ptr %A)
4064   %tmp = getelementptr i64, ptr %A, i32 2
4065   store ptr %tmp, ptr %ptr
4066   ret { <1 x i64>, <1 x i64> } %ld2
4069 define { <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <1 x i64> %B, <1 x i64> %C) nounwind {
4070 ; CHECK-LABEL: test_v1i64_post_reg_ld2lane:
4071 ; CHECK:       ; %bb.0:
4072 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
4073 ; CHECK-NEXT:    lsl x8, x2, #3
4074 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
4075 ; CHECK-NEXT:    ld2.d { v0, v1 }[0], [x0], x8
4076 ; CHECK-NEXT:    str x0, [x1]
4077 ; CHECK-NEXT:    ret
4078   %ld2 = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, i64 0, ptr %A)
4079   %tmp = getelementptr i64, ptr %A, i64 %inc
4080   store ptr %tmp, ptr %ptr
4081   ret { <1 x i64>, <1 x i64> } %ld2
4084 declare { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2lane.v1i64.p0(<1 x i64>, <1 x i64>, i64, ptr) nounwind readonly
4087 define { <4 x float>, <4 x float> } @test_v4f32_post_imm_ld2lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C) nounwind {
4088 ; CHECK-LABEL: test_v4f32_post_imm_ld2lane:
4089 ; CHECK:       ; %bb.0:
4090 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
4091 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
4092 ; CHECK-NEXT:    ld2.s { v0, v1 }[0], [x0], #8
4093 ; CHECK-NEXT:    str x0, [x1]
4094 ; CHECK-NEXT:    ret
4095   %ld2 = call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2lane.v4f32.p0(<4 x float> %B, <4 x float> %C, i64 0, ptr %A)
4096   %tmp = getelementptr float, ptr %A, i32 2
4097   store ptr %tmp, ptr %ptr
4098   ret { <4 x float>, <4 x float> } %ld2
4101 define { <4 x float>, <4 x float> } @test_v4f32_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <4 x float> %B, <4 x float> %C) nounwind {
4102 ; CHECK-LABEL: test_v4f32_post_reg_ld2lane:
4103 ; CHECK:       ; %bb.0:
4104 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
4105 ; CHECK-NEXT:    lsl x8, x2, #2
4106 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
4107 ; CHECK-NEXT:    ld2.s { v0, v1 }[0], [x0], x8
4108 ; CHECK-NEXT:    str x0, [x1]
4109 ; CHECK-NEXT:    ret
4110   %ld2 = call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2lane.v4f32.p0(<4 x float> %B, <4 x float> %C, i64 0, ptr %A)
4111   %tmp = getelementptr float, ptr %A, i64 %inc
4112   store ptr %tmp, ptr %ptr
4113   ret { <4 x float>, <4 x float> } %ld2
4116 declare { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2lane.v4f32.p0(<4 x float>, <4 x float>, i64, ptr) nounwind readonly
4119 define { <2 x float>, <2 x float> } @test_v2f32_post_imm_ld2lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C) nounwind {
4120 ; CHECK-LABEL: test_v2f32_post_imm_ld2lane:
4121 ; CHECK:       ; %bb.0:
4122 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
4123 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
4124 ; CHECK-NEXT:    ld2.s { v0, v1 }[0], [x0], #8
4125 ; CHECK-NEXT:    str x0, [x1]
4126 ; CHECK-NEXT:    ret
4127   %ld2 = call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2lane.v2f32.p0(<2 x float> %B, <2 x float> %C, i64 0, ptr %A)
4128   %tmp = getelementptr float, ptr %A, i32 2
4129   store ptr %tmp, ptr %ptr
4130   ret { <2 x float>, <2 x float> } %ld2
4133 define { <2 x float>, <2 x float> } @test_v2f32_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <2 x float> %B, <2 x float> %C) nounwind {
4134 ; CHECK-LABEL: test_v2f32_post_reg_ld2lane:
4135 ; CHECK:       ; %bb.0:
4136 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
4137 ; CHECK-NEXT:    lsl x8, x2, #2
4138 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
4139 ; CHECK-NEXT:    ld2.s { v0, v1 }[0], [x0], x8
4140 ; CHECK-NEXT:    str x0, [x1]
4141 ; CHECK-NEXT:    ret
4142   %ld2 = call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2lane.v2f32.p0(<2 x float> %B, <2 x float> %C, i64 0, ptr %A)
4143   %tmp = getelementptr float, ptr %A, i64 %inc
4144   store ptr %tmp, ptr %ptr
4145   ret { <2 x float>, <2 x float> } %ld2
4148 declare { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2lane.v2f32.p0(<2 x float>, <2 x float>, i64, ptr) nounwind readonly
4151 define { <2 x double>, <2 x double> } @test_v2f64_post_imm_ld2lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C) nounwind {
4152 ; CHECK-LABEL: test_v2f64_post_imm_ld2lane:
4153 ; CHECK:       ; %bb.0:
4154 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
4155 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
4156 ; CHECK-NEXT:    ld2.d { v0, v1 }[0], [x0], #16
4157 ; CHECK-NEXT:    str x0, [x1]
4158 ; CHECK-NEXT:    ret
4159   %ld2 = call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2lane.v2f64.p0(<2 x double> %B, <2 x double> %C, i64 0, ptr %A)
4160   %tmp = getelementptr double, ptr %A, i32 2
4161   store ptr %tmp, ptr %ptr
4162   ret { <2 x double>, <2 x double> } %ld2
4165 define { <2 x double>, <2 x double> } @test_v2f64_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <2 x double> %B, <2 x double> %C) nounwind {
4166 ; CHECK-LABEL: test_v2f64_post_reg_ld2lane:
4167 ; CHECK:       ; %bb.0:
4168 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
4169 ; CHECK-NEXT:    lsl x8, x2, #3
4170 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
4171 ; CHECK-NEXT:    ld2.d { v0, v1 }[0], [x0], x8
4172 ; CHECK-NEXT:    str x0, [x1]
4173 ; CHECK-NEXT:    ret
4174   %ld2 = call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2lane.v2f64.p0(<2 x double> %B, <2 x double> %C, i64 0, ptr %A)
4175   %tmp = getelementptr double, ptr %A, i64 %inc
4176   store ptr %tmp, ptr %ptr
4177   ret { <2 x double>, <2 x double> } %ld2
4180 declare { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2lane.v2f64.p0(<2 x double>, <2 x double>, i64, ptr) nounwind readonly
4183 define { <1 x double>, <1 x double> } @test_v1f64_post_imm_ld2lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C) nounwind {
4184 ; CHECK-LABEL: test_v1f64_post_imm_ld2lane:
4185 ; CHECK:       ; %bb.0:
4186 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
4187 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
4188 ; CHECK-NEXT:    ld2.d { v0, v1 }[0], [x0], #16
4189 ; CHECK-NEXT:    str x0, [x1]
4190 ; CHECK-NEXT:    ret
4191   %ld2 = call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2lane.v1f64.p0(<1 x double> %B, <1 x double> %C, i64 0, ptr %A)
4192   %tmp = getelementptr double, ptr %A, i32 2
4193   store ptr %tmp, ptr %ptr
4194   ret { <1 x double>, <1 x double> } %ld2
4197 define { <1 x double>, <1 x double> } @test_v1f64_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <1 x double> %B, <1 x double> %C) nounwind {
4198 ; CHECK-LABEL: test_v1f64_post_reg_ld2lane:
4199 ; CHECK:       ; %bb.0:
4200 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
4201 ; CHECK-NEXT:    lsl x8, x2, #3
4202 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
4203 ; CHECK-NEXT:    ld2.d { v0, v1 }[0], [x0], x8
4204 ; CHECK-NEXT:    str x0, [x1]
4205 ; CHECK-NEXT:    ret
4206   %ld2 = call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2lane.v1f64.p0(<1 x double> %B, <1 x double> %C, i64 0, ptr %A)
4207   %tmp = getelementptr double, ptr %A, i64 %inc
4208   store ptr %tmp, ptr %ptr
4209   ret { <1 x double>, <1 x double> } %ld2
4212 declare { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2lane.v1f64.p0(<1 x double>, <1 x double>, i64, ptr) nounwind readonly
4215 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld3lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
4216 ; CHECK-LABEL: test_v16i8_post_imm_ld3lane:
4217 ; CHECK:       ; %bb.0:
4218 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4219 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4220 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4221 ; CHECK-NEXT:    ld3.b { v0, v1, v2 }[0], [x0], #3
4222 ; CHECK-NEXT:    str x0, [x1]
4223 ; CHECK-NEXT:    ret
4224   %ld3 = call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 0, ptr %A)
4225   %tmp = getelementptr i8, ptr %A, i32 3
4226   store ptr %tmp, ptr %ptr
4227   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
4230 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
4231 ; CHECK-LABEL: test_v16i8_post_reg_ld3lane:
4232 ; CHECK:       ; %bb.0:
4233 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4234 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4235 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4236 ; CHECK-NEXT:    ld3.b { v0, v1, v2 }[0], [x0], x2
4237 ; CHECK-NEXT:    str x0, [x1]
4238 ; CHECK-NEXT:    ret
4239   %ld3 = call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 0, ptr %A)
4240   %tmp = getelementptr i8, ptr %A, i64 %inc
4241   store ptr %tmp, ptr %ptr
4242   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
4245 declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readonly
4248 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld3lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
4249 ; CHECK-LABEL: test_v8i8_post_imm_ld3lane:
4250 ; CHECK:       ; %bb.0:
4251 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4252 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4253 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4254 ; CHECK-NEXT:    ld3.b { v0, v1, v2 }[0], [x0], #3
4255 ; CHECK-NEXT:    str x0, [x1]
4256 ; CHECK-NEXT:    ret
4257   %ld3 = call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 0, ptr %A)
4258   %tmp = getelementptr i8, ptr %A, i32 3
4259   store ptr %tmp, ptr %ptr
4260   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
4263 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
4264 ; CHECK-LABEL: test_v8i8_post_reg_ld3lane:
4265 ; CHECK:       ; %bb.0:
4266 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4267 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4268 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4269 ; CHECK-NEXT:    ld3.b { v0, v1, v2 }[0], [x0], x2
4270 ; CHECK-NEXT:    str x0, [x1]
4271 ; CHECK-NEXT:    ret
4272   %ld3 = call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 0, ptr %A)
4273   %tmp = getelementptr i8, ptr %A, i64 %inc
4274   store ptr %tmp, ptr %ptr
4275   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
4278 declare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3lane.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, i64, ptr) nounwind readonly
4281 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld3lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
4282 ; CHECK-LABEL: test_v8i16_post_imm_ld3lane:
4283 ; CHECK:       ; %bb.0:
4284 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4285 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4286 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4287 ; CHECK-NEXT:    ld3.h { v0, v1, v2 }[0], [x0], #6
4288 ; CHECK-NEXT:    str x0, [x1]
4289 ; CHECK-NEXT:    ret
4290   %ld3 = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 0, ptr %A)
4291   %tmp = getelementptr i16, ptr %A, i32 3
4292   store ptr %tmp, ptr %ptr
4293   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
4296 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
4297 ; CHECK-LABEL: test_v8i16_post_reg_ld3lane:
4298 ; CHECK:       ; %bb.0:
4299 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4300 ; CHECK-NEXT:    lsl x8, x2, #1
4301 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4302 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4303 ; CHECK-NEXT:    ld3.h { v0, v1, v2 }[0], [x0], x8
4304 ; CHECK-NEXT:    str x0, [x1]
4305 ; CHECK-NEXT:    ret
4306   %ld3 = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 0, ptr %A)
4307   %tmp = getelementptr i16, ptr %A, i64 %inc
4308   store ptr %tmp, ptr %ptr
4309   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
4312 declare { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readonly
4315 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld3lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
4316 ; CHECK-LABEL: test_v4i16_post_imm_ld3lane:
4317 ; CHECK:       ; %bb.0:
4318 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4319 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4320 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4321 ; CHECK-NEXT:    ld3.h { v0, v1, v2 }[0], [x0], #6
4322 ; CHECK-NEXT:    str x0, [x1]
4323 ; CHECK-NEXT:    ret
4324   %ld3 = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 0, ptr %A)
4325   %tmp = getelementptr i16, ptr %A, i32 3
4326   store ptr %tmp, ptr %ptr
4327   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
4330 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
4331 ; CHECK-LABEL: test_v4i16_post_reg_ld3lane:
4332 ; CHECK:       ; %bb.0:
4333 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4334 ; CHECK-NEXT:    lsl x8, x2, #1
4335 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4336 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4337 ; CHECK-NEXT:    ld3.h { v0, v1, v2 }[0], [x0], x8
4338 ; CHECK-NEXT:    str x0, [x1]
4339 ; CHECK-NEXT:    ret
4340   %ld3 = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 0, ptr %A)
4341   %tmp = getelementptr i16, ptr %A, i64 %inc
4342   store ptr %tmp, ptr %ptr
4343   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
4346 declare { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3lane.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, i64, ptr) nounwind readonly
4349 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld3lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
4350 ; CHECK-LABEL: test_v4i32_post_imm_ld3lane:
4351 ; CHECK:       ; %bb.0:
4352 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4353 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4354 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4355 ; CHECK-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], #12
4356 ; CHECK-NEXT:    str x0, [x1]
4357 ; CHECK-NEXT:    ret
4358   %ld3 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 0, ptr %A)
4359   %tmp = getelementptr i32, ptr %A, i32 3
4360   store ptr %tmp, ptr %ptr
4361   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
4364 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
4365 ; CHECK-LABEL: test_v4i32_post_reg_ld3lane:
4366 ; CHECK:       ; %bb.0:
4367 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4368 ; CHECK-NEXT:    lsl x8, x2, #2
4369 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4370 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4371 ; CHECK-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], x8
4372 ; CHECK-NEXT:    str x0, [x1]
4373 ; CHECK-NEXT:    ret
4374   %ld3 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 0, ptr %A)
4375   %tmp = getelementptr i32, ptr %A, i64 %inc
4376   store ptr %tmp, ptr %ptr
4377   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
4380 declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readonly
4383 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld3lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
4384 ; CHECK-LABEL: test_v2i32_post_imm_ld3lane:
4385 ; CHECK:       ; %bb.0:
4386 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4387 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4388 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4389 ; CHECK-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], #12
4390 ; CHECK-NEXT:    str x0, [x1]
4391 ; CHECK-NEXT:    ret
4392   %ld3 = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 0, ptr %A)
4393   %tmp = getelementptr i32, ptr %A, i32 3
4394   store ptr %tmp, ptr %ptr
4395   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
4398 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
4399 ; CHECK-LABEL: test_v2i32_post_reg_ld3lane:
4400 ; CHECK:       ; %bb.0:
4401 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4402 ; CHECK-NEXT:    lsl x8, x2, #2
4403 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4404 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4405 ; CHECK-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], x8
4406 ; CHECK-NEXT:    str x0, [x1]
4407 ; CHECK-NEXT:    ret
4408   %ld3 = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 0, ptr %A)
4409   %tmp = getelementptr i32, ptr %A, i64 %inc
4410   store ptr %tmp, ptr %ptr
4411   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
4414 declare { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3lane.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, i64, ptr) nounwind readonly
4417 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld3lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
4418 ; CHECK-LABEL: test_v2i64_post_imm_ld3lane:
4419 ; CHECK:       ; %bb.0:
4420 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4421 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4422 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4423 ; CHECK-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], #24
4424 ; CHECK-NEXT:    str x0, [x1]
4425 ; CHECK-NEXT:    ret
4426   %ld3 = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 0, ptr %A)
4427   %tmp = getelementptr i64, ptr %A, i32 3
4428   store ptr %tmp, ptr %ptr
4429   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
4432 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
4433 ; CHECK-LABEL: test_v2i64_post_reg_ld3lane:
4434 ; CHECK:       ; %bb.0:
4435 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4436 ; CHECK-NEXT:    lsl x8, x2, #3
4437 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4438 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4439 ; CHECK-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], x8
4440 ; CHECK-NEXT:    str x0, [x1]
4441 ; CHECK-NEXT:    ret
4442   %ld3 = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 0, ptr %A)
4443   %tmp = getelementptr i64, ptr %A, i64 %inc
4444   store ptr %tmp, ptr %ptr
4445   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
4448 declare { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readonly
4451 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld3lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
4452 ; CHECK-LABEL: test_v1i64_post_imm_ld3lane:
4453 ; CHECK:       ; %bb.0:
4454 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4455 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4456 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4457 ; CHECK-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], #24
4458 ; CHECK-NEXT:    str x0, [x1]
4459 ; CHECK-NEXT:    ret
4460   %ld3 = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 0, ptr %A)
4461   %tmp = getelementptr i64, ptr %A, i32 3
4462   store ptr %tmp, ptr %ptr
4463   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
4466 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
4467 ; CHECK-LABEL: test_v1i64_post_reg_ld3lane:
4468 ; CHECK:       ; %bb.0:
4469 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4470 ; CHECK-NEXT:    lsl x8, x2, #3
4471 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4472 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4473 ; CHECK-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], x8
4474 ; CHECK-NEXT:    str x0, [x1]
4475 ; CHECK-NEXT:    ret
4476   %ld3 = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 0, ptr %A)
4477   %tmp = getelementptr i64, ptr %A, i64 %inc
4478   store ptr %tmp, ptr %ptr
4479   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
4482 declare { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3lane.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, i64, ptr) nounwind readonly
4485 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld3lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
4486 ; CHECK-LABEL: test_v4f32_post_imm_ld3lane:
4487 ; CHECK:       ; %bb.0:
4488 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4489 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4490 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4491 ; CHECK-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], #12
4492 ; CHECK-NEXT:    str x0, [x1]
4493 ; CHECK-NEXT:    ret
4494   %ld3 = call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, i64 0, ptr %A)
4495   %tmp = getelementptr float, ptr %A, i32 3
4496   store ptr %tmp, ptr %ptr
4497   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
4500 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
4501 ; CHECK-LABEL: test_v4f32_post_reg_ld3lane:
4502 ; CHECK:       ; %bb.0:
4503 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4504 ; CHECK-NEXT:    lsl x8, x2, #2
4505 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4506 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4507 ; CHECK-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], x8
4508 ; CHECK-NEXT:    str x0, [x1]
4509 ; CHECK-NEXT:    ret
4510   %ld3 = call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, i64 0, ptr %A)
4511   %tmp = getelementptr float, ptr %A, i64 %inc
4512   store ptr %tmp, ptr %ptr
4513   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
4516 declare { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3lane.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, i64, ptr) nounwind readonly
4519 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld3lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
4520 ; CHECK-LABEL: test_v2f32_post_imm_ld3lane:
4521 ; CHECK:       ; %bb.0:
4522 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4523 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4524 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4525 ; CHECK-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], #12
4526 ; CHECK-NEXT:    str x0, [x1]
4527 ; CHECK-NEXT:    ret
4528   %ld3 = call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, i64 0, ptr %A)
4529   %tmp = getelementptr float, ptr %A, i32 3
4530   store ptr %tmp, ptr %ptr
4531   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
4534 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
4535 ; CHECK-LABEL: test_v2f32_post_reg_ld3lane:
4536 ; CHECK:       ; %bb.0:
4537 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4538 ; CHECK-NEXT:    lsl x8, x2, #2
4539 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4540 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4541 ; CHECK-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], x8
4542 ; CHECK-NEXT:    str x0, [x1]
4543 ; CHECK-NEXT:    ret
4544   %ld3 = call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, i64 0, ptr %A)
4545   %tmp = getelementptr float, ptr %A, i64 %inc
4546   store ptr %tmp, ptr %ptr
4547   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
4550 declare { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3lane.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, i64, ptr) nounwind readonly
4553 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld3lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
4554 ; CHECK-LABEL: test_v2f64_post_imm_ld3lane:
4555 ; CHECK:       ; %bb.0:
4556 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4557 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4558 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4559 ; CHECK-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], #24
4560 ; CHECK-NEXT:    str x0, [x1]
4561 ; CHECK-NEXT:    ret
4562   %ld3 = call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, i64 0, ptr %A)
4563   %tmp = getelementptr double, ptr %A, i32 3
4564   store ptr %tmp, ptr %ptr
4565   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
4568 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
4569 ; CHECK-LABEL: test_v2f64_post_reg_ld3lane:
4570 ; CHECK:       ; %bb.0:
4571 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
4572 ; CHECK-NEXT:    lsl x8, x2, #3
4573 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
4574 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
4575 ; CHECK-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], x8
4576 ; CHECK-NEXT:    str x0, [x1]
4577 ; CHECK-NEXT:    ret
4578   %ld3 = call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, i64 0, ptr %A)
4579   %tmp = getelementptr double, ptr %A, i64 %inc
4580   store ptr %tmp, ptr %ptr
4581   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
4584 declare { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3lane.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, i64, ptr) nounwind readonly
4587 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld3lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
4588 ; CHECK-LABEL: test_v1f64_post_imm_ld3lane:
4589 ; CHECK:       ; %bb.0:
4590 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4591 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4592 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4593 ; CHECK-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], #24
4594 ; CHECK-NEXT:    str x0, [x1]
4595 ; CHECK-NEXT:    ret
4596   %ld3 = call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, i64 0, ptr %A)
4597   %tmp = getelementptr double, ptr %A, i32 3
4598   store ptr %tmp, ptr %ptr
4599   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
4602 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
4603 ; CHECK-LABEL: test_v1f64_post_reg_ld3lane:
4604 ; CHECK:       ; %bb.0:
4605 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
4606 ; CHECK-NEXT:    lsl x8, x2, #3
4607 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
4608 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
4609 ; CHECK-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], x8
4610 ; CHECK-NEXT:    str x0, [x1]
4611 ; CHECK-NEXT:    ret
4612   %ld3 = call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, i64 0, ptr %A)
4613   %tmp = getelementptr double, ptr %A, i64 %inc
4614   store ptr %tmp, ptr %ptr
4615   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
4618 declare { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3lane.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, i64, ptr) nounwind readonly
4621 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld4lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
4622 ; CHECK-LABEL: test_v16i8_post_imm_ld4lane:
4623 ; CHECK:       ; %bb.0:
4624 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4625 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4626 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4627 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4628 ; CHECK-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0], #4
4629 ; CHECK-NEXT:    str x0, [x1]
4630 ; CHECK-NEXT:    ret
4631   %ld4 = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 0, ptr %A)
4632   %tmp = getelementptr i8, ptr %A, i32 4
4633   store ptr %tmp, ptr %ptr
4634   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
4637 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
4638 ; CHECK-LABEL: test_v16i8_post_reg_ld4lane:
4639 ; CHECK:       ; %bb.0:
4640 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4641 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4642 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4643 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4644 ; CHECK-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0], x2
4645 ; CHECK-NEXT:    str x0, [x1]
4646 ; CHECK-NEXT:    ret
4647   %ld4 = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 0, ptr %A)
4648   %tmp = getelementptr i8, ptr %A, i64 %inc
4649   store ptr %tmp, ptr %ptr
4650   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
4653 declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readonly
4656 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld4lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
4657 ; CHECK-LABEL: test_v8i8_post_imm_ld4lane:
4658 ; CHECK:       ; %bb.0:
4659 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4660 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4661 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4662 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4663 ; CHECK-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0], #4
4664 ; CHECK-NEXT:    str x0, [x1]
4665 ; CHECK-NEXT:    ret
4666   %ld4 = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 0, ptr %A)
4667   %tmp = getelementptr i8, ptr %A, i32 4
4668   store ptr %tmp, ptr %ptr
4669   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
4672 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
4673 ; CHECK-LABEL: test_v8i8_post_reg_ld4lane:
4674 ; CHECK:       ; %bb.0:
4675 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4676 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4677 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4678 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4679 ; CHECK-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0], x2
4680 ; CHECK-NEXT:    str x0, [x1]
4681 ; CHECK-NEXT:    ret
4682   %ld4 = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 0, ptr %A)
4683   %tmp = getelementptr i8, ptr %A, i64 %inc
4684   store ptr %tmp, ptr %ptr
4685   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
4688 declare { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4lane.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i64, ptr) nounwind readonly
4691 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld4lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
4692 ; CHECK-LABEL: test_v8i16_post_imm_ld4lane:
4693 ; CHECK:       ; %bb.0:
4694 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4695 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4696 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4697 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4698 ; CHECK-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0], #8
4699 ; CHECK-NEXT:    str x0, [x1]
4700 ; CHECK-NEXT:    ret
4701   %ld4 = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 0, ptr %A)
4702   %tmp = getelementptr i16, ptr %A, i32 4
4703   store ptr %tmp, ptr %ptr
4704   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
4707 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
4708 ; CHECK-LABEL: test_v8i16_post_reg_ld4lane:
4709 ; CHECK:       ; %bb.0:
4710 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4711 ; CHECK-NEXT:    lsl x8, x2, #1
4712 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4713 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4714 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4715 ; CHECK-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0], x8
4716 ; CHECK-NEXT:    str x0, [x1]
4717 ; CHECK-NEXT:    ret
4718   %ld4 = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 0, ptr %A)
4719   %tmp = getelementptr i16, ptr %A, i64 %inc
4720   store ptr %tmp, ptr %ptr
4721   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
4724 declare { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readonly
4727 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld4lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
4728 ; CHECK-LABEL: test_v4i16_post_imm_ld4lane:
4729 ; CHECK:       ; %bb.0:
4730 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4731 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4732 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4733 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4734 ; CHECK-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0], #8
4735 ; CHECK-NEXT:    str x0, [x1]
4736 ; CHECK-NEXT:    ret
4737   %ld4 = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 0, ptr %A)
4738   %tmp = getelementptr i16, ptr %A, i32 4
4739   store ptr %tmp, ptr %ptr
4740   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
4743 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
4744 ; CHECK-LABEL: test_v4i16_post_reg_ld4lane:
4745 ; CHECK:       ; %bb.0:
4746 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4747 ; CHECK-NEXT:    lsl x8, x2, #1
4748 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4749 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4750 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4751 ; CHECK-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0], x8
4752 ; CHECK-NEXT:    str x0, [x1]
4753 ; CHECK-NEXT:    ret
4754   %ld4 = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 0, ptr %A)
4755   %tmp = getelementptr i16, ptr %A, i64 %inc
4756   store ptr %tmp, ptr %ptr
4757   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
4760 declare { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4lane.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i64, ptr) nounwind readonly
4763 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld4lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
4764 ; CHECK-LABEL: test_v4i32_post_imm_ld4lane:
4765 ; CHECK:       ; %bb.0:
4766 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4767 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4768 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4769 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4770 ; CHECK-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], #16
4771 ; CHECK-NEXT:    str x0, [x1]
4772 ; CHECK-NEXT:    ret
4773   %ld4 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 0, ptr %A)
4774   %tmp = getelementptr i32, ptr %A, i32 4
4775   store ptr %tmp, ptr %ptr
4776   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
4779 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
4780 ; CHECK-LABEL: test_v4i32_post_reg_ld4lane:
4781 ; CHECK:       ; %bb.0:
4782 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4783 ; CHECK-NEXT:    lsl x8, x2, #2
4784 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4785 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4786 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4787 ; CHECK-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], x8
4788 ; CHECK-NEXT:    str x0, [x1]
4789 ; CHECK-NEXT:    ret
4790   %ld4 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 0, ptr %A)
4791   %tmp = getelementptr i32, ptr %A, i64 %inc
4792   store ptr %tmp, ptr %ptr
4793   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
4796 declare { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readonly
4799 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld4lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
4800 ; CHECK-LABEL: test_v2i32_post_imm_ld4lane:
4801 ; CHECK:       ; %bb.0:
4802 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4803 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4804 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4805 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4806 ; CHECK-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], #16
4807 ; CHECK-NEXT:    str x0, [x1]
4808 ; CHECK-NEXT:    ret
4809   %ld4 = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 0, ptr %A)
4810   %tmp = getelementptr i32, ptr %A, i32 4
4811   store ptr %tmp, ptr %ptr
4812   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
4815 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
4816 ; CHECK-LABEL: test_v2i32_post_reg_ld4lane:
4817 ; CHECK:       ; %bb.0:
4818 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4819 ; CHECK-NEXT:    lsl x8, x2, #2
4820 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4821 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4822 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4823 ; CHECK-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], x8
4824 ; CHECK-NEXT:    str x0, [x1]
4825 ; CHECK-NEXT:    ret
4826   %ld4 = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 0, ptr %A)
4827   %tmp = getelementptr i32, ptr %A, i64 %inc
4828   store ptr %tmp, ptr %ptr
4829   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
4832 declare { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4lane.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i64, ptr) nounwind readonly
4835 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld4lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
4836 ; CHECK-LABEL: test_v2i64_post_imm_ld4lane:
4837 ; CHECK:       ; %bb.0:
4838 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4839 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4840 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4841 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4842 ; CHECK-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], #32
4843 ; CHECK-NEXT:    str x0, [x1]
4844 ; CHECK-NEXT:    ret
4845   %ld4 = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 0, ptr %A)
4846   %tmp = getelementptr i64, ptr %A, i32 4
4847   store ptr %tmp, ptr %ptr
4848   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
4851 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
4852 ; CHECK-LABEL: test_v2i64_post_reg_ld4lane:
4853 ; CHECK:       ; %bb.0:
4854 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4855 ; CHECK-NEXT:    lsl x8, x2, #3
4856 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4857 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4858 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4859 ; CHECK-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], x8
4860 ; CHECK-NEXT:    str x0, [x1]
4861 ; CHECK-NEXT:    ret
4862   %ld4 = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 0, ptr %A)
4863   %tmp = getelementptr i64, ptr %A, i64 %inc
4864   store ptr %tmp, ptr %ptr
4865   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
4868 declare { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readonly
4871 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld4lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
4872 ; CHECK-LABEL: test_v1i64_post_imm_ld4lane:
4873 ; CHECK:       ; %bb.0:
4874 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4875 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4876 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4877 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4878 ; CHECK-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], #32
4879 ; CHECK-NEXT:    str x0, [x1]
4880 ; CHECK-NEXT:    ret
4881   %ld4 = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 0, ptr %A)
4882   %tmp = getelementptr i64, ptr %A, i32 4
4883   store ptr %tmp, ptr %ptr
4884   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
4887 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
4888 ; CHECK-LABEL: test_v1i64_post_reg_ld4lane:
4889 ; CHECK:       ; %bb.0:
4890 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4891 ; CHECK-NEXT:    lsl x8, x2, #3
4892 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4893 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4894 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4895 ; CHECK-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], x8
4896 ; CHECK-NEXT:    str x0, [x1]
4897 ; CHECK-NEXT:    ret
4898   %ld4 = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 0, ptr %A)
4899   %tmp = getelementptr i64, ptr %A, i64 %inc
4900   store ptr %tmp, ptr %ptr
4901   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
4904 declare { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4lane.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, <1 x i64>, i64, ptr) nounwind readonly
4907 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld4lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
4908 ; CHECK-LABEL: test_v4f32_post_imm_ld4lane:
4909 ; CHECK:       ; %bb.0:
4910 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4911 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4912 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4913 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4914 ; CHECK-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], #16
4915 ; CHECK-NEXT:    str x0, [x1]
4916 ; CHECK-NEXT:    ret
4917   %ld4 = call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 0, ptr %A)
4918   %tmp = getelementptr float, ptr %A, i32 4
4919   store ptr %tmp, ptr %ptr
4920   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
4923 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
4924 ; CHECK-LABEL: test_v4f32_post_reg_ld4lane:
4925 ; CHECK:       ; %bb.0:
4926 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4927 ; CHECK-NEXT:    lsl x8, x2, #2
4928 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4929 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4930 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4931 ; CHECK-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], x8
4932 ; CHECK-NEXT:    str x0, [x1]
4933 ; CHECK-NEXT:    ret
4934   %ld4 = call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 0, ptr %A)
4935   %tmp = getelementptr float, ptr %A, i64 %inc
4936   store ptr %tmp, ptr %ptr
4937   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
4940 declare { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4lane.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, <4 x float>, i64, ptr) nounwind readonly
4943 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld4lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
4944 ; CHECK-LABEL: test_v2f32_post_imm_ld4lane:
4945 ; CHECK:       ; %bb.0:
4946 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4947 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4948 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4949 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4950 ; CHECK-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], #16
4951 ; CHECK-NEXT:    str x0, [x1]
4952 ; CHECK-NEXT:    ret
4953   %ld4 = call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 0, ptr %A)
4954   %tmp = getelementptr float, ptr %A, i32 4
4955   store ptr %tmp, ptr %ptr
4956   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
4959 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
4960 ; CHECK-LABEL: test_v2f32_post_reg_ld4lane:
4961 ; CHECK:       ; %bb.0:
4962 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4963 ; CHECK-NEXT:    lsl x8, x2, #2
4964 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4965 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4966 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4967 ; CHECK-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], x8
4968 ; CHECK-NEXT:    str x0, [x1]
4969 ; CHECK-NEXT:    ret
4970   %ld4 = call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 0, ptr %A)
4971   %tmp = getelementptr float, ptr %A, i64 %inc
4972   store ptr %tmp, ptr %ptr
4973   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
4976 declare { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4lane.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, <2 x float>, i64, ptr) nounwind readonly
4979 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld4lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
4980 ; CHECK-LABEL: test_v2f64_post_imm_ld4lane:
4981 ; CHECK:       ; %bb.0:
4982 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4983 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4984 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4985 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4986 ; CHECK-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], #32
4987 ; CHECK-NEXT:    str x0, [x1]
4988 ; CHECK-NEXT:    ret
4989   %ld4 = call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 0, ptr %A)
4990   %tmp = getelementptr double, ptr %A, i32 4
4991   store ptr %tmp, ptr %ptr
4992   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
4995 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
4996 ; CHECK-LABEL: test_v2f64_post_reg_ld4lane:
4997 ; CHECK:       ; %bb.0:
4998 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
4999 ; CHECK-NEXT:    lsl x8, x2, #3
5000 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5001 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5002 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5003 ; CHECK-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], x8
5004 ; CHECK-NEXT:    str x0, [x1]
5005 ; CHECK-NEXT:    ret
5006   %ld4 = call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 0, ptr %A)
5007   %tmp = getelementptr double, ptr %A, i64 %inc
5008   store ptr %tmp, ptr %ptr
5009   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
5012 declare { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4lane.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, <2 x double>, i64, ptr) nounwind readonly
5015 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld4lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
5016 ; CHECK-LABEL: test_v1f64_post_imm_ld4lane:
5017 ; CHECK:       ; %bb.0:
5018 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5019 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5020 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5021 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5022 ; CHECK-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], #32
5023 ; CHECK-NEXT:    str x0, [x1]
5024 ; CHECK-NEXT:    ret
5025   %ld4 = call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 0, ptr %A)
5026   %tmp = getelementptr double, ptr %A, i32 4
5027   store ptr %tmp, ptr %ptr
5028   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
5031 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
5032 ; CHECK-LABEL: test_v1f64_post_reg_ld4lane:
5033 ; CHECK:       ; %bb.0:
5034 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5035 ; CHECK-NEXT:    lsl x8, x2, #3
5036 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5037 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5038 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5039 ; CHECK-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], x8
5040 ; CHECK-NEXT:    str x0, [x1]
5041 ; CHECK-NEXT:    ret
5042   %ld4 = call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 0, ptr %A)
5043   %tmp = getelementptr double, ptr %A, i64 %inc
5044   store ptr %tmp, ptr %ptr
5045   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
5048 declare { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4lane.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, <1 x double>, i64, ptr) nounwind readonly
5051 define ptr @test_v16i8_post_imm_st2(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C) nounwind {
5052 ; CHECK-LABEL: test_v16i8_post_imm_st2:
5053 ; CHECK:       ; %bb.0:
5054 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5055 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5056 ; CHECK-NEXT:    st2.16b { v0, v1 }, [x0], #32
5057 ; CHECK-NEXT:    ret
5058   call void @llvm.aarch64.neon.st2.v16i8.p0(<16 x i8> %B, <16 x i8> %C, ptr %A)
5059   %tmp = getelementptr i8, ptr %A, i32 32
5060   ret ptr %tmp
5063 define ptr @test_v16i8_post_reg_st2(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, i64 %inc) nounwind {
5064 ; CHECK-LABEL: test_v16i8_post_reg_st2:
5065 ; CHECK:       ; %bb.0:
5066 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5067 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5068 ; CHECK-NEXT:    st2.16b { v0, v1 }, [x0], x2
5069 ; CHECK-NEXT:    ret
5070   call void @llvm.aarch64.neon.st2.v16i8.p0(<16 x i8> %B, <16 x i8> %C, ptr %A)
5071   %tmp = getelementptr i8, ptr %A, i64 %inc
5072   ret ptr %tmp
5075 declare void @llvm.aarch64.neon.st2.v16i8.p0(<16 x i8>, <16 x i8>, ptr)
5078 define ptr @test_v8i8_post_imm_st2(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C) nounwind {
5079 ; CHECK-LABEL: test_v8i8_post_imm_st2:
5080 ; CHECK:       ; %bb.0:
5081 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5082 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5083 ; CHECK-NEXT:    st2.8b { v0, v1 }, [x0], #16
5084 ; CHECK-NEXT:    ret
5085   call void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8> %B, <8 x i8> %C, ptr %A)
5086   %tmp = getelementptr i8, ptr %A, i32 16
5087   ret ptr %tmp
5090 define ptr @test_v8i8_post_reg_st2(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, i64 %inc) nounwind {
5091 ; CHECK-LABEL: test_v8i8_post_reg_st2:
5092 ; CHECK:       ; %bb.0:
5093 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5094 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5095 ; CHECK-NEXT:    st2.8b { v0, v1 }, [x0], x2
5096 ; CHECK-NEXT:    ret
5097   call void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8> %B, <8 x i8> %C, ptr %A)
5098   %tmp = getelementptr i8, ptr %A, i64 %inc
5099   ret ptr %tmp
5102 declare void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8>, <8 x i8>, ptr)
5105 define ptr @test_v8i16_post_imm_st2(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C) nounwind {
5106 ; CHECK-LABEL: test_v8i16_post_imm_st2:
5107 ; CHECK:       ; %bb.0:
5108 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5109 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5110 ; CHECK-NEXT:    st2.8h { v0, v1 }, [x0], #32
5111 ; CHECK-NEXT:    ret
5112   call void @llvm.aarch64.neon.st2.v8i16.p0(<8 x i16> %B, <8 x i16> %C, ptr %A)
5113   %tmp = getelementptr i16, ptr %A, i32 16
5114   ret ptr %tmp
5117 define ptr @test_v8i16_post_reg_st2(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, i64 %inc) nounwind {
5118 ; CHECK-LABEL: test_v8i16_post_reg_st2:
5119 ; CHECK:       ; %bb.0:
5120 ; CHECK-NEXT:    lsl x8, x2, #1
5121 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5122 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5123 ; CHECK-NEXT:    st2.8h { v0, v1 }, [x0], x8
5124 ; CHECK-NEXT:    ret
5125   call void @llvm.aarch64.neon.st2.v8i16.p0(<8 x i16> %B, <8 x i16> %C, ptr %A)
5126   %tmp = getelementptr i16, ptr %A, i64 %inc
5127   ret ptr %tmp
5130 declare void @llvm.aarch64.neon.st2.v8i16.p0(<8 x i16>, <8 x i16>, ptr)
5133 define ptr @test_v4i16_post_imm_st2(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C) nounwind {
5134 ; CHECK-LABEL: test_v4i16_post_imm_st2:
5135 ; CHECK:       ; %bb.0:
5136 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5137 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5138 ; CHECK-NEXT:    st2.4h { v0, v1 }, [x0], #16
5139 ; CHECK-NEXT:    ret
5140   call void @llvm.aarch64.neon.st2.v4i16.p0(<4 x i16> %B, <4 x i16> %C, ptr %A)
5141   %tmp = getelementptr i16, ptr %A, i32 8
5142   ret ptr %tmp
5145 define ptr @test_v4i16_post_reg_st2(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, i64 %inc) nounwind {
5146 ; CHECK-LABEL: test_v4i16_post_reg_st2:
5147 ; CHECK:       ; %bb.0:
5148 ; CHECK-NEXT:    lsl x8, x2, #1
5149 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5150 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5151 ; CHECK-NEXT:    st2.4h { v0, v1 }, [x0], x8
5152 ; CHECK-NEXT:    ret
5153   call void @llvm.aarch64.neon.st2.v4i16.p0(<4 x i16> %B, <4 x i16> %C, ptr %A)
5154   %tmp = getelementptr i16, ptr %A, i64 %inc
5155   ret ptr %tmp
5158 declare void @llvm.aarch64.neon.st2.v4i16.p0(<4 x i16>, <4 x i16>, ptr)
5161 define ptr @test_v4i32_post_imm_st2(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C) nounwind {
5162 ; CHECK-LABEL: test_v4i32_post_imm_st2:
5163 ; CHECK:       ; %bb.0:
5164 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5165 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5166 ; CHECK-NEXT:    st2.4s { v0, v1 }, [x0], #32
5167 ; CHECK-NEXT:    ret
5168   call void @llvm.aarch64.neon.st2.v4i32.p0(<4 x i32> %B, <4 x i32> %C, ptr %A)
5169   %tmp = getelementptr i32, ptr %A, i32 8
5170   ret ptr %tmp
5173 define ptr @test_v4i32_post_reg_st2(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, i64 %inc) nounwind {
5174 ; CHECK-LABEL: test_v4i32_post_reg_st2:
5175 ; CHECK:       ; %bb.0:
5176 ; CHECK-NEXT:    lsl x8, x2, #2
5177 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5178 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5179 ; CHECK-NEXT:    st2.4s { v0, v1 }, [x0], x8
5180 ; CHECK-NEXT:    ret
5181   call void @llvm.aarch64.neon.st2.v4i32.p0(<4 x i32> %B, <4 x i32> %C, ptr %A)
5182   %tmp = getelementptr i32, ptr %A, i64 %inc
5183   ret ptr %tmp
5186 declare void @llvm.aarch64.neon.st2.v4i32.p0(<4 x i32>, <4 x i32>, ptr)
5189 define ptr @test_v2i32_post_imm_st2(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C) nounwind {
5190 ; CHECK-LABEL: test_v2i32_post_imm_st2:
5191 ; CHECK:       ; %bb.0:
5192 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5193 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5194 ; CHECK-NEXT:    st2.2s { v0, v1 }, [x0], #16
5195 ; CHECK-NEXT:    ret
5196   call void @llvm.aarch64.neon.st2.v2i32.p0(<2 x i32> %B, <2 x i32> %C, ptr %A)
5197   %tmp = getelementptr i32, ptr %A, i32 4
5198   ret ptr %tmp
5201 define ptr @test_v2i32_post_reg_st2(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, i64 %inc) nounwind {
5202 ; CHECK-LABEL: test_v2i32_post_reg_st2:
5203 ; CHECK:       ; %bb.0:
5204 ; CHECK-NEXT:    lsl x8, x2, #2
5205 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5206 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5207 ; CHECK-NEXT:    st2.2s { v0, v1 }, [x0], x8
5208 ; CHECK-NEXT:    ret
5209   call void @llvm.aarch64.neon.st2.v2i32.p0(<2 x i32> %B, <2 x i32> %C, ptr %A)
5210   %tmp = getelementptr i32, ptr %A, i64 %inc
5211   ret ptr %tmp
5214 declare void @llvm.aarch64.neon.st2.v2i32.p0(<2 x i32>, <2 x i32>, ptr)
5217 define ptr @test_v2i64_post_imm_st2(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C) nounwind {
5218 ; CHECK-LABEL: test_v2i64_post_imm_st2:
5219 ; CHECK:       ; %bb.0:
5220 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5221 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5222 ; CHECK-NEXT:    st2.2d { v0, v1 }, [x0], #32
5223 ; CHECK-NEXT:    ret
5224   call void @llvm.aarch64.neon.st2.v2i64.p0(<2 x i64> %B, <2 x i64> %C, ptr %A)
5225   %tmp = getelementptr i64, ptr %A, i64 4
5226   ret ptr %tmp
5229 define ptr @test_v2i64_post_reg_st2(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, i64 %inc) nounwind {
5230 ; CHECK-LABEL: test_v2i64_post_reg_st2:
5231 ; CHECK:       ; %bb.0:
5232 ; CHECK-NEXT:    lsl x8, x2, #3
5233 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5234 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5235 ; CHECK-NEXT:    st2.2d { v0, v1 }, [x0], x8
5236 ; CHECK-NEXT:    ret
5237   call void @llvm.aarch64.neon.st2.v2i64.p0(<2 x i64> %B, <2 x i64> %C, ptr %A)
5238   %tmp = getelementptr i64, ptr %A, i64 %inc
5239   ret ptr %tmp
5242 declare void @llvm.aarch64.neon.st2.v2i64.p0(<2 x i64>, <2 x i64>, ptr)
5245 define ptr @test_v1i64_post_imm_st2(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C) nounwind {
5246 ; CHECK-LABEL: test_v1i64_post_imm_st2:
5247 ; CHECK:       ; %bb.0:
5248 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5249 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5250 ; CHECK-NEXT:    st1.1d { v0, v1 }, [x0], #16
5251 ; CHECK-NEXT:    ret
5252   call void @llvm.aarch64.neon.st2.v1i64.p0(<1 x i64> %B, <1 x i64> %C, ptr %A)
5253   %tmp = getelementptr i64, ptr %A, i64 2
5254   ret ptr %tmp
5257 define ptr @test_v1i64_post_reg_st2(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, i64 %inc) nounwind {
5258 ; CHECK-LABEL: test_v1i64_post_reg_st2:
5259 ; CHECK:       ; %bb.0:
5260 ; CHECK-NEXT:    lsl x8, x2, #3
5261 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5262 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5263 ; CHECK-NEXT:    st1.1d { v0, v1 }, [x0], x8
5264 ; CHECK-NEXT:    ret
5265   call void @llvm.aarch64.neon.st2.v1i64.p0(<1 x i64> %B, <1 x i64> %C, ptr %A)
5266   %tmp = getelementptr i64, ptr %A, i64 %inc
5267   ret ptr %tmp
5270 declare void @llvm.aarch64.neon.st2.v1i64.p0(<1 x i64>, <1 x i64>, ptr)
5273 define ptr @test_v4f32_post_imm_st2(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C) nounwind {
5274 ; CHECK-LABEL: test_v4f32_post_imm_st2:
5275 ; CHECK:       ; %bb.0:
5276 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5277 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5278 ; CHECK-NEXT:    st2.4s { v0, v1 }, [x0], #32
5279 ; CHECK-NEXT:    ret
5280   call void @llvm.aarch64.neon.st2.v4f32.p0(<4 x float> %B, <4 x float> %C, ptr %A)
5281   %tmp = getelementptr float, ptr %A, i32 8
5282   ret ptr %tmp
5285 define ptr @test_v4f32_post_reg_st2(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, i64 %inc) nounwind {
5286 ; CHECK-LABEL: test_v4f32_post_reg_st2:
5287 ; CHECK:       ; %bb.0:
5288 ; CHECK-NEXT:    lsl x8, x2, #2
5289 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5290 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5291 ; CHECK-NEXT:    st2.4s { v0, v1 }, [x0], x8
5292 ; CHECK-NEXT:    ret
5293   call void @llvm.aarch64.neon.st2.v4f32.p0(<4 x float> %B, <4 x float> %C, ptr %A)
5294   %tmp = getelementptr float, ptr %A, i64 %inc
5295   ret ptr %tmp
5298 declare void @llvm.aarch64.neon.st2.v4f32.p0(<4 x float>, <4 x float>, ptr)
5301 define ptr @test_v2f32_post_imm_st2(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C) nounwind {
5302 ; CHECK-LABEL: test_v2f32_post_imm_st2:
5303 ; CHECK:       ; %bb.0:
5304 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5305 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5306 ; CHECK-NEXT:    st2.2s { v0, v1 }, [x0], #16
5307 ; CHECK-NEXT:    ret
5308   call void @llvm.aarch64.neon.st2.v2f32.p0(<2 x float> %B, <2 x float> %C, ptr %A)
5309   %tmp = getelementptr float, ptr %A, i32 4
5310   ret ptr %tmp
5313 define ptr @test_v2f32_post_reg_st2(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, i64 %inc) nounwind {
5314 ; CHECK-LABEL: test_v2f32_post_reg_st2:
5315 ; CHECK:       ; %bb.0:
5316 ; CHECK-NEXT:    lsl x8, x2, #2
5317 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5318 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5319 ; CHECK-NEXT:    st2.2s { v0, v1 }, [x0], x8
5320 ; CHECK-NEXT:    ret
5321   call void @llvm.aarch64.neon.st2.v2f32.p0(<2 x float> %B, <2 x float> %C, ptr %A)
5322   %tmp = getelementptr float, ptr %A, i64 %inc
5323   ret ptr %tmp
5326 declare void @llvm.aarch64.neon.st2.v2f32.p0(<2 x float>, <2 x float>, ptr)
5329 define ptr @test_v2f64_post_imm_st2(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C) nounwind {
5330 ; CHECK-LABEL: test_v2f64_post_imm_st2:
5331 ; CHECK:       ; %bb.0:
5332 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5333 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5334 ; CHECK-NEXT:    st2.2d { v0, v1 }, [x0], #32
5335 ; CHECK-NEXT:    ret
5336   call void @llvm.aarch64.neon.st2.v2f64.p0(<2 x double> %B, <2 x double> %C, ptr %A)
5337   %tmp = getelementptr double, ptr %A, i64 4
5338   ret ptr %tmp
5341 define ptr @test_v2f64_post_reg_st2(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, i64 %inc) nounwind {
5342 ; CHECK-LABEL: test_v2f64_post_reg_st2:
5343 ; CHECK:       ; %bb.0:
5344 ; CHECK-NEXT:    lsl x8, x2, #3
5345 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
5346 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
5347 ; CHECK-NEXT:    st2.2d { v0, v1 }, [x0], x8
5348 ; CHECK-NEXT:    ret
5349   call void @llvm.aarch64.neon.st2.v2f64.p0(<2 x double> %B, <2 x double> %C, ptr %A)
5350   %tmp = getelementptr double, ptr %A, i64 %inc
5351   ret ptr %tmp
5354 declare void @llvm.aarch64.neon.st2.v2f64.p0(<2 x double>, <2 x double>, ptr)
5357 define ptr @test_v1f64_post_imm_st2(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C) nounwind {
5358 ; CHECK-LABEL: test_v1f64_post_imm_st2:
5359 ; CHECK:       ; %bb.0:
5360 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5361 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5362 ; CHECK-NEXT:    st1.1d { v0, v1 }, [x0], #16
5363 ; CHECK-NEXT:    ret
5364   call void @llvm.aarch64.neon.st2.v1f64.p0(<1 x double> %B, <1 x double> %C, ptr %A)
5365   %tmp = getelementptr double, ptr %A, i64 2
5366   ret ptr %tmp
5369 define ptr @test_v1f64_post_reg_st2(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, i64 %inc) nounwind {
5370 ; CHECK-LABEL: test_v1f64_post_reg_st2:
5371 ; CHECK:       ; %bb.0:
5372 ; CHECK-NEXT:    lsl x8, x2, #3
5373 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
5374 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
5375 ; CHECK-NEXT:    st1.1d { v0, v1 }, [x0], x8
5376 ; CHECK-NEXT:    ret
5377   call void @llvm.aarch64.neon.st2.v1f64.p0(<1 x double> %B, <1 x double> %C, ptr %A)
5378   %tmp = getelementptr double, ptr %A, i64 %inc
5379   ret ptr %tmp
5382 declare void @llvm.aarch64.neon.st2.v1f64.p0(<1 x double>, <1 x double>, ptr)
5385 define ptr @test_v16i8_post_imm_st3(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
5386 ; CHECK-LABEL: test_v16i8_post_imm_st3:
5387 ; CHECK:       ; %bb.0:
5388 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5389 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5390 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5391 ; CHECK-NEXT:    st3.16b { v0, v1, v2 }, [x0], #48
5392 ; CHECK-NEXT:    ret
5393   call void @llvm.aarch64.neon.st3.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %A)
5394   %tmp = getelementptr i8, ptr %A, i32 48
5395   ret ptr %tmp
5398 define ptr @test_v16i8_post_reg_st3(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 %inc) nounwind {
5399 ; CHECK-LABEL: test_v16i8_post_reg_st3:
5400 ; CHECK:       ; %bb.0:
5401 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5402 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5403 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5404 ; CHECK-NEXT:    st3.16b { v0, v1, v2 }, [x0], x2
5405 ; CHECK-NEXT:    ret
5406   call void @llvm.aarch64.neon.st3.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %A)
5407   %tmp = getelementptr i8, ptr %A, i64 %inc
5408   ret ptr %tmp
5411 declare void @llvm.aarch64.neon.st3.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, ptr)
5414 define ptr @test_v8i8_post_imm_st3(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
5415 ; CHECK-LABEL: test_v8i8_post_imm_st3:
5416 ; CHECK:       ; %bb.0:
5417 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5418 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5419 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5420 ; CHECK-NEXT:    st3.8b { v0, v1, v2 }, [x0], #24
5421 ; CHECK-NEXT:    ret
5422   call void @llvm.aarch64.neon.st3.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, ptr %A)
5423   %tmp = getelementptr i8, ptr %A, i32 24
5424   ret ptr %tmp
5427 define ptr @test_v8i8_post_reg_st3(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 %inc) nounwind {
5428 ; CHECK-LABEL: test_v8i8_post_reg_st3:
5429 ; CHECK:       ; %bb.0:
5430 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5431 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5432 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5433 ; CHECK-NEXT:    st3.8b { v0, v1, v2 }, [x0], x2
5434 ; CHECK-NEXT:    ret
5435   call void @llvm.aarch64.neon.st3.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, ptr %A)
5436   %tmp = getelementptr i8, ptr %A, i64 %inc
5437   ret ptr %tmp
5440 declare void @llvm.aarch64.neon.st3.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, ptr)
5443 define ptr @test_v8i16_post_imm_st3(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
5444 ; CHECK-LABEL: test_v8i16_post_imm_st3:
5445 ; CHECK:       ; %bb.0:
5446 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5447 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5448 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5449 ; CHECK-NEXT:    st3.8h { v0, v1, v2 }, [x0], #48
5450 ; CHECK-NEXT:    ret
5451   call void @llvm.aarch64.neon.st3.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %A)
5452   %tmp = getelementptr i16, ptr %A, i32 24
5453   ret ptr %tmp
5456 define ptr @test_v8i16_post_reg_st3(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 %inc) nounwind {
5457 ; CHECK-LABEL: test_v8i16_post_reg_st3:
5458 ; CHECK:       ; %bb.0:
5459 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5460 ; CHECK-NEXT:    lsl x8, x2, #1
5461 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5462 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5463 ; CHECK-NEXT:    st3.8h { v0, v1, v2 }, [x0], x8
5464 ; CHECK-NEXT:    ret
5465   call void @llvm.aarch64.neon.st3.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %A)
5466   %tmp = getelementptr i16, ptr %A, i64 %inc
5467   ret ptr %tmp
5470 declare void @llvm.aarch64.neon.st3.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, ptr)
5473 define ptr @test_v4i16_post_imm_st3(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
5474 ; CHECK-LABEL: test_v4i16_post_imm_st3:
5475 ; CHECK:       ; %bb.0:
5476 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5477 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5478 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5479 ; CHECK-NEXT:    st3.4h { v0, v1, v2 }, [x0], #24
5480 ; CHECK-NEXT:    ret
5481   call void @llvm.aarch64.neon.st3.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, ptr %A)
5482   %tmp = getelementptr i16, ptr %A, i32 12
5483   ret ptr %tmp
5486 define ptr @test_v4i16_post_reg_st3(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 %inc) nounwind {
5487 ; CHECK-LABEL: test_v4i16_post_reg_st3:
5488 ; CHECK:       ; %bb.0:
5489 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5490 ; CHECK-NEXT:    lsl x8, x2, #1
5491 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5492 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5493 ; CHECK-NEXT:    st3.4h { v0, v1, v2 }, [x0], x8
5494 ; CHECK-NEXT:    ret
5495   call void @llvm.aarch64.neon.st3.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, ptr %A)
5496   %tmp = getelementptr i16, ptr %A, i64 %inc
5497   ret ptr %tmp
5500 declare void @llvm.aarch64.neon.st3.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, ptr)
5503 define ptr @test_v4i32_post_imm_st3(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
5504 ; CHECK-LABEL: test_v4i32_post_imm_st3:
5505 ; CHECK:       ; %bb.0:
5506 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5507 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5508 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5509 ; CHECK-NEXT:    st3.4s { v0, v1, v2 }, [x0], #48
5510 ; CHECK-NEXT:    ret
5511   call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %A)
5512   %tmp = getelementptr i32, ptr %A, i32 12
5513   ret ptr %tmp
5516 define ptr @test_v4i32_post_reg_st3(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 %inc) nounwind {
5517 ; CHECK-LABEL: test_v4i32_post_reg_st3:
5518 ; CHECK:       ; %bb.0:
5519 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5520 ; CHECK-NEXT:    lsl x8, x2, #2
5521 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5522 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5523 ; CHECK-NEXT:    st3.4s { v0, v1, v2 }, [x0], x8
5524 ; CHECK-NEXT:    ret
5525   call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %A)
5526   %tmp = getelementptr i32, ptr %A, i64 %inc
5527   ret ptr %tmp
5530 declare void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, ptr)
5533 define ptr @test_v2i32_post_imm_st3(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
5534 ; CHECK-LABEL: test_v2i32_post_imm_st3:
5535 ; CHECK:       ; %bb.0:
5536 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5537 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5538 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5539 ; CHECK-NEXT:    st3.2s { v0, v1, v2 }, [x0], #24
5540 ; CHECK-NEXT:    ret
5541   call void @llvm.aarch64.neon.st3.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, ptr %A)
5542   %tmp = getelementptr i32, ptr %A, i32 6
5543   ret ptr %tmp
5546 define ptr @test_v2i32_post_reg_st3(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 %inc) nounwind {
5547 ; CHECK-LABEL: test_v2i32_post_reg_st3:
5548 ; CHECK:       ; %bb.0:
5549 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5550 ; CHECK-NEXT:    lsl x8, x2, #2
5551 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5552 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5553 ; CHECK-NEXT:    st3.2s { v0, v1, v2 }, [x0], x8
5554 ; CHECK-NEXT:    ret
5555   call void @llvm.aarch64.neon.st3.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, ptr %A)
5556   %tmp = getelementptr i32, ptr %A, i64 %inc
5557   ret ptr %tmp
5560 declare void @llvm.aarch64.neon.st3.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, ptr)
5563 define ptr @test_v2i64_post_imm_st3(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
5564 ; CHECK-LABEL: test_v2i64_post_imm_st3:
5565 ; CHECK:       ; %bb.0:
5566 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5567 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5568 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5569 ; CHECK-NEXT:    st3.2d { v0, v1, v2 }, [x0], #48
5570 ; CHECK-NEXT:    ret
5571   call void @llvm.aarch64.neon.st3.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %A)
5572   %tmp = getelementptr i64, ptr %A, i64 6
5573   ret ptr %tmp
5576 define ptr @test_v2i64_post_reg_st3(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 %inc) nounwind {
5577 ; CHECK-LABEL: test_v2i64_post_reg_st3:
5578 ; CHECK:       ; %bb.0:
5579 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5580 ; CHECK-NEXT:    lsl x8, x2, #3
5581 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5582 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5583 ; CHECK-NEXT:    st3.2d { v0, v1, v2 }, [x0], x8
5584 ; CHECK-NEXT:    ret
5585   call void @llvm.aarch64.neon.st3.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %A)
5586   %tmp = getelementptr i64, ptr %A, i64 %inc
5587   ret ptr %tmp
5590 declare void @llvm.aarch64.neon.st3.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, ptr)
5593 define ptr @test_v1i64_post_imm_st3(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
5594 ; CHECK-LABEL: test_v1i64_post_imm_st3:
5595 ; CHECK:       ; %bb.0:
5596 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5597 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5598 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5599 ; CHECK-NEXT:    st1.1d { v0, v1, v2 }, [x0], #24
5600 ; CHECK-NEXT:    ret
5601   call void @llvm.aarch64.neon.st3.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, ptr %A)
5602   %tmp = getelementptr i64, ptr %A, i64 3
5603   ret ptr %tmp
5606 define ptr @test_v1i64_post_reg_st3(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 %inc) nounwind {
5607 ; CHECK-LABEL: test_v1i64_post_reg_st3:
5608 ; CHECK:       ; %bb.0:
5609 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5610 ; CHECK-NEXT:    lsl x8, x2, #3
5611 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5612 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5613 ; CHECK-NEXT:    st1.1d { v0, v1, v2 }, [x0], x8
5614 ; CHECK-NEXT:    ret
5615   call void @llvm.aarch64.neon.st3.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, ptr %A)
5616   %tmp = getelementptr i64, ptr %A, i64 %inc
5617   ret ptr %tmp
5620 declare void @llvm.aarch64.neon.st3.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, ptr)
5623 define ptr @test_v4f32_post_imm_st3(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
5624 ; CHECK-LABEL: test_v4f32_post_imm_st3:
5625 ; CHECK:       ; %bb.0:
5626 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5627 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5628 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5629 ; CHECK-NEXT:    st3.4s { v0, v1, v2 }, [x0], #48
5630 ; CHECK-NEXT:    ret
5631   call void @llvm.aarch64.neon.st3.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, ptr %A)
5632   %tmp = getelementptr float, ptr %A, i32 12
5633   ret ptr %tmp
5636 define ptr @test_v4f32_post_reg_st3(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, i64 %inc) nounwind {
5637 ; CHECK-LABEL: test_v4f32_post_reg_st3:
5638 ; CHECK:       ; %bb.0:
5639 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5640 ; CHECK-NEXT:    lsl x8, x2, #2
5641 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5642 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5643 ; CHECK-NEXT:    st3.4s { v0, v1, v2 }, [x0], x8
5644 ; CHECK-NEXT:    ret
5645   call void @llvm.aarch64.neon.st3.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, ptr %A)
5646   %tmp = getelementptr float, ptr %A, i64 %inc
5647   ret ptr %tmp
5650 declare void @llvm.aarch64.neon.st3.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, ptr)
5653 define ptr @test_v2f32_post_imm_st3(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
5654 ; CHECK-LABEL: test_v2f32_post_imm_st3:
5655 ; CHECK:       ; %bb.0:
5656 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5657 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5658 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5659 ; CHECK-NEXT:    st3.2s { v0, v1, v2 }, [x0], #24
5660 ; CHECK-NEXT:    ret
5661   call void @llvm.aarch64.neon.st3.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, ptr %A)
5662   %tmp = getelementptr float, ptr %A, i32 6
5663   ret ptr %tmp
5666 define ptr @test_v2f32_post_reg_st3(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, i64 %inc) nounwind {
5667 ; CHECK-LABEL: test_v2f32_post_reg_st3:
5668 ; CHECK:       ; %bb.0:
5669 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5670 ; CHECK-NEXT:    lsl x8, x2, #2
5671 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5672 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5673 ; CHECK-NEXT:    st3.2s { v0, v1, v2 }, [x0], x8
5674 ; CHECK-NEXT:    ret
5675   call void @llvm.aarch64.neon.st3.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, ptr %A)
5676   %tmp = getelementptr float, ptr %A, i64 %inc
5677   ret ptr %tmp
5680 declare void @llvm.aarch64.neon.st3.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, ptr)
5683 define ptr @test_v2f64_post_imm_st3(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
5684 ; CHECK-LABEL: test_v2f64_post_imm_st3:
5685 ; CHECK:       ; %bb.0:
5686 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5687 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5688 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5689 ; CHECK-NEXT:    st3.2d { v0, v1, v2 }, [x0], #48
5690 ; CHECK-NEXT:    ret
5691   call void @llvm.aarch64.neon.st3.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, ptr %A)
5692   %tmp = getelementptr double, ptr %A, i64 6
5693   ret ptr %tmp
5696 define ptr @test_v2f64_post_reg_st3(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, i64 %inc) nounwind {
5697 ; CHECK-LABEL: test_v2f64_post_reg_st3:
5698 ; CHECK:       ; %bb.0:
5699 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
5700 ; CHECK-NEXT:    lsl x8, x2, #3
5701 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
5702 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
5703 ; CHECK-NEXT:    st3.2d { v0, v1, v2 }, [x0], x8
5704 ; CHECK-NEXT:    ret
5705   call void @llvm.aarch64.neon.st3.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, ptr %A)
5706   %tmp = getelementptr double, ptr %A, i64 %inc
5707   ret ptr %tmp
5710 declare void @llvm.aarch64.neon.st3.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, ptr)
5713 define ptr @test_v1f64_post_imm_st3(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
5714 ; CHECK-LABEL: test_v1f64_post_imm_st3:
5715 ; CHECK:       ; %bb.0:
5716 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5717 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5718 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5719 ; CHECK-NEXT:    st1.1d { v0, v1, v2 }, [x0], #24
5720 ; CHECK-NEXT:    ret
5721   call void @llvm.aarch64.neon.st3.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, ptr %A)
5722   %tmp = getelementptr double, ptr %A, i64 3
5723   ret ptr %tmp
5726 define ptr @test_v1f64_post_reg_st3(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, i64 %inc) nounwind {
5727 ; CHECK-LABEL: test_v1f64_post_reg_st3:
5728 ; CHECK:       ; %bb.0:
5729 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
5730 ; CHECK-NEXT:    lsl x8, x2, #3
5731 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
5732 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
5733 ; CHECK-NEXT:    st1.1d { v0, v1, v2 }, [x0], x8
5734 ; CHECK-NEXT:    ret
5735   call void @llvm.aarch64.neon.st3.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, ptr %A)
5736   %tmp = getelementptr double, ptr %A, i64 %inc
5737   ret ptr %tmp
5740 declare void @llvm.aarch64.neon.st3.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, ptr)
5743 define ptr @test_v16i8_post_imm_st4(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
5744 ; CHECK-LABEL: test_v16i8_post_imm_st4:
5745 ; CHECK:       ; %bb.0:
5746 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5747 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5748 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5749 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5750 ; CHECK-NEXT:    st4.16b { v0, v1, v2, v3 }, [x0], #64
5751 ; CHECK-NEXT:    ret
5752   call void @llvm.aarch64.neon.st4.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, ptr %A)
5753   %tmp = getelementptr i8, ptr %A, i32 64
5754   ret ptr %tmp
5757 define ptr @test_v16i8_post_reg_st4(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 %inc) nounwind {
5758 ; CHECK-LABEL: test_v16i8_post_reg_st4:
5759 ; CHECK:       ; %bb.0:
5760 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5761 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5762 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5763 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5764 ; CHECK-NEXT:    st4.16b { v0, v1, v2, v3 }, [x0], x2
5765 ; CHECK-NEXT:    ret
5766   call void @llvm.aarch64.neon.st4.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, ptr %A)
5767   %tmp = getelementptr i8, ptr %A, i64 %inc
5768   ret ptr %tmp
5771 declare void @llvm.aarch64.neon.st4.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, ptr)
5774 define ptr @test_v8i8_post_imm_st4(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
5775 ; CHECK-LABEL: test_v8i8_post_imm_st4:
5776 ; CHECK:       ; %bb.0:
5777 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5778 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5779 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5780 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5781 ; CHECK-NEXT:    st4.8b { v0, v1, v2, v3 }, [x0], #32
5782 ; CHECK-NEXT:    ret
5783   call void @llvm.aarch64.neon.st4.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, ptr %A)
5784   %tmp = getelementptr i8, ptr %A, i32 32
5785   ret ptr %tmp
5788 define ptr @test_v8i8_post_reg_st4(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 %inc) nounwind {
5789 ; CHECK-LABEL: test_v8i8_post_reg_st4:
5790 ; CHECK:       ; %bb.0:
5791 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5792 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5793 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5794 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5795 ; CHECK-NEXT:    st4.8b { v0, v1, v2, v3 }, [x0], x2
5796 ; CHECK-NEXT:    ret
5797   call void @llvm.aarch64.neon.st4.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, ptr %A)
5798   %tmp = getelementptr i8, ptr %A, i64 %inc
5799   ret ptr %tmp
5802 declare void @llvm.aarch64.neon.st4.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, ptr)
5805 define ptr @test_v8i16_post_imm_st4(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
5806 ; CHECK-LABEL: test_v8i16_post_imm_st4:
5807 ; CHECK:       ; %bb.0:
5808 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5809 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5810 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5811 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5812 ; CHECK-NEXT:    st4.8h { v0, v1, v2, v3 }, [x0], #64
5813 ; CHECK-NEXT:    ret
5814   call void @llvm.aarch64.neon.st4.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, ptr %A)
5815   %tmp = getelementptr i16, ptr %A, i32 32
5816   ret ptr %tmp
5819 define ptr @test_v8i16_post_reg_st4(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 %inc) nounwind {
5820 ; CHECK-LABEL: test_v8i16_post_reg_st4:
5821 ; CHECK:       ; %bb.0:
5822 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5823 ; CHECK-NEXT:    lsl x8, x2, #1
5824 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5825 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5826 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5827 ; CHECK-NEXT:    st4.8h { v0, v1, v2, v3 }, [x0], x8
5828 ; CHECK-NEXT:    ret
5829   call void @llvm.aarch64.neon.st4.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, ptr %A)
5830   %tmp = getelementptr i16, ptr %A, i64 %inc
5831   ret ptr %tmp
5834 declare void @llvm.aarch64.neon.st4.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, ptr)
5837 define ptr @test_v4i16_post_imm_st4(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
5838 ; CHECK-LABEL: test_v4i16_post_imm_st4:
5839 ; CHECK:       ; %bb.0:
5840 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5841 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5842 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5843 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5844 ; CHECK-NEXT:    st4.4h { v0, v1, v2, v3 }, [x0], #32
5845 ; CHECK-NEXT:    ret
5846   call void @llvm.aarch64.neon.st4.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, ptr %A)
5847   %tmp = getelementptr i16, ptr %A, i32 16
5848   ret ptr %tmp
5851 define ptr @test_v4i16_post_reg_st4(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 %inc) nounwind {
5852 ; CHECK-LABEL: test_v4i16_post_reg_st4:
5853 ; CHECK:       ; %bb.0:
5854 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5855 ; CHECK-NEXT:    lsl x8, x2, #1
5856 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5857 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5858 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5859 ; CHECK-NEXT:    st4.4h { v0, v1, v2, v3 }, [x0], x8
5860 ; CHECK-NEXT:    ret
5861   call void @llvm.aarch64.neon.st4.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, ptr %A)
5862   %tmp = getelementptr i16, ptr %A, i64 %inc
5863   ret ptr %tmp
5866 declare void @llvm.aarch64.neon.st4.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>,<4 x i16>,  ptr)
5869 define ptr @test_v4i32_post_imm_st4(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
5870 ; CHECK-LABEL: test_v4i32_post_imm_st4:
5871 ; CHECK:       ; %bb.0:
5872 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5873 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5874 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5875 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5876 ; CHECK-NEXT:    st4.4s { v0, v1, v2, v3 }, [x0], #64
5877 ; CHECK-NEXT:    ret
5878   call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, ptr %A)
5879   %tmp = getelementptr i32, ptr %A, i32 16
5880   ret ptr %tmp
5883 define ptr @test_v4i32_post_reg_st4(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 %inc) nounwind {
5884 ; CHECK-LABEL: test_v4i32_post_reg_st4:
5885 ; CHECK:       ; %bb.0:
5886 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5887 ; CHECK-NEXT:    lsl x8, x2, #2
5888 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5889 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5890 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5891 ; CHECK-NEXT:    st4.4s { v0, v1, v2, v3 }, [x0], x8
5892 ; CHECK-NEXT:    ret
5893   call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, ptr %A)
5894   %tmp = getelementptr i32, ptr %A, i64 %inc
5895   ret ptr %tmp
5898 declare void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>,<4 x i32>,  ptr)
5901 define ptr @test_v2i32_post_imm_st4(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
5902 ; CHECK-LABEL: test_v2i32_post_imm_st4:
5903 ; CHECK:       ; %bb.0:
5904 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5905 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5906 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5907 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5908 ; CHECK-NEXT:    st4.2s { v0, v1, v2, v3 }, [x0], #32
5909 ; CHECK-NEXT:    ret
5910   call void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, ptr %A)
5911   %tmp = getelementptr i32, ptr %A, i32 8
5912   ret ptr %tmp
5915 define ptr @test_v2i32_post_reg_st4(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 %inc) nounwind {
5916 ; CHECK-LABEL: test_v2i32_post_reg_st4:
5917 ; CHECK:       ; %bb.0:
5918 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5919 ; CHECK-NEXT:    lsl x8, x2, #2
5920 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5921 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5922 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5923 ; CHECK-NEXT:    st4.2s { v0, v1, v2, v3 }, [x0], x8
5924 ; CHECK-NEXT:    ret
5925   call void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, ptr %A)
5926   %tmp = getelementptr i32, ptr %A, i64 %inc
5927   ret ptr %tmp
5930 declare void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, ptr)
5933 define ptr @test_v2i64_post_imm_st4(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
5934 ; CHECK-LABEL: test_v2i64_post_imm_st4:
5935 ; CHECK:       ; %bb.0:
5936 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5937 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5938 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5939 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5940 ; CHECK-NEXT:    st4.2d { v0, v1, v2, v3 }, [x0], #64
5941 ; CHECK-NEXT:    ret
5942   call void @llvm.aarch64.neon.st4.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, ptr %A)
5943   %tmp = getelementptr i64, ptr %A, i64 8
5944   ret ptr %tmp
5947 define ptr @test_v2i64_post_reg_st4(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 %inc) nounwind {
5948 ; CHECK-LABEL: test_v2i64_post_reg_st4:
5949 ; CHECK:       ; %bb.0:
5950 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5951 ; CHECK-NEXT:    lsl x8, x2, #3
5952 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5953 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5954 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
5955 ; CHECK-NEXT:    st4.2d { v0, v1, v2, v3 }, [x0], x8
5956 ; CHECK-NEXT:    ret
5957   call void @llvm.aarch64.neon.st4.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, ptr %A)
5958   %tmp = getelementptr i64, ptr %A, i64 %inc
5959   ret ptr %tmp
5962 declare void @llvm.aarch64.neon.st4.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>,<2 x i64>,  ptr)
5965 define ptr @test_v1i64_post_imm_st4(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
5966 ; CHECK-LABEL: test_v1i64_post_imm_st4:
5967 ; CHECK:       ; %bb.0:
5968 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5969 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5970 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5971 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5972 ; CHECK-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], #32
5973 ; CHECK-NEXT:    ret
5974   call void @llvm.aarch64.neon.st4.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, ptr %A)
5975   %tmp = getelementptr i64, ptr %A, i64 4
5976   ret ptr %tmp
5979 define ptr @test_v1i64_post_reg_st4(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 %inc) nounwind {
5980 ; CHECK-LABEL: test_v1i64_post_reg_st4:
5981 ; CHECK:       ; %bb.0:
5982 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5983 ; CHECK-NEXT:    lsl x8, x2, #3
5984 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5985 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5986 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
5987 ; CHECK-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], x8
5988 ; CHECK-NEXT:    ret
5989   call void @llvm.aarch64.neon.st4.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, ptr %A)
5990   %tmp = getelementptr i64, ptr %A, i64 %inc
5991   ret ptr %tmp
5994 declare void @llvm.aarch64.neon.st4.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>,<1 x i64>,  ptr)
5997 define ptr @test_v4f32_post_imm_st4(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
5998 ; CHECK-LABEL: test_v4f32_post_imm_st4:
5999 ; CHECK:       ; %bb.0:
6000 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6001 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6002 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6003 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6004 ; CHECK-NEXT:    st4.4s { v0, v1, v2, v3 }, [x0], #64
6005 ; CHECK-NEXT:    ret
6006   call void @llvm.aarch64.neon.st4.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, ptr %A)
6007   %tmp = getelementptr float, ptr %A, i32 16
6008   ret ptr %tmp
6011 define ptr @test_v4f32_post_reg_st4(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 %inc) nounwind {
6012 ; CHECK-LABEL: test_v4f32_post_reg_st4:
6013 ; CHECK:       ; %bb.0:
6014 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6015 ; CHECK-NEXT:    lsl x8, x2, #2
6016 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6017 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6018 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6019 ; CHECK-NEXT:    st4.4s { v0, v1, v2, v3 }, [x0], x8
6020 ; CHECK-NEXT:    ret
6021   call void @llvm.aarch64.neon.st4.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, ptr %A)
6022   %tmp = getelementptr float, ptr %A, i64 %inc
6023   ret ptr %tmp
6026 declare void @llvm.aarch64.neon.st4.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, <4 x float>, ptr)
6029 define ptr @test_v2f32_post_imm_st4(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
6030 ; CHECK-LABEL: test_v2f32_post_imm_st4:
6031 ; CHECK:       ; %bb.0:
6032 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6033 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6034 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6035 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6036 ; CHECK-NEXT:    st4.2s { v0, v1, v2, v3 }, [x0], #32
6037 ; CHECK-NEXT:    ret
6038   call void @llvm.aarch64.neon.st4.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, ptr %A)
6039   %tmp = getelementptr float, ptr %A, i32 8
6040   ret ptr %tmp
6043 define ptr @test_v2f32_post_reg_st4(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 %inc) nounwind {
6044 ; CHECK-LABEL: test_v2f32_post_reg_st4:
6045 ; CHECK:       ; %bb.0:
6046 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6047 ; CHECK-NEXT:    lsl x8, x2, #2
6048 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6049 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6050 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6051 ; CHECK-NEXT:    st4.2s { v0, v1, v2, v3 }, [x0], x8
6052 ; CHECK-NEXT:    ret
6053   call void @llvm.aarch64.neon.st4.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, ptr %A)
6054   %tmp = getelementptr float, ptr %A, i64 %inc
6055   ret ptr %tmp
6058 declare void @llvm.aarch64.neon.st4.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, <2 x float>, ptr)
6061 define ptr @test_v2f64_post_imm_st4(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
6062 ; CHECK-LABEL: test_v2f64_post_imm_st4:
6063 ; CHECK:       ; %bb.0:
6064 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6065 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6066 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6067 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6068 ; CHECK-NEXT:    st4.2d { v0, v1, v2, v3 }, [x0], #64
6069 ; CHECK-NEXT:    ret
6070   call void @llvm.aarch64.neon.st4.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, ptr %A)
6071   %tmp = getelementptr double, ptr %A, i64 8
6072   ret ptr %tmp
6075 define ptr @test_v2f64_post_reg_st4(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 %inc) nounwind {
6076 ; CHECK-LABEL: test_v2f64_post_reg_st4:
6077 ; CHECK:       ; %bb.0:
6078 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6079 ; CHECK-NEXT:    lsl x8, x2, #3
6080 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6081 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6082 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6083 ; CHECK-NEXT:    st4.2d { v0, v1, v2, v3 }, [x0], x8
6084 ; CHECK-NEXT:    ret
6085   call void @llvm.aarch64.neon.st4.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, ptr %A)
6086   %tmp = getelementptr double, ptr %A, i64 %inc
6087   ret ptr %tmp
6090 declare void @llvm.aarch64.neon.st4.v2f64.p0(<2 x double>, <2 x double>, <2 x double>,<2 x double>,  ptr)
6093 define ptr @test_v1f64_post_imm_st4(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
6094 ; CHECK-LABEL: test_v1f64_post_imm_st4:
6095 ; CHECK:       ; %bb.0:
6096 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6097 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6098 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6099 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6100 ; CHECK-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], #32
6101 ; CHECK-NEXT:    ret
6102   call void @llvm.aarch64.neon.st4.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, ptr %A)
6103   %tmp = getelementptr double, ptr %A, i64 4
6104   ret ptr %tmp
6107 define ptr @test_v1f64_post_reg_st4(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 %inc) nounwind {
6108 ; CHECK-LABEL: test_v1f64_post_reg_st4:
6109 ; CHECK:       ; %bb.0:
6110 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6111 ; CHECK-NEXT:    lsl x8, x2, #3
6112 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6113 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6114 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6115 ; CHECK-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], x8
6116 ; CHECK-NEXT:    ret
6117   call void @llvm.aarch64.neon.st4.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, ptr %A)
6118   %tmp = getelementptr double, ptr %A, i64 %inc
6119   ret ptr %tmp
6122 declare void @llvm.aarch64.neon.st4.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, <1 x double>, ptr)
6125 define ptr @test_v16i8_post_imm_st1x2(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C) nounwind {
6126 ; CHECK-LABEL: test_v16i8_post_imm_st1x2:
6127 ; CHECK:       ; %bb.0:
6128 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6129 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6130 ; CHECK-NEXT:    st1.16b { v0, v1 }, [x0], #32
6131 ; CHECK-NEXT:    ret
6132   call void @llvm.aarch64.neon.st1x2.v16i8.p0(<16 x i8> %B, <16 x i8> %C, ptr %A)
6133   %tmp = getelementptr i8, ptr %A, i32 32
6134   ret ptr %tmp
6137 define ptr @test_v16i8_post_reg_st1x2(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, i64 %inc) nounwind {
6138 ; CHECK-LABEL: test_v16i8_post_reg_st1x2:
6139 ; CHECK:       ; %bb.0:
6140 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6141 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6142 ; CHECK-NEXT:    st1.16b { v0, v1 }, [x0], x2
6143 ; CHECK-NEXT:    ret
6144   call void @llvm.aarch64.neon.st1x2.v16i8.p0(<16 x i8> %B, <16 x i8> %C, ptr %A)
6145   %tmp = getelementptr i8, ptr %A, i64 %inc
6146   ret ptr %tmp
6149 declare void @llvm.aarch64.neon.st1x2.v16i8.p0(<16 x i8>, <16 x i8>, ptr)
6152 define ptr @test_v8i8_post_imm_st1x2(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C) nounwind {
6153 ; CHECK-LABEL: test_v8i8_post_imm_st1x2:
6154 ; CHECK:       ; %bb.0:
6155 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6156 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6157 ; CHECK-NEXT:    st1.8b { v0, v1 }, [x0], #16
6158 ; CHECK-NEXT:    ret
6159   call void @llvm.aarch64.neon.st1x2.v8i8.p0(<8 x i8> %B, <8 x i8> %C, ptr %A)
6160   %tmp = getelementptr i8, ptr %A, i32 16
6161   ret ptr %tmp
6164 define ptr @test_v8i8_post_reg_st1x2(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, i64 %inc) nounwind {
6165 ; CHECK-LABEL: test_v8i8_post_reg_st1x2:
6166 ; CHECK:       ; %bb.0:
6167 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6168 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6169 ; CHECK-NEXT:    st1.8b { v0, v1 }, [x0], x2
6170 ; CHECK-NEXT:    ret
6171   call void @llvm.aarch64.neon.st1x2.v8i8.p0(<8 x i8> %B, <8 x i8> %C, ptr %A)
6172   %tmp = getelementptr i8, ptr %A, i64 %inc
6173   ret ptr %tmp
6176 declare void @llvm.aarch64.neon.st1x2.v8i8.p0(<8 x i8>, <8 x i8>, ptr)
6179 define ptr @test_v8i16_post_imm_st1x2(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C) nounwind {
6180 ; CHECK-LABEL: test_v8i16_post_imm_st1x2:
6181 ; CHECK:       ; %bb.0:
6182 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6183 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6184 ; CHECK-NEXT:    st1.8h { v0, v1 }, [x0], #32
6185 ; CHECK-NEXT:    ret
6186   call void @llvm.aarch64.neon.st1x2.v8i16.p0(<8 x i16> %B, <8 x i16> %C, ptr %A)
6187   %tmp = getelementptr i16, ptr %A, i32 16
6188   ret ptr %tmp
6191 define ptr @test_v8i16_post_reg_st1x2(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, i64 %inc) nounwind {
6192 ; CHECK-LABEL: test_v8i16_post_reg_st1x2:
6193 ; CHECK:       ; %bb.0:
6194 ; CHECK-NEXT:    lsl x8, x2, #1
6195 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6196 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6197 ; CHECK-NEXT:    st1.8h { v0, v1 }, [x0], x8
6198 ; CHECK-NEXT:    ret
6199   call void @llvm.aarch64.neon.st1x2.v8i16.p0(<8 x i16> %B, <8 x i16> %C, ptr %A)
6200   %tmp = getelementptr i16, ptr %A, i64 %inc
6201   ret ptr %tmp
6204 declare void @llvm.aarch64.neon.st1x2.v8i16.p0(<8 x i16>, <8 x i16>, ptr)
6207 define ptr @test_v4i16_post_imm_st1x2(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C) nounwind {
6208 ; CHECK-LABEL: test_v4i16_post_imm_st1x2:
6209 ; CHECK:       ; %bb.0:
6210 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6211 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6212 ; CHECK-NEXT:    st1.4h { v0, v1 }, [x0], #16
6213 ; CHECK-NEXT:    ret
6214   call void @llvm.aarch64.neon.st1x2.v4i16.p0(<4 x i16> %B, <4 x i16> %C, ptr %A)
6215   %tmp = getelementptr i16, ptr %A, i32 8
6216   ret ptr %tmp
6219 define ptr @test_v4i16_post_reg_st1x2(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, i64 %inc) nounwind {
6220 ; CHECK-LABEL: test_v4i16_post_reg_st1x2:
6221 ; CHECK:       ; %bb.0:
6222 ; CHECK-NEXT:    lsl x8, x2, #1
6223 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6224 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6225 ; CHECK-NEXT:    st1.4h { v0, v1 }, [x0], x8
6226 ; CHECK-NEXT:    ret
6227   call void @llvm.aarch64.neon.st1x2.v4i16.p0(<4 x i16> %B, <4 x i16> %C, ptr %A)
6228   %tmp = getelementptr i16, ptr %A, i64 %inc
6229   ret ptr %tmp
6232 declare void @llvm.aarch64.neon.st1x2.v4i16.p0(<4 x i16>, <4 x i16>, ptr)
6235 define ptr @test_v4i32_post_imm_st1x2(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C) nounwind {
6236 ; CHECK-LABEL: test_v4i32_post_imm_st1x2:
6237 ; CHECK:       ; %bb.0:
6238 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6239 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6240 ; CHECK-NEXT:    st1.4s { v0, v1 }, [x0], #32
6241 ; CHECK-NEXT:    ret
6242   call void @llvm.aarch64.neon.st1x2.v4i32.p0(<4 x i32> %B, <4 x i32> %C, ptr %A)
6243   %tmp = getelementptr i32, ptr %A, i32 8
6244   ret ptr %tmp
6247 define ptr @test_v4i32_post_reg_st1x2(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, i64 %inc) nounwind {
6248 ; CHECK-LABEL: test_v4i32_post_reg_st1x2:
6249 ; CHECK:       ; %bb.0:
6250 ; CHECK-NEXT:    lsl x8, x2, #2
6251 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6252 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6253 ; CHECK-NEXT:    st1.4s { v0, v1 }, [x0], x8
6254 ; CHECK-NEXT:    ret
6255   call void @llvm.aarch64.neon.st1x2.v4i32.p0(<4 x i32> %B, <4 x i32> %C, ptr %A)
6256   %tmp = getelementptr i32, ptr %A, i64 %inc
6257   ret ptr %tmp
6260 declare void @llvm.aarch64.neon.st1x2.v4i32.p0(<4 x i32>, <4 x i32>, ptr)
6263 define ptr @test_v2i32_post_imm_st1x2(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C) nounwind {
6264 ; CHECK-LABEL: test_v2i32_post_imm_st1x2:
6265 ; CHECK:       ; %bb.0:
6266 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6267 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6268 ; CHECK-NEXT:    st1.2s { v0, v1 }, [x0], #16
6269 ; CHECK-NEXT:    ret
6270   call void @llvm.aarch64.neon.st1x2.v2i32.p0(<2 x i32> %B, <2 x i32> %C, ptr %A)
6271   %tmp = getelementptr i32, ptr %A, i32 4
6272   ret ptr %tmp
6275 define ptr @test_v2i32_post_reg_st1x2(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, i64 %inc) nounwind {
6276 ; CHECK-LABEL: test_v2i32_post_reg_st1x2:
6277 ; CHECK:       ; %bb.0:
6278 ; CHECK-NEXT:    lsl x8, x2, #2
6279 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6280 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6281 ; CHECK-NEXT:    st1.2s { v0, v1 }, [x0], x8
6282 ; CHECK-NEXT:    ret
6283   call void @llvm.aarch64.neon.st1x2.v2i32.p0(<2 x i32> %B, <2 x i32> %C, ptr %A)
6284   %tmp = getelementptr i32, ptr %A, i64 %inc
6285   ret ptr %tmp
6288 declare void @llvm.aarch64.neon.st1x2.v2i32.p0(<2 x i32>, <2 x i32>, ptr)
6291 define ptr @test_v2i64_post_imm_st1x2(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C) nounwind {
6292 ; CHECK-LABEL: test_v2i64_post_imm_st1x2:
6293 ; CHECK:       ; %bb.0:
6294 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6295 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6296 ; CHECK-NEXT:    st1.2d { v0, v1 }, [x0], #32
6297 ; CHECK-NEXT:    ret
6298   call void @llvm.aarch64.neon.st1x2.v2i64.p0(<2 x i64> %B, <2 x i64> %C, ptr %A)
6299   %tmp = getelementptr i64, ptr %A, i64 4
6300   ret ptr %tmp
6303 define ptr @test_v2i64_post_reg_st1x2(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, i64 %inc) nounwind {
6304 ; CHECK-LABEL: test_v2i64_post_reg_st1x2:
6305 ; CHECK:       ; %bb.0:
6306 ; CHECK-NEXT:    lsl x8, x2, #3
6307 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6308 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6309 ; CHECK-NEXT:    st1.2d { v0, v1 }, [x0], x8
6310 ; CHECK-NEXT:    ret
6311   call void @llvm.aarch64.neon.st1x2.v2i64.p0(<2 x i64> %B, <2 x i64> %C, ptr %A)
6312   %tmp = getelementptr i64, ptr %A, i64 %inc
6313   ret ptr %tmp
6316 declare void @llvm.aarch64.neon.st1x2.v2i64.p0(<2 x i64>, <2 x i64>, ptr)
6319 define ptr @test_v1i64_post_imm_st1x2(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C) nounwind {
6320 ; CHECK-LABEL: test_v1i64_post_imm_st1x2:
6321 ; CHECK:       ; %bb.0:
6322 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6323 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6324 ; CHECK-NEXT:    st1.1d { v0, v1 }, [x0], #16
6325 ; CHECK-NEXT:    ret
6326   call void @llvm.aarch64.neon.st1x2.v1i64.p0(<1 x i64> %B, <1 x i64> %C, ptr %A)
6327   %tmp = getelementptr i64, ptr %A, i64 2
6328   ret ptr %tmp
6331 define ptr @test_v1i64_post_reg_st1x2(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, i64 %inc) nounwind {
6332 ; CHECK-LABEL: test_v1i64_post_reg_st1x2:
6333 ; CHECK:       ; %bb.0:
6334 ; CHECK-NEXT:    lsl x8, x2, #3
6335 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6336 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6337 ; CHECK-NEXT:    st1.1d { v0, v1 }, [x0], x8
6338 ; CHECK-NEXT:    ret
6339   call void @llvm.aarch64.neon.st1x2.v1i64.p0(<1 x i64> %B, <1 x i64> %C, ptr %A)
6340   %tmp = getelementptr i64, ptr %A, i64 %inc
6341   ret ptr %tmp
6344 declare void @llvm.aarch64.neon.st1x2.v1i64.p0(<1 x i64>, <1 x i64>, ptr)
6347 define ptr @test_v4f32_post_imm_st1x2(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C) nounwind {
6348 ; CHECK-LABEL: test_v4f32_post_imm_st1x2:
6349 ; CHECK:       ; %bb.0:
6350 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6351 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6352 ; CHECK-NEXT:    st1.4s { v0, v1 }, [x0], #32
6353 ; CHECK-NEXT:    ret
6354   call void @llvm.aarch64.neon.st1x2.v4f32.p0(<4 x float> %B, <4 x float> %C, ptr %A)
6355   %tmp = getelementptr float, ptr %A, i32 8
6356   ret ptr %tmp
6359 define ptr @test_v4f32_post_reg_st1x2(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, i64 %inc) nounwind {
6360 ; CHECK-LABEL: test_v4f32_post_reg_st1x2:
6361 ; CHECK:       ; %bb.0:
6362 ; CHECK-NEXT:    lsl x8, x2, #2
6363 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6364 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6365 ; CHECK-NEXT:    st1.4s { v0, v1 }, [x0], x8
6366 ; CHECK-NEXT:    ret
6367   call void @llvm.aarch64.neon.st1x2.v4f32.p0(<4 x float> %B, <4 x float> %C, ptr %A)
6368   %tmp = getelementptr float, ptr %A, i64 %inc
6369   ret ptr %tmp
6372 declare void @llvm.aarch64.neon.st1x2.v4f32.p0(<4 x float>, <4 x float>, ptr)
6375 define ptr @test_v2f32_post_imm_st1x2(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C) nounwind {
6376 ; CHECK-LABEL: test_v2f32_post_imm_st1x2:
6377 ; CHECK:       ; %bb.0:
6378 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6379 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6380 ; CHECK-NEXT:    st1.2s { v0, v1 }, [x0], #16
6381 ; CHECK-NEXT:    ret
6382   call void @llvm.aarch64.neon.st1x2.v2f32.p0(<2 x float> %B, <2 x float> %C, ptr %A)
6383   %tmp = getelementptr float, ptr %A, i32 4
6384   ret ptr %tmp
6387 define ptr @test_v2f32_post_reg_st1x2(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, i64 %inc) nounwind {
6388 ; CHECK-LABEL: test_v2f32_post_reg_st1x2:
6389 ; CHECK:       ; %bb.0:
6390 ; CHECK-NEXT:    lsl x8, x2, #2
6391 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6392 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6393 ; CHECK-NEXT:    st1.2s { v0, v1 }, [x0], x8
6394 ; CHECK-NEXT:    ret
6395   call void @llvm.aarch64.neon.st1x2.v2f32.p0(<2 x float> %B, <2 x float> %C, ptr %A)
6396   %tmp = getelementptr float, ptr %A, i64 %inc
6397   ret ptr %tmp
6400 declare void @llvm.aarch64.neon.st1x2.v2f32.p0(<2 x float>, <2 x float>, ptr)
6403 define ptr @test_v2f64_post_imm_st1x2(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C) nounwind {
6404 ; CHECK-LABEL: test_v2f64_post_imm_st1x2:
6405 ; CHECK:       ; %bb.0:
6406 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6407 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6408 ; CHECK-NEXT:    st1.2d { v0, v1 }, [x0], #32
6409 ; CHECK-NEXT:    ret
6410   call void @llvm.aarch64.neon.st1x2.v2f64.p0(<2 x double> %B, <2 x double> %C, ptr %A)
6411   %tmp = getelementptr double, ptr %A, i64 4
6412   ret ptr %tmp
6415 define ptr @test_v2f64_post_reg_st1x2(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, i64 %inc) nounwind {
6416 ; CHECK-LABEL: test_v2f64_post_reg_st1x2:
6417 ; CHECK:       ; %bb.0:
6418 ; CHECK-NEXT:    lsl x8, x2, #3
6419 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6420 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6421 ; CHECK-NEXT:    st1.2d { v0, v1 }, [x0], x8
6422 ; CHECK-NEXT:    ret
6423   call void @llvm.aarch64.neon.st1x2.v2f64.p0(<2 x double> %B, <2 x double> %C, ptr %A)
6424   %tmp = getelementptr double, ptr %A, i64 %inc
6425   ret ptr %tmp
6428 declare void @llvm.aarch64.neon.st1x2.v2f64.p0(<2 x double>, <2 x double>, ptr)
6431 define ptr @test_v1f64_post_imm_st1x2(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C) nounwind {
6432 ; CHECK-LABEL: test_v1f64_post_imm_st1x2:
6433 ; CHECK:       ; %bb.0:
6434 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6435 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6436 ; CHECK-NEXT:    st1.1d { v0, v1 }, [x0], #16
6437 ; CHECK-NEXT:    ret
6438   call void @llvm.aarch64.neon.st1x2.v1f64.p0(<1 x double> %B, <1 x double> %C, ptr %A)
6439   %tmp = getelementptr double, ptr %A, i64 2
6440   ret ptr %tmp
6443 define ptr @test_v1f64_post_reg_st1x2(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, i64 %inc) nounwind {
6444 ; CHECK-LABEL: test_v1f64_post_reg_st1x2:
6445 ; CHECK:       ; %bb.0:
6446 ; CHECK-NEXT:    lsl x8, x2, #3
6447 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
6448 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
6449 ; CHECK-NEXT:    st1.1d { v0, v1 }, [x0], x8
6450 ; CHECK-NEXT:    ret
6451   call void @llvm.aarch64.neon.st1x2.v1f64.p0(<1 x double> %B, <1 x double> %C, ptr %A)
6452   %tmp = getelementptr double, ptr %A, i64 %inc
6453   ret ptr %tmp
6456 declare void @llvm.aarch64.neon.st1x2.v1f64.p0(<1 x double>, <1 x double>, ptr)
6459 define ptr @test_v16i8_post_imm_st1x3(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
6460 ; CHECK-LABEL: test_v16i8_post_imm_st1x3:
6461 ; CHECK:       ; %bb.0:
6462 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6463 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6464 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6465 ; CHECK-NEXT:    st1.16b { v0, v1, v2 }, [x0], #48
6466 ; CHECK-NEXT:    ret
6467   call void @llvm.aarch64.neon.st1x3.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %A)
6468   %tmp = getelementptr i8, ptr %A, i32 48
6469   ret ptr %tmp
6472 define ptr @test_v16i8_post_reg_st1x3(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 %inc) nounwind {
6473 ; CHECK-LABEL: test_v16i8_post_reg_st1x3:
6474 ; CHECK:       ; %bb.0:
6475 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6476 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6477 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6478 ; CHECK-NEXT:    st1.16b { v0, v1, v2 }, [x0], x2
6479 ; CHECK-NEXT:    ret
6480   call void @llvm.aarch64.neon.st1x3.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %A)
6481   %tmp = getelementptr i8, ptr %A, i64 %inc
6482   ret ptr %tmp
6485 declare void @llvm.aarch64.neon.st1x3.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, ptr)
6488 define ptr @test_v8i8_post_imm_st1x3(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
6489 ; CHECK-LABEL: test_v8i8_post_imm_st1x3:
6490 ; CHECK:       ; %bb.0:
6491 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6492 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6493 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6494 ; CHECK-NEXT:    st1.8b { v0, v1, v2 }, [x0], #24
6495 ; CHECK-NEXT:    ret
6496   call void @llvm.aarch64.neon.st1x3.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, ptr %A)
6497   %tmp = getelementptr i8, ptr %A, i32 24
6498   ret ptr %tmp
6501 define ptr @test_v8i8_post_reg_st1x3(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 %inc) nounwind {
6502 ; CHECK-LABEL: test_v8i8_post_reg_st1x3:
6503 ; CHECK:       ; %bb.0:
6504 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6505 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6506 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6507 ; CHECK-NEXT:    st1.8b { v0, v1, v2 }, [x0], x2
6508 ; CHECK-NEXT:    ret
6509   call void @llvm.aarch64.neon.st1x3.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, ptr %A)
6510   %tmp = getelementptr i8, ptr %A, i64 %inc
6511   ret ptr %tmp
6514 declare void @llvm.aarch64.neon.st1x3.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, ptr)
6517 define ptr @test_v8i16_post_imm_st1x3(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
6518 ; CHECK-LABEL: test_v8i16_post_imm_st1x3:
6519 ; CHECK:       ; %bb.0:
6520 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6521 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6522 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6523 ; CHECK-NEXT:    st1.8h { v0, v1, v2 }, [x0], #48
6524 ; CHECK-NEXT:    ret
6525   call void @llvm.aarch64.neon.st1x3.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %A)
6526   %tmp = getelementptr i16, ptr %A, i32 24
6527   ret ptr %tmp
6530 define ptr @test_v8i16_post_reg_st1x3(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 %inc) nounwind {
6531 ; CHECK-LABEL: test_v8i16_post_reg_st1x3:
6532 ; CHECK:       ; %bb.0:
6533 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6534 ; CHECK-NEXT:    lsl x8, x2, #1
6535 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6536 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6537 ; CHECK-NEXT:    st1.8h { v0, v1, v2 }, [x0], x8
6538 ; CHECK-NEXT:    ret
6539   call void @llvm.aarch64.neon.st1x3.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %A)
6540   %tmp = getelementptr i16, ptr %A, i64 %inc
6541   ret ptr %tmp
6544 declare void @llvm.aarch64.neon.st1x3.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, ptr)
6547 define ptr @test_v4i16_post_imm_st1x3(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
6548 ; CHECK-LABEL: test_v4i16_post_imm_st1x3:
6549 ; CHECK:       ; %bb.0:
6550 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6551 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6552 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6553 ; CHECK-NEXT:    st1.4h { v0, v1, v2 }, [x0], #24
6554 ; CHECK-NEXT:    ret
6555   call void @llvm.aarch64.neon.st1x3.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, ptr %A)
6556   %tmp = getelementptr i16, ptr %A, i32 12
6557   ret ptr %tmp
6560 define ptr @test_v4i16_post_reg_st1x3(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 %inc) nounwind {
6561 ; CHECK-LABEL: test_v4i16_post_reg_st1x3:
6562 ; CHECK:       ; %bb.0:
6563 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6564 ; CHECK-NEXT:    lsl x8, x2, #1
6565 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6566 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6567 ; CHECK-NEXT:    st1.4h { v0, v1, v2 }, [x0], x8
6568 ; CHECK-NEXT:    ret
6569   call void @llvm.aarch64.neon.st1x3.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, ptr %A)
6570   %tmp = getelementptr i16, ptr %A, i64 %inc
6571   ret ptr %tmp
6574 declare void @llvm.aarch64.neon.st1x3.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, ptr)
6577 define ptr @test_v4i32_post_imm_st1x3(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
6578 ; CHECK-LABEL: test_v4i32_post_imm_st1x3:
6579 ; CHECK:       ; %bb.0:
6580 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6581 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6582 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6583 ; CHECK-NEXT:    st1.4s { v0, v1, v2 }, [x0], #48
6584 ; CHECK-NEXT:    ret
6585   call void @llvm.aarch64.neon.st1x3.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %A)
6586   %tmp = getelementptr i32, ptr %A, i32 12
6587   ret ptr %tmp
6590 define ptr @test_v4i32_post_reg_st1x3(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 %inc) nounwind {
6591 ; CHECK-LABEL: test_v4i32_post_reg_st1x3:
6592 ; CHECK:       ; %bb.0:
6593 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6594 ; CHECK-NEXT:    lsl x8, x2, #2
6595 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6596 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6597 ; CHECK-NEXT:    st1.4s { v0, v1, v2 }, [x0], x8
6598 ; CHECK-NEXT:    ret
6599   call void @llvm.aarch64.neon.st1x3.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %A)
6600   %tmp = getelementptr i32, ptr %A, i64 %inc
6601   ret ptr %tmp
6604 declare void @llvm.aarch64.neon.st1x3.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, ptr)
6607 define ptr @test_v2i32_post_imm_st1x3(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
6608 ; CHECK-LABEL: test_v2i32_post_imm_st1x3:
6609 ; CHECK:       ; %bb.0:
6610 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6611 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6612 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6613 ; CHECK-NEXT:    st1.2s { v0, v1, v2 }, [x0], #24
6614 ; CHECK-NEXT:    ret
6615   call void @llvm.aarch64.neon.st1x3.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, ptr %A)
6616   %tmp = getelementptr i32, ptr %A, i32 6
6617   ret ptr %tmp
6620 define ptr @test_v2i32_post_reg_st1x3(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 %inc) nounwind {
6621 ; CHECK-LABEL: test_v2i32_post_reg_st1x3:
6622 ; CHECK:       ; %bb.0:
6623 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6624 ; CHECK-NEXT:    lsl x8, x2, #2
6625 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6626 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6627 ; CHECK-NEXT:    st1.2s { v0, v1, v2 }, [x0], x8
6628 ; CHECK-NEXT:    ret
6629   call void @llvm.aarch64.neon.st1x3.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, ptr %A)
6630   %tmp = getelementptr i32, ptr %A, i64 %inc
6631   ret ptr %tmp
6634 declare void @llvm.aarch64.neon.st1x3.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, ptr)
6637 define ptr @test_v2i64_post_imm_st1x3(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
6638 ; CHECK-LABEL: test_v2i64_post_imm_st1x3:
6639 ; CHECK:       ; %bb.0:
6640 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6641 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6642 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6643 ; CHECK-NEXT:    st1.2d { v0, v1, v2 }, [x0], #48
6644 ; CHECK-NEXT:    ret
6645   call void @llvm.aarch64.neon.st1x3.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %A)
6646   %tmp = getelementptr i64, ptr %A, i64 6
6647   ret ptr %tmp
6650 define ptr @test_v2i64_post_reg_st1x3(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 %inc) nounwind {
6651 ; CHECK-LABEL: test_v2i64_post_reg_st1x3:
6652 ; CHECK:       ; %bb.0:
6653 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6654 ; CHECK-NEXT:    lsl x8, x2, #3
6655 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6656 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6657 ; CHECK-NEXT:    st1.2d { v0, v1, v2 }, [x0], x8
6658 ; CHECK-NEXT:    ret
6659   call void @llvm.aarch64.neon.st1x3.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %A)
6660   %tmp = getelementptr i64, ptr %A, i64 %inc
6661   ret ptr %tmp
6664 declare void @llvm.aarch64.neon.st1x3.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, ptr)
6667 define ptr @test_v1i64_post_imm_st1x3(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
6668 ; CHECK-LABEL: test_v1i64_post_imm_st1x3:
6669 ; CHECK:       ; %bb.0:
6670 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6671 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6672 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6673 ; CHECK-NEXT:    st1.1d { v0, v1, v2 }, [x0], #24
6674 ; CHECK-NEXT:    ret
6675   call void @llvm.aarch64.neon.st1x3.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, ptr %A)
6676   %tmp = getelementptr i64, ptr %A, i64 3
6677   ret ptr %tmp
6680 define ptr @test_v1i64_post_reg_st1x3(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 %inc) nounwind {
6681 ; CHECK-LABEL: test_v1i64_post_reg_st1x3:
6682 ; CHECK:       ; %bb.0:
6683 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6684 ; CHECK-NEXT:    lsl x8, x2, #3
6685 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6686 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6687 ; CHECK-NEXT:    st1.1d { v0, v1, v2 }, [x0], x8
6688 ; CHECK-NEXT:    ret
6689   call void @llvm.aarch64.neon.st1x3.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, ptr %A)
6690   %tmp = getelementptr i64, ptr %A, i64 %inc
6691   ret ptr %tmp
6694 declare void @llvm.aarch64.neon.st1x3.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, ptr)
6697 define ptr @test_v4f32_post_imm_st1x3(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
6698 ; CHECK-LABEL: test_v4f32_post_imm_st1x3:
6699 ; CHECK:       ; %bb.0:
6700 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6701 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6702 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6703 ; CHECK-NEXT:    st1.4s { v0, v1, v2 }, [x0], #48
6704 ; CHECK-NEXT:    ret
6705   call void @llvm.aarch64.neon.st1x3.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, ptr %A)
6706   %tmp = getelementptr float, ptr %A, i32 12
6707   ret ptr %tmp
6710 define ptr @test_v4f32_post_reg_st1x3(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, i64 %inc) nounwind {
6711 ; CHECK-LABEL: test_v4f32_post_reg_st1x3:
6712 ; CHECK:       ; %bb.0:
6713 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6714 ; CHECK-NEXT:    lsl x8, x2, #2
6715 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6716 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6717 ; CHECK-NEXT:    st1.4s { v0, v1, v2 }, [x0], x8
6718 ; CHECK-NEXT:    ret
6719   call void @llvm.aarch64.neon.st1x3.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, ptr %A)
6720   %tmp = getelementptr float, ptr %A, i64 %inc
6721   ret ptr %tmp
6724 declare void @llvm.aarch64.neon.st1x3.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, ptr)
6727 define ptr @test_v2f32_post_imm_st1x3(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
6728 ; CHECK-LABEL: test_v2f32_post_imm_st1x3:
6729 ; CHECK:       ; %bb.0:
6730 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6731 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6732 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6733 ; CHECK-NEXT:    st1.2s { v0, v1, v2 }, [x0], #24
6734 ; CHECK-NEXT:    ret
6735   call void @llvm.aarch64.neon.st1x3.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, ptr %A)
6736   %tmp = getelementptr float, ptr %A, i32 6
6737   ret ptr %tmp
6740 define ptr @test_v2f32_post_reg_st1x3(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, i64 %inc) nounwind {
6741 ; CHECK-LABEL: test_v2f32_post_reg_st1x3:
6742 ; CHECK:       ; %bb.0:
6743 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6744 ; CHECK-NEXT:    lsl x8, x2, #2
6745 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6746 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6747 ; CHECK-NEXT:    st1.2s { v0, v1, v2 }, [x0], x8
6748 ; CHECK-NEXT:    ret
6749   call void @llvm.aarch64.neon.st1x3.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, ptr %A)
6750   %tmp = getelementptr float, ptr %A, i64 %inc
6751   ret ptr %tmp
6754 declare void @llvm.aarch64.neon.st1x3.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, ptr)
6757 define ptr @test_v2f64_post_imm_st1x3(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
6758 ; CHECK-LABEL: test_v2f64_post_imm_st1x3:
6759 ; CHECK:       ; %bb.0:
6760 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6761 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6762 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6763 ; CHECK-NEXT:    st1.2d { v0, v1, v2 }, [x0], #48
6764 ; CHECK-NEXT:    ret
6765   call void @llvm.aarch64.neon.st1x3.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, ptr %A)
6766   %tmp = getelementptr double, ptr %A, i64 6
6767   ret ptr %tmp
6770 define ptr @test_v2f64_post_reg_st1x3(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, i64 %inc) nounwind {
6771 ; CHECK-LABEL: test_v2f64_post_reg_st1x3:
6772 ; CHECK:       ; %bb.0:
6773 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6774 ; CHECK-NEXT:    lsl x8, x2, #3
6775 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6776 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6777 ; CHECK-NEXT:    st1.2d { v0, v1, v2 }, [x0], x8
6778 ; CHECK-NEXT:    ret
6779   call void @llvm.aarch64.neon.st1x3.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, ptr %A)
6780   %tmp = getelementptr double, ptr %A, i64 %inc
6781   ret ptr %tmp
6784 declare void @llvm.aarch64.neon.st1x3.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, ptr)
6787 define ptr @test_v1f64_post_imm_st1x3(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
6788 ; CHECK-LABEL: test_v1f64_post_imm_st1x3:
6789 ; CHECK:       ; %bb.0:
6790 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6791 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6792 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6793 ; CHECK-NEXT:    st1.1d { v0, v1, v2 }, [x0], #24
6794 ; CHECK-NEXT:    ret
6795   call void @llvm.aarch64.neon.st1x3.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, ptr %A)
6796   %tmp = getelementptr double, ptr %A, i64 3
6797   ret ptr %tmp
6800 define ptr @test_v1f64_post_reg_st1x3(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, i64 %inc) nounwind {
6801 ; CHECK-LABEL: test_v1f64_post_reg_st1x3:
6802 ; CHECK:       ; %bb.0:
6803 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
6804 ; CHECK-NEXT:    lsl x8, x2, #3
6805 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
6806 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
6807 ; CHECK-NEXT:    st1.1d { v0, v1, v2 }, [x0], x8
6808 ; CHECK-NEXT:    ret
6809   call void @llvm.aarch64.neon.st1x3.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, ptr %A)
6810   %tmp = getelementptr double, ptr %A, i64 %inc
6811   ret ptr %tmp
6814 declare void @llvm.aarch64.neon.st1x3.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, ptr)
6817 define ptr @test_v16i8_post_imm_st1x4(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
6818 ; CHECK-LABEL: test_v16i8_post_imm_st1x4:
6819 ; CHECK:       ; %bb.0:
6820 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6821 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6822 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6823 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6824 ; CHECK-NEXT:    st1.16b { v0, v1, v2, v3 }, [x0], #64
6825 ; CHECK-NEXT:    ret
6826   call void @llvm.aarch64.neon.st1x4.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, ptr %A)
6827   %tmp = getelementptr i8, ptr %A, i32 64
6828   ret ptr %tmp
6831 define ptr @test_v16i8_post_reg_st1x4(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 %inc) nounwind {
6832 ; CHECK-LABEL: test_v16i8_post_reg_st1x4:
6833 ; CHECK:       ; %bb.0:
6834 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6835 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6836 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6837 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6838 ; CHECK-NEXT:    st1.16b { v0, v1, v2, v3 }, [x0], x2
6839 ; CHECK-NEXT:    ret
6840   call void @llvm.aarch64.neon.st1x4.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, ptr %A)
6841   %tmp = getelementptr i8, ptr %A, i64 %inc
6842   ret ptr %tmp
6845 declare void @llvm.aarch64.neon.st1x4.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, ptr)
6848 define ptr @test_v8i8_post_imm_st1x4(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
6849 ; CHECK-LABEL: test_v8i8_post_imm_st1x4:
6850 ; CHECK:       ; %bb.0:
6851 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6852 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6853 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6854 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6855 ; CHECK-NEXT:    st1.8b { v0, v1, v2, v3 }, [x0], #32
6856 ; CHECK-NEXT:    ret
6857   call void @llvm.aarch64.neon.st1x4.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, ptr %A)
6858   %tmp = getelementptr i8, ptr %A, i32 32
6859   ret ptr %tmp
6862 define ptr @test_v8i8_post_reg_st1x4(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 %inc) nounwind {
6863 ; CHECK-LABEL: test_v8i8_post_reg_st1x4:
6864 ; CHECK:       ; %bb.0:
6865 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6866 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6867 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6868 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6869 ; CHECK-NEXT:    st1.8b { v0, v1, v2, v3 }, [x0], x2
6870 ; CHECK-NEXT:    ret
6871   call void @llvm.aarch64.neon.st1x4.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, ptr %A)
6872   %tmp = getelementptr i8, ptr %A, i64 %inc
6873   ret ptr %tmp
6876 declare void @llvm.aarch64.neon.st1x4.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, ptr)
6879 define ptr @test_v8i16_post_imm_st1x4(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
6880 ; CHECK-LABEL: test_v8i16_post_imm_st1x4:
6881 ; CHECK:       ; %bb.0:
6882 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6883 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6884 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6885 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6886 ; CHECK-NEXT:    st1.8h { v0, v1, v2, v3 }, [x0], #64
6887 ; CHECK-NEXT:    ret
6888   call void @llvm.aarch64.neon.st1x4.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, ptr %A)
6889   %tmp = getelementptr i16, ptr %A, i32 32
6890   ret ptr %tmp
6893 define ptr @test_v8i16_post_reg_st1x4(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 %inc) nounwind {
6894 ; CHECK-LABEL: test_v8i16_post_reg_st1x4:
6895 ; CHECK:       ; %bb.0:
6896 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6897 ; CHECK-NEXT:    lsl x8, x2, #1
6898 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6899 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6900 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6901 ; CHECK-NEXT:    st1.8h { v0, v1, v2, v3 }, [x0], x8
6902 ; CHECK-NEXT:    ret
6903   call void @llvm.aarch64.neon.st1x4.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, ptr %A)
6904   %tmp = getelementptr i16, ptr %A, i64 %inc
6905   ret ptr %tmp
6908 declare void @llvm.aarch64.neon.st1x4.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, ptr)
6911 define ptr @test_v4i16_post_imm_st1x4(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
6912 ; CHECK-LABEL: test_v4i16_post_imm_st1x4:
6913 ; CHECK:       ; %bb.0:
6914 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6915 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6916 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6917 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6918 ; CHECK-NEXT:    st1.4h { v0, v1, v2, v3 }, [x0], #32
6919 ; CHECK-NEXT:    ret
6920   call void @llvm.aarch64.neon.st1x4.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, ptr %A)
6921   %tmp = getelementptr i16, ptr %A, i32 16
6922   ret ptr %tmp
6925 define ptr @test_v4i16_post_reg_st1x4(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 %inc) nounwind {
6926 ; CHECK-LABEL: test_v4i16_post_reg_st1x4:
6927 ; CHECK:       ; %bb.0:
6928 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6929 ; CHECK-NEXT:    lsl x8, x2, #1
6930 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6931 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6932 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6933 ; CHECK-NEXT:    st1.4h { v0, v1, v2, v3 }, [x0], x8
6934 ; CHECK-NEXT:    ret
6935   call void @llvm.aarch64.neon.st1x4.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, ptr %A)
6936   %tmp = getelementptr i16, ptr %A, i64 %inc
6937   ret ptr %tmp
6940 declare void @llvm.aarch64.neon.st1x4.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>,<4 x i16>,  ptr)
6943 define ptr @test_v4i32_post_imm_st1x4(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
6944 ; CHECK-LABEL: test_v4i32_post_imm_st1x4:
6945 ; CHECK:       ; %bb.0:
6946 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6947 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6948 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6949 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6950 ; CHECK-NEXT:    st1.4s { v0, v1, v2, v3 }, [x0], #64
6951 ; CHECK-NEXT:    ret
6952   call void @llvm.aarch64.neon.st1x4.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, ptr %A)
6953   %tmp = getelementptr i32, ptr %A, i32 16
6954   ret ptr %tmp
6957 define ptr @test_v4i32_post_reg_st1x4(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 %inc) nounwind {
6958 ; CHECK-LABEL: test_v4i32_post_reg_st1x4:
6959 ; CHECK:       ; %bb.0:
6960 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6961 ; CHECK-NEXT:    lsl x8, x2, #2
6962 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6963 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6964 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
6965 ; CHECK-NEXT:    st1.4s { v0, v1, v2, v3 }, [x0], x8
6966 ; CHECK-NEXT:    ret
6967   call void @llvm.aarch64.neon.st1x4.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, ptr %A)
6968   %tmp = getelementptr i32, ptr %A, i64 %inc
6969   ret ptr %tmp
6972 declare void @llvm.aarch64.neon.st1x4.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>,<4 x i32>,  ptr)
6975 define ptr @test_v2i32_post_imm_st1x4(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
6976 ; CHECK-LABEL: test_v2i32_post_imm_st1x4:
6977 ; CHECK:       ; %bb.0:
6978 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6979 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6980 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6981 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6982 ; CHECK-NEXT:    st1.2s { v0, v1, v2, v3 }, [x0], #32
6983 ; CHECK-NEXT:    ret
6984   call void @llvm.aarch64.neon.st1x4.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, ptr %A)
6985   %tmp = getelementptr i32, ptr %A, i32 8
6986   ret ptr %tmp
6989 define ptr @test_v2i32_post_reg_st1x4(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 %inc) nounwind {
6990 ; CHECK-LABEL: test_v2i32_post_reg_st1x4:
6991 ; CHECK:       ; %bb.0:
6992 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6993 ; CHECK-NEXT:    lsl x8, x2, #2
6994 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6995 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6996 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
6997 ; CHECK-NEXT:    st1.2s { v0, v1, v2, v3 }, [x0], x8
6998 ; CHECK-NEXT:    ret
6999   call void @llvm.aarch64.neon.st1x4.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, ptr %A)
7000   %tmp = getelementptr i32, ptr %A, i64 %inc
7001   ret ptr %tmp
7004 declare void @llvm.aarch64.neon.st1x4.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, ptr)
7007 define ptr @test_v2i64_post_imm_st1x4(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
7008 ; CHECK-LABEL: test_v2i64_post_imm_st1x4:
7009 ; CHECK:       ; %bb.0:
7010 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7011 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7012 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7013 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7014 ; CHECK-NEXT:    st1.2d { v0, v1, v2, v3 }, [x0], #64
7015 ; CHECK-NEXT:    ret
7016   call void @llvm.aarch64.neon.st1x4.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, ptr %A)
7017   %tmp = getelementptr i64, ptr %A, i64 8
7018   ret ptr %tmp
7021 define ptr @test_v2i64_post_reg_st1x4(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 %inc) nounwind {
7022 ; CHECK-LABEL: test_v2i64_post_reg_st1x4:
7023 ; CHECK:       ; %bb.0:
7024 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7025 ; CHECK-NEXT:    lsl x8, x2, #3
7026 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7027 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7028 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7029 ; CHECK-NEXT:    st1.2d { v0, v1, v2, v3 }, [x0], x8
7030 ; CHECK-NEXT:    ret
7031   call void @llvm.aarch64.neon.st1x4.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, ptr %A)
7032   %tmp = getelementptr i64, ptr %A, i64 %inc
7033   ret ptr %tmp
7036 declare void @llvm.aarch64.neon.st1x4.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>,<2 x i64>,  ptr)
7039 define ptr @test_v1i64_post_imm_st1x4(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
7040 ; CHECK-LABEL: test_v1i64_post_imm_st1x4:
7041 ; CHECK:       ; %bb.0:
7042 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7043 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7044 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7045 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7046 ; CHECK-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], #32
7047 ; CHECK-NEXT:    ret
7048   call void @llvm.aarch64.neon.st1x4.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, ptr %A)
7049   %tmp = getelementptr i64, ptr %A, i64 4
7050   ret ptr %tmp
7053 define ptr @test_v1i64_post_reg_st1x4(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 %inc) nounwind {
7054 ; CHECK-LABEL: test_v1i64_post_reg_st1x4:
7055 ; CHECK:       ; %bb.0:
7056 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7057 ; CHECK-NEXT:    lsl x8, x2, #3
7058 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7059 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7060 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7061 ; CHECK-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], x8
7062 ; CHECK-NEXT:    ret
7063   call void @llvm.aarch64.neon.st1x4.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, ptr %A)
7064   %tmp = getelementptr i64, ptr %A, i64 %inc
7065   ret ptr %tmp
7068 declare void @llvm.aarch64.neon.st1x4.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>,<1 x i64>,  ptr)
7071 define ptr @test_v4f32_post_imm_st1x4(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
7072 ; CHECK-LABEL: test_v4f32_post_imm_st1x4:
7073 ; CHECK:       ; %bb.0:
7074 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7075 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7076 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7077 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7078 ; CHECK-NEXT:    st1.4s { v0, v1, v2, v3 }, [x0], #64
7079 ; CHECK-NEXT:    ret
7080   call void @llvm.aarch64.neon.st1x4.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, ptr %A)
7081   %tmp = getelementptr float, ptr %A, i32 16
7082   ret ptr %tmp
7085 define ptr @test_v4f32_post_reg_st1x4(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 %inc) nounwind {
7086 ; CHECK-LABEL: test_v4f32_post_reg_st1x4:
7087 ; CHECK:       ; %bb.0:
7088 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7089 ; CHECK-NEXT:    lsl x8, x2, #2
7090 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7091 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7092 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7093 ; CHECK-NEXT:    st1.4s { v0, v1, v2, v3 }, [x0], x8
7094 ; CHECK-NEXT:    ret
7095   call void @llvm.aarch64.neon.st1x4.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, ptr %A)
7096   %tmp = getelementptr float, ptr %A, i64 %inc
7097   ret ptr %tmp
7100 declare void @llvm.aarch64.neon.st1x4.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, <4 x float>, ptr)
7103 define ptr @test_v2f32_post_imm_st1x4(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
7104 ; CHECK-LABEL: test_v2f32_post_imm_st1x4:
7105 ; CHECK:       ; %bb.0:
7106 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7107 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7108 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7109 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7110 ; CHECK-NEXT:    st1.2s { v0, v1, v2, v3 }, [x0], #32
7111 ; CHECK-NEXT:    ret
7112   call void @llvm.aarch64.neon.st1x4.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, ptr %A)
7113   %tmp = getelementptr float, ptr %A, i32 8
7114   ret ptr %tmp
7117 define ptr @test_v2f32_post_reg_st1x4(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 %inc) nounwind {
7118 ; CHECK-LABEL: test_v2f32_post_reg_st1x4:
7119 ; CHECK:       ; %bb.0:
7120 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7121 ; CHECK-NEXT:    lsl x8, x2, #2
7122 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7123 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7124 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7125 ; CHECK-NEXT:    st1.2s { v0, v1, v2, v3 }, [x0], x8
7126 ; CHECK-NEXT:    ret
7127   call void @llvm.aarch64.neon.st1x4.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, ptr %A)
7128   %tmp = getelementptr float, ptr %A, i64 %inc
7129   ret ptr %tmp
7132 declare void @llvm.aarch64.neon.st1x4.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, <2 x float>, ptr)
7135 define ptr @test_v2f64_post_imm_st1x4(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
7136 ; CHECK-LABEL: test_v2f64_post_imm_st1x4:
7137 ; CHECK:       ; %bb.0:
7138 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7139 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7140 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7141 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7142 ; CHECK-NEXT:    st1.2d { v0, v1, v2, v3 }, [x0], #64
7143 ; CHECK-NEXT:    ret
7144   call void @llvm.aarch64.neon.st1x4.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, ptr %A)
7145   %tmp = getelementptr double, ptr %A, i64 8
7146   ret ptr %tmp
7149 define ptr @test_v2f64_post_reg_st1x4(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 %inc) nounwind {
7150 ; CHECK-LABEL: test_v2f64_post_reg_st1x4:
7151 ; CHECK:       ; %bb.0:
7152 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7153 ; CHECK-NEXT:    lsl x8, x2, #3
7154 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7155 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7156 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7157 ; CHECK-NEXT:    st1.2d { v0, v1, v2, v3 }, [x0], x8
7158 ; CHECK-NEXT:    ret
7159   call void @llvm.aarch64.neon.st1x4.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, ptr %A)
7160   %tmp = getelementptr double, ptr %A, i64 %inc
7161   ret ptr %tmp
7164 declare void @llvm.aarch64.neon.st1x4.v2f64.p0(<2 x double>, <2 x double>, <2 x double>,<2 x double>,  ptr)
7167 define ptr @test_v1f64_post_imm_st1x4(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
7168 ; CHECK-LABEL: test_v1f64_post_imm_st1x4:
7169 ; CHECK:       ; %bb.0:
7170 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7171 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7172 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7173 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7174 ; CHECK-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], #32
7175 ; CHECK-NEXT:    ret
7176   call void @llvm.aarch64.neon.st1x4.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, ptr %A)
7177   %tmp = getelementptr double, ptr %A, i64 4
7178   ret ptr %tmp
7181 define ptr @test_v1f64_post_reg_st1x4(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 %inc) nounwind {
7182 ; CHECK-LABEL: test_v1f64_post_reg_st1x4:
7183 ; CHECK:       ; %bb.0:
7184 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7185 ; CHECK-NEXT:    lsl x8, x2, #3
7186 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7187 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7188 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
7189 ; CHECK-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], x8
7190 ; CHECK-NEXT:    ret
7191   call void @llvm.aarch64.neon.st1x4.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, ptr %A)
7192   %tmp = getelementptr double, ptr %A, i64 %inc
7193   ret ptr %tmp
7196 declare void @llvm.aarch64.neon.st1x4.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, <1 x double>, ptr)
7198 define ptr @test_v16i8_post_imm_st2lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C) nounwind {
7199 ; CHECK-LABEL: test_v16i8_post_imm_st2lane:
7200 ; CHECK:       ; %bb.0:
7201 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7202 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7203 ; CHECK-NEXT:    st2.b { v0, v1 }[0], [x0], #2
7204 ; CHECK-NEXT:    ret
7205   call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, i64 0, ptr %A)
7206   %tmp = getelementptr i8, ptr %A, i32 2
7207   ret ptr %tmp
7210 define ptr @test_v16i8_post_reg_st2lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, i64 %inc) nounwind {
7211 ; CHECK-LABEL: test_v16i8_post_reg_st2lane:
7212 ; CHECK:       ; %bb.0:
7213 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7214 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7215 ; CHECK-NEXT:    st2.b { v0, v1 }[0], [x0], x2
7216 ; CHECK-NEXT:    ret
7217   call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, i64 0, ptr %A)
7218   %tmp = getelementptr i8, ptr %A, i64 %inc
7219   ret ptr %tmp
7222 declare void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8>, <16 x i8>, i64, ptr)
7225 define ptr @test_v8i8_post_imm_st2lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C) nounwind {
7226 ; CHECK-LABEL: test_v8i8_post_imm_st2lane:
7227 ; CHECK:       ; %bb.0:
7228 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7229 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7230 ; CHECK-NEXT:    st2.b { v0, v1 }[0], [x0], #2
7231 ; CHECK-NEXT:    ret
7232   call void @llvm.aarch64.neon.st2lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, i64 0, ptr %A)
7233   %tmp = getelementptr i8, ptr %A, i32 2
7234   ret ptr %tmp
7237 define ptr @test_v8i8_post_reg_st2lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, i64 %inc) nounwind {
7238 ; CHECK-LABEL: test_v8i8_post_reg_st2lane:
7239 ; CHECK:       ; %bb.0:
7240 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7241 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7242 ; CHECK-NEXT:    st2.b { v0, v1 }[0], [x0], x2
7243 ; CHECK-NEXT:    ret
7244   call void @llvm.aarch64.neon.st2lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, i64 0, ptr %A)
7245   %tmp = getelementptr i8, ptr %A, i64 %inc
7246   ret ptr %tmp
7249 declare void @llvm.aarch64.neon.st2lane.v8i8.p0(<8 x i8>, <8 x i8>, i64, ptr)
7252 define ptr @test_v8i16_post_imm_st2lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C) nounwind {
7253 ; CHECK-LABEL: test_v8i16_post_imm_st2lane:
7254 ; CHECK:       ; %bb.0:
7255 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7256 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7257 ; CHECK-NEXT:    st2.h { v0, v1 }[0], [x0], #4
7258 ; CHECK-NEXT:    ret
7259   call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, i64 0, ptr %A)
7260   %tmp = getelementptr i16, ptr %A, i32 2
7261   ret ptr %tmp
7264 define ptr @test_v8i16_post_reg_st2lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, i64 %inc) nounwind {
7265 ; CHECK-LABEL: test_v8i16_post_reg_st2lane:
7266 ; CHECK:       ; %bb.0:
7267 ; CHECK-NEXT:    lsl x8, x2, #1
7268 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7269 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7270 ; CHECK-NEXT:    st2.h { v0, v1 }[0], [x0], x8
7271 ; CHECK-NEXT:    ret
7272   call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, i64 0, ptr %A)
7273   %tmp = getelementptr i16, ptr %A, i64 %inc
7274   ret ptr %tmp
7277 declare void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16>, <8 x i16>, i64, ptr)
7280 define ptr @test_v4i16_post_imm_st2lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C) nounwind {
7281 ; CHECK-LABEL: test_v4i16_post_imm_st2lane:
7282 ; CHECK:       ; %bb.0:
7283 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7284 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7285 ; CHECK-NEXT:    st2.h { v0, v1 }[0], [x0], #4
7286 ; CHECK-NEXT:    ret
7287   call void @llvm.aarch64.neon.st2lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, i64 0, ptr %A)
7288   %tmp = getelementptr i16, ptr %A, i32 2
7289   ret ptr %tmp
7292 define ptr @test_v4i16_post_reg_st2lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, i64 %inc) nounwind {
7293 ; CHECK-LABEL: test_v4i16_post_reg_st2lane:
7294 ; CHECK:       ; %bb.0:
7295 ; CHECK-NEXT:    lsl x8, x2, #1
7296 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7297 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7298 ; CHECK-NEXT:    st2.h { v0, v1 }[0], [x0], x8
7299 ; CHECK-NEXT:    ret
7300   call void @llvm.aarch64.neon.st2lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, i64 0, ptr %A)
7301   %tmp = getelementptr i16, ptr %A, i64 %inc
7302   ret ptr %tmp
7305 declare void @llvm.aarch64.neon.st2lane.v4i16.p0(<4 x i16>, <4 x i16>, i64, ptr)
7308 define ptr @test_v4i32_post_imm_st2lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C) nounwind {
7309 ; CHECK-LABEL: test_v4i32_post_imm_st2lane:
7310 ; CHECK:       ; %bb.0:
7311 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7312 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7313 ; CHECK-NEXT:    st2.s { v0, v1 }[0], [x0], #8
7314 ; CHECK-NEXT:    ret
7315   call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, i64 0, ptr %A)
7316   %tmp = getelementptr i32, ptr %A, i32 2
7317   ret ptr %tmp
7320 define ptr @test_v4i32_post_reg_st2lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, i64 %inc) nounwind {
7321 ; CHECK-LABEL: test_v4i32_post_reg_st2lane:
7322 ; CHECK:       ; %bb.0:
7323 ; CHECK-NEXT:    lsl x8, x2, #2
7324 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7325 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7326 ; CHECK-NEXT:    st2.s { v0, v1 }[0], [x0], x8
7327 ; CHECK-NEXT:    ret
7328   call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, i64 0, ptr %A)
7329   %tmp = getelementptr i32, ptr %A, i64 %inc
7330   ret ptr %tmp
7333 declare void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32>, <4 x i32>, i64, ptr)
7336 define ptr @test_v2i32_post_imm_st2lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C) nounwind {
7337 ; CHECK-LABEL: test_v2i32_post_imm_st2lane:
7338 ; CHECK:       ; %bb.0:
7339 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7340 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7341 ; CHECK-NEXT:    st2.s { v0, v1 }[0], [x0], #8
7342 ; CHECK-NEXT:    ret
7343   call void @llvm.aarch64.neon.st2lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, i64 0, ptr %A)
7344   %tmp = getelementptr i32, ptr %A, i32 2
7345   ret ptr %tmp
7348 define ptr @test_v2i32_post_reg_st2lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, i64 %inc) nounwind {
7349 ; CHECK-LABEL: test_v2i32_post_reg_st2lane:
7350 ; CHECK:       ; %bb.0:
7351 ; CHECK-NEXT:    lsl x8, x2, #2
7352 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7353 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7354 ; CHECK-NEXT:    st2.s { v0, v1 }[0], [x0], x8
7355 ; CHECK-NEXT:    ret
7356   call void @llvm.aarch64.neon.st2lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, i64 0, ptr %A)
7357   %tmp = getelementptr i32, ptr %A, i64 %inc
7358   ret ptr %tmp
7361 declare void @llvm.aarch64.neon.st2lane.v2i32.p0(<2 x i32>, <2 x i32>, i64, ptr)
7364 define ptr @test_v2i64_post_imm_st2lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C) nounwind {
7365 ; CHECK-LABEL: test_v2i64_post_imm_st2lane:
7366 ; CHECK:       ; %bb.0:
7367 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7368 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7369 ; CHECK-NEXT:    st2.d { v0, v1 }[0], [x0], #16
7370 ; CHECK-NEXT:    ret
7371   call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, i64 0, ptr %A)
7372   %tmp = getelementptr i64, ptr %A, i64 2
7373   ret ptr %tmp
7376 define ptr @test_v2i64_post_reg_st2lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, i64 %inc) nounwind {
7377 ; CHECK-LABEL: test_v2i64_post_reg_st2lane:
7378 ; CHECK:       ; %bb.0:
7379 ; CHECK-NEXT:    lsl x8, x2, #3
7380 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7381 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7382 ; CHECK-NEXT:    st2.d { v0, v1 }[0], [x0], x8
7383 ; CHECK-NEXT:    ret
7384   call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, i64 0, ptr %A)
7385   %tmp = getelementptr i64, ptr %A, i64 %inc
7386   ret ptr %tmp
7389 declare void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64>, <2 x i64>, i64, ptr)
7392 define ptr @test_v1i64_post_imm_st2lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C) nounwind {
7393 ; CHECK-LABEL: test_v1i64_post_imm_st2lane:
7394 ; CHECK:       ; %bb.0:
7395 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7396 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7397 ; CHECK-NEXT:    st2.d { v0, v1 }[0], [x0], #16
7398 ; CHECK-NEXT:    ret
7399   call void @llvm.aarch64.neon.st2lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, i64 0, ptr %A)
7400   %tmp = getelementptr i64, ptr %A, i64 2
7401   ret ptr %tmp
7404 define ptr @test_v1i64_post_reg_st2lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, i64 %inc) nounwind {
7405 ; CHECK-LABEL: test_v1i64_post_reg_st2lane:
7406 ; CHECK:       ; %bb.0:
7407 ; CHECK-NEXT:    lsl x8, x2, #3
7408 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7409 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7410 ; CHECK-NEXT:    st2.d { v0, v1 }[0], [x0], x8
7411 ; CHECK-NEXT:    ret
7412   call void @llvm.aarch64.neon.st2lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, i64 0, ptr %A)
7413   %tmp = getelementptr i64, ptr %A, i64 %inc
7414   ret ptr %tmp
7417 declare void @llvm.aarch64.neon.st2lane.v1i64.p0(<1 x i64>, <1 x i64>, i64, ptr)
7420 define ptr @test_v4f32_post_imm_st2lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C) nounwind {
7421 ; CHECK-LABEL: test_v4f32_post_imm_st2lane:
7422 ; CHECK:       ; %bb.0:
7423 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7424 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7425 ; CHECK-NEXT:    st2.s { v0, v1 }[0], [x0], #8
7426 ; CHECK-NEXT:    ret
7427   call void @llvm.aarch64.neon.st2lane.v4f32.p0(<4 x float> %B, <4 x float> %C, i64 0, ptr %A)
7428   %tmp = getelementptr float, ptr %A, i32 2
7429   ret ptr %tmp
7432 define ptr @test_v4f32_post_reg_st2lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, i64 %inc) nounwind {
7433 ; CHECK-LABEL: test_v4f32_post_reg_st2lane:
7434 ; CHECK:       ; %bb.0:
7435 ; CHECK-NEXT:    lsl x8, x2, #2
7436 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7437 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7438 ; CHECK-NEXT:    st2.s { v0, v1 }[0], [x0], x8
7439 ; CHECK-NEXT:    ret
7440   call void @llvm.aarch64.neon.st2lane.v4f32.p0(<4 x float> %B, <4 x float> %C, i64 0, ptr %A)
7441   %tmp = getelementptr float, ptr %A, i64 %inc
7442   ret ptr %tmp
7445 declare void @llvm.aarch64.neon.st2lane.v4f32.p0(<4 x float>, <4 x float>, i64, ptr)
7448 define ptr @test_v2f32_post_imm_st2lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C) nounwind {
7449 ; CHECK-LABEL: test_v2f32_post_imm_st2lane:
7450 ; CHECK:       ; %bb.0:
7451 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7452 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7453 ; CHECK-NEXT:    st2.s { v0, v1 }[0], [x0], #8
7454 ; CHECK-NEXT:    ret
7455   call void @llvm.aarch64.neon.st2lane.v2f32.p0(<2 x float> %B, <2 x float> %C, i64 0, ptr %A)
7456   %tmp = getelementptr float, ptr %A, i32 2
7457   ret ptr %tmp
7460 define ptr @test_v2f32_post_reg_st2lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, i64 %inc) nounwind {
7461 ; CHECK-LABEL: test_v2f32_post_reg_st2lane:
7462 ; CHECK:       ; %bb.0:
7463 ; CHECK-NEXT:    lsl x8, x2, #2
7464 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7465 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7466 ; CHECK-NEXT:    st2.s { v0, v1 }[0], [x0], x8
7467 ; CHECK-NEXT:    ret
7468   call void @llvm.aarch64.neon.st2lane.v2f32.p0(<2 x float> %B, <2 x float> %C, i64 0, ptr %A)
7469   %tmp = getelementptr float, ptr %A, i64 %inc
7470   ret ptr %tmp
7473 declare void @llvm.aarch64.neon.st2lane.v2f32.p0(<2 x float>, <2 x float>, i64, ptr)
7476 define ptr @test_v2f64_post_imm_st2lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C) nounwind {
7477 ; CHECK-LABEL: test_v2f64_post_imm_st2lane:
7478 ; CHECK:       ; %bb.0:
7479 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7480 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7481 ; CHECK-NEXT:    st2.d { v0, v1 }[0], [x0], #16
7482 ; CHECK-NEXT:    ret
7483   call void @llvm.aarch64.neon.st2lane.v2f64.p0(<2 x double> %B, <2 x double> %C, i64 0, ptr %A)
7484   %tmp = getelementptr double, ptr %A, i64 2
7485   ret ptr %tmp
7488 define ptr @test_v2f64_post_reg_st2lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, i64 %inc) nounwind {
7489 ; CHECK-LABEL: test_v2f64_post_reg_st2lane:
7490 ; CHECK:       ; %bb.0:
7491 ; CHECK-NEXT:    lsl x8, x2, #3
7492 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
7493 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
7494 ; CHECK-NEXT:    st2.d { v0, v1 }[0], [x0], x8
7495 ; CHECK-NEXT:    ret
7496   call void @llvm.aarch64.neon.st2lane.v2f64.p0(<2 x double> %B, <2 x double> %C, i64 0, ptr %A)
7497   %tmp = getelementptr double, ptr %A, i64 %inc
7498   ret ptr %tmp
7501 declare void @llvm.aarch64.neon.st2lane.v2f64.p0(<2 x double>, <2 x double>, i64, ptr)
7504 define ptr @test_v1f64_post_imm_st2lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C) nounwind {
7505 ; CHECK-LABEL: test_v1f64_post_imm_st2lane:
7506 ; CHECK:       ; %bb.0:
7507 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7508 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7509 ; CHECK-NEXT:    st2.d { v0, v1 }[0], [x0], #16
7510 ; CHECK-NEXT:    ret
7511   call void @llvm.aarch64.neon.st2lane.v1f64.p0(<1 x double> %B, <1 x double> %C, i64 0, ptr %A)
7512   %tmp = getelementptr double, ptr %A, i64 2
7513   ret ptr %tmp
7516 define ptr @test_v1f64_post_reg_st2lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, i64 %inc) nounwind {
7517 ; CHECK-LABEL: test_v1f64_post_reg_st2lane:
7518 ; CHECK:       ; %bb.0:
7519 ; CHECK-NEXT:    lsl x8, x2, #3
7520 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
7521 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
7522 ; CHECK-NEXT:    st2.d { v0, v1 }[0], [x0], x8
7523 ; CHECK-NEXT:    ret
7524   call void @llvm.aarch64.neon.st2lane.v1f64.p0(<1 x double> %B, <1 x double> %C, i64 0, ptr %A)
7525   %tmp = getelementptr double, ptr %A, i64 %inc
7526   ret ptr %tmp
7529 declare void @llvm.aarch64.neon.st2lane.v1f64.p0(<1 x double>, <1 x double>, i64, ptr)
7532 define ptr @test_v16i8_post_imm_st3lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
7533 ; CHECK-LABEL: test_v16i8_post_imm_st3lane:
7534 ; CHECK:       ; %bb.0:
7535 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7536 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7537 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7538 ; CHECK-NEXT:    st3.b { v0, v1, v2 }[0], [x0], #3
7539 ; CHECK-NEXT:    ret
7540   call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 0, ptr %A)
7541   %tmp = getelementptr i8, ptr %A, i32 3
7542   ret ptr %tmp
7545 define ptr @test_v16i8_post_reg_st3lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 %inc) nounwind {
7546 ; CHECK-LABEL: test_v16i8_post_reg_st3lane:
7547 ; CHECK:       ; %bb.0:
7548 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7549 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7550 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7551 ; CHECK-NEXT:    st3.b { v0, v1, v2 }[0], [x0], x2
7552 ; CHECK-NEXT:    ret
7553   call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 0, ptr %A)
7554   %tmp = getelementptr i8, ptr %A, i64 %inc
7555   ret ptr %tmp
7558 declare void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, i64, ptr)
7561 define ptr @test_v8i8_post_imm_st3lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
7562 ; CHECK-LABEL: test_v8i8_post_imm_st3lane:
7563 ; CHECK:       ; %bb.0:
7564 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7565 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7566 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7567 ; CHECK-NEXT:    st3.b { v0, v1, v2 }[0], [x0], #3
7568 ; CHECK-NEXT:    ret
7569   call void @llvm.aarch64.neon.st3lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 0, ptr %A)
7570   %tmp = getelementptr i8, ptr %A, i32 3
7571   ret ptr %tmp
7574 define ptr @test_v8i8_post_reg_st3lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 %inc) nounwind {
7575 ; CHECK-LABEL: test_v8i8_post_reg_st3lane:
7576 ; CHECK:       ; %bb.0:
7577 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7578 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7579 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7580 ; CHECK-NEXT:    st3.b { v0, v1, v2 }[0], [x0], x2
7581 ; CHECK-NEXT:    ret
7582   call void @llvm.aarch64.neon.st3lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 0, ptr %A)
7583   %tmp = getelementptr i8, ptr %A, i64 %inc
7584   ret ptr %tmp
7587 declare void @llvm.aarch64.neon.st3lane.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, i64, ptr)
7590 define ptr @test_v8i16_post_imm_st3lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
7591 ; CHECK-LABEL: test_v8i16_post_imm_st3lane:
7592 ; CHECK:       ; %bb.0:
7593 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7594 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7595 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7596 ; CHECK-NEXT:    st3.h { v0, v1, v2 }[0], [x0], #6
7597 ; CHECK-NEXT:    ret
7598   call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 0, ptr %A)
7599   %tmp = getelementptr i16, ptr %A, i32 3
7600   ret ptr %tmp
7603 define ptr @test_v8i16_post_reg_st3lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 %inc) nounwind {
7604 ; CHECK-LABEL: test_v8i16_post_reg_st3lane:
7605 ; CHECK:       ; %bb.0:
7606 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7607 ; CHECK-NEXT:    lsl x8, x2, #1
7608 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7609 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7610 ; CHECK-NEXT:    st3.h { v0, v1, v2 }[0], [x0], x8
7611 ; CHECK-NEXT:    ret
7612   call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 0, ptr %A)
7613   %tmp = getelementptr i16, ptr %A, i64 %inc
7614   ret ptr %tmp
7617 declare void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, i64, ptr)
7620 define ptr @test_v4i16_post_imm_st3lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
7621 ; CHECK-LABEL: test_v4i16_post_imm_st3lane:
7622 ; CHECK:       ; %bb.0:
7623 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7624 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7625 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7626 ; CHECK-NEXT:    st3.h { v0, v1, v2 }[0], [x0], #6
7627 ; CHECK-NEXT:    ret
7628   call void @llvm.aarch64.neon.st3lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 0, ptr %A)
7629   %tmp = getelementptr i16, ptr %A, i32 3
7630   ret ptr %tmp
7633 define ptr @test_v4i16_post_reg_st3lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 %inc) nounwind {
7634 ; CHECK-LABEL: test_v4i16_post_reg_st3lane:
7635 ; CHECK:       ; %bb.0:
7636 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7637 ; CHECK-NEXT:    lsl x8, x2, #1
7638 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7639 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7640 ; CHECK-NEXT:    st3.h { v0, v1, v2 }[0], [x0], x8
7641 ; CHECK-NEXT:    ret
7642   call void @llvm.aarch64.neon.st3lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 0, ptr %A)
7643   %tmp = getelementptr i16, ptr %A, i64 %inc
7644   ret ptr %tmp
7647 declare void @llvm.aarch64.neon.st3lane.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, i64, ptr)
7650 define ptr @test_v4i32_post_imm_st3lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
7651 ; CHECK-LABEL: test_v4i32_post_imm_st3lane:
7652 ; CHECK:       ; %bb.0:
7653 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7654 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7655 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7656 ; CHECK-NEXT:    st3.s { v0, v1, v2 }[0], [x0], #12
7657 ; CHECK-NEXT:    ret
7658   call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 0, ptr %A)
7659   %tmp = getelementptr i32, ptr %A, i32 3
7660   ret ptr %tmp
7663 define ptr @test_v4i32_post_reg_st3lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 %inc) nounwind {
7664 ; CHECK-LABEL: test_v4i32_post_reg_st3lane:
7665 ; CHECK:       ; %bb.0:
7666 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7667 ; CHECK-NEXT:    lsl x8, x2, #2
7668 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7669 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7670 ; CHECK-NEXT:    st3.s { v0, v1, v2 }[0], [x0], x8
7671 ; CHECK-NEXT:    ret
7672   call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 0, ptr %A)
7673   %tmp = getelementptr i32, ptr %A, i64 %inc
7674   ret ptr %tmp
7677 declare void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, i64, ptr)
7680 define ptr @test_v2i32_post_imm_st3lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
7681 ; CHECK-LABEL: test_v2i32_post_imm_st3lane:
7682 ; CHECK:       ; %bb.0:
7683 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7684 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7685 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7686 ; CHECK-NEXT:    st3.s { v0, v1, v2 }[0], [x0], #12
7687 ; CHECK-NEXT:    ret
7688   call void @llvm.aarch64.neon.st3lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 0, ptr %A)
7689   %tmp = getelementptr i32, ptr %A, i32 3
7690   ret ptr %tmp
7693 define ptr @test_v2i32_post_reg_st3lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 %inc) nounwind {
7694 ; CHECK-LABEL: test_v2i32_post_reg_st3lane:
7695 ; CHECK:       ; %bb.0:
7696 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7697 ; CHECK-NEXT:    lsl x8, x2, #2
7698 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7699 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7700 ; CHECK-NEXT:    st3.s { v0, v1, v2 }[0], [x0], x8
7701 ; CHECK-NEXT:    ret
7702   call void @llvm.aarch64.neon.st3lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 0, ptr %A)
7703   %tmp = getelementptr i32, ptr %A, i64 %inc
7704   ret ptr %tmp
7707 declare void @llvm.aarch64.neon.st3lane.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, i64, ptr)
7710 define ptr @test_v2i64_post_imm_st3lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
7711 ; CHECK-LABEL: test_v2i64_post_imm_st3lane:
7712 ; CHECK:       ; %bb.0:
7713 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7714 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7715 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7716 ; CHECK-NEXT:    st3.d { v0, v1, v2 }[0], [x0], #24
7717 ; CHECK-NEXT:    ret
7718   call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 0, ptr %A)
7719   %tmp = getelementptr i64, ptr %A, i64 3
7720   ret ptr %tmp
7723 define ptr @test_v2i64_post_reg_st3lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 %inc) nounwind {
7724 ; CHECK-LABEL: test_v2i64_post_reg_st3lane:
7725 ; CHECK:       ; %bb.0:
7726 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7727 ; CHECK-NEXT:    lsl x8, x2, #3
7728 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7729 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7730 ; CHECK-NEXT:    st3.d { v0, v1, v2 }[0], [x0], x8
7731 ; CHECK-NEXT:    ret
7732   call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 0, ptr %A)
7733   %tmp = getelementptr i64, ptr %A, i64 %inc
7734   ret ptr %tmp
7737 declare void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, i64, ptr)
7740 define ptr @test_v1i64_post_imm_st3lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
7741 ; CHECK-LABEL: test_v1i64_post_imm_st3lane:
7742 ; CHECK:       ; %bb.0:
7743 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7744 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7745 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7746 ; CHECK-NEXT:    st3.d { v0, v1, v2 }[0], [x0], #24
7747 ; CHECK-NEXT:    ret
7748   call void @llvm.aarch64.neon.st3lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 0, ptr %A)
7749   %tmp = getelementptr i64, ptr %A, i64 3
7750   ret ptr %tmp
7753 define ptr @test_v1i64_post_reg_st3lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 %inc) nounwind {
7754 ; CHECK-LABEL: test_v1i64_post_reg_st3lane:
7755 ; CHECK:       ; %bb.0:
7756 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7757 ; CHECK-NEXT:    lsl x8, x2, #3
7758 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7759 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7760 ; CHECK-NEXT:    st3.d { v0, v1, v2 }[0], [x0], x8
7761 ; CHECK-NEXT:    ret
7762   call void @llvm.aarch64.neon.st3lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 0, ptr %A)
7763   %tmp = getelementptr i64, ptr %A, i64 %inc
7764   ret ptr %tmp
7767 declare void @llvm.aarch64.neon.st3lane.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, i64, ptr)
7770 define ptr @test_v4f32_post_imm_st3lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
7771 ; CHECK-LABEL: test_v4f32_post_imm_st3lane:
7772 ; CHECK:       ; %bb.0:
7773 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7774 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7775 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7776 ; CHECK-NEXT:    st3.s { v0, v1, v2 }[0], [x0], #12
7777 ; CHECK-NEXT:    ret
7778   call void @llvm.aarch64.neon.st3lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, i64 0, ptr %A)
7779   %tmp = getelementptr float, ptr %A, i32 3
7780   ret ptr %tmp
7783 define ptr @test_v4f32_post_reg_st3lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, i64 %inc) nounwind {
7784 ; CHECK-LABEL: test_v4f32_post_reg_st3lane:
7785 ; CHECK:       ; %bb.0:
7786 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7787 ; CHECK-NEXT:    lsl x8, x2, #2
7788 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7789 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7790 ; CHECK-NEXT:    st3.s { v0, v1, v2 }[0], [x0], x8
7791 ; CHECK-NEXT:    ret
7792   call void @llvm.aarch64.neon.st3lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, i64 0, ptr %A)
7793   %tmp = getelementptr float, ptr %A, i64 %inc
7794   ret ptr %tmp
7797 declare void @llvm.aarch64.neon.st3lane.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, i64, ptr)
7800 define ptr @test_v2f32_post_imm_st3lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
7801 ; CHECK-LABEL: test_v2f32_post_imm_st3lane:
7802 ; CHECK:       ; %bb.0:
7803 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7804 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7805 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7806 ; CHECK-NEXT:    st3.s { v0, v1, v2 }[0], [x0], #12
7807 ; CHECK-NEXT:    ret
7808   call void @llvm.aarch64.neon.st3lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, i64 0, ptr %A)
7809   %tmp = getelementptr float, ptr %A, i32 3
7810   ret ptr %tmp
7813 define ptr @test_v2f32_post_reg_st3lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, i64 %inc) nounwind {
7814 ; CHECK-LABEL: test_v2f32_post_reg_st3lane:
7815 ; CHECK:       ; %bb.0:
7816 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7817 ; CHECK-NEXT:    lsl x8, x2, #2
7818 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7819 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7820 ; CHECK-NEXT:    st3.s { v0, v1, v2 }[0], [x0], x8
7821 ; CHECK-NEXT:    ret
7822   call void @llvm.aarch64.neon.st3lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, i64 0, ptr %A)
7823   %tmp = getelementptr float, ptr %A, i64 %inc
7824   ret ptr %tmp
7827 declare void @llvm.aarch64.neon.st3lane.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, i64, ptr)
7830 define ptr @test_v2f64_post_imm_st3lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
7831 ; CHECK-LABEL: test_v2f64_post_imm_st3lane:
7832 ; CHECK:       ; %bb.0:
7833 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7834 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7835 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7836 ; CHECK-NEXT:    st3.d { v0, v1, v2 }[0], [x0], #24
7837 ; CHECK-NEXT:    ret
7838   call void @llvm.aarch64.neon.st3lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, i64 0, ptr %A)
7839   %tmp = getelementptr double, ptr %A, i64 3
7840   ret ptr %tmp
7843 define ptr @test_v2f64_post_reg_st3lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, i64 %inc) nounwind {
7844 ; CHECK-LABEL: test_v2f64_post_reg_st3lane:
7845 ; CHECK:       ; %bb.0:
7846 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7847 ; CHECK-NEXT:    lsl x8, x2, #3
7848 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7849 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7850 ; CHECK-NEXT:    st3.d { v0, v1, v2 }[0], [x0], x8
7851 ; CHECK-NEXT:    ret
7852   call void @llvm.aarch64.neon.st3lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, i64 0, ptr %A)
7853   %tmp = getelementptr double, ptr %A, i64 %inc
7854   ret ptr %tmp
7857 declare void @llvm.aarch64.neon.st3lane.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, i64, ptr)
7860 define ptr @test_v1f64_post_imm_st3lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
7861 ; CHECK-LABEL: test_v1f64_post_imm_st3lane:
7862 ; CHECK:       ; %bb.0:
7863 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7864 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7865 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7866 ; CHECK-NEXT:    st3.d { v0, v1, v2 }[0], [x0], #24
7867 ; CHECK-NEXT:    ret
7868   call void @llvm.aarch64.neon.st3lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, i64 0, ptr %A)
7869   %tmp = getelementptr double, ptr %A, i64 3
7870   ret ptr %tmp
7873 define ptr @test_v1f64_post_reg_st3lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, i64 %inc) nounwind {
7874 ; CHECK-LABEL: test_v1f64_post_reg_st3lane:
7875 ; CHECK:       ; %bb.0:
7876 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7877 ; CHECK-NEXT:    lsl x8, x2, #3
7878 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7879 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7880 ; CHECK-NEXT:    st3.d { v0, v1, v2 }[0], [x0], x8
7881 ; CHECK-NEXT:    ret
7882   call void @llvm.aarch64.neon.st3lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, i64 0, ptr %A)
7883   %tmp = getelementptr double, ptr %A, i64 %inc
7884   ret ptr %tmp
7887 declare void @llvm.aarch64.neon.st3lane.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, i64, ptr)
7890 define ptr @test_v16i8_post_imm_st4lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
7891 ; CHECK-LABEL: test_v16i8_post_imm_st4lane:
7892 ; CHECK:       ; %bb.0:
7893 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7894 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7895 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7896 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7897 ; CHECK-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x0], #4
7898 ; CHECK-NEXT:    ret
7899   call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 0, ptr %A)
7900   %tmp = getelementptr i8, ptr %A, i32 4
7901   ret ptr %tmp
7904 define ptr @test_v16i8_post_reg_st4lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 %inc) nounwind {
7905 ; CHECK-LABEL: test_v16i8_post_reg_st4lane:
7906 ; CHECK:       ; %bb.0:
7907 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7908 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7909 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7910 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7911 ; CHECK-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x0], x2
7912 ; CHECK-NEXT:    ret
7913   call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 0, ptr %A)
7914   %tmp = getelementptr i8, ptr %A, i64 %inc
7915   ret ptr %tmp
7918 declare void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i64, ptr)
7921 define ptr @test_v8i8_post_imm_st4lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
7922 ; CHECK-LABEL: test_v8i8_post_imm_st4lane:
7923 ; CHECK:       ; %bb.0:
7924 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7925 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7926 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7927 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7928 ; CHECK-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x0], #4
7929 ; CHECK-NEXT:    ret
7930   call void @llvm.aarch64.neon.st4lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 0, ptr %A)
7931   %tmp = getelementptr i8, ptr %A, i32 4
7932   ret ptr %tmp
7935 define ptr @test_v8i8_post_reg_st4lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 %inc) nounwind {
7936 ; CHECK-LABEL: test_v8i8_post_reg_st4lane:
7937 ; CHECK:       ; %bb.0:
7938 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7939 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7940 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7941 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7942 ; CHECK-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x0], x2
7943 ; CHECK-NEXT:    ret
7944   call void @llvm.aarch64.neon.st4lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 0, ptr %A)
7945   %tmp = getelementptr i8, ptr %A, i64 %inc
7946   ret ptr %tmp
7949 declare void @llvm.aarch64.neon.st4lane.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i64, ptr)
7952 define ptr @test_v8i16_post_imm_st4lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
7953 ; CHECK-LABEL: test_v8i16_post_imm_st4lane:
7954 ; CHECK:       ; %bb.0:
7955 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7956 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7957 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7958 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7959 ; CHECK-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x0], #8
7960 ; CHECK-NEXT:    ret
7961   call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 0, ptr %A)
7962   %tmp = getelementptr i16, ptr %A, i32 4
7963   ret ptr %tmp
7966 define ptr @test_v8i16_post_reg_st4lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 %inc) nounwind {
7967 ; CHECK-LABEL: test_v8i16_post_reg_st4lane:
7968 ; CHECK:       ; %bb.0:
7969 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7970 ; CHECK-NEXT:    lsl x8, x2, #1
7971 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7972 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7973 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7974 ; CHECK-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x0], x8
7975 ; CHECK-NEXT:    ret
7976   call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 0, ptr %A)
7977   %tmp = getelementptr i16, ptr %A, i64 %inc
7978   ret ptr %tmp
7981 declare void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i64, ptr)
7984 define ptr @test_v4i16_post_imm_st4lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
7985 ; CHECK-LABEL: test_v4i16_post_imm_st4lane:
7986 ; CHECK:       ; %bb.0:
7987 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7988 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7989 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7990 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7991 ; CHECK-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x0], #8
7992 ; CHECK-NEXT:    ret
7993   call void @llvm.aarch64.neon.st4lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 0, ptr %A)
7994   %tmp = getelementptr i16, ptr %A, i32 4
7995   ret ptr %tmp
7998 define ptr @test_v4i16_post_reg_st4lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 %inc) nounwind {
7999 ; CHECK-LABEL: test_v4i16_post_reg_st4lane:
8000 ; CHECK:       ; %bb.0:
8001 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8002 ; CHECK-NEXT:    lsl x8, x2, #1
8003 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8004 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8005 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8006 ; CHECK-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x0], x8
8007 ; CHECK-NEXT:    ret
8008   call void @llvm.aarch64.neon.st4lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 0, ptr %A)
8009   %tmp = getelementptr i16, ptr %A, i64 %inc
8010   ret ptr %tmp
8013 declare void @llvm.aarch64.neon.st4lane.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i64, ptr)
8016 define ptr @test_v4i32_post_imm_st4lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
8017 ; CHECK-LABEL: test_v4i32_post_imm_st4lane:
8018 ; CHECK:       ; %bb.0:
8019 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8020 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8021 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8022 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8023 ; CHECK-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], #16
8024 ; CHECK-NEXT:    ret
8025   call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 0, ptr %A)
8026   %tmp = getelementptr i32, ptr %A, i32 4
8027   ret ptr %tmp
8030 define ptr @test_v4i32_post_reg_st4lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 %inc) nounwind {
8031 ; CHECK-LABEL: test_v4i32_post_reg_st4lane:
8032 ; CHECK:       ; %bb.0:
8033 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8034 ; CHECK-NEXT:    lsl x8, x2, #2
8035 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8036 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8037 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8038 ; CHECK-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], x8
8039 ; CHECK-NEXT:    ret
8040   call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 0, ptr %A)
8041   %tmp = getelementptr i32, ptr %A, i64 %inc
8042   ret ptr %tmp
8045 declare void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i64, ptr)
8048 define ptr @test_v2i32_post_imm_st4lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
8049 ; CHECK-LABEL: test_v2i32_post_imm_st4lane:
8050 ; CHECK:       ; %bb.0:
8051 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8052 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8053 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8054 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8055 ; CHECK-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], #16
8056 ; CHECK-NEXT:    ret
8057   call void @llvm.aarch64.neon.st4lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 0, ptr %A)
8058   %tmp = getelementptr i32, ptr %A, i32 4
8059   ret ptr %tmp
8062 define ptr @test_v2i32_post_reg_st4lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 %inc) nounwind {
8063 ; CHECK-LABEL: test_v2i32_post_reg_st4lane:
8064 ; CHECK:       ; %bb.0:
8065 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8066 ; CHECK-NEXT:    lsl x8, x2, #2
8067 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8068 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8069 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8070 ; CHECK-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], x8
8071 ; CHECK-NEXT:    ret
8072   call void @llvm.aarch64.neon.st4lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 0, ptr %A)
8073   %tmp = getelementptr i32, ptr %A, i64 %inc
8074   ret ptr %tmp
8077 declare void @llvm.aarch64.neon.st4lane.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i64, ptr)
8080 define ptr @test_v2i64_post_imm_st4lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
8081 ; CHECK-LABEL: test_v2i64_post_imm_st4lane:
8082 ; CHECK:       ; %bb.0:
8083 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8084 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8085 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8086 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8087 ; CHECK-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], #32
8088 ; CHECK-NEXT:    ret
8089   call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 0, ptr %A)
8090   %tmp = getelementptr i64, ptr %A, i64 4
8091   ret ptr %tmp
8094 define ptr @test_v2i64_post_reg_st4lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 %inc) nounwind {
8095 ; CHECK-LABEL: test_v2i64_post_reg_st4lane:
8096 ; CHECK:       ; %bb.0:
8097 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8098 ; CHECK-NEXT:    lsl x8, x2, #3
8099 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8100 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8101 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8102 ; CHECK-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], x8
8103 ; CHECK-NEXT:    ret
8104   call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 0, ptr %A)
8105   %tmp = getelementptr i64, ptr %A, i64 %inc
8106   ret ptr %tmp
8109 declare void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i64, ptr)
8112 define ptr @test_v1i64_post_imm_st4lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
8113 ; CHECK-LABEL: test_v1i64_post_imm_st4lane:
8114 ; CHECK:       ; %bb.0:
8115 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8116 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8117 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8118 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8119 ; CHECK-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], #32
8120 ; CHECK-NEXT:    ret
8121   call void @llvm.aarch64.neon.st4lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 0, ptr %A)
8122   %tmp = getelementptr i64, ptr %A, i64 4
8123   ret ptr %tmp
8126 define ptr @test_v1i64_post_reg_st4lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 %inc) nounwind {
8127 ; CHECK-LABEL: test_v1i64_post_reg_st4lane:
8128 ; CHECK:       ; %bb.0:
8129 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8130 ; CHECK-NEXT:    lsl x8, x2, #3
8131 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8132 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8133 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8134 ; CHECK-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], x8
8135 ; CHECK-NEXT:    ret
8136   call void @llvm.aarch64.neon.st4lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 0, ptr %A)
8137   %tmp = getelementptr i64, ptr %A, i64 %inc
8138   ret ptr %tmp
8141 declare void @llvm.aarch64.neon.st4lane.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, <1 x i64>, i64, ptr)
8144 define ptr @test_v4f32_post_imm_st4lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
8145 ; CHECK-LABEL: test_v4f32_post_imm_st4lane:
8146 ; CHECK:       ; %bb.0:
8147 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8148 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8149 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8150 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8151 ; CHECK-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], #16
8152 ; CHECK-NEXT:    ret
8153   call void @llvm.aarch64.neon.st4lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 0, ptr %A)
8154   %tmp = getelementptr float, ptr %A, i32 4
8155   ret ptr %tmp
8158 define ptr @test_v4f32_post_reg_st4lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 %inc) nounwind {
8159 ; CHECK-LABEL: test_v4f32_post_reg_st4lane:
8160 ; CHECK:       ; %bb.0:
8161 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8162 ; CHECK-NEXT:    lsl x8, x2, #2
8163 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8164 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8165 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8166 ; CHECK-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], x8
8167 ; CHECK-NEXT:    ret
8168   call void @llvm.aarch64.neon.st4lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 0, ptr %A)
8169   %tmp = getelementptr float, ptr %A, i64 %inc
8170   ret ptr %tmp
8173 declare void @llvm.aarch64.neon.st4lane.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, <4 x float>, i64, ptr)
8176 define ptr @test_v2f32_post_imm_st4lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
8177 ; CHECK-LABEL: test_v2f32_post_imm_st4lane:
8178 ; CHECK:       ; %bb.0:
8179 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8180 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8181 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8182 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8183 ; CHECK-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], #16
8184 ; CHECK-NEXT:    ret
8185   call void @llvm.aarch64.neon.st4lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 0, ptr %A)
8186   %tmp = getelementptr float, ptr %A, i32 4
8187   ret ptr %tmp
8190 define ptr @test_v2f32_post_reg_st4lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 %inc) nounwind {
8191 ; CHECK-LABEL: test_v2f32_post_reg_st4lane:
8192 ; CHECK:       ; %bb.0:
8193 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8194 ; CHECK-NEXT:    lsl x8, x2, #2
8195 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8196 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8197 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8198 ; CHECK-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], x8
8199 ; CHECK-NEXT:    ret
8200   call void @llvm.aarch64.neon.st4lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 0, ptr %A)
8201   %tmp = getelementptr float, ptr %A, i64 %inc
8202   ret ptr %tmp
8205 declare void @llvm.aarch64.neon.st4lane.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, <2 x float>, i64, ptr)
8208 define ptr @test_v2f64_post_imm_st4lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
8209 ; CHECK-LABEL: test_v2f64_post_imm_st4lane:
8210 ; CHECK:       ; %bb.0:
8211 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8212 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8213 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8214 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8215 ; CHECK-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], #32
8216 ; CHECK-NEXT:    ret
8217   call void @llvm.aarch64.neon.st4lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 0, ptr %A)
8218   %tmp = getelementptr double, ptr %A, i64 4
8219   ret ptr %tmp
8222 define ptr @test_v2f64_post_reg_st4lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 %inc) nounwind {
8223 ; CHECK-LABEL: test_v2f64_post_reg_st4lane:
8224 ; CHECK:       ; %bb.0:
8225 ; CHECK-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8226 ; CHECK-NEXT:    lsl x8, x2, #3
8227 ; CHECK-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8228 ; CHECK-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8229 ; CHECK-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8230 ; CHECK-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], x8
8231 ; CHECK-NEXT:    ret
8232   call void @llvm.aarch64.neon.st4lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 0, ptr %A)
8233   %tmp = getelementptr double, ptr %A, i64 %inc
8234   ret ptr %tmp
8237 declare void @llvm.aarch64.neon.st4lane.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, <2 x double>, i64, ptr)
8240 define ptr @test_v1f64_post_imm_st4lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
8241 ; CHECK-LABEL: test_v1f64_post_imm_st4lane:
8242 ; CHECK:       ; %bb.0:
8243 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8244 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8245 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8246 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8247 ; CHECK-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], #32
8248 ; CHECK-NEXT:    ret
8249   call void @llvm.aarch64.neon.st4lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 0, ptr %A)
8250   %tmp = getelementptr double, ptr %A, i64 4
8251   ret ptr %tmp
8254 define ptr @test_v1f64_post_reg_st4lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 %inc) nounwind {
8255 ; CHECK-LABEL: test_v1f64_post_reg_st4lane:
8256 ; CHECK:       ; %bb.0:
8257 ; CHECK-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8258 ; CHECK-NEXT:    lsl x8, x2, #3
8259 ; CHECK-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8260 ; CHECK-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8261 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8262 ; CHECK-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], x8
8263 ; CHECK-NEXT:    ret
8264   call void @llvm.aarch64.neon.st4lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 0, ptr %A)
8265   %tmp = getelementptr double, ptr %A, i64 %inc
8266   ret ptr %tmp
8269 declare void @llvm.aarch64.neon.st4lane.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, <1 x double>, i64, ptr)
8271 define <16 x i8> @test_v16i8_post_imm_ld1r(ptr %bar, ptr %ptr) {
8272 ; CHECK-LABEL: test_v16i8_post_imm_ld1r:
8273 ; CHECK:       ; %bb.0:
8274 ; CHECK-NEXT:    ld1r.16b { v0 }, [x0], #1
8275 ; CHECK-NEXT:    str x0, [x1]
8276 ; CHECK-NEXT:    ret
8277   %tmp1 = load i8, ptr %bar
8278   %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
8279   %tmp3 = insertelement <16 x i8> %tmp2, i8 %tmp1, i32 1
8280   %tmp4 = insertelement <16 x i8> %tmp3, i8 %tmp1, i32 2
8281   %tmp5 = insertelement <16 x i8> %tmp4, i8 %tmp1, i32 3
8282   %tmp6 = insertelement <16 x i8> %tmp5, i8 %tmp1, i32 4
8283   %tmp7 = insertelement <16 x i8> %tmp6, i8 %tmp1, i32 5
8284   %tmp8 = insertelement <16 x i8> %tmp7, i8 %tmp1, i32 6
8285   %tmp9 = insertelement <16 x i8> %tmp8, i8 %tmp1, i32 7
8286   %tmp10 = insertelement <16 x i8> %tmp9, i8 %tmp1, i32 8
8287   %tmp11 = insertelement <16 x i8> %tmp10, i8 %tmp1, i32 9
8288   %tmp12 = insertelement <16 x i8> %tmp11, i8 %tmp1, i32 10
8289   %tmp13 = insertelement <16 x i8> %tmp12, i8 %tmp1, i32 11
8290   %tmp14 = insertelement <16 x i8> %tmp13, i8 %tmp1, i32 12
8291   %tmp15 = insertelement <16 x i8> %tmp14, i8 %tmp1, i32 13
8292   %tmp16 = insertelement <16 x i8> %tmp15, i8 %tmp1, i32 14
8293   %tmp17 = insertelement <16 x i8> %tmp16, i8 %tmp1, i32 15
8294   %tmp18 = getelementptr i8, ptr %bar, i64 1
8295   store ptr %tmp18, ptr %ptr
8296   ret <16 x i8> %tmp17
8299 define <16 x i8> @test_v16i8_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8300 ; CHECK-LABEL: test_v16i8_post_reg_ld1r:
8301 ; CHECK:       ; %bb.0:
8302 ; CHECK-NEXT:    ld1r.16b { v0 }, [x0], x2
8303 ; CHECK-NEXT:    str x0, [x1]
8304 ; CHECK-NEXT:    ret
8305   %tmp1 = load i8, ptr %bar
8306   %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
8307   %tmp3 = insertelement <16 x i8> %tmp2, i8 %tmp1, i32 1
8308   %tmp4 = insertelement <16 x i8> %tmp3, i8 %tmp1, i32 2
8309   %tmp5 = insertelement <16 x i8> %tmp4, i8 %tmp1, i32 3
8310   %tmp6 = insertelement <16 x i8> %tmp5, i8 %tmp1, i32 4
8311   %tmp7 = insertelement <16 x i8> %tmp6, i8 %tmp1, i32 5
8312   %tmp8 = insertelement <16 x i8> %tmp7, i8 %tmp1, i32 6
8313   %tmp9 = insertelement <16 x i8> %tmp8, i8 %tmp1, i32 7
8314   %tmp10 = insertelement <16 x i8> %tmp9, i8 %tmp1, i32 8
8315   %tmp11 = insertelement <16 x i8> %tmp10, i8 %tmp1, i32 9
8316   %tmp12 = insertelement <16 x i8> %tmp11, i8 %tmp1, i32 10
8317   %tmp13 = insertelement <16 x i8> %tmp12, i8 %tmp1, i32 11
8318   %tmp14 = insertelement <16 x i8> %tmp13, i8 %tmp1, i32 12
8319   %tmp15 = insertelement <16 x i8> %tmp14, i8 %tmp1, i32 13
8320   %tmp16 = insertelement <16 x i8> %tmp15, i8 %tmp1, i32 14
8321   %tmp17 = insertelement <16 x i8> %tmp16, i8 %tmp1, i32 15
8322   %tmp18 = getelementptr i8, ptr %bar, i64 %inc
8323   store ptr %tmp18, ptr %ptr
8324   ret <16 x i8> %tmp17
8327 define <8 x i8> @test_v8i8_post_imm_ld1r(ptr %bar, ptr %ptr) {
8328 ; CHECK-LABEL: test_v8i8_post_imm_ld1r:
8329 ; CHECK:       ; %bb.0:
8330 ; CHECK-NEXT:    ld1r.8b { v0 }, [x0], #1
8331 ; CHECK-NEXT:    str x0, [x1]
8332 ; CHECK-NEXT:    ret
8333   %tmp1 = load i8, ptr %bar
8334   %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
8335   %tmp3 = insertelement <8 x i8> %tmp2, i8 %tmp1, i32 1
8336   %tmp4 = insertelement <8 x i8> %tmp3, i8 %tmp1, i32 2
8337   %tmp5 = insertelement <8 x i8> %tmp4, i8 %tmp1, i32 3
8338   %tmp6 = insertelement <8 x i8> %tmp5, i8 %tmp1, i32 4
8339   %tmp7 = insertelement <8 x i8> %tmp6, i8 %tmp1, i32 5
8340   %tmp8 = insertelement <8 x i8> %tmp7, i8 %tmp1, i32 6
8341   %tmp9 = insertelement <8 x i8> %tmp8, i8 %tmp1, i32 7
8342   %tmp10 = getelementptr i8, ptr %bar, i64 1
8343   store ptr %tmp10, ptr %ptr
8344   ret <8 x i8> %tmp9
8347 define <8 x i8> @test_v8i8_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8348 ; CHECK-LABEL: test_v8i8_post_reg_ld1r:
8349 ; CHECK:       ; %bb.0:
8350 ; CHECK-NEXT:    ld1r.8b { v0 }, [x0], x2
8351 ; CHECK-NEXT:    str x0, [x1]
8352 ; CHECK-NEXT:    ret
8353   %tmp1 = load i8, ptr %bar
8354   %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
8355   %tmp3 = insertelement <8 x i8> %tmp2, i8 %tmp1, i32 1
8356   %tmp4 = insertelement <8 x i8> %tmp3, i8 %tmp1, i32 2
8357   %tmp5 = insertelement <8 x i8> %tmp4, i8 %tmp1, i32 3
8358   %tmp6 = insertelement <8 x i8> %tmp5, i8 %tmp1, i32 4
8359   %tmp7 = insertelement <8 x i8> %tmp6, i8 %tmp1, i32 5
8360   %tmp8 = insertelement <8 x i8> %tmp7, i8 %tmp1, i32 6
8361   %tmp9 = insertelement <8 x i8> %tmp8, i8 %tmp1, i32 7
8362   %tmp10 = getelementptr i8, ptr %bar, i64 %inc
8363   store ptr %tmp10, ptr %ptr
8364   ret <8 x i8> %tmp9
8367 define <8 x i16> @test_v8i16_post_imm_ld1r(ptr %bar, ptr %ptr) {
8368 ; CHECK-LABEL: test_v8i16_post_imm_ld1r:
8369 ; CHECK:       ; %bb.0:
8370 ; CHECK-NEXT:    ld1r.8h { v0 }, [x0], #2
8371 ; CHECK-NEXT:    str x0, [x1]
8372 ; CHECK-NEXT:    ret
8373   %tmp1 = load i16, ptr %bar
8374   %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
8375   %tmp3 = insertelement <8 x i16> %tmp2, i16 %tmp1, i32 1
8376   %tmp4 = insertelement <8 x i16> %tmp3, i16 %tmp1, i32 2
8377   %tmp5 = insertelement <8 x i16> %tmp4, i16 %tmp1, i32 3
8378   %tmp6 = insertelement <8 x i16> %tmp5, i16 %tmp1, i32 4
8379   %tmp7 = insertelement <8 x i16> %tmp6, i16 %tmp1, i32 5
8380   %tmp8 = insertelement <8 x i16> %tmp7, i16 %tmp1, i32 6
8381   %tmp9 = insertelement <8 x i16> %tmp8, i16 %tmp1, i32 7
8382   %tmp10 = getelementptr i16, ptr %bar, i64 1
8383   store ptr %tmp10, ptr %ptr
8384   ret <8 x i16> %tmp9
8387 define <8 x i16> @test_v8i16_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8388 ; CHECK-LABEL: test_v8i16_post_reg_ld1r:
8389 ; CHECK:       ; %bb.0:
8390 ; CHECK-NEXT:    lsl x8, x2, #1
8391 ; CHECK-NEXT:    ld1r.8h { v0 }, [x0], x8
8392 ; CHECK-NEXT:    str x0, [x1]
8393 ; CHECK-NEXT:    ret
8394   %tmp1 = load i16, ptr %bar
8395   %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
8396   %tmp3 = insertelement <8 x i16> %tmp2, i16 %tmp1, i32 1
8397   %tmp4 = insertelement <8 x i16> %tmp3, i16 %tmp1, i32 2
8398   %tmp5 = insertelement <8 x i16> %tmp4, i16 %tmp1, i32 3
8399   %tmp6 = insertelement <8 x i16> %tmp5, i16 %tmp1, i32 4
8400   %tmp7 = insertelement <8 x i16> %tmp6, i16 %tmp1, i32 5
8401   %tmp8 = insertelement <8 x i16> %tmp7, i16 %tmp1, i32 6
8402   %tmp9 = insertelement <8 x i16> %tmp8, i16 %tmp1, i32 7
8403   %tmp10 = getelementptr i16, ptr %bar, i64 %inc
8404   store ptr %tmp10, ptr %ptr
8405   ret <8 x i16> %tmp9
8408 define <4 x i16> @test_v4i16_post_imm_ld1r(ptr %bar, ptr %ptr) {
8409 ; CHECK-LABEL: test_v4i16_post_imm_ld1r:
8410 ; CHECK:       ; %bb.0:
8411 ; CHECK-NEXT:    ld1r.4h { v0 }, [x0], #2
8412 ; CHECK-NEXT:    str x0, [x1]
8413 ; CHECK-NEXT:    ret
8414   %tmp1 = load i16, ptr %bar
8415   %tmp2 = insertelement <4 x i16> <i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0
8416   %tmp3 = insertelement <4 x i16> %tmp2, i16 %tmp1, i32 1
8417   %tmp4 = insertelement <4 x i16> %tmp3, i16 %tmp1, i32 2
8418   %tmp5 = insertelement <4 x i16> %tmp4, i16 %tmp1, i32 3
8419   %tmp6 = getelementptr i16, ptr %bar, i64 1
8420   store ptr %tmp6, ptr %ptr
8421   ret <4 x i16> %tmp5
8424 define <4 x i16> @test_v4i16_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8425 ; CHECK-LABEL: test_v4i16_post_reg_ld1r:
8426 ; CHECK:       ; %bb.0:
8427 ; CHECK-NEXT:    lsl x8, x2, #1
8428 ; CHECK-NEXT:    ld1r.4h { v0 }, [x0], x8
8429 ; CHECK-NEXT:    str x0, [x1]
8430 ; CHECK-NEXT:    ret
8431   %tmp1 = load i16, ptr %bar
8432   %tmp2 = insertelement <4 x i16> <i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0
8433   %tmp3 = insertelement <4 x i16> %tmp2, i16 %tmp1, i32 1
8434   %tmp4 = insertelement <4 x i16> %tmp3, i16 %tmp1, i32 2
8435   %tmp5 = insertelement <4 x i16> %tmp4, i16 %tmp1, i32 3
8436   %tmp6 = getelementptr i16, ptr %bar, i64 %inc
8437   store ptr %tmp6, ptr %ptr
8438   ret <4 x i16> %tmp5
8441 define <4 x i32> @test_v4i32_post_imm_ld1r(ptr %bar, ptr %ptr) {
8442 ; CHECK-LABEL: test_v4i32_post_imm_ld1r:
8443 ; CHECK:       ; %bb.0:
8444 ; CHECK-NEXT:    ld1r.4s { v0 }, [x0], #4
8445 ; CHECK-NEXT:    str x0, [x1]
8446 ; CHECK-NEXT:    ret
8447   %tmp1 = load i32, ptr %bar
8448   %tmp2 = insertelement <4 x i32> <i32 undef, i32 undef, i32 undef, i32 undef>, i32 %tmp1, i32 0
8449   %tmp3 = insertelement <4 x i32> %tmp2, i32 %tmp1, i32 1
8450   %tmp4 = insertelement <4 x i32> %tmp3, i32 %tmp1, i32 2
8451   %tmp5 = insertelement <4 x i32> %tmp4, i32 %tmp1, i32 3
8452   %tmp6 = getelementptr i32, ptr %bar, i64 1
8453   store ptr %tmp6, ptr %ptr
8454   ret <4 x i32> %tmp5
8457 define <4 x i32> @test_v4i32_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8458 ; CHECK-LABEL: test_v4i32_post_reg_ld1r:
8459 ; CHECK:       ; %bb.0:
8460 ; CHECK-NEXT:    lsl x8, x2, #2
8461 ; CHECK-NEXT:    ld1r.4s { v0 }, [x0], x8
8462 ; CHECK-NEXT:    str x0, [x1]
8463 ; CHECK-NEXT:    ret
8464   %tmp1 = load i32, ptr %bar
8465   %tmp2 = insertelement <4 x i32> <i32 undef, i32 undef, i32 undef, i32 undef>, i32 %tmp1, i32 0
8466   %tmp3 = insertelement <4 x i32> %tmp2, i32 %tmp1, i32 1
8467   %tmp4 = insertelement <4 x i32> %tmp3, i32 %tmp1, i32 2
8468   %tmp5 = insertelement <4 x i32> %tmp4, i32 %tmp1, i32 3
8469   %tmp6 = getelementptr i32, ptr %bar, i64 %inc
8470   store ptr %tmp6, ptr %ptr
8471   ret <4 x i32> %tmp5
8474 define <2 x i32> @test_v2i32_post_imm_ld1r(ptr %bar, ptr %ptr) {
8475 ; CHECK-LABEL: test_v2i32_post_imm_ld1r:
8476 ; CHECK:       ; %bb.0:
8477 ; CHECK-NEXT:    ld1r.2s { v0 }, [x0], #4
8478 ; CHECK-NEXT:    str x0, [x1]
8479 ; CHECK-NEXT:    ret
8480   %tmp1 = load i32, ptr %bar
8481   %tmp2 = insertelement <2 x i32> <i32 undef, i32 undef>, i32 %tmp1, i32 0
8482   %tmp3 = insertelement <2 x i32> %tmp2, i32 %tmp1, i32 1
8483   %tmp4 = getelementptr i32, ptr %bar, i64 1
8484   store ptr %tmp4, ptr %ptr
8485   ret <2 x i32> %tmp3
8488 define <2 x i32> @test_v2i32_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8489 ; CHECK-LABEL: test_v2i32_post_reg_ld1r:
8490 ; CHECK:       ; %bb.0:
8491 ; CHECK-NEXT:    lsl x8, x2, #2
8492 ; CHECK-NEXT:    ld1r.2s { v0 }, [x0], x8
8493 ; CHECK-NEXT:    str x0, [x1]
8494 ; CHECK-NEXT:    ret
8495   %tmp1 = load i32, ptr %bar
8496   %tmp2 = insertelement <2 x i32> <i32 undef, i32 undef>, i32 %tmp1, i32 0
8497   %tmp3 = insertelement <2 x i32> %tmp2, i32 %tmp1, i32 1
8498   %tmp4 = getelementptr i32, ptr %bar, i64 %inc
8499   store ptr %tmp4, ptr %ptr
8500   ret <2 x i32> %tmp3
8503 define <2 x i64> @test_v2i64_post_imm_ld1r(ptr %bar, ptr %ptr) {
8504 ; CHECK-LABEL: test_v2i64_post_imm_ld1r:
8505 ; CHECK:       ; %bb.0:
8506 ; CHECK-NEXT:    ld1r.2d { v0 }, [x0], #8
8507 ; CHECK-NEXT:    str x0, [x1]
8508 ; CHECK-NEXT:    ret
8509   %tmp1 = load i64, ptr %bar
8510   %tmp2 = insertelement <2 x i64> <i64 undef, i64 undef>, i64 %tmp1, i32 0
8511   %tmp3 = insertelement <2 x i64> %tmp2, i64 %tmp1, i32 1
8512   %tmp4 = getelementptr i64, ptr %bar, i64 1
8513   store ptr %tmp4, ptr %ptr
8514   ret <2 x i64> %tmp3
8517 define <2 x i64> @test_v2i64_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8518 ; CHECK-LABEL: test_v2i64_post_reg_ld1r:
8519 ; CHECK:       ; %bb.0:
8520 ; CHECK-NEXT:    lsl x8, x2, #3
8521 ; CHECK-NEXT:    ld1r.2d { v0 }, [x0], x8
8522 ; CHECK-NEXT:    str x0, [x1]
8523 ; CHECK-NEXT:    ret
8524   %tmp1 = load i64, ptr %bar
8525   %tmp2 = insertelement <2 x i64> <i64 undef, i64 undef>, i64 %tmp1, i32 0
8526   %tmp3 = insertelement <2 x i64> %tmp2, i64 %tmp1, i32 1
8527   %tmp4 = getelementptr i64, ptr %bar, i64 %inc
8528   store ptr %tmp4, ptr %ptr
8529   ret <2 x i64> %tmp3
8532 define <4 x float> @test_v4f32_post_imm_ld1r(ptr %bar, ptr %ptr) {
8533 ; CHECK-LABEL: test_v4f32_post_imm_ld1r:
8534 ; CHECK:       ; %bb.0:
8535 ; CHECK-NEXT:    ld1r.4s { v0 }, [x0], #4
8536 ; CHECK-NEXT:    str x0, [x1]
8537 ; CHECK-NEXT:    ret
8538   %tmp1 = load float, ptr %bar
8539   %tmp2 = insertelement <4 x float> <float undef, float undef, float undef, float undef>, float %tmp1, i32 0
8540   %tmp3 = insertelement <4 x float> %tmp2, float %tmp1, i32 1
8541   %tmp4 = insertelement <4 x float> %tmp3, float %tmp1, i32 2
8542   %tmp5 = insertelement <4 x float> %tmp4, float %tmp1, i32 3
8543   %tmp6 = getelementptr float, ptr %bar, i64 1
8544   store ptr %tmp6, ptr %ptr
8545   ret <4 x float> %tmp5
8548 define <4 x float> @test_v4f32_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8549 ; CHECK-LABEL: test_v4f32_post_reg_ld1r:
8550 ; CHECK:       ; %bb.0:
8551 ; CHECK-NEXT:    lsl x8, x2, #2
8552 ; CHECK-NEXT:    ld1r.4s { v0 }, [x0], x8
8553 ; CHECK-NEXT:    str x0, [x1]
8554 ; CHECK-NEXT:    ret
8555   %tmp1 = load float, ptr %bar
8556   %tmp2 = insertelement <4 x float> <float undef, float undef, float undef, float undef>, float %tmp1, i32 0
8557   %tmp3 = insertelement <4 x float> %tmp2, float %tmp1, i32 1
8558   %tmp4 = insertelement <4 x float> %tmp3, float %tmp1, i32 2
8559   %tmp5 = insertelement <4 x float> %tmp4, float %tmp1, i32 3
8560   %tmp6 = getelementptr float, ptr %bar, i64 %inc
8561   store ptr %tmp6, ptr %ptr
8562   ret <4 x float> %tmp5
8565 define <2 x float> @test_v2f32_post_imm_ld1r(ptr %bar, ptr %ptr) {
8566 ; CHECK-LABEL: test_v2f32_post_imm_ld1r:
8567 ; CHECK:       ; %bb.0:
8568 ; CHECK-NEXT:    ld1r.2s { v0 }, [x0], #4
8569 ; CHECK-NEXT:    str x0, [x1]
8570 ; CHECK-NEXT:    ret
8571   %tmp1 = load float, ptr %bar
8572   %tmp2 = insertelement <2 x float> <float undef, float undef>, float %tmp1, i32 0
8573   %tmp3 = insertelement <2 x float> %tmp2, float %tmp1, i32 1
8574   %tmp4 = getelementptr float, ptr %bar, i64 1
8575   store ptr %tmp4, ptr %ptr
8576   ret <2 x float> %tmp3
8579 define <2 x float> @test_v2f32_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8580 ; CHECK-LABEL: test_v2f32_post_reg_ld1r:
8581 ; CHECK:       ; %bb.0:
8582 ; CHECK-NEXT:    lsl x8, x2, #2
8583 ; CHECK-NEXT:    ld1r.2s { v0 }, [x0], x8
8584 ; CHECK-NEXT:    str x0, [x1]
8585 ; CHECK-NEXT:    ret
8586   %tmp1 = load float, ptr %bar
8587   %tmp2 = insertelement <2 x float> <float undef, float undef>, float %tmp1, i32 0
8588   %tmp3 = insertelement <2 x float> %tmp2, float %tmp1, i32 1
8589   %tmp4 = getelementptr float, ptr %bar, i64 %inc
8590   store ptr %tmp4, ptr %ptr
8591   ret <2 x float> %tmp3
8594 define <2 x double> @test_v2f64_post_imm_ld1r(ptr %bar, ptr %ptr) {
8595 ; CHECK-LABEL: test_v2f64_post_imm_ld1r:
8596 ; CHECK:       ; %bb.0:
8597 ; CHECK-NEXT:    ld1r.2d { v0 }, [x0], #8
8598 ; CHECK-NEXT:    str x0, [x1]
8599 ; CHECK-NEXT:    ret
8600   %tmp1 = load double, ptr %bar
8601   %tmp2 = insertelement <2 x double> <double undef, double undef>, double %tmp1, i32 0
8602   %tmp3 = insertelement <2 x double> %tmp2, double %tmp1, i32 1
8603   %tmp4 = getelementptr double, ptr %bar, i64 1
8604   store ptr %tmp4, ptr %ptr
8605   ret <2 x double> %tmp3
8608 define <2 x double> @test_v2f64_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
8609 ; CHECK-LABEL: test_v2f64_post_reg_ld1r:
8610 ; CHECK:       ; %bb.0:
8611 ; CHECK-NEXT:    lsl x8, x2, #3
8612 ; CHECK-NEXT:    ld1r.2d { v0 }, [x0], x8
8613 ; CHECK-NEXT:    str x0, [x1]
8614 ; CHECK-NEXT:    ret
8615   %tmp1 = load double, ptr %bar
8616   %tmp2 = insertelement <2 x double> <double undef, double undef>, double %tmp1, i32 0
8617   %tmp3 = insertelement <2 x double> %tmp2, double %tmp1, i32 1
8618   %tmp4 = getelementptr double, ptr %bar, i64 %inc
8619   store ptr %tmp4, ptr %ptr
8620   ret <2 x double> %tmp3
8623 define <16 x i8> @test_v16i8_post_imm_ld1lane(ptr %bar, ptr %ptr, <16 x i8> %A) {
8624 ; CHECK-LABEL: test_v16i8_post_imm_ld1lane:
8625 ; CHECK:       ; %bb.0:
8626 ; CHECK-NEXT:    ld1.b { v0 }[1], [x0], #1
8627 ; CHECK-NEXT:    str x0, [x1]
8628 ; CHECK-NEXT:    ret
8629   %tmp1 = load i8, ptr %bar
8630   %tmp2 = insertelement <16 x i8> %A, i8 %tmp1, i32 1
8631   %tmp3 = getelementptr i8, ptr %bar, i64 1
8632   store ptr %tmp3, ptr %ptr
8633   ret <16 x i8> %tmp2
8636 define <16 x i8> @test_v16i8_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <16 x i8> %A) {
8637 ; CHECK-LABEL: test_v16i8_post_reg_ld1lane:
8638 ; CHECK:       ; %bb.0:
8639 ; CHECK-NEXT:    ld1.b { v0 }[1], [x0], x2
8640 ; CHECK-NEXT:    str x0, [x1]
8641 ; CHECK-NEXT:    ret
8642   %tmp1 = load i8, ptr %bar
8643   %tmp2 = insertelement <16 x i8> %A, i8 %tmp1, i32 1
8644   %tmp3 = getelementptr i8, ptr %bar, i64 %inc
8645   store ptr %tmp3, ptr %ptr
8646   ret <16 x i8> %tmp2
8649 define <8 x i8> @test_v8i8_post_imm_ld1lane(ptr %bar, ptr %ptr, <8 x i8> %A) {
8650 ; CHECK-LABEL: test_v8i8_post_imm_ld1lane:
8651 ; CHECK:       ; %bb.0:
8652 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
8653 ; CHECK-NEXT:    ld1.b { v0 }[1], [x0], #1
8654 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
8655 ; CHECK-NEXT:    str x0, [x1]
8656 ; CHECK-NEXT:    ret
8657   %tmp1 = load i8, ptr %bar
8658   %tmp2 = insertelement <8 x i8> %A, i8 %tmp1, i32 1
8659   %tmp3 = getelementptr i8, ptr %bar, i64 1
8660   store ptr %tmp3, ptr %ptr
8661   ret <8 x i8> %tmp2
8664 define <8 x i8> @test_v8i8_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <8 x i8> %A) {
8665 ; CHECK-LABEL: test_v8i8_post_reg_ld1lane:
8666 ; CHECK:       ; %bb.0:
8667 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
8668 ; CHECK-NEXT:    ld1.b { v0 }[1], [x0], x2
8669 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
8670 ; CHECK-NEXT:    str x0, [x1]
8671 ; CHECK-NEXT:    ret
8672   %tmp1 = load i8, ptr %bar
8673   %tmp2 = insertelement <8 x i8> %A, i8 %tmp1, i32 1
8674   %tmp3 = getelementptr i8, ptr %bar, i64 %inc
8675   store ptr %tmp3, ptr %ptr
8676   ret <8 x i8> %tmp2
8679 define <8 x i16> @test_v8i16_post_imm_ld1lane(ptr %bar, ptr %ptr, <8 x i16> %A) {
8680 ; CHECK-LABEL: test_v8i16_post_imm_ld1lane:
8681 ; CHECK:       ; %bb.0:
8682 ; CHECK-NEXT:    ld1.h { v0 }[1], [x0], #2
8683 ; CHECK-NEXT:    str x0, [x1]
8684 ; CHECK-NEXT:    ret
8685   %tmp1 = load i16, ptr %bar
8686   %tmp2 = insertelement <8 x i16> %A, i16 %tmp1, i32 1
8687   %tmp3 = getelementptr i16, ptr %bar, i64 1
8688   store ptr %tmp3, ptr %ptr
8689   ret <8 x i16> %tmp2
8692 define <8 x i16> @test_v8i16_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <8 x i16> %A) {
8693 ; CHECK-LABEL: test_v8i16_post_reg_ld1lane:
8694 ; CHECK:       ; %bb.0:
8695 ; CHECK-NEXT:    lsl x8, x2, #1
8696 ; CHECK-NEXT:    ld1.h { v0 }[1], [x0], x8
8697 ; CHECK-NEXT:    str x0, [x1]
8698 ; CHECK-NEXT:    ret
8699   %tmp1 = load i16, ptr %bar
8700   %tmp2 = insertelement <8 x i16> %A, i16 %tmp1, i32 1
8701   %tmp3 = getelementptr i16, ptr %bar, i64 %inc
8702   store ptr %tmp3, ptr %ptr
8703   ret <8 x i16> %tmp2
8706 define <4 x i16> @test_v4i16_post_imm_ld1lane(ptr %bar, ptr %ptr, <4 x i16> %A) {
8707 ; CHECK-LABEL: test_v4i16_post_imm_ld1lane:
8708 ; CHECK:       ; %bb.0:
8709 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
8710 ; CHECK-NEXT:    ld1.h { v0 }[1], [x0], #2
8711 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
8712 ; CHECK-NEXT:    str x0, [x1]
8713 ; CHECK-NEXT:    ret
8714   %tmp1 = load i16, ptr %bar
8715   %tmp2 = insertelement <4 x i16> %A, i16 %tmp1, i32 1
8716   %tmp3 = getelementptr i16, ptr %bar, i64 1
8717   store ptr %tmp3, ptr %ptr
8718   ret <4 x i16> %tmp2
8721 define <4 x i16> @test_v4i16_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <4 x i16> %A) {
8722 ; CHECK-LABEL: test_v4i16_post_reg_ld1lane:
8723 ; CHECK:       ; %bb.0:
8724 ; CHECK-NEXT:    lsl x8, x2, #1
8725 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
8726 ; CHECK-NEXT:    ld1.h { v0 }[1], [x0], x8
8727 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
8728 ; CHECK-NEXT:    str x0, [x1]
8729 ; CHECK-NEXT:    ret
8730   %tmp1 = load i16, ptr %bar
8731   %tmp2 = insertelement <4 x i16> %A, i16 %tmp1, i32 1
8732   %tmp3 = getelementptr i16, ptr %bar, i64 %inc
8733   store ptr %tmp3, ptr %ptr
8734   ret <4 x i16> %tmp2
8737 define <4 x i32> @test_v4i32_post_imm_ld1lane(ptr %bar, ptr %ptr, <4 x i32> %A) {
8738 ; CHECK-LABEL: test_v4i32_post_imm_ld1lane:
8739 ; CHECK:       ; %bb.0:
8740 ; CHECK-NEXT:    ld1.s { v0 }[1], [x0], #4
8741 ; CHECK-NEXT:    str x0, [x1]
8742 ; CHECK-NEXT:    ret
8743   %tmp1 = load i32, ptr %bar
8744   %tmp2 = insertelement <4 x i32> %A, i32 %tmp1, i32 1
8745   %tmp3 = getelementptr i32, ptr %bar, i64 1
8746   store ptr %tmp3, ptr %ptr
8747   ret <4 x i32> %tmp2
8750 define <4 x i32> @test_v4i32_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <4 x i32> %A) {
8751 ; CHECK-LABEL: test_v4i32_post_reg_ld1lane:
8752 ; CHECK:       ; %bb.0:
8753 ; CHECK-NEXT:    lsl x8, x2, #2
8754 ; CHECK-NEXT:    ld1.s { v0 }[1], [x0], x8
8755 ; CHECK-NEXT:    str x0, [x1]
8756 ; CHECK-NEXT:    ret
8757   %tmp1 = load i32, ptr %bar
8758   %tmp2 = insertelement <4 x i32> %A, i32 %tmp1, i32 1
8759   %tmp3 = getelementptr i32, ptr %bar, i64 %inc
8760   store ptr %tmp3, ptr %ptr
8761   ret <4 x i32> %tmp2
8764 define <2 x i32> @test_v2i32_post_imm_ld1lane(ptr %bar, ptr %ptr, <2 x i32> %A) {
8765 ; CHECK-LABEL: test_v2i32_post_imm_ld1lane:
8766 ; CHECK:       ; %bb.0:
8767 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
8768 ; CHECK-NEXT:    ld1.s { v0 }[1], [x0], #4
8769 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
8770 ; CHECK-NEXT:    str x0, [x1]
8771 ; CHECK-NEXT:    ret
8772   %tmp1 = load i32, ptr %bar
8773   %tmp2 = insertelement <2 x i32> %A, i32 %tmp1, i32 1
8774   %tmp3 = getelementptr i32, ptr %bar, i64 1
8775   store ptr %tmp3, ptr %ptr
8776   ret <2 x i32> %tmp2
8779 define <2 x i32> @test_v2i32_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <2 x i32> %A) {
8780 ; CHECK-LABEL: test_v2i32_post_reg_ld1lane:
8781 ; CHECK:       ; %bb.0:
8782 ; CHECK-NEXT:    lsl x8, x2, #2
8783 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
8784 ; CHECK-NEXT:    ld1.s { v0 }[1], [x0], x8
8785 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
8786 ; CHECK-NEXT:    str x0, [x1]
8787 ; CHECK-NEXT:    ret
8788   %tmp1 = load i32, ptr %bar
8789   %tmp2 = insertelement <2 x i32> %A, i32 %tmp1, i32 1
8790   %tmp3 = getelementptr i32, ptr %bar, i64 %inc
8791   store ptr %tmp3, ptr %ptr
8792   ret <2 x i32> %tmp2
8795 define <2 x i64> @test_v2i64_post_imm_ld1lane(ptr %bar, ptr %ptr, <2 x i64> %A) {
8796 ; CHECK-LABEL: test_v2i64_post_imm_ld1lane:
8797 ; CHECK:       ; %bb.0:
8798 ; CHECK-NEXT:    ld1.d { v0 }[1], [x0], #8
8799 ; CHECK-NEXT:    str x0, [x1]
8800 ; CHECK-NEXT:    ret
8801   %tmp1 = load i64, ptr %bar
8802   %tmp2 = insertelement <2 x i64> %A, i64 %tmp1, i32 1
8803   %tmp3 = getelementptr i64, ptr %bar, i64 1
8804   store ptr %tmp3, ptr %ptr
8805   ret <2 x i64> %tmp2
8808 define <2 x i64> @test_v2i64_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <2 x i64> %A) {
8809 ; CHECK-LABEL: test_v2i64_post_reg_ld1lane:
8810 ; CHECK:       ; %bb.0:
8811 ; CHECK-NEXT:    lsl x8, x2, #3
8812 ; CHECK-NEXT:    ld1.d { v0 }[1], [x0], x8
8813 ; CHECK-NEXT:    str x0, [x1]
8814 ; CHECK-NEXT:    ret
8815   %tmp1 = load i64, ptr %bar
8816   %tmp2 = insertelement <2 x i64> %A, i64 %tmp1, i32 1
8817   %tmp3 = getelementptr i64, ptr %bar, i64 %inc
8818   store ptr %tmp3, ptr %ptr
8819   ret <2 x i64> %tmp2
8822 define <4 x float> @test_v4f32_post_imm_ld1lane(ptr %bar, ptr %ptr, <4 x float> %A) {
8823 ; CHECK-LABEL: test_v4f32_post_imm_ld1lane:
8824 ; CHECK:       ; %bb.0:
8825 ; CHECK-NEXT:    ld1.s { v0 }[1], [x0], #4
8826 ; CHECK-NEXT:    str x0, [x1]
8827 ; CHECK-NEXT:    ret
8828   %tmp1 = load float, ptr %bar
8829   %tmp2 = insertelement <4 x float> %A, float %tmp1, i32 1
8830   %tmp3 = getelementptr float, ptr %bar, i64 1
8831   store ptr %tmp3, ptr %ptr
8832   ret <4 x float> %tmp2
8835 define <4 x float> @test_v4f32_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <4 x float> %A) {
8836 ; CHECK-LABEL: test_v4f32_post_reg_ld1lane:
8837 ; CHECK:       ; %bb.0:
8838 ; CHECK-NEXT:    lsl x8, x2, #2
8839 ; CHECK-NEXT:    ld1.s { v0 }[1], [x0], x8
8840 ; CHECK-NEXT:    str x0, [x1]
8841 ; CHECK-NEXT:    ret
8842   %tmp1 = load float, ptr %bar
8843   %tmp2 = insertelement <4 x float> %A, float %tmp1, i32 1
8844   %tmp3 = getelementptr float, ptr %bar, i64 %inc
8845   store ptr %tmp3, ptr %ptr
8846   ret <4 x float> %tmp2
8849 define <2 x float> @test_v2f32_post_imm_ld1lane(ptr %bar, ptr %ptr, <2 x float> %A) {
8850 ; CHECK-LABEL: test_v2f32_post_imm_ld1lane:
8851 ; CHECK:       ; %bb.0:
8852 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
8853 ; CHECK-NEXT:    ld1.s { v0 }[1], [x0], #4
8854 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
8855 ; CHECK-NEXT:    str x0, [x1]
8856 ; CHECK-NEXT:    ret
8857   %tmp1 = load float, ptr %bar
8858   %tmp2 = insertelement <2 x float> %A, float %tmp1, i32 1
8859   %tmp3 = getelementptr float, ptr %bar, i64 1
8860   store ptr %tmp3, ptr %ptr
8861   ret <2 x float> %tmp2
8864 define <2 x float> @test_v2f32_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <2 x float> %A) {
8865 ; CHECK-LABEL: test_v2f32_post_reg_ld1lane:
8866 ; CHECK:       ; %bb.0:
8867 ; CHECK-NEXT:    lsl x8, x2, #2
8868 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
8869 ; CHECK-NEXT:    ld1.s { v0 }[1], [x0], x8
8870 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
8871 ; CHECK-NEXT:    str x0, [x1]
8872 ; CHECK-NEXT:    ret
8873   %tmp1 = load float, ptr %bar
8874   %tmp2 = insertelement <2 x float> %A, float %tmp1, i32 1
8875   %tmp3 = getelementptr float, ptr %bar, i64 %inc
8876   store ptr %tmp3, ptr %ptr
8877   ret <2 x float> %tmp2
8880 define <2 x double> @test_v2f64_post_imm_ld1lane(ptr %bar, ptr %ptr, <2 x double> %A) {
8881 ; CHECK-LABEL: test_v2f64_post_imm_ld1lane:
8882 ; CHECK:       ; %bb.0:
8883 ; CHECK-NEXT:    ld1.d { v0 }[1], [x0], #8
8884 ; CHECK-NEXT:    str x0, [x1]
8885 ; CHECK-NEXT:    ret
8886   %tmp1 = load double, ptr %bar
8887   %tmp2 = insertelement <2 x double> %A, double %tmp1, i32 1
8888   %tmp3 = getelementptr double, ptr %bar, i64 1
8889   store ptr %tmp3, ptr %ptr
8890   ret <2 x double> %tmp2
8893 define <2 x double> @test_v2f64_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <2 x double> %A) {
8894 ; CHECK-LABEL: test_v2f64_post_reg_ld1lane:
8895 ; CHECK:       ; %bb.0:
8896 ; CHECK-NEXT:    lsl x8, x2, #3
8897 ; CHECK-NEXT:    ld1.d { v0 }[1], [x0], x8
8898 ; CHECK-NEXT:    str x0, [x1]
8899 ; CHECK-NEXT:    ret
8900   %tmp1 = load double, ptr %bar
8901   %tmp2 = insertelement <2 x double> %A, double %tmp1, i32 1
8902   %tmp3 = getelementptr double, ptr %bar, i64 %inc
8903   store ptr %tmp3, ptr %ptr
8904   ret <2 x double> %tmp2
8907 ; Check for dependencies between the vector and the scalar load.
8908 define <4 x float> @test_v4f32_post_reg_ld1lane_dep_vec_on_load(ptr %bar, ptr %ptr, i64 %inc, ptr %dep_ptr_1, ptr %dep_ptr_2, <4 x float> %vec) {
8909 ; CHECK-LABEL: test_v4f32_post_reg_ld1lane_dep_vec_on_load:
8910 ; CHECK:       ; %bb.0:
8911 ; CHECK-NEXT:    ldr s1, [x0]
8912 ; CHECK-NEXT:    str q0, [x3]
8913 ; CHECK-NEXT:    add x8, x0, x2, lsl #2
8914 ; CHECK-NEXT:    ldr q0, [x4]
8915 ; CHECK-NEXT:    str x8, [x1]
8916 ; CHECK-NEXT:    mov.s v0[1], v1[0]
8917 ; CHECK-NEXT:    ret
8918   %tmp1 = load float, ptr %bar
8919   store <4 x float> %vec, ptr %dep_ptr_1, align 16
8920   %A = load <4 x float>, ptr %dep_ptr_2, align 16
8921   %tmp2 = insertelement <4 x float> %A, float %tmp1, i32 1
8922   %tmp3 = getelementptr float, ptr %bar, i64 %inc
8923   store ptr %tmp3, ptr %ptr
8924   ret <4 x float> %tmp2
8927 ; Make sure that we test the narrow V64 code path.
8928 ; The tests above don't, because there, 64-bit insert_vector_elt nodes will be
8929 ; widened to 128-bit before the LD1LANEpost combine has the chance to run,
8930 ; making it avoid narrow vector types.
8931 ; One way to trick that combine into running early is to force the vector ops
8932 ; legalizer to run.  We achieve that using the ctpop.
8933 ; PR23265
8934 define <4 x i16> @test_v4i16_post_reg_ld1lane_forced_narrow(ptr %bar, ptr %ptr, i64 %inc, <4 x i16> %A, ptr %d) {
8935 ; CHECK-LABEL: test_v4i16_post_reg_ld1lane_forced_narrow:
8936 ; CHECK:       ; %bb.0:
8937 ; CHECK-NEXT:    lsl x8, x2, #1
8938 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
8939 ; CHECK-NEXT:    ld1.h { v0 }[1], [x0], x8
8940 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 killed $q0
8941 ; CHECK-NEXT:    str x0, [x1]
8942 ; CHECK-NEXT:    ldr d1, [x3]
8943 ; CHECK-NEXT:    cnt.8b v1, v1
8944 ; CHECK-NEXT:    uaddlp.4h v1, v1
8945 ; CHECK-NEXT:    uaddlp.2s v1, v1
8946 ; CHECK-NEXT:    str d1, [x3]
8947 ; CHECK-NEXT:    ret
8948   %tmp1 = load i16, ptr %bar
8949   %tmp2 = insertelement <4 x i16> %A, i16 %tmp1, i32 1
8950   %tmp3 = getelementptr i16, ptr %bar, i64 %inc
8951   store ptr %tmp3, ptr %ptr
8952   %dl =  load <2 x i32>,  ptr %d
8953   %dr = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %dl)
8954   store <2 x i32> %dr, ptr %d
8955   ret <4 x i16> %tmp2
8958 declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)
8960 define void @test_ld1lane_build(ptr %ptr0, ptr %ptr1, ptr %ptr2, ptr %ptr3, ptr %out) {
8961 ; CHECK-LABEL: test_ld1lane_build:
8962 ; CHECK:       ; %bb.0:
8963 ; CHECK-NEXT:    ldr s0, [x2]
8964 ; CHECK-NEXT:    ldr s1, [x0]
8965 ; CHECK-NEXT:    ld1.s { v0 }[1], [x3]
8966 ; CHECK-NEXT:    ld1.s { v1 }[1], [x1]
8967 ; CHECK-NEXT:    sub.2s v0, v1, v0
8968 ; CHECK-NEXT:    str d0, [x4]
8969 ; CHECK-NEXT:    ret
8970   %load0 = load i32, ptr %ptr0, align 4
8971   %load1 = load i32, ptr %ptr1, align 4
8972   %vec0_0 = insertelement <2 x i32> undef, i32 %load0, i32 0
8973   %vec0_1 = insertelement <2 x i32> %vec0_0, i32 %load1, i32 1
8975   %load2 = load i32, ptr %ptr2, align 4
8976   %load3 = load i32, ptr %ptr3, align 4
8977   %vec1_0 = insertelement <2 x i32> undef, i32 %load2, i32 0
8978   %vec1_1 = insertelement <2 x i32> %vec1_0, i32 %load3, i32 1
8980   %sub = sub nsw <2 x i32> %vec0_1, %vec1_1
8981   store <2 x i32> %sub, ptr %out, align 16
8982   ret void
8985 define void  @test_ld1lane_build_i16(ptr %a, ptr %b, ptr %c, ptr %d, <4 x i16> %e, ptr %p) {
8986 ; CHECK-LABEL: test_ld1lane_build_i16:
8987 ; CHECK:       ; %bb.0:
8988 ; CHECK-NEXT:    ldr h1, [x0]
8989 ; CHECK-NEXT:    ld1.h { v1 }[1], [x1]
8990 ; CHECK-NEXT:    ld1.h { v1 }[2], [x2]
8991 ; CHECK-NEXT:    ld1.h { v1 }[3], [x3]
8992 ; CHECK-NEXT:    sub.4h v0, v1, v0
8993 ; CHECK-NEXT:    str d0, [x4]
8994 ; CHECK-NEXT:    ret
8995   %ld.a = load i16, ptr %a
8996   %ld.b = load i16, ptr %b
8997   %ld.c = load i16, ptr %c
8998   %ld.d = load i16, ptr %d
8999   %v.a = insertelement <4 x i16> undef, i16 %ld.a, i64 0
9000   %v.b = insertelement <4 x i16> %v.a, i16 %ld.b, i64 1
9001   %v.c = insertelement <4 x i16> %v.b, i16 %ld.c, i64 2
9002   %v = insertelement <4 x i16> %v.c, i16 %ld.d, i64 3
9003   %sub = sub nsw <4 x i16> %v, %e
9004   store <4 x i16> %sub, ptr %p
9005   ret void
9008 define void  @test_ld1lane_build_half(ptr %a, ptr %b, ptr %c, ptr %d, <4 x half> %e, ptr %p) {
9009 ; CHECK-LABEL: test_ld1lane_build_half:
9010 ; CHECK:       ; %bb.0:
9011 ; CHECK-NEXT:    ldr h1, [x0]
9012 ; CHECK-NEXT:    fcvtl v0.4s, v0.4h
9013 ; CHECK-NEXT:    ld1.h { v1 }[1], [x1]
9014 ; CHECK-NEXT:    ld1.h { v1 }[2], [x2]
9015 ; CHECK-NEXT:    ld1.h { v1 }[3], [x3]
9016 ; CHECK-NEXT:    fcvtl v1.4s, v1.4h
9017 ; CHECK-NEXT:    fsub.4s v0, v1, v0
9018 ; CHECK-NEXT:    fcvtn v0.4h, v0.4s
9019 ; CHECK-NEXT:    str d0, [x4]
9020 ; CHECK-NEXT:    ret
9021   %ld.a = load half, ptr %a
9022   %ld.b = load half, ptr %b
9023   %ld.c = load half, ptr %c
9024   %ld.d = load half, ptr %d
9025   %v.a = insertelement <4 x half> undef, half %ld.a, i64 0
9026   %v.b = insertelement <4 x half> %v.a, half %ld.b, i64 1
9027   %v.c = insertelement <4 x half> %v.b, half %ld.c, i64 2
9028   %v = insertelement <4 x half> %v.c, half %ld.d, i64 3
9029   %sub = fsub <4 x half> %v, %e
9030   store <4 x half> %sub, ptr %p
9031   ret void
9034 define void  @test_ld1lane_build_i8(ptr %a, ptr %b, ptr %c, ptr %d, ptr %e, ptr %f, ptr %g, ptr %h, <8 x i8> %v, ptr %p) {
9035 ; CHECK-LABEL: test_ld1lane_build_i8:
9036 ; CHECK:       ; %bb.0:
9037 ; CHECK-NEXT:    ldr b1, [x0]
9038 ; CHECK-NEXT:    ldr x8, [sp]
9039 ; CHECK-NEXT:    ld1.b { v1 }[1], [x1]
9040 ; CHECK-NEXT:    ld1.b { v1 }[2], [x2]
9041 ; CHECK-NEXT:    ld1.b { v1 }[3], [x3]
9042 ; CHECK-NEXT:    ld1.b { v1 }[4], [x4]
9043 ; CHECK-NEXT:    ld1.b { v1 }[5], [x5]
9044 ; CHECK-NEXT:    ld1.b { v1 }[6], [x6]
9045 ; CHECK-NEXT:    ld1.b { v1 }[7], [x7]
9046 ; CHECK-NEXT:    sub.8b v0, v1, v0
9047 ; CHECK-NEXT:    str d0, [x8]
9048 ; CHECK-NEXT:    ret
9049   %ld.a = load i8, ptr %a
9050   %ld.b = load i8, ptr %b
9051   %ld.c = load i8, ptr %c
9052   %ld.d = load i8, ptr %d
9053   %ld.e = load i8, ptr %e
9054   %ld.f = load i8, ptr %f
9055   %ld.g = load i8, ptr %g
9056   %ld.h = load i8, ptr %h
9057   %v.a = insertelement <8 x i8> undef, i8 %ld.a, i64 0
9058   %v.b = insertelement <8 x i8> %v.a,  i8 %ld.b, i64 1
9059   %v.c = insertelement <8 x i8> %v.b,  i8 %ld.c, i64 2
9060   %v.d = insertelement <8 x i8> %v.c,  i8 %ld.d, i64 3
9061   %v.e = insertelement <8 x i8> %v.d,  i8 %ld.e, i64 4
9062   %v.f = insertelement <8 x i8> %v.e,  i8 %ld.f, i64 5
9063   %v.g = insertelement <8 x i8> %v.f,  i8 %ld.g, i64 6
9064   %v1 = insertelement <8 x i8> %v.g,  i8 %ld.h, i64 7
9065   %sub = sub nsw <8 x i8> %v1, %v
9066   store <8 x i8> %sub, ptr %p
9067   ret void
9070 define <4 x i32> @test_inc_cycle(<4 x i32> %vec, ptr %in) {
9071 ; CHECK-LABEL: test_inc_cycle:
9072 ; CHECK:       ; %bb.0:
9073 ; CHECK-NEXT:    ld1.s { v0 }[0], [x0]
9074 ; CHECK-NEXT:    adrp x9, _var@PAGE
9075 ; CHECK-NEXT:    fmov x8, d0
9076 ; CHECK-NEXT:    add x8, x0, x8, lsl #2
9077 ; CHECK-NEXT:    str x8, [x9, _var@PAGEOFF]
9078 ; CHECK-NEXT:    ret
9079   %elt = load i32, ptr %in
9080   %newvec = insertelement <4 x i32> %vec, i32 %elt, i32 0
9082   ; %inc cannot be %elt directly because we check that the load is only
9083   ; used by the insert before trying to form post-inc.
9084   %inc.vec = bitcast <4 x i32> %newvec to <2 x i64>
9085   %inc = extractelement <2 x i64> %inc.vec, i32 0
9086   %newaddr = getelementptr i32, ptr %in, i64 %inc
9087   store ptr %newaddr, ptr @var
9089   ret <4 x i32> %newvec
9092 @var = global ptr null
9094 define i8 @load_single_extract_variable_index_i8(ptr %A, i32 %idx) {
9095 ; CHECK-LABEL: load_single_extract_variable_index_i8:
9096 ; CHECK:       ; %bb.0:
9097 ; CHECK-NEXT:    sub sp, sp, #16
9098 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
9099 ; CHECK-NEXT:    mov x8, sp
9100 ; CHECK-NEXT:    ldr q0, [x0]
9101 ; CHECK-NEXT:    ; kill: def $w1 killed $w1 def $x1
9102 ; CHECK-NEXT:    bfxil x8, x1, #0, #4
9103 ; CHECK-NEXT:    str q0, [sp]
9104 ; CHECK-NEXT:    ldrb w0, [x8]
9105 ; CHECK-NEXT:    add sp, sp, #16
9106 ; CHECK-NEXT:    ret
9107   %lv = load <16 x i8>, ptr %A
9108   %e = extractelement <16 x i8> %lv, i32 %idx
9109   ret i8 %e
9112 define i16 @load_single_extract_variable_index_i16(ptr %A, i32 %idx) {
9113 ; CHECK-LABEL: load_single_extract_variable_index_i16:
9114 ; CHECK:       ; %bb.0:
9115 ; CHECK-NEXT:    sub sp, sp, #16
9116 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
9117 ; CHECK-NEXT:    mov x8, sp
9118 ; CHECK-NEXT:    ldr q0, [x0]
9119 ; CHECK-NEXT:    ; kill: def $w1 killed $w1 def $x1
9120 ; CHECK-NEXT:    bfi x8, x1, #1, #3
9121 ; CHECK-NEXT:    str q0, [sp]
9122 ; CHECK-NEXT:    ldrh w0, [x8]
9123 ; CHECK-NEXT:    add sp, sp, #16
9124 ; CHECK-NEXT:    ret
9125   %lv = load <8 x i16>, ptr %A
9126   %e = extractelement <8 x i16> %lv, i32 %idx
9127   ret i16 %e
9130 define i32 @load_single_extract_variable_index_i32(ptr %A, i32 %idx) {
9131 ; CHECK-LABEL: load_single_extract_variable_index_i32:
9132 ; CHECK:       ; %bb.0:
9133 ; CHECK-NEXT:    ; kill: def $w1 killed $w1 def $x1
9134 ; CHECK-NEXT:    and x8, x1, #0x3
9135 ; CHECK-NEXT:    ldr w0, [x0, x8, lsl #2]
9136 ; CHECK-NEXT:    ret
9137   %lv = load <4 x i32>, ptr %A
9138   %e = extractelement <4 x i32> %lv, i32 %idx
9139   ret i32 %e
9142 define i32 @load_single_extract_variable_index_v3i32_small_align(ptr %A, i32 %idx) {
9143 ; CHECK-LABEL: load_single_extract_variable_index_v3i32_small_align:
9144 ; CHECK:       ; %bb.0:
9145 ; CHECK-NEXT:    mov w9, w1
9146 ; CHECK-NEXT:    mov w8, #2 ; =0x2
9147 ; CHECK-NEXT:    cmp x9, #2
9148 ; CHECK-NEXT:    csel x8, x9, x8, lo
9149 ; CHECK-NEXT:    ldr w0, [x0, x8, lsl #2]
9150 ; CHECK-NEXT:    ret
9151   %lv = load <3 x i32>, ptr %A, align 2
9152   %e = extractelement <3 x i32> %lv, i32 %idx
9153   ret i32 %e
9156 define i32 @load_single_extract_variable_index_v3i32_default_align(ptr %A, i32 %idx) {
9157 ; CHECK-LABEL: load_single_extract_variable_index_v3i32_default_align:
9158 ; CHECK:       ; %bb.0:
9159 ; CHECK-NEXT:    mov w9, w1
9160 ; CHECK-NEXT:    mov w8, #2 ; =0x2
9161 ; CHECK-NEXT:    cmp x9, #2
9162 ; CHECK-NEXT:    csel x8, x9, x8, lo
9163 ; CHECK-NEXT:    ldr w0, [x0, x8, lsl #2]
9164 ; CHECK-NEXT:    ret
9165   %lv = load <3 x i32>, ptr %A
9166   %e = extractelement <3 x i32> %lv, i32 %idx
9167   ret i32 %e
9170 define i32 @load_single_extract_valid_const_index_v3i32(ptr %A, i32 %idx) {
9171 ; CHECK-LABEL: load_single_extract_valid_const_index_v3i32:
9172 ; CHECK:       ; %bb.0:
9173 ; CHECK-NEXT:    ldr w0, [x0, #8]
9174 ; CHECK-NEXT:    ret
9175   %lv = load <3 x i32>, ptr %A
9176   %e = extractelement <3 x i32> %lv, i32 2
9177   ret i32 %e
9180 define i32 @load_single_extract_variable_index_masked_i32(ptr %A, i32 %idx) {
9181 ; CHECK-LABEL: load_single_extract_variable_index_masked_i32:
9182 ; CHECK:       ; %bb.0:
9183 ; CHECK-NEXT:    and w8, w1, #0x3
9184 ; CHECK-NEXT:    ldr w0, [x0, w8, uxtw #2]
9185 ; CHECK-NEXT:    ret
9186   %idx.x = and i32 %idx, 3
9187   %lv = load <4 x i32>, ptr %A
9188   %e = extractelement <4 x i32> %lv, i32 %idx.x
9189   ret i32 %e
9192 define i32 @load_single_extract_variable_index_masked2_i32(ptr %A, i32 %idx) {
9193 ; CHECK-LABEL: load_single_extract_variable_index_masked2_i32:
9194 ; CHECK:       ; %bb.0:
9195 ; CHECK-NEXT:    and w8, w1, #0x1
9196 ; CHECK-NEXT:    ldr w0, [x0, w8, uxtw #2]
9197 ; CHECK-NEXT:    ret
9198   %idx.x = and i32 %idx, 1
9199   %lv = load <4 x i32>, ptr %A
9200   %e = extractelement <4 x i32> %lv, i32 %idx.x
9201   ret i32 %e