[NFC][Py Reformat] Reformat python files in llvm
[llvm-project.git] / llvm / test / CodeGen / ARM / arm-vst1.ll
blob7dacd8b0b99f98ccf0243f08748ec601c63fb272
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=armv8-linux-gnueabi -verify-machineinstrs -asm-verbose=false | FileCheck %s
4 ; %struct.uint16x4x2_t = type { <4 x i16>, <4 x i16> }
5 ; %struct.uint16x4x3_t = type { <4 x i16>, <4 x i16>, <4 x i16> }
6 ; %struct.uint16x4x4_t = type { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> }
8 ; %struct.uint32x2x2_t = type { <2 x i32>, <2 x i32> }
9 ; %struct.uint32x2x3_t = type { <2 x i32>, <2 x i32>, <2 x i32> }
10 ; %struct.uint32x2x4_t = type { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> }
12 ; %struct.uint64x1x2_t = type { <1 x i64>, <1 x i64> }
13 ; %struct.uint64x1x3_t = type { <1 x i64>, <1 x i64>, <1 x i64> }
14 ; %struct.uint64x1x4_t = type { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> }
16 ; %struct.uint8x8x2_t = type { <8 x i8>, <8 x i8> }
17 ; %struct.uint8x8x3_t = type { <8 x i8>, <8 x i8>, <8 x i8> }
18 ; %struct.uint8x8x4_t = type { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> }
20 ; %struct.uint16x8x2_t = type { <8 x i16>, <8 x i16> }
21 ; %struct.uint16x8x3_t = type { <8 x i16>, <8 x i16>, <8 x i16> }
22 ; %struct.uint16x8x4_t = type { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> }
24 ; %struct.uint32x4x2_t = type { <4 x i32>, <4 x i32> }
25 ; %struct.uint32x4x3_t = type { <4 x i32>, <4 x i32>, <4 x i32> }
26 ; %struct.uint32x4x4_t = type { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> }
28 ; %struct.uint64x2x2_t = type { <2 x i64>, <2 x i64> }
29 ; %struct.uint64x2x3_t = type { <2 x i64>, <2 x i64>, <2 x i64> }
30 ; %struct.uint64x2x4_t = type { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> }
32 ; %struct.uint8x16x2_t = type { <16 x i8>, <16 x i8> }
33 ; %struct.uint8x16x3_t = type { <16 x i8>, <16 x i8>, <16 x i8> }
34 ; %struct.uint8x16x4_t = type { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> }
36 %struct.uint16x4x2_t = type { [2 x <4 x i16>] }
37 %struct.uint16x4x3_t = type { [3 x <4 x i16>] }
38 %struct.uint16x4x4_t = type { [4 x <4 x i16>] }
39 %struct.uint32x2x2_t = type { [2 x <2 x i32>] }
40 %struct.uint32x2x3_t = type { [3 x <2 x i32>] }
41 %struct.uint32x2x4_t = type { [4 x <2 x i32>] }
42 %struct.uint64x1x2_t = type { [2 x <1 x i64>] }
43 %struct.uint64x1x3_t = type { [3 x <1 x i64>] }
44 %struct.uint64x1x4_t = type { [4 x <1 x i64>] }
45 %struct.uint8x8x2_t = type { [2 x <8 x i8>] }
46 %struct.uint8x8x3_t = type { [3 x <8 x i8>] }
47 %struct.uint8x8x4_t = type { [4 x <8 x i8>] }
48 %struct.uint16x8x2_t = type { [2 x <8 x i16>] }
49 %struct.uint16x8x3_t = type { [3 x <8 x i16>] }
50 %struct.uint16x8x4_t = type { [4 x <8 x i16>] }
51 %struct.uint32x4x2_t = type { [2 x <4 x i32>] }
52 %struct.uint32x4x3_t = type { [3 x <4 x i32>] }
53 %struct.uint32x4x4_t = type { [4 x <4 x i32>] }
54 %struct.uint64x2x2_t = type { [2 x <2 x i64>] }
55 %struct.uint64x2x3_t = type { [3 x <2 x i64>] }
56 %struct.uint64x2x4_t = type { [4 x <2 x i64>] }
57 %struct.uint8x16x2_t = type { [2 x <16 x i8>] }
58 %struct.uint8x16x3_t = type { [3 x <16 x i8>] }
59 %struct.uint8x16x4_t = type { [4 x <16 x i8>] }
61 declare void @llvm.arm.neon.vst1x2.p0.v4i16(ptr nocapture, <4 x i16>, <4 x i16>) argmemonly nounwind
62 declare void @llvm.arm.neon.vst1x3.p0.v4i16(ptr nocapture, <4 x i16>, <4 x i16>, <4 x i16>) argmemonly nounwind
63 declare void @llvm.arm.neon.vst1x4.p0.v4i16(ptr nocapture, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>) argmemonly nounwind
65 declare void @llvm.arm.neon.vst1x2.p0.v2i32(ptr nocapture, <2 x i32>, <2 x i32>) argmemonly nounwind
66 declare void @llvm.arm.neon.vst1x3.p0.v2i32(ptr nocapture, <2 x i32>, <2 x i32>, <2 x i32>) argmemonly nounwind
67 declare void @llvm.arm.neon.vst1x4.p0.v2i32(ptr nocapture, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>) argmemonly nounwind
69 declare void @llvm.arm.neon.vst1x2.p0.v1i64(ptr nocapture, <1 x i64>, <1 x i64>) argmemonly nounwind
70 declare void @llvm.arm.neon.vst1x3.p0.v1i64(ptr nocapture, <1 x i64>, <1 x i64>, <1 x i64>) argmemonly nounwind
71 declare void @llvm.arm.neon.vst1x4.p0.v1i64(ptr nocapture, <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64>) argmemonly nounwind
73 declare void @llvm.arm.neon.vst1x2.p0.v8i8(ptr nocapture, <8 x i8>, <8 x i8>) argmemonly nounwind
74 declare void @llvm.arm.neon.vst1x3.p0.v8i8(ptr nocapture, <8 x i8>, <8 x i8>, <8 x i8>) argmemonly nounwind
75 declare void @llvm.arm.neon.vst1x4.p0.v8i8(ptr nocapture, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>) argmemonly nounwind
77 declare void @llvm.arm.neon.vst1x2.p0.v8i16(ptr nocapture, <8 x i16>, <8 x i16>) argmemonly nounwind
78 declare void @llvm.arm.neon.vst1x3.p0.v8i16(ptr nocapture, <8 x i16>, <8 x i16>, <8 x i16>) argmemonly nounwind
79 declare void @llvm.arm.neon.vst1x4.p0.v8i16(ptr nocapture, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>) argmemonly nounwind
81 declare void @llvm.arm.neon.vst1x2.p0.v4i32(ptr nocapture, <4 x i32>, <4 x i32>) argmemonly nounwind
82 declare void @llvm.arm.neon.vst1x3.p0.v4i32(ptr nocapture, <4 x i32>, <4 x i32>, <4 x i32>) argmemonly nounwind
83 declare void @llvm.arm.neon.vst1x4.p0.v4i32(ptr nocapture, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) argmemonly nounwind
85 declare void @llvm.arm.neon.vst1x2.p0.v2i64(ptr nocapture, <2 x i64>, <2 x i64>) argmemonly nounwind
86 declare void @llvm.arm.neon.vst1x3.p0.v2i64(ptr nocapture, <2 x i64>, <2 x i64>, <2 x i64>) argmemonly nounwind
87 declare void @llvm.arm.neon.vst1x4.p0.v2i64(ptr nocapture, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) argmemonly nounwind
89 declare void @llvm.arm.neon.vst1x2.p0.v16i8(ptr nocapture, <16 x i8>, <16 x i8>) argmemonly nounwind
90 declare void @llvm.arm.neon.vst1x3.p0.v16i8(ptr nocapture, <16 x i8>, <16 x i8>, <16 x i8>) argmemonly nounwind
91 declare void @llvm.arm.neon.vst1x4.p0.v16i8(ptr nocapture, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>) argmemonly nounwind
93 define arm_aapcs_vfpcc void @test_vst1_u16_x2(ptr %a, %struct.uint16x4x2_t %b) nounwind {
94 ; CHECK-LABEL: test_vst1_u16_x2:
95 ; CHECK:         vst1.16 {d0, d1}, [r0:64]
96 ; CHECK-NEXT:    bx lr
97 entry:
98   %b0 = extractvalue %struct.uint16x4x2_t %b, 0, 0
99   %b1 = extractvalue %struct.uint16x4x2_t %b, 0, 1
100   tail call void @llvm.arm.neon.vst1x2.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1)
101   ret void
104 define arm_aapcs_vfpcc void @test_vst1_u16_x3(ptr %a, %struct.uint16x4x3_t %b) nounwind {
105 ; CHECK-LABEL: test_vst1_u16_x3:
106 ; CHECK:         vst1.16 {d0, d1, d2}, [r0:64]
107 ; CHECK-NEXT:    bx lr
108 entry:
109   %b0 = extractvalue %struct.uint16x4x3_t %b, 0, 0
110   %b1 = extractvalue %struct.uint16x4x3_t %b, 0, 1
111   %b2 = extractvalue %struct.uint16x4x3_t %b, 0, 2
112   tail call void @llvm.arm.neon.vst1x3.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1, <4 x i16> %b2)
113   ret void
116 define arm_aapcs_vfpcc void @test_vst1_u16_x4(ptr %a, %struct.uint16x4x4_t %b) nounwind {
117 ; CHECK-LABEL: test_vst1_u16_x4:
118 ; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0:256]
119 ; CHECK-NEXT:    bx lr
120 entry:
121   %b0 = extractvalue %struct.uint16x4x4_t %b, 0, 0
122   %b1 = extractvalue %struct.uint16x4x4_t %b, 0, 1
123   %b2 = extractvalue %struct.uint16x4x4_t %b, 0, 2
124   %b3 = extractvalue %struct.uint16x4x4_t %b, 0, 3
125   tail call void @llvm.arm.neon.vst1x4.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1, <4 x i16> %b2, <4 x i16> %b3)
126   ret void
129 define arm_aapcs_vfpcc void @test_vst1_u32_x2(ptr %a, %struct.uint32x2x2_t %b) nounwind {
130 ; CHECK-LABEL: test_vst1_u32_x2:
131 ; CHECK:         vst1.32 {d0, d1}, [r0:64]
132 ; CHECK-NEXT:    bx lr
133 entry:
134   %b0 = extractvalue %struct.uint32x2x2_t %b, 0, 0
135   %b1 = extractvalue %struct.uint32x2x2_t %b, 0, 1
136   tail call void @llvm.arm.neon.vst1x2.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1)
137   ret void
140 define arm_aapcs_vfpcc void @test_vst1_u32_x3(ptr %a, %struct.uint32x2x3_t %b) nounwind {
141 ; CHECK-LABEL: test_vst1_u32_x3:
142 ; CHECK:         vst1.32 {d0, d1, d2}, [r0:64]
143 ; CHECK-NEXT:    bx lr
144 entry:
145   %b0 = extractvalue %struct.uint32x2x3_t %b, 0, 0
146   %b1 = extractvalue %struct.uint32x2x3_t %b, 0, 1
147   %b2 = extractvalue %struct.uint32x2x3_t %b, 0, 2
148   tail call void @llvm.arm.neon.vst1x3.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1, <2 x i32> %b2)
149   ret void
152 define arm_aapcs_vfpcc void @test_vst1_u32_x4(ptr %a, %struct.uint32x2x4_t %b) nounwind {
153 ; CHECK-LABEL: test_vst1_u32_x4:
154 ; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0:256]
155 ; CHECK-NEXT:    bx lr
156 entry:
157   %b0 = extractvalue %struct.uint32x2x4_t %b, 0, 0
158   %b1 = extractvalue %struct.uint32x2x4_t %b, 0, 1
159   %b2 = extractvalue %struct.uint32x2x4_t %b, 0, 2
160   %b3 = extractvalue %struct.uint32x2x4_t %b, 0, 3
161   tail call void @llvm.arm.neon.vst1x4.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1, <2 x i32> %b2, <2 x i32> %b3)
162   ret void
165 define arm_aapcs_vfpcc void @test_vst1_u64_x2(ptr %a, %struct.uint64x1x2_t %b) nounwind {
166 ; CHECK-LABEL: test_vst1_u64_x2:
167 ; CHECK:         vst1.64 {d0, d1}, [r0:64]
168 ; CHECK-NEXT:    bx lr
169 entry:
170   %b0 = extractvalue %struct.uint64x1x2_t %b, 0, 0
171   %b1 = extractvalue %struct.uint64x1x2_t %b, 0, 1
172   tail call void @llvm.arm.neon.vst1x2.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1)
173   ret void
176 define arm_aapcs_vfpcc void @test_vst1_u64_x3(ptr %a, %struct.uint64x1x3_t %b) nounwind {
177 ; CHECK-LABEL: test_vst1_u64_x3:
178 ; CHECK:         vst1.64 {d0, d1, d2}, [r0:64]
179 ; CHECK-NEXT:    bx lr
180 entry:
181   %b0 = extractvalue %struct.uint64x1x3_t %b, 0, 0
182   %b1 = extractvalue %struct.uint64x1x3_t %b, 0, 1
183   %b2 = extractvalue %struct.uint64x1x3_t %b, 0, 2
184   tail call void @llvm.arm.neon.vst1x3.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1, <1 x i64> %b2)
185   ret void
188 define arm_aapcs_vfpcc void @test_vst1_u64_x4(ptr %a, %struct.uint64x1x4_t %b) nounwind {
189 ; CHECK-LABEL: test_vst1_u64_x4:
190 ; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0:256]
191 ; CHECK-NEXT:    bx lr
192 entry:
193   %b0 = extractvalue %struct.uint64x1x4_t %b, 0, 0
194   %b1 = extractvalue %struct.uint64x1x4_t %b, 0, 1
195   %b2 = extractvalue %struct.uint64x1x4_t %b, 0, 2
196   %b3 = extractvalue %struct.uint64x1x4_t %b, 0, 3
197   tail call void @llvm.arm.neon.vst1x4.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1, <1 x i64> %b2, <1 x i64> %b3)
198   ret void
201 define arm_aapcs_vfpcc void @test_vst1_u8_x2(ptr %a, %struct.uint8x8x2_t %b) nounwind {
202 ; CHECK-LABEL: test_vst1_u8_x2:
203 ; CHECK:         vst1.8 {d0, d1}, [r0:64]
204 ; CHECK-NEXT:    bx lr
205 entry:
206   %b0 = extractvalue %struct.uint8x8x2_t %b, 0, 0
207   %b1 = extractvalue %struct.uint8x8x2_t %b, 0, 1
208   tail call void @llvm.arm.neon.vst1x2.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1)
209   ret void
212 define arm_aapcs_vfpcc void @test_vst1_u8_x3(ptr %a, %struct.uint8x8x3_t %b) nounwind {
213 ; CHECK-LABEL: test_vst1_u8_x3:
214 ; CHECK:         vst1.8 {d0, d1, d2}, [r0:64]
215 ; CHECK-NEXT:    bx lr
216 entry:
217   %b0 = extractvalue %struct.uint8x8x3_t %b, 0, 0
218   %b1 = extractvalue %struct.uint8x8x3_t %b, 0, 1
219   %b2 = extractvalue %struct.uint8x8x3_t %b, 0, 2
220   tail call void @llvm.arm.neon.vst1x3.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1, <8 x i8> %b2)
221   ret void
224 define arm_aapcs_vfpcc void @test_vst1_u8_x4(ptr %a, %struct.uint8x8x4_t %b) nounwind {
225 ; CHECK-LABEL: test_vst1_u8_x4:
226 ; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0:256]
227 ; CHECK-NEXT:    bx lr
228 entry:
229   %b0 = extractvalue %struct.uint8x8x4_t %b, 0, 0
230   %b1 = extractvalue %struct.uint8x8x4_t %b, 0, 1
231   %b2 = extractvalue %struct.uint8x8x4_t %b, 0, 2
232   %b3 = extractvalue %struct.uint8x8x4_t %b, 0, 3
233   tail call void @llvm.arm.neon.vst1x4.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1, <8 x i8> %b2, <8 x i8> %b3)
234   ret void
237 define arm_aapcs_vfpcc void @test_vst1q_u16_x2(ptr %a, %struct.uint16x8x2_t %b) nounwind {
238 ; CHECK-LABEL: test_vst1q_u16_x2:
239 ; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0:256]
240 ; CHECK-NEXT:    bx lr
241 entry:
242   %b0 = extractvalue %struct.uint16x8x2_t %b, 0, 0
243   %b1 = extractvalue %struct.uint16x8x2_t %b, 0, 1
244   tail call void @llvm.arm.neon.vst1x2.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1)
245   ret void
248 define arm_aapcs_vfpcc void @test_vst1q_u16_x3(ptr %a, %struct.uint16x8x3_t %b) nounwind {
249 ; CHECK-LABEL: test_vst1q_u16_x3:
250 ; CHECK:         vst1.16 {d0, d1, d2}, [r0:64]!
251 ; CHECK-NEXT:    vst1.16 {d3, d4, d5}, [r0:64]
252 ; CHECK-NEXT:    bx lr
253 entry:
254   %b0 = extractvalue %struct.uint16x8x3_t %b, 0, 0
255   %b1 = extractvalue %struct.uint16x8x3_t %b, 0, 1
256   %b2 = extractvalue %struct.uint16x8x3_t %b, 0, 2
257   tail call void @llvm.arm.neon.vst1x3.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1, <8 x i16> %b2)
258   ret void
261 define arm_aapcs_vfpcc void @test_vst1q_u16_x4(ptr %a, %struct.uint16x8x4_t %b) nounwind {
262 ; CHECK-LABEL: test_vst1q_u16_x4:
263 ; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0:256]!
264 ; CHECK-NEXT:    vst1.16 {d4, d5, d6, d7}, [r0:256]
265 ; CHECK-NEXT:    bx lr
266 entry:
267   %b0 = extractvalue %struct.uint16x8x4_t %b, 0, 0
268   %b1 = extractvalue %struct.uint16x8x4_t %b, 0, 1
269   %b2 = extractvalue %struct.uint16x8x4_t %b, 0, 2
270   %b3 = extractvalue %struct.uint16x8x4_t %b, 0, 3
271   tail call void @llvm.arm.neon.vst1x4.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1, <8 x i16> %b2, <8 x i16> %b3)
272   ret void
275 define arm_aapcs_vfpcc void @test_vst1q_u32_x2(ptr %a, %struct.uint32x4x2_t %b) nounwind {
276 ; CHECK-LABEL: test_vst1q_u32_x2:
277 ; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0:256]
278 ; CHECK-NEXT:    bx lr
279 entry:
280   %b0 = extractvalue %struct.uint32x4x2_t %b, 0, 0
281   %b1 = extractvalue %struct.uint32x4x2_t %b, 0, 1
282   tail call void @llvm.arm.neon.vst1x2.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1)
283   ret void
286 define arm_aapcs_vfpcc void @test_vst1q_u32_x3(ptr %a, %struct.uint32x4x3_t %b) nounwind {
287 ; CHECK-LABEL: test_vst1q_u32_x3:
288 ; CHECK:         vst1.32 {d0, d1, d2}, [r0:64]!
289 ; CHECK-NEXT:    vst1.32 {d3, d4, d5}, [r0:64]
290 ; CHECK-NEXT:    bx lr
291 entry:
292   %b0 = extractvalue %struct.uint32x4x3_t %b, 0, 0
293   %b1 = extractvalue %struct.uint32x4x3_t %b, 0, 1
294   %b2 = extractvalue %struct.uint32x4x3_t %b, 0, 2
295   tail call void @llvm.arm.neon.vst1x3.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1, <4 x i32> %b2)
296   ret void
299 define arm_aapcs_vfpcc void @test_vst1q_u32_x4(ptr %a, %struct.uint32x4x4_t %b) nounwind {
300 ; CHECK-LABEL: test_vst1q_u32_x4:
301 ; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0:256]!
302 ; CHECK-NEXT:    vst1.32 {d4, d5, d6, d7}, [r0:256]
303 ; CHECK-NEXT:    bx lr
304 entry:
305   %b0 = extractvalue %struct.uint32x4x4_t %b, 0, 0
306   %b1 = extractvalue %struct.uint32x4x4_t %b, 0, 1
307   %b2 = extractvalue %struct.uint32x4x4_t %b, 0, 2
308   %b3 = extractvalue %struct.uint32x4x4_t %b, 0, 3
309   tail call void @llvm.arm.neon.vst1x4.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1, <4 x i32> %b2, <4 x i32> %b3)
310   ret void
313 define arm_aapcs_vfpcc void @test_vst1q_u64_x2(ptr %a, %struct.uint64x2x2_t %b) nounwind {
314 ; CHECK-LABEL: test_vst1q_u64_x2:
315 ; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0:256]
316 ; CHECK-NEXT:    bx lr
317 entry:
318   %b0 = extractvalue %struct.uint64x2x2_t %b, 0, 0
319   %b1 = extractvalue %struct.uint64x2x2_t %b, 0, 1
320   tail call void @llvm.arm.neon.vst1x2.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1)
321   ret void
324 define arm_aapcs_vfpcc void @test_vst1q_u64_x3(ptr %a, %struct.uint64x2x3_t %b) nounwind {
325 ; CHECK-LABEL: test_vst1q_u64_x3:
326 ; CHECK:         vst1.64 {d0, d1, d2}, [r0:64]!
327 ; CHECK-NEXT:    vst1.64 {d3, d4, d5}, [r0:64]
328 ; CHECK-NEXT:    bx lr
329 entry:
330   %b0 = extractvalue %struct.uint64x2x3_t %b, 0, 0
331   %b1 = extractvalue %struct.uint64x2x3_t %b, 0, 1
332   %b2 = extractvalue %struct.uint64x2x3_t %b, 0, 2
333   tail call void @llvm.arm.neon.vst1x3.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1, <2 x i64> %b2)
334   ret void
337 define arm_aapcs_vfpcc void @test_vst1q_u64_x4(ptr %a, %struct.uint64x2x4_t %b) nounwind {
338 ; CHECK-LABEL: test_vst1q_u64_x4:
339 ; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0:256]!
340 ; CHECK-NEXT:    vst1.64 {d4, d5, d6, d7}, [r0:256]
341 ; CHECK-NEXT:    bx lr
342 entry:
343   %b0 = extractvalue %struct.uint64x2x4_t %b, 0, 0
344   %b1 = extractvalue %struct.uint64x2x4_t %b, 0, 1
345   %b2 = extractvalue %struct.uint64x2x4_t %b, 0, 2
346   %b3 = extractvalue %struct.uint64x2x4_t %b, 0, 3
347   tail call void @llvm.arm.neon.vst1x4.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1, <2 x i64> %b2, <2 x i64> %b3)
348   ret void
351 define arm_aapcs_vfpcc void @test_vst1q_u8_x2(ptr %a, %struct.uint8x16x2_t %b) nounwind {
352 ; CHECK-LABEL: test_vst1q_u8_x2:
353 ; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0:256]
354 ; CHECK-NEXT:    bx lr
355 entry:
356   %b0 = extractvalue %struct.uint8x16x2_t %b, 0, 0
357   %b1 = extractvalue %struct.uint8x16x2_t %b, 0, 1
358   tail call void @llvm.arm.neon.vst1x2.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1)
359   ret void
362 define arm_aapcs_vfpcc void @test_vst1q_u8_x3(ptr %a, %struct.uint8x16x3_t %b) nounwind {
363 ; CHECK-LABEL: test_vst1q_u8_x3:
364 ; CHECK:         vst1.8 {d0, d1, d2}, [r0:64]!
365 ; CHECK-NEXT:    vst1.8 {d3, d4, d5}, [r0:64]
366 ; CHECK-NEXT:    bx lr
367 entry:
368   %b0 = extractvalue %struct.uint8x16x3_t %b, 0, 0
369   %b1 = extractvalue %struct.uint8x16x3_t %b, 0, 1
370   %b2 = extractvalue %struct.uint8x16x3_t %b, 0, 2
371   tail call void @llvm.arm.neon.vst1x3.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1, <16 x i8> %b2)
372   ret void
375 define arm_aapcs_vfpcc void @test_vst1q_u8_x4(ptr %a, %struct.uint8x16x4_t %b) nounwind {
376 ; CHECK-LABEL: test_vst1q_u8_x4:
377 ; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0:256]!
378 ; CHECK-NEXT:    vst1.8 {d4, d5, d6, d7}, [r0:256]
379 ; CHECK-NEXT:    bx lr
380 entry:
381   %b0 = extractvalue %struct.uint8x16x4_t %b, 0, 0
382   %b1 = extractvalue %struct.uint8x16x4_t %b, 0, 1
383   %b2 = extractvalue %struct.uint8x16x4_t %b, 0, 2
384   %b3 = extractvalue %struct.uint8x16x4_t %b, 0, 3
385   tail call void @llvm.arm.neon.vst1x4.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1, <16 x i8> %b2, <16 x i8> %b3)
386   ret void
389 ; Post increment
391 define arm_aapcs_vfpcc ptr @test_vst1_u8_x2_post_imm(ptr %a, %struct.uint8x8x2_t %b) nounwind {
392 ; CHECK-LABEL: test_vst1_u8_x2_post_imm:
393 ; CHECK:         vst1.8 {d0, d1}, [r0:64]!
394 ; CHECK-NEXT:    bx lr
395 entry:
396   %b0 = extractvalue %struct.uint8x8x2_t %b, 0, 0
397   %b1 = extractvalue %struct.uint8x8x2_t %b, 0, 1
398   tail call void @llvm.arm.neon.vst1x2.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1)
399   %tmp = getelementptr i8, ptr %a, i32 16
400   ret ptr %tmp
403 define arm_aapcs_vfpcc ptr @test_vst1_u8_x2_post_reg(ptr %a, %struct.uint8x8x2_t %b, i32 %inc) nounwind {
404 ; CHECK-LABEL: test_vst1_u8_x2_post_reg:
405 ; CHECK:         vst1.8 {d0, d1}, [r0:64], r1
406 ; CHECK-NEXT:    bx lr
407 entry:
408   %b0 = extractvalue %struct.uint8x8x2_t %b, 0, 0
409   %b1 = extractvalue %struct.uint8x8x2_t %b, 0, 1
410   tail call void @llvm.arm.neon.vst1x2.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1)
411   %tmp = getelementptr i8, ptr %a, i32 %inc
412   ret ptr %tmp
415 define arm_aapcs_vfpcc ptr @test_vst1_u16_x2_post_imm(ptr %a, %struct.uint16x4x2_t %b) nounwind {
416 ; CHECK-LABEL: test_vst1_u16_x2_post_imm:
417 ; CHECK:         vst1.16 {d0, d1}, [r0:64]!
418 ; CHECK-NEXT:    bx lr
419   %b0 = extractvalue %struct.uint16x4x2_t %b, 0, 0
420   %b1 = extractvalue %struct.uint16x4x2_t %b, 0, 1
421   tail call void @llvm.arm.neon.vst1x2.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1)
422   %tmp = getelementptr i16, ptr %a, i32 8
423   ret ptr %tmp
426 define arm_aapcs_vfpcc ptr @test_vst1_u16_x2_post_reg(ptr %a, %struct.uint16x4x2_t %b, i32 %inc) nounwind {
427 ; CHECK-LABEL: test_vst1_u16_x2_post_reg:
428 ; CHECK:         lsl r1, r1, #1
429 ; CHECK-NEXT:    vst1.16 {d0, d1}, [r0:64], r1
430 ; CHECK-NEXT:    bx lr
431   %b0 = extractvalue %struct.uint16x4x2_t %b, 0, 0
432   %b1 = extractvalue %struct.uint16x4x2_t %b, 0, 1
433   tail call void @llvm.arm.neon.vst1x2.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1)
434   %tmp = getelementptr i16, ptr %a, i32 %inc
435   ret ptr %tmp
438 define arm_aapcs_vfpcc ptr @test_vst1_u32_x2_post_imm(ptr %a, %struct.uint32x2x2_t %b) nounwind {
439 ; CHECK-LABEL: test_vst1_u32_x2_post_imm:
440 ; CHECK:         vst1.32 {d0, d1}, [r0:64]!
441 ; CHECK-NEXT:    bx lr
442 entry:
443   %b0 = extractvalue %struct.uint32x2x2_t %b, 0, 0
444   %b1 = extractvalue %struct.uint32x2x2_t %b, 0, 1
445   tail call void @llvm.arm.neon.vst1x2.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1)
446   %tmp = getelementptr i32, ptr %a, i32 4
447   ret ptr %tmp
450 define arm_aapcs_vfpcc ptr @test_vst1_u32_x2_post_reg(ptr %a, %struct.uint32x2x2_t %b, i32 %inc) nounwind {
451 ; CHECK-LABEL: test_vst1_u32_x2_post_reg:
452 ; CHECK:         lsl r1, r1, #2
453 ; CHECK-NEXT:    vst1.32 {d0, d1}, [r0:64], r1
454 ; CHECK-NEXT:    bx lr
455 entry:
456   %b0 = extractvalue %struct.uint32x2x2_t %b, 0, 0
457   %b1 = extractvalue %struct.uint32x2x2_t %b, 0, 1
458   tail call void @llvm.arm.neon.vst1x2.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1)
459   %tmp = getelementptr i32, ptr %a, i32 %inc
460   ret ptr %tmp
463 define arm_aapcs_vfpcc ptr @test_vst1_u64_x2_post_imm(ptr %a, %struct.uint64x1x2_t %b) nounwind {
464 ; CHECK-LABEL: test_vst1_u64_x2_post_imm:
465 ; CHECK:         vst1.64 {d0, d1}, [r0:64]!
466 ; CHECK-NEXT:    bx lr
467 entry:
468   %b0 = extractvalue %struct.uint64x1x2_t %b, 0, 0
469   %b1 = extractvalue %struct.uint64x1x2_t %b, 0, 1
470   tail call void @llvm.arm.neon.vst1x2.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1)
471   %tmp = getelementptr i64, ptr %a, i32 2
472   ret ptr %tmp
475 define arm_aapcs_vfpcc ptr @test_vst1_u64_x2_post_reg(ptr %a, %struct.uint64x1x2_t %b, i32 %inc) nounwind {
476 ; CHECK-LABEL: test_vst1_u64_x2_post_reg:
477 ; CHECK:         lsl r1, r1, #3
478 ; CHECK-NEXT:    vst1.64 {d0, d1}, [r0:64], r1
479 ; CHECK-NEXT:    bx lr
480 entry:
481   %b0 = extractvalue %struct.uint64x1x2_t %b, 0, 0
482   %b1 = extractvalue %struct.uint64x1x2_t %b, 0, 1
483   tail call void @llvm.arm.neon.vst1x2.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1)
484   %tmp = getelementptr i64, ptr %a, i32 %inc
485   ret ptr %tmp
488 define arm_aapcs_vfpcc ptr @test_vst1q_u8_x2_post_imm(ptr %a, %struct.uint8x16x2_t %b) nounwind {
489 ; CHECK-LABEL: test_vst1q_u8_x2_post_imm:
490 ; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0:256]!
491 ; CHECK-NEXT:    bx lr
492 entry:
493   %b0 = extractvalue %struct.uint8x16x2_t %b, 0, 0
494   %b1 = extractvalue %struct.uint8x16x2_t %b, 0, 1
495   tail call void @llvm.arm.neon.vst1x2.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1)
496   %tmp = getelementptr i8, ptr %a, i32 32
497   ret ptr %tmp
500 define arm_aapcs_vfpcc ptr @test_vst1q_u8_x2_post_reg(ptr %a, %struct.uint8x16x2_t %b, i32 %inc) nounwind {
501 ; CHECK-LABEL: test_vst1q_u8_x2_post_reg:
502 ; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0:256], r1
503 ; CHECK-NEXT:    bx lr
504 entry:
505   %b0 = extractvalue %struct.uint8x16x2_t %b, 0, 0
506   %b1 = extractvalue %struct.uint8x16x2_t %b, 0, 1
507   tail call void @llvm.arm.neon.vst1x2.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1)
508   %tmp = getelementptr i8, ptr %a, i32 %inc
509   ret ptr %tmp
512 define arm_aapcs_vfpcc ptr @test_vst1q_u16_x2_post_imm(ptr %a, %struct.uint16x8x2_t %b) nounwind {
513 ; CHECK-LABEL: test_vst1q_u16_x2_post_imm:
514 ; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0:256]!
515 ; CHECK-NEXT:    bx lr
516 entry:
517   %b0 = extractvalue %struct.uint16x8x2_t %b, 0, 0
518   %b1 = extractvalue %struct.uint16x8x2_t %b, 0, 1
519   tail call void @llvm.arm.neon.vst1x2.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1)
520   %tmp = getelementptr i16, ptr %a, i32 16
521   ret ptr %tmp
524 define arm_aapcs_vfpcc ptr @test_vst1q_u16_x2_post_reg(ptr %a, %struct.uint16x8x2_t %b, i32 %inc) nounwind {
525 ; CHECK-LABEL: test_vst1q_u16_x2_post_reg:
526 ; CHECK:         lsl r1, r1, #1
527 ; CHECK-NEXT:    vst1.16 {d0, d1, d2, d3}, [r0:256], r1
528 ; CHECK-NEXT:    bx lr
529 entry:
530   %b0 = extractvalue %struct.uint16x8x2_t %b, 0, 0
531   %b1 = extractvalue %struct.uint16x8x2_t %b, 0, 1
532   tail call void @llvm.arm.neon.vst1x2.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1)
533   %tmp = getelementptr i16, ptr %a, i32 %inc
534   ret ptr %tmp
537 define arm_aapcs_vfpcc ptr @test_vst1q_u32_x2_post_imm(ptr %a, %struct.uint32x4x2_t %b) nounwind {
538 ; CHECK-LABEL: test_vst1q_u32_x2_post_imm:
539 ; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0:256]!
540 ; CHECK-NEXT:    bx lr
541 entry:
542   %b0 = extractvalue %struct.uint32x4x2_t %b, 0, 0
543   %b1 = extractvalue %struct.uint32x4x2_t %b, 0, 1
544   tail call void @llvm.arm.neon.vst1x2.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1)
545   %tmp = getelementptr i32, ptr %a, i32 8
546   ret ptr %tmp
549 define arm_aapcs_vfpcc ptr @test_vst1q_u32_x2_post_reg(ptr %a, %struct.uint32x4x2_t %b, i32 %inc) nounwind {
550 ; CHECK-LABEL: test_vst1q_u32_x2_post_reg:
551 ; CHECK:         lsl r1, r1, #2
552 ; CHECK-NEXT:    vst1.32 {d0, d1, d2, d3}, [r0:256], r1
553 ; CHECK-NEXT:    bx lr
554 entry:
555   %b0 = extractvalue %struct.uint32x4x2_t %b, 0, 0
556   %b1 = extractvalue %struct.uint32x4x2_t %b, 0, 1
557   tail call void @llvm.arm.neon.vst1x2.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1)
558   %tmp = getelementptr i32, ptr %a, i32 %inc
559   ret ptr %tmp
562 define arm_aapcs_vfpcc ptr @test_vst1q_u64_x2_post_imm(ptr %a, %struct.uint64x2x2_t %b) nounwind {
563 ; CHECK-LABEL: test_vst1q_u64_x2_post_imm:
564 ; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0:256]!
565 ; CHECK-NEXT:    bx lr
566 entry:
567   %b0 = extractvalue %struct.uint64x2x2_t %b, 0, 0
568   %b1 = extractvalue %struct.uint64x2x2_t %b, 0, 1
569   tail call void @llvm.arm.neon.vst1x2.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1)
570   %tmp = getelementptr i64, ptr %a, i32 4
571   ret ptr %tmp
574 define arm_aapcs_vfpcc ptr @test_vst1q_u64_x2_post_reg(ptr %a, %struct.uint64x2x2_t %b, i32 %inc) nounwind {
575 ; CHECK-LABEL: test_vst1q_u64_x2_post_reg:
576 ; CHECK:         lsl r1, r1, #3
577 ; CHECK-NEXT:    vst1.64 {d0, d1, d2, d3}, [r0:256], r1
578 ; CHECK-NEXT:    bx lr
579 entry:
580   %b0 = extractvalue %struct.uint64x2x2_t %b, 0, 0
581   %b1 = extractvalue %struct.uint64x2x2_t %b, 0, 1
582   tail call void @llvm.arm.neon.vst1x2.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1)
583   %tmp = getelementptr i64, ptr %a, i32 %inc
584   ret ptr %tmp
588 define arm_aapcs_vfpcc ptr @test_vst1_u8_x3_post_imm(ptr %a, %struct.uint8x8x3_t %b) nounwind {
589 ; CHECK-LABEL: test_vst1_u8_x3_post_imm:
590 ; CHECK:         vst1.8 {d0, d1, d2}, [r0:64]!
591 ; CHECK-NEXT:    bx lr
592 entry:
593   %b0 = extractvalue %struct.uint8x8x3_t %b, 0, 0
594   %b1 = extractvalue %struct.uint8x8x3_t %b, 0, 1
595   %b2 = extractvalue %struct.uint8x8x3_t %b, 0, 2
596   tail call void @llvm.arm.neon.vst1x3.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1, <8 x i8> %b2)
597   %tmp = getelementptr i8, ptr %a, i32 24
598   ret ptr %tmp
601 define arm_aapcs_vfpcc ptr @test_vst1_u8_x3_post_reg(ptr %a, %struct.uint8x8x3_t %b, i32 %inc) nounwind {
602 ; CHECK-LABEL: test_vst1_u8_x3_post_reg:
603 ; CHECK:         vst1.8 {d0, d1, d2}, [r0:64], r1
604 ; CHECK-NEXT:    bx lr
605 entry:
606   %b0 = extractvalue %struct.uint8x8x3_t %b, 0, 0
607   %b1 = extractvalue %struct.uint8x8x3_t %b, 0, 1
608   %b2 = extractvalue %struct.uint8x8x3_t %b, 0, 2
609   tail call void @llvm.arm.neon.vst1x3.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1, <8 x i8> %b2)
610   %tmp = getelementptr i8, ptr %a, i32 %inc
611   ret ptr %tmp
614 define arm_aapcs_vfpcc ptr @test_vst1_u16_x3_post_imm(ptr %a, %struct.uint16x4x3_t %b) nounwind {
615 ; CHECK-LABEL: test_vst1_u16_x3_post_imm:
616 ; CHECK:         vst1.16 {d0, d1, d2}, [r0:64]!
617 ; CHECK-NEXT:    bx lr
618   %b0 = extractvalue %struct.uint16x4x3_t %b, 0, 0
619   %b1 = extractvalue %struct.uint16x4x3_t %b, 0, 1
620   %b2 = extractvalue %struct.uint16x4x3_t %b, 0, 2
621   tail call void @llvm.arm.neon.vst1x3.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1, <4 x i16> %b2)
622   %tmp = getelementptr i16, ptr %a, i32 12
623   ret ptr %tmp
626 define arm_aapcs_vfpcc ptr @test_vst1_u16_x3_post_reg(ptr %a, %struct.uint16x4x3_t %b, i32 %inc) nounwind {
627 ; CHECK-LABEL: test_vst1_u16_x3_post_reg:
628 ; CHECK:         lsl r1, r1, #1
629 ; CHECK-NEXT:    vst1.16 {d0, d1, d2}, [r0:64], r1
630 ; CHECK-NEXT:    bx lr
631   %b0 = extractvalue %struct.uint16x4x3_t %b, 0, 0
632   %b1 = extractvalue %struct.uint16x4x3_t %b, 0, 1
633   %b2 = extractvalue %struct.uint16x4x3_t %b, 0, 2
634   tail call void @llvm.arm.neon.vst1x3.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1, <4 x i16> %b2)
635   %tmp = getelementptr i16, ptr %a, i32 %inc
636   ret ptr %tmp
639 define arm_aapcs_vfpcc ptr @test_vst1_u32_x3_post_imm(ptr %a, %struct.uint32x2x3_t %b) nounwind {
640 ; CHECK-LABEL: test_vst1_u32_x3_post_imm:
641 ; CHECK:         vst1.32 {d0, d1, d2}, [r0:64]!
642 ; CHECK-NEXT:    bx lr
643 entry:
644   %b0 = extractvalue %struct.uint32x2x3_t %b, 0, 0
645   %b1 = extractvalue %struct.uint32x2x3_t %b, 0, 1
646   %b2 = extractvalue %struct.uint32x2x3_t %b, 0, 2
647   tail call void @llvm.arm.neon.vst1x3.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1, <2 x i32> %b2)
648   %tmp = getelementptr i32, ptr %a, i32 6
649   ret ptr %tmp
652 define arm_aapcs_vfpcc ptr @test_vst1_u32_x3_post_reg(ptr %a, %struct.uint32x2x3_t %b, i32 %inc) nounwind {
653 ; CHECK-LABEL: test_vst1_u32_x3_post_reg:
654 ; CHECK:         lsl r1, r1, #2
655 ; CHECK-NEXT:    vst1.32 {d0, d1, d2}, [r0:64], r1
656 ; CHECK-NEXT:    bx lr
657 entry:
658   %b0 = extractvalue %struct.uint32x2x3_t %b, 0, 0
659   %b1 = extractvalue %struct.uint32x2x3_t %b, 0, 1
660   %b2 = extractvalue %struct.uint32x2x3_t %b, 0, 2
661   tail call void @llvm.arm.neon.vst1x3.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1, <2 x i32> %b2)
662   %tmp = getelementptr i32, ptr %a, i32 %inc
663   ret ptr %tmp
666 define arm_aapcs_vfpcc ptr @test_vst1_u64_x3_post_imm(ptr %a, %struct.uint64x1x3_t %b) nounwind {
667 ; CHECK-LABEL: test_vst1_u64_x3_post_imm:
668 ; CHECK:         vst1.64 {d0, d1, d2}, [r0:64]!
669 ; CHECK-NEXT:    bx lr
670 entry:
671   %b0 = extractvalue %struct.uint64x1x3_t %b, 0, 0
672   %b1 = extractvalue %struct.uint64x1x3_t %b, 0, 1
673   %b2 = extractvalue %struct.uint64x1x3_t %b, 0, 2
674   tail call void @llvm.arm.neon.vst1x3.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1, <1 x i64> %b2)
675   %tmp = getelementptr i64, ptr %a, i32 3
676   ret ptr %tmp
679 define arm_aapcs_vfpcc ptr @test_vst1_u64_x3_post_reg(ptr %a, %struct.uint64x1x3_t %b, i32 %inc) nounwind {
680 ; CHECK-LABEL: test_vst1_u64_x3_post_reg:
681 ; CHECK:         lsl r1, r1, #3
682 ; CHECK-NEXT:    vst1.64 {d0, d1, d2}, [r0:64], r1
683 ; CHECK-NEXT:    bx lr
684 entry:
685   %b0 = extractvalue %struct.uint64x1x3_t %b, 0, 0
686   %b1 = extractvalue %struct.uint64x1x3_t %b, 0, 1
687   %b2 = extractvalue %struct.uint64x1x3_t %b, 0, 2
688   tail call void @llvm.arm.neon.vst1x3.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1, <1 x i64> %b2)
689   %tmp = getelementptr i64, ptr %a, i32 %inc
690   ret ptr %tmp
693 define arm_aapcs_vfpcc ptr @test_vst1q_u8_x3_post_imm(ptr %a, %struct.uint8x16x3_t %b) nounwind {
694 ; CHECK-LABEL: test_vst1q_u8_x3_post_imm:
695 ; CHECK:         vst1.8 {d0, d1, d2}, [r0:64]!
696 ; CHECK-NEXT:    vst1.8 {d3, d4, d5}, [r0:64]!
697 ; CHECK-NEXT:    bx lr
698 entry:
699   %b0 = extractvalue %struct.uint8x16x3_t %b, 0, 0
700   %b1 = extractvalue %struct.uint8x16x3_t %b, 0, 1
701   %b2 = extractvalue %struct.uint8x16x3_t %b, 0, 2
702   tail call void @llvm.arm.neon.vst1x3.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1, <16 x i8> %b2)
703   %tmp = getelementptr i8, ptr %a, i32 48
704   ret ptr %tmp
707 define arm_aapcs_vfpcc ptr @test_vst1q_u16_x3_post_imm(ptr %a, %struct.uint16x8x3_t %b) nounwind {
708 ; CHECK-LABEL: test_vst1q_u16_x3_post_imm:
709 ; CHECK:         vst1.16 {d0, d1, d2}, [r0:64]!
710 ; CHECK-NEXT:    vst1.16 {d3, d4, d5}, [r0:64]!
711 ; CHECK-NEXT:    bx lr
712 entry:
713   %b0 = extractvalue %struct.uint16x8x3_t %b, 0, 0
714   %b1 = extractvalue %struct.uint16x8x3_t %b, 0, 1
715   %b2 = extractvalue %struct.uint16x8x3_t %b, 0, 2
716   tail call void @llvm.arm.neon.vst1x3.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1, <8 x i16> %b2)
717   %tmp = getelementptr i16, ptr %a, i32 24
718   ret ptr %tmp
721 define arm_aapcs_vfpcc ptr @test_vst1q_u32_x3_post_imm(ptr %a, %struct.uint32x4x3_t %b) nounwind {
722 ; CHECK-LABEL: test_vst1q_u32_x3_post_imm:
723 ; CHECK:         vst1.32 {d0, d1, d2}, [r0:64]!
724 ; CHECK-NEXT:    vst1.32 {d3, d4, d5}, [r0:64]!
725 ; CHECK-NEXT:    bx lr
726 entry:
727   %b0 = extractvalue %struct.uint32x4x3_t %b, 0, 0
728   %b1 = extractvalue %struct.uint32x4x3_t %b, 0, 1
729   %b2 = extractvalue %struct.uint32x4x3_t %b, 0, 2
730   tail call void @llvm.arm.neon.vst1x3.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1, <4 x i32> %b2)
731   %tmp = getelementptr i32, ptr %a, i32 12
732   ret ptr %tmp
735 define arm_aapcs_vfpcc ptr @test_vst1q_u64_x3_post_imm(ptr %a, %struct.uint64x2x3_t %b) nounwind {
736 ; CHECK-LABEL: test_vst1q_u64_x3_post_imm:
737 ; CHECK:         vst1.64 {d0, d1, d2}, [r0:64]!
738 ; CHECK-NEXT:    vst1.64 {d3, d4, d5}, [r0:64]!
739 ; CHECK-NEXT:    bx lr
740 entry:
741   %b0 = extractvalue %struct.uint64x2x3_t %b, 0, 0
742   %b1 = extractvalue %struct.uint64x2x3_t %b, 0, 1
743   %b2 = extractvalue %struct.uint64x2x3_t %b, 0, 2
744   tail call void @llvm.arm.neon.vst1x3.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1, <2 x i64> %b2)
745   %tmp = getelementptr i64, ptr %a, i32 6
746   ret ptr %tmp
749 define arm_aapcs_vfpcc ptr @test_vst1_u8_x4_post_imm(ptr %a, %struct.uint8x8x4_t %b) nounwind {
750 ; CHECK-LABEL: test_vst1_u8_x4_post_imm:
751 ; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0:256]!
752 ; CHECK-NEXT:    bx lr
753 entry:
754   %b0 = extractvalue %struct.uint8x8x4_t %b, 0, 0
755   %b1 = extractvalue %struct.uint8x8x4_t %b, 0, 1
756   %b2 = extractvalue %struct.uint8x8x4_t %b, 0, 2
757   %b3 = extractvalue %struct.uint8x8x4_t %b, 0, 3
758   tail call void @llvm.arm.neon.vst1x4.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1, <8 x i8> %b2, <8 x i8> %b3)
759   %tmp = getelementptr i8, ptr %a, i32 32
760   ret ptr %tmp
763 define arm_aapcs_vfpcc ptr @test_vst1_u8_x4_post_reg(ptr %a, %struct.uint8x8x4_t %b, i32 %inc) nounwind {
764 ; CHECK-LABEL: test_vst1_u8_x4_post_reg:
765 ; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0:256], r1
766 ; CHECK-NEXT:    bx lr
767 entry:
768   %b0 = extractvalue %struct.uint8x8x4_t %b, 0, 0
769   %b1 = extractvalue %struct.uint8x8x4_t %b, 0, 1
770   %b2 = extractvalue %struct.uint8x8x4_t %b, 0, 2
771   %b3 = extractvalue %struct.uint8x8x4_t %b, 0, 3
772   tail call void @llvm.arm.neon.vst1x4.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1, <8 x i8> %b2, <8 x i8> %b3)
773   %tmp = getelementptr i8, ptr %a, i32 %inc
774   ret ptr %tmp
777 define arm_aapcs_vfpcc ptr @test_vst1_u16_x4_post_imm(ptr %a, %struct.uint16x4x4_t %b) nounwind {
778 ; CHECK-LABEL: test_vst1_u16_x4_post_imm:
779 ; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0:256]!
780 ; CHECK-NEXT:    bx lr
781   %b0 = extractvalue %struct.uint16x4x4_t %b, 0, 0
782   %b1 = extractvalue %struct.uint16x4x4_t %b, 0, 1
783   %b2 = extractvalue %struct.uint16x4x4_t %b, 0, 2
784   %b3 = extractvalue %struct.uint16x4x4_t %b, 0, 3
785   tail call void @llvm.arm.neon.vst1x4.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1, <4 x i16> %b2, <4 x i16> %b3)
786   %tmp = getelementptr i16, ptr %a, i32 16
787   ret ptr %tmp
790 define arm_aapcs_vfpcc ptr @test_vst1_u16_x4_post_reg(ptr %a, %struct.uint16x4x4_t %b, i32 %inc) nounwind {
791 ; CHECK-LABEL: test_vst1_u16_x4_post_reg:
792 ; CHECK:         lsl r1, r1, #1
793 ; CHECK-NEXT:    vst1.16 {d0, d1, d2, d3}, [r0:256], r1
794 ; CHECK-NEXT:    bx lr
795   %b0 = extractvalue %struct.uint16x4x4_t %b, 0, 0
796   %b1 = extractvalue %struct.uint16x4x4_t %b, 0, 1
797   %b2 = extractvalue %struct.uint16x4x4_t %b, 0, 2
798   %b3 = extractvalue %struct.uint16x4x4_t %b, 0, 3
799   tail call void @llvm.arm.neon.vst1x4.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1, <4 x i16> %b2, <4 x i16> %b3)
800   %tmp = getelementptr i16, ptr %a, i32 %inc
801   ret ptr %tmp
804 define arm_aapcs_vfpcc ptr @test_vst1_u32_x4_post_imm(ptr %a, %struct.uint32x2x4_t %b) nounwind {
805 ; CHECK-LABEL: test_vst1_u32_x4_post_imm:
806 ; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0:256]!
807 ; CHECK-NEXT:    bx lr
808 entry:
809   %b0 = extractvalue %struct.uint32x2x4_t %b, 0, 0
810   %b1 = extractvalue %struct.uint32x2x4_t %b, 0, 1
811   %b2 = extractvalue %struct.uint32x2x4_t %b, 0, 2
812   %b3 = extractvalue %struct.uint32x2x4_t %b, 0, 3
813   tail call void @llvm.arm.neon.vst1x4.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1, <2 x i32> %b2, <2 x i32> %b3)
814   %tmp = getelementptr i32, ptr %a, i32 8
815   ret ptr %tmp
818 define arm_aapcs_vfpcc ptr @test_vst1_u32_x4_post_reg(ptr %a, %struct.uint32x2x4_t %b, i32 %inc) nounwind {
819 ; CHECK-LABEL: test_vst1_u32_x4_post_reg:
820 ; CHECK:         lsl r1, r1, #2
821 ; CHECK-NEXT:    vst1.32 {d0, d1, d2, d3}, [r0:256], r1
822 ; CHECK-NEXT:    bx lr
823 entry:
824   %b0 = extractvalue %struct.uint32x2x4_t %b, 0, 0
825   %b1 = extractvalue %struct.uint32x2x4_t %b, 0, 1
826   %b2 = extractvalue %struct.uint32x2x4_t %b, 0, 2
827   %b3 = extractvalue %struct.uint32x2x4_t %b, 0, 3
828   tail call void @llvm.arm.neon.vst1x4.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1, <2 x i32> %b2, <2 x i32> %b3)
829   %tmp = getelementptr i32, ptr %a, i32 %inc
830   ret ptr %tmp
833 define arm_aapcs_vfpcc ptr @test_vst1_u64_x4_post_imm(ptr %a, %struct.uint64x1x4_t %b) nounwind {
834 ; CHECK-LABEL: test_vst1_u64_x4_post_imm:
835 ; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0:256]!
836 ; CHECK-NEXT:    bx lr
837 entry:
838   %b0 = extractvalue %struct.uint64x1x4_t %b, 0, 0
839   %b1 = extractvalue %struct.uint64x1x4_t %b, 0, 1
840   %b2 = extractvalue %struct.uint64x1x4_t %b, 0, 2
841   %b3 = extractvalue %struct.uint64x1x4_t %b, 0, 3
842   tail call void @llvm.arm.neon.vst1x4.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1, <1 x i64> %b2, <1 x i64> %b3)
843   %tmp = getelementptr i64, ptr %a, i32 4
844   ret ptr %tmp
847 define arm_aapcs_vfpcc ptr @test_vst1_u64_x4_post_reg(ptr %a, %struct.uint64x1x4_t %b, i32 %inc) nounwind {
848 ; CHECK-LABEL: test_vst1_u64_x4_post_reg:
849 ; CHECK:         lsl r1, r1, #3
850 ; CHECK-NEXT:    vst1.64 {d0, d1, d2, d3}, [r0:256], r1
851 ; CHECK-NEXT:    bx lr
852 entry:
853   %b0 = extractvalue %struct.uint64x1x4_t %b, 0, 0
854   %b1 = extractvalue %struct.uint64x1x4_t %b, 0, 1
855   %b2 = extractvalue %struct.uint64x1x4_t %b, 0, 2
856   %b3 = extractvalue %struct.uint64x1x4_t %b, 0, 3
857   tail call void @llvm.arm.neon.vst1x4.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1, <1 x i64> %b2, <1 x i64> %b3)
858   %tmp = getelementptr i64, ptr %a, i32 %inc
859   ret ptr %tmp
862 define arm_aapcs_vfpcc ptr @test_vst1q_u8_x4_post_imm(ptr %a, %struct.uint8x16x4_t %b) nounwind {
863 ; CHECK-LABEL: test_vst1q_u8_x4_post_imm:
864 ; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0:256]!
865 ; CHECK-NEXT:    vst1.8 {d4, d5, d6, d7}, [r0:256]!
866 ; CHECK-NEXT:    bx lr
867 entry:
868   %b0 = extractvalue %struct.uint8x16x4_t %b, 0, 0
869   %b1 = extractvalue %struct.uint8x16x4_t %b, 0, 1
870   %b2 = extractvalue %struct.uint8x16x4_t %b, 0, 2
871   %b3 = extractvalue %struct.uint8x16x4_t %b, 0, 3
872   tail call void @llvm.arm.neon.vst1x4.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1, <16 x i8> %b2, <16 x i8> %b3)
873   %tmp = getelementptr i8, ptr %a, i32 64
874   ret ptr %tmp
877 define arm_aapcs_vfpcc ptr @test_vst1q_u16_x4_post_imm(ptr %a, %struct.uint16x8x4_t %b) nounwind {
878 ; CHECK-LABEL: test_vst1q_u16_x4_post_imm:
879 ; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0:256]!
880 ; CHECK-NEXT:    vst1.16 {d4, d5, d6, d7}, [r0:256]!
881 ; CHECK-NEXT:    bx lr
882 entry:
883   %b0 = extractvalue %struct.uint16x8x4_t %b, 0, 0
884   %b1 = extractvalue %struct.uint16x8x4_t %b, 0, 1
885   %b2 = extractvalue %struct.uint16x8x4_t %b, 0, 2
886   %b3 = extractvalue %struct.uint16x8x4_t %b, 0, 3
887   tail call void @llvm.arm.neon.vst1x4.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1, <8 x i16> %b2, <8 x i16> %b3)
888   %tmp = getelementptr i16, ptr %a, i32 32
889   ret ptr %tmp
892 define arm_aapcs_vfpcc ptr @test_vst1q_u32_x4_post_imm(ptr %a, %struct.uint32x4x4_t %b) nounwind {
893 ; CHECK-LABEL: test_vst1q_u32_x4_post_imm:
894 ; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0:256]!
895 ; CHECK-NEXT:    vst1.32 {d4, d5, d6, d7}, [r0:256]!
896 ; CHECK-NEXT:    bx lr
897 entry:
898   %b0 = extractvalue %struct.uint32x4x4_t %b, 0, 0
899   %b1 = extractvalue %struct.uint32x4x4_t %b, 0, 1
900   %b2 = extractvalue %struct.uint32x4x4_t %b, 0, 2
901   %b3 = extractvalue %struct.uint32x4x4_t %b, 0, 3
902   tail call void @llvm.arm.neon.vst1x4.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1, <4 x i32> %b2, <4 x i32> %b3)
903   %tmp = getelementptr i32, ptr %a, i32 16
904   ret ptr %tmp
907 define arm_aapcs_vfpcc ptr @test_vst1q_u64_x4_post_imm(ptr %a, %struct.uint64x2x4_t %b) nounwind {
908 ; CHECK-LABEL: test_vst1q_u64_x4_post_imm:
909 ; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0:256]!
910 ; CHECK-NEXT:    vst1.64 {d4, d5, d6, d7}, [r0:256]!
911 ; CHECK-NEXT:    bx lr
912 entry:
913   %b0 = extractvalue %struct.uint64x2x4_t %b, 0, 0
914   %b1 = extractvalue %struct.uint64x2x4_t %b, 0, 1
915   %b2 = extractvalue %struct.uint64x2x4_t %b, 0, 2
916   %b3 = extractvalue %struct.uint64x2x4_t %b, 0, 3
917   tail call void @llvm.arm.neon.vst1x4.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1, <2 x i64> %b2, <2 x i64> %b3)
918   %tmp = getelementptr i64, ptr %a, i32 8
919   ret ptr %tmp