[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / nontemporal.ll
blob4fcb5c0342e525b59977541fa78ce2b08b4a21c4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple aarch64-apple-darwin | FileCheck %s
4 define void @test_stnp_v4i64(ptr %p, <4 x i64> %v) #0 {
5 ; CHECK-LABEL: test_stnp_v4i64:
6 ; CHECK:       ; %bb.0:
7 ; CHECK-NEXT:    stnp q0, q1, [x0]
8 ; CHECK-NEXT:    ret
9   store <4 x i64> %v, ptr %p, align 1, !nontemporal !0
10   ret void
13 define void @test_stnp_v4i32(ptr %p, <4 x i32> %v) #0 {
14 ; CHECK-LABEL: test_stnp_v4i32:
15 ; CHECK:       ; %bb.0:
16 ; CHECK-NEXT:    mov d1, v0[1]
17 ; CHECK-NEXT:    stnp d0, d1, [x0]
18 ; CHECK-NEXT:    ret
19   store <4 x i32> %v, ptr %p, align 1, !nontemporal !0
20   ret void
23 define void @test_stnp_v8i16(ptr %p, <8 x i16> %v) #0 {
24 ; CHECK-LABEL: test_stnp_v8i16:
25 ; CHECK:       ; %bb.0:
26 ; CHECK-NEXT:    mov d1, v0[1]
27 ; CHECK-NEXT:    stnp d0, d1, [x0]
28 ; CHECK-NEXT:    ret
29   store <8 x i16> %v, ptr %p, align 1, !nontemporal !0
30   ret void
33 define void @test_stnp_v16i8(ptr %p, <16 x i8> %v) #0 {
34 ; CHECK-LABEL: test_stnp_v16i8:
35 ; CHECK:       ; %bb.0:
36 ; CHECK-NEXT:    mov d1, v0[1]
37 ; CHECK-NEXT:    stnp d0, d1, [x0]
38 ; CHECK-NEXT:    ret
39   store <16 x i8> %v, ptr %p, align 1, !nontemporal !0
40   ret void
43 define void @test_stnp_v2i32(ptr %p, <2 x i32> %v) #0 {
44 ; CHECK-LABEL: test_stnp_v2i32:
45 ; CHECK:       ; %bb.0:
46 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
47 ; CHECK-NEXT:    mov s1, v0[1]
48 ; CHECK-NEXT:    stnp s0, s1, [x0]
49 ; CHECK-NEXT:    ret
50   store <2 x i32> %v, ptr %p, align 1, !nontemporal !0
51   ret void
54 define void @test_stnp_v4i16(ptr %p, <4 x i16> %v) #0 {
55 ; CHECK-LABEL: test_stnp_v4i16:
56 ; CHECK:       ; %bb.0:
57 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
58 ; CHECK-NEXT:    mov s1, v0[1]
59 ; CHECK-NEXT:    stnp s0, s1, [x0]
60 ; CHECK-NEXT:    ret
61   store <4 x i16> %v, ptr %p, align 1, !nontemporal !0
62   ret void
65 define void @test_stnp_v8i8(ptr %p, <8 x i8> %v) #0 {
66 ; CHECK-LABEL: test_stnp_v8i8:
67 ; CHECK:       ; %bb.0:
68 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
69 ; CHECK-NEXT:    mov s1, v0[1]
70 ; CHECK-NEXT:    stnp s0, s1, [x0]
71 ; CHECK-NEXT:    ret
72   store <8 x i8> %v, ptr %p, align 1, !nontemporal !0
73   ret void
76 define void @test_stnp_v2f64(ptr %p, <2 x double> %v) #0 {
77 ; CHECK-LABEL: test_stnp_v2f64:
78 ; CHECK:       ; %bb.0:
79 ; CHECK-NEXT:    mov d1, v0[1]
80 ; CHECK-NEXT:    stnp d0, d1, [x0]
81 ; CHECK-NEXT:    ret
82   store <2 x double> %v, ptr %p, align 1, !nontemporal !0
83   ret void
86 define void @test_stnp_v4f32(ptr %p, <4 x float> %v) #0 {
87 ; CHECK-LABEL: test_stnp_v4f32:
88 ; CHECK:       ; %bb.0:
89 ; CHECK-NEXT:    mov d1, v0[1]
90 ; CHECK-NEXT:    stnp d0, d1, [x0]
91 ; CHECK-NEXT:    ret
92   store <4 x float> %v, ptr %p, align 1, !nontemporal !0
93   ret void
96 define void @test_stnp_v2f32(ptr %p, <2 x float> %v) #0 {
97 ; CHECK-LABEL: test_stnp_v2f32:
98 ; CHECK:       ; %bb.0:
99 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
100 ; CHECK-NEXT:    mov s1, v0[1]
101 ; CHECK-NEXT:    stnp s0, s1, [x0]
102 ; CHECK-NEXT:    ret
103   store <2 x float> %v, ptr %p, align 1, !nontemporal !0
104   ret void
107 define void @test_stnp_v1f64(ptr %p, <1 x double> %v) #0 {
108 ; CHECK-LABEL: test_stnp_v1f64:
109 ; CHECK:       ; %bb.0:
110 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
111 ; CHECK-NEXT:    mov s1, v0[1]
112 ; CHECK-NEXT:    stnp s0, s1, [x0]
113 ; CHECK-NEXT:    ret
114   store <1 x double> %v, ptr %p, align 1, !nontemporal !0
115   ret void
118 define void @test_stnp_v1i64(ptr %p, <1 x i64> %v) #0 {
119 ; CHECK-LABEL: test_stnp_v1i64:
120 ; CHECK:       ; %bb.0:
121 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
122 ; CHECK-NEXT:    mov s1, v0[1]
123 ; CHECK-NEXT:    stnp s0, s1, [x0]
124 ; CHECK-NEXT:    ret
125   store <1 x i64> %v, ptr %p, align 1, !nontemporal !0
126   ret void
129 define void @test_stnp_i64(ptr %p, i64 %v) #0 {
130 ; CHECK-LABEL: test_stnp_i64:
131 ; CHECK:       ; %bb.0:
132 ; CHECK-NEXT:    lsr x8, x1, #32
133 ; CHECK-NEXT:    stnp w1, w8, [x0]
134 ; CHECK-NEXT:    ret
135   store i64 %v, ptr %p, align 1, !nontemporal !0
136   ret void
140 define void @test_stnp_v2f64_offset(ptr %p, <2 x double> %v) #0 {
141 ; CHECK-LABEL: test_stnp_v2f64_offset:
142 ; CHECK:       ; %bb.0:
143 ; CHECK-NEXT:    mov d1, v0[1]
144 ; CHECK-NEXT:    stnp d0, d1, [x0, #16]
145 ; CHECK-NEXT:    ret
146   %tmp0 = getelementptr <2 x double>, ptr %p, i32 1
147   store <2 x double> %v, ptr %tmp0, align 1, !nontemporal !0
148   ret void
151 define void @test_stnp_v2f64_offset_neg(ptr %p, <2 x double> %v) #0 {
152 ; CHECK-LABEL: test_stnp_v2f64_offset_neg:
153 ; CHECK:       ; %bb.0:
154 ; CHECK-NEXT:    mov d1, v0[1]
155 ; CHECK-NEXT:    stnp d0, d1, [x0, #-16]
156 ; CHECK-NEXT:    ret
157   %tmp0 = getelementptr <2 x double>, ptr %p, i32 -1
158   store <2 x double> %v, ptr %tmp0, align 1, !nontemporal !0
159   ret void
162 define void @test_stnp_v2f32_offset(ptr %p, <2 x float> %v) #0 {
163 ; CHECK-LABEL: test_stnp_v2f32_offset:
164 ; CHECK:       ; %bb.0:
165 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
166 ; CHECK-NEXT:    mov s1, v0[1]
167 ; CHECK-NEXT:    stnp s0, s1, [x0, #8]
168 ; CHECK-NEXT:    ret
169   %tmp0 = getelementptr <2 x float>, ptr %p, i32 1
170   store <2 x float> %v, ptr %tmp0, align 1, !nontemporal !0
171   ret void
174 define void @test_stnp_v2f32_offset_neg(ptr %p, <2 x float> %v) #0 {
175 ; CHECK-LABEL: test_stnp_v2f32_offset_neg:
176 ; CHECK:       ; %bb.0:
177 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
178 ; CHECK-NEXT:    mov s1, v0[1]
179 ; CHECK-NEXT:    stnp s0, s1, [x0, #-8]
180 ; CHECK-NEXT:    ret
181   %tmp0 = getelementptr <2 x float>, ptr %p, i32 -1
182   store <2 x float> %v, ptr %tmp0, align 1, !nontemporal !0
183   ret void
186 define void @test_stnp_i64_offset(ptr %p, i64 %v) #0 {
187 ; CHECK-LABEL: test_stnp_i64_offset:
188 ; CHECK:       ; %bb.0:
189 ; CHECK-NEXT:    lsr x8, x1, #32
190 ; CHECK-NEXT:    stnp w1, w8, [x0, #8]
191 ; CHECK-NEXT:    ret
192   %tmp0 = getelementptr i64, ptr %p, i32 1
193   store i64 %v, ptr %tmp0, align 1, !nontemporal !0
194   ret void
197 define void @test_stnp_i64_offset_neg(ptr %p, i64 %v) #0 {
198 ; CHECK-LABEL: test_stnp_i64_offset_neg:
199 ; CHECK:       ; %bb.0:
200 ; CHECK-NEXT:    lsr x8, x1, #32
201 ; CHECK-NEXT:    stnp w1, w8, [x0, #-8]
202 ; CHECK-NEXT:    ret
203   %tmp0 = getelementptr i64, ptr %p, i32 -1
204   store i64 %v, ptr %tmp0, align 1, !nontemporal !0
205   ret void
208 define void @test_stnp_v4f32_invalid_offset_4(ptr %p, <4 x float> %v) #0 {
209 ; CHECK-LABEL: test_stnp_v4f32_invalid_offset_4:
210 ; CHECK:       ; %bb.0:
211 ; CHECK-NEXT:    mov d1, v0[1]
212 ; CHECK-NEXT:    add x8, x0, #4
213 ; CHECK-NEXT:    stnp d0, d1, [x8]
214 ; CHECK-NEXT:    ret
215   %tmp0 = getelementptr i8, ptr %p, i32 4
216   store <4 x float> %v, ptr %tmp0, align 1, !nontemporal !0
217   ret void
220 define void @test_stnp_v4f32_invalid_offset_neg_4(ptr %p, <4 x float> %v) #0 {
221 ; CHECK-LABEL: test_stnp_v4f32_invalid_offset_neg_4:
222 ; CHECK:       ; %bb.0:
223 ; CHECK-NEXT:    mov d1, v0[1]
224 ; CHECK-NEXT:    sub x8, x0, #4
225 ; CHECK-NEXT:    stnp d0, d1, [x8]
226 ; CHECK-NEXT:    ret
227   %tmp0 = getelementptr i8, ptr %p, i32 -4
228   store <4 x float> %v, ptr %tmp0, align 1, !nontemporal !0
229   ret void
232 define void @test_stnp_v4f32_invalid_offset_512(ptr %p, <4 x float> %v) #0 {
233 ; CHECK-LABEL: test_stnp_v4f32_invalid_offset_512:
234 ; CHECK:       ; %bb.0:
235 ; CHECK-NEXT:    mov d1, v0[1]
236 ; CHECK-NEXT:    add x8, x0, #512
237 ; CHECK-NEXT:    stnp d0, d1, [x8]
238 ; CHECK-NEXT:    ret
239   %tmp0 = getelementptr i8, ptr %p, i32 512
240   store <4 x float> %v, ptr %tmp0, align 1, !nontemporal !0
241   ret void
244 define void @test_stnp_v4f32_offset_504(ptr %p, <4 x float> %v) #0 {
245 ; CHECK-LABEL: test_stnp_v4f32_offset_504:
246 ; CHECK:       ; %bb.0:
247 ; CHECK-NEXT:    mov d1, v0[1]
248 ; CHECK-NEXT:    stnp d0, d1, [x0, #504]
249 ; CHECK-NEXT:    ret
250   %tmp0 = getelementptr i8, ptr %p, i32 504
251   store <4 x float> %v, ptr %tmp0, align 1, !nontemporal !0
252   ret void
255 define void @test_stnp_v4f32_invalid_offset_508(ptr %p, <4 x float> %v) #0 {
256 ; CHECK-LABEL: test_stnp_v4f32_invalid_offset_508:
257 ; CHECK:       ; %bb.0:
258 ; CHECK-NEXT:    mov d1, v0[1]
259 ; CHECK-NEXT:    add x8, x0, #508
260 ; CHECK-NEXT:    stnp d0, d1, [x8]
261 ; CHECK-NEXT:    ret
262   %tmp0 = getelementptr i8, ptr %p, i32 508
263   store <4 x float> %v, ptr %tmp0, align 1, !nontemporal !0
264   ret void
267 define void @test_stnp_v4f32_invalid_offset_neg_520(ptr %p, <4 x float> %v) #0 {
268 ; CHECK-LABEL: test_stnp_v4f32_invalid_offset_neg_520:
269 ; CHECK:       ; %bb.0:
270 ; CHECK-NEXT:    mov d1, v0[1]
271 ; CHECK-NEXT:    sub x8, x0, #520
272 ; CHECK-NEXT:    stnp d0, d1, [x8]
273 ; CHECK-NEXT:    ret
274   %tmp0 = getelementptr i8, ptr %p, i32 -520
275   store <4 x float> %v, ptr %tmp0, align 1, !nontemporal !0
276   ret void
279 define void @test_stnp_v4f32_offset_neg_512(ptr %p, <4 x float> %v) #0 {
280 ; CHECK-LABEL: test_stnp_v4f32_offset_neg_512:
281 ; CHECK:       ; %bb.0:
282 ; CHECK-NEXT:    mov d1, v0[1]
283 ; CHECK-NEXT:    stnp d0, d1, [x0, #-512]
284 ; CHECK-NEXT:    ret
285   %tmp0 = getelementptr i8, ptr %p, i32 -512
286   store <4 x float> %v, ptr %tmp0, align 1, !nontemporal !0
287   ret void
291 define void @test_stnp_v2f32_invalid_offset_256(ptr %p, <2 x float> %v) #0 {
292 ; CHECK-LABEL: test_stnp_v2f32_invalid_offset_256:
293 ; CHECK:       ; %bb.0:
294 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
295 ; CHECK-NEXT:    mov s1, v0[1]
296 ; CHECK-NEXT:    add x8, x0, #256
297 ; CHECK-NEXT:    stnp s0, s1, [x8]
298 ; CHECK-NEXT:    ret
299   %tmp0 = getelementptr i8, ptr %p, i32 256
300   store <2 x float> %v, ptr %tmp0, align 1, !nontemporal !0
301   ret void
304 define void @test_stnp_v2f32_offset_252(ptr %p, <2 x float> %v) #0 {
305 ; CHECK-LABEL: test_stnp_v2f32_offset_252:
306 ; CHECK:       ; %bb.0:
307 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
308 ; CHECK-NEXT:    mov s1, v0[1]
309 ; CHECK-NEXT:    stnp s0, s1, [x0, #252]
310 ; CHECK-NEXT:    ret
311   %tmp0 = getelementptr i8, ptr %p, i32 252
312   store <2 x float> %v, ptr %tmp0, align 1, !nontemporal !0
313   ret void
316 define void @test_stnp_v2f32_invalid_offset_neg_260(ptr %p, <2 x float> %v) #0 {
317 ; CHECK-LABEL: test_stnp_v2f32_invalid_offset_neg_260:
318 ; CHECK:       ; %bb.0:
319 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
320 ; CHECK-NEXT:    mov s1, v0[1]
321 ; CHECK-NEXT:    sub x8, x0, #260
322 ; CHECK-NEXT:    stnp s0, s1, [x8]
323 ; CHECK-NEXT:    ret
324   %tmp0 = getelementptr i8, ptr %p, i32 -260
325   store <2 x float> %v, ptr %tmp0, align 1, !nontemporal !0
326   ret void
329 define void @test_stnp_v2f32_offset_neg_256(ptr %p, <2 x float> %v) #0 {
330 ; CHECK-LABEL: test_stnp_v2f32_offset_neg_256:
331 ; CHECK:       ; %bb.0:
332 ; CHECK-NEXT:    ; kill: def $d0 killed $d0 def $q0
333 ; CHECK-NEXT:    mov s1, v0[1]
334 ; CHECK-NEXT:    stnp s0, s1, [x0, #-256]
335 ; CHECK-NEXT:    ret
336   %tmp0 = getelementptr i8, ptr %p, i32 -256
337   store <2 x float> %v, ptr %tmp0, align 1, !nontemporal !0
338   ret void
341 declare void @dummy(ptr)
343 define void @test_stnp_v4f32_offset_alloca(<4 x float> %v) #0 {
344 ; CHECK-LABEL: test_stnp_v4f32_offset_alloca:
345 ; CHECK:       ; %bb.0:
346 ; CHECK-NEXT:    sub sp, sp, #32
347 ; CHECK-NEXT:    mov d1, v0[1]
348 ; CHECK-NEXT:    mov x0, sp
349 ; CHECK-NEXT:    stp x29, x30, [sp, #16] ; 16-byte Folded Spill
350 ; CHECK-NEXT:    stnp d0, d1, [sp]
351 ; CHECK-NEXT:    bl _dummy
352 ; CHECK-NEXT:    ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
353 ; CHECK-NEXT:    add sp, sp, #32
354 ; CHECK-NEXT:    ret
355   %tmp0 = alloca <4 x float>
356   store <4 x float> %v, ptr %tmp0, align 1, !nontemporal !0
357   call void @dummy(ptr %tmp0)
358   ret void
361 define void @test_stnp_v4f32_offset_alloca_2(<4 x float> %v) #0 {
362 ; CHECK-LABEL: test_stnp_v4f32_offset_alloca_2:
363 ; CHECK:       ; %bb.0:
364 ; CHECK-NEXT:    sub sp, sp, #48
365 ; CHECK-NEXT:    mov d1, v0[1]
366 ; CHECK-NEXT:    mov x0, sp
367 ; CHECK-NEXT:    stp x29, x30, [sp, #32] ; 16-byte Folded Spill
368 ; CHECK-NEXT:    stnp d0, d1, [sp, #16]
369 ; CHECK-NEXT:    bl _dummy
370 ; CHECK-NEXT:    ldp x29, x30, [sp, #32] ; 16-byte Folded Reload
371 ; CHECK-NEXT:    add sp, sp, #48
372 ; CHECK-NEXT:    ret
373   %tmp0 = alloca <4 x float>, i32 2
374   %tmp1 = getelementptr <4 x float>, ptr %tmp0, i32 1
375   store <4 x float> %v, ptr %tmp1, align 1, !nontemporal !0
376   call void @dummy(ptr %tmp0)
377   ret void
380 define void @test_stnp_v32i8(<32 x i8> %v, ptr %ptr) {
381 ; CHECK-LABEL: test_stnp_v32i8:
382 ; CHECK:       ; %bb.0: ; %entry
383 ; CHECK-NEXT:    stnp q0, q1, [x0]
384 ; CHECK-NEXT:    ret
386 entry:
387   store <32 x i8> %v, ptr %ptr, align 4, !nontemporal !0
388   ret void
391 define void @test_stnp_v32i16(<32 x i16> %v, ptr %ptr) {
392 ; CHECK-LABEL: test_stnp_v32i16:
393 ; CHECK:       ; %bb.0: ; %entry
394 ; CHECK-NEXT:    stnp q2, q3, [x0, #32]
395 ; CHECK-NEXT:    stnp q0, q1, [x0]
396 ; CHECK-NEXT:    ret
398 entry:
399   store <32 x i16> %v, ptr %ptr, align 4, !nontemporal !0
400   ret void
403 define void @test_stnp_v32f16(<32 x half> %v, ptr %ptr) {
404 ; CHECK-LABEL: test_stnp_v32f16:
405 ; CHECK:       ; %bb.0: ; %entry
406 ; CHECK-NEXT:    stnp q2, q3, [x0, #32]
407 ; CHECK-NEXT:    stnp q0, q1, [x0]
408 ; CHECK-NEXT:    ret
410 entry:
411   store <32 x half> %v, ptr %ptr, align 4, !nontemporal !0
412   ret void
415 define void @test_stnp_v16i32(<16 x i32> %v, ptr %ptr) {
416 ; CHECK-LABEL: test_stnp_v16i32:
417 ; CHECK:       ; %bb.0: ; %entry
418 ; CHECK-NEXT:    stnp q2, q3, [x0, #32]
419 ; CHECK-NEXT:    stnp q0, q1, [x0]
420 ; CHECK-NEXT:    ret
422 entry:
423   store <16 x i32> %v, ptr %ptr, align 4, !nontemporal !0
424   ret void
427 define void @test_stnp_v16f32(<16 x float> %v, ptr %ptr) {
428 ; CHECK-LABEL: test_stnp_v16f32:
429 ; CHECK:       ; %bb.0: ; %entry
430 ; CHECK-NEXT:    stnp q2, q3, [x0, #32]
431 ; CHECK-NEXT:    stnp q0, q1, [x0]
432 ; CHECK-NEXT:    ret
434 entry:
435   store <16 x float> %v, ptr %ptr, align 4, !nontemporal !0
436   ret void
439 define void @test_stnp_v17f32(<17 x float> %v, ptr %ptr) {
440 ; CHECK-LABEL: test_stnp_v17f32:
441 ; CHECK:       ; %bb.0: ; %entry
442 ; CHECK-NEXT:    ; kill: def $s4 killed $s4 def $q4
443 ; CHECK-NEXT:    ; kill: def $s0 killed $s0 def $q0
444 ; CHECK-NEXT:    ldr s16, [sp, #16]
445 ; CHECK-NEXT:    ; kill: def $s5 killed $s5 def $q5
446 ; CHECK-NEXT:    ; kill: def $s1 killed $s1 def $q1
447 ; CHECK-NEXT:    add x8, sp, #20
448 ; CHECK-NEXT:    ; kill: def $s6 killed $s6 def $q6
449 ; CHECK-NEXT:    ; kill: def $s2 killed $s2 def $q2
450 ; CHECK-NEXT:    ; kill: def $s7 killed $s7 def $q7
451 ; CHECK-NEXT:    ; kill: def $s3 killed $s3 def $q3
452 ; CHECK-NEXT:    mov.s v4[1], v5[0]
453 ; CHECK-NEXT:    mov.s v0[1], v1[0]
454 ; CHECK-NEXT:    ldr s5, [sp]
455 ; CHECK-NEXT:    ld1.s { v16 }[1], [x8]
456 ; CHECK-NEXT:    add x8, sp, #4
457 ; CHECK-NEXT:    ld1.s { v5 }[1], [x8]
458 ; CHECK-NEXT:    add x8, sp, #24
459 ; CHECK-NEXT:    mov.s v4[2], v6[0]
460 ; CHECK-NEXT:    ld1.s { v16 }[2], [x8]
461 ; CHECK-NEXT:    mov.s v0[2], v2[0]
462 ; CHECK-NEXT:    add x8, sp, #8
463 ; CHECK-NEXT:    ld1.s { v5 }[2], [x8]
464 ; CHECK-NEXT:    add x8, sp, #28
465 ; CHECK-NEXT:    ld1.s { v16 }[3], [x8]
466 ; CHECK-NEXT:    add x8, sp, #12
467 ; CHECK-NEXT:    mov.s v4[3], v7[0]
468 ; CHECK-NEXT:    mov.s v0[3], v3[0]
469 ; CHECK-NEXT:    ld1.s { v5 }[3], [x8]
470 ; CHECK-NEXT:    mov d1, v16[1]
471 ; CHECK-NEXT:    mov d2, v5[1]
472 ; CHECK-NEXT:    mov d3, v4[1]
473 ; CHECK-NEXT:    mov d6, v0[1]
474 ; CHECK-NEXT:    stnp d16, d1, [x0, #48]
475 ; CHECK-NEXT:    ldr s1, [sp, #32]
476 ; CHECK-NEXT:    stnp d5, d2, [x0, #32]
477 ; CHECK-NEXT:    stnp d4, d3, [x0, #16]
478 ; CHECK-NEXT:    stnp d0, d6, [x0]
479 ; CHECK-NEXT:    str s1, [x0, #64]
480 ; CHECK-NEXT:    ret
482 entry:
483   store <17 x float> %v, ptr %ptr, align 4, !nontemporal !0
484   ret void
486 define void @test_stnp_v16i32_invalid_offset(<16 x i32> %v, ptr %ptr) {
487 ; CHECK-LABEL: test_stnp_v16i32_invalid_offset:
488 ; CHECK:       ; %bb.0: ; %entry
489 ; CHECK-NEXT:    mov w8, #32032 ; =0x7d20
490 ; CHECK-NEXT:    mov w9, #32000 ; =0x7d00
491 ; CHECK-NEXT:    add x8, x0, x8
492 ; CHECK-NEXT:    add x9, x0, x9
493 ; CHECK-NEXT:    stnp q2, q3, [x8]
494 ; CHECK-NEXT:    stnp q0, q1, [x9]
495 ; CHECK-NEXT:    ret
497 entry:
498   %gep = getelementptr <16 x i32>, ptr %ptr, i32 500
499   store <16 x i32> %v, ptr %gep, align 4, !nontemporal !0
500   ret void
503 define void @test_stnp_v16f64(<16 x double> %v, ptr %ptr) {
504 ; CHECK-LABEL: test_stnp_v16f64:
505 ; CHECK:       ; %bb.0: ; %entry
506 ; CHECK-NEXT:    stnp q6, q7, [x0, #96]
507 ; CHECK-NEXT:    stnp q4, q5, [x0, #64]
508 ; CHECK-NEXT:    stnp q2, q3, [x0, #32]
509 ; CHECK-NEXT:    stnp q0, q1, [x0]
510 ; CHECK-NEXT:    ret
512 entry:
513   store <16 x double> %v, ptr %ptr, align 4, !nontemporal !0
514   ret void
517 define void @test_stnp_v16i64(<16 x i64> %v, ptr %ptr) {
518 ; CHECK-LABEL: test_stnp_v16i64:
519 ; CHECK:       ; %bb.0: ; %entry
520 ; CHECK-NEXT:    stnp q6, q7, [x0, #96]
521 ; CHECK-NEXT:    stnp q4, q5, [x0, #64]
522 ; CHECK-NEXT:    stnp q2, q3, [x0, #32]
523 ; CHECK-NEXT:    stnp q0, q1, [x0]
524 ; CHECK-NEXT:    ret
526 entry:
527   store <16 x i64> %v, ptr %ptr, align 4, !nontemporal !0
528   ret void
531 !0 = !{ i32 1 }
533 attributes #0 = { nounwind }