xref: /llvm-project/llvm/test/CodeGen/ARM/arm-vst1.ll (revision a7697c86559e9d57c9c0e2b5f2daaa5cec4e5119)
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
3
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> }
7
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> }
11
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> }
15
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> }
19
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> }
23
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> }
27
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> }
31
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> }
35
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>] }
60
61declare void @llvm.arm.neon.vst1x2.p0.v4i16(ptr nocapture, <4 x i16>, <4 x i16>) argmemonly nounwind
62declare void @llvm.arm.neon.vst1x3.p0.v4i16(ptr nocapture, <4 x i16>, <4 x i16>, <4 x i16>) argmemonly nounwind
63declare void @llvm.arm.neon.vst1x4.p0.v4i16(ptr nocapture, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>) argmemonly nounwind
64
65declare void @llvm.arm.neon.vst1x2.p0.v2i32(ptr nocapture, <2 x i32>, <2 x i32>) argmemonly nounwind
66declare void @llvm.arm.neon.vst1x3.p0.v2i32(ptr nocapture, <2 x i32>, <2 x i32>, <2 x i32>) argmemonly nounwind
67declare void @llvm.arm.neon.vst1x4.p0.v2i32(ptr nocapture, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>) argmemonly nounwind
68
69declare void @llvm.arm.neon.vst1x2.p0.v1i64(ptr nocapture, <1 x i64>, <1 x i64>) argmemonly nounwind
70declare void @llvm.arm.neon.vst1x3.p0.v1i64(ptr nocapture, <1 x i64>, <1 x i64>, <1 x i64>) argmemonly nounwind
71declare void @llvm.arm.neon.vst1x4.p0.v1i64(ptr nocapture, <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64>) argmemonly nounwind
72
73declare void @llvm.arm.neon.vst1x2.p0.v8i8(ptr nocapture, <8 x i8>, <8 x i8>) argmemonly nounwind
74declare void @llvm.arm.neon.vst1x3.p0.v8i8(ptr nocapture, <8 x i8>, <8 x i8>, <8 x i8>) argmemonly nounwind
75declare void @llvm.arm.neon.vst1x4.p0.v8i8(ptr nocapture, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>) argmemonly nounwind
76
77declare void @llvm.arm.neon.vst1x2.p0.v8i16(ptr nocapture, <8 x i16>, <8 x i16>) argmemonly nounwind
78declare void @llvm.arm.neon.vst1x3.p0.v8i16(ptr nocapture, <8 x i16>, <8 x i16>, <8 x i16>) argmemonly nounwind
79declare void @llvm.arm.neon.vst1x4.p0.v8i16(ptr nocapture, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>) argmemonly nounwind
80
81declare void @llvm.arm.neon.vst1x2.p0.v4i32(ptr nocapture, <4 x i32>, <4 x i32>) argmemonly nounwind
82declare void @llvm.arm.neon.vst1x3.p0.v4i32(ptr nocapture, <4 x i32>, <4 x i32>, <4 x i32>) argmemonly nounwind
83declare void @llvm.arm.neon.vst1x4.p0.v4i32(ptr nocapture, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) argmemonly nounwind
84
85declare void @llvm.arm.neon.vst1x2.p0.v2i64(ptr nocapture, <2 x i64>, <2 x i64>) argmemonly nounwind
86declare void @llvm.arm.neon.vst1x3.p0.v2i64(ptr nocapture, <2 x i64>, <2 x i64>, <2 x i64>) argmemonly nounwind
87declare void @llvm.arm.neon.vst1x4.p0.v2i64(ptr nocapture, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) argmemonly nounwind
88
89declare void @llvm.arm.neon.vst1x2.p0.v16i8(ptr nocapture, <16 x i8>, <16 x i8>) argmemonly nounwind
90declare void @llvm.arm.neon.vst1x3.p0.v16i8(ptr nocapture, <16 x i8>, <16 x i8>, <16 x i8>) argmemonly nounwind
91declare void @llvm.arm.neon.vst1x4.p0.v16i8(ptr nocapture, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>) argmemonly nounwind
92
93define 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]
96; CHECK-NEXT:    bx lr
97entry:
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
102}
103
104define arm_aapcs_vfpcc void @test_vst1_u16_x2_align8(ptr %a, %struct.uint16x4x2_t %b) nounwind {
105; CHECK-LABEL: test_vst1_u16_x2_align8:
106; CHECK:         vst1.16 {d0, d1}, [r0:64]
107; CHECK-NEXT:    bx lr
108entry:
109  %b0 = extractvalue %struct.uint16x4x2_t %b, 0, 0
110  %b1 = extractvalue %struct.uint16x4x2_t %b, 0, 1
111  tail call void @llvm.arm.neon.vst1x2.p0.v4i16(ptr align 8 %a, <4 x i16> %b0, <4 x i16> %b1)
112  ret void
113}
114
115define arm_aapcs_vfpcc void @test_vst1_u16_x2_align16(ptr %a, %struct.uint16x4x2_t %b) nounwind {
116; CHECK-LABEL: test_vst1_u16_x2_align16:
117; CHECK:         vst1.16 {d0, d1}, [r0:128]
118; CHECK-NEXT:    bx lr
119entry:
120  %b0 = extractvalue %struct.uint16x4x2_t %b, 0, 0
121  %b1 = extractvalue %struct.uint16x4x2_t %b, 0, 1
122  tail call void @llvm.arm.neon.vst1x2.p0.v4i16(ptr align 16 %a, <4 x i16> %b0, <4 x i16> %b1)
123  ret void
124}
125
126define arm_aapcs_vfpcc void @test_vst1_u16_x2_align32(ptr %a, %struct.uint16x4x2_t %b) nounwind {
127; CHECK-LABEL: test_vst1_u16_x2_align32:
128; CHECK:         vst1.16 {d0, d1}, [r0:128]
129; CHECK-NEXT:    bx lr
130entry:
131  %b0 = extractvalue %struct.uint16x4x2_t %b, 0, 0
132  %b1 = extractvalue %struct.uint16x4x2_t %b, 0, 1
133  tail call void @llvm.arm.neon.vst1x2.p0.v4i16(ptr align 32 %a, <4 x i16> %b0, <4 x i16> %b1)
134  ret void
135}
136
137define arm_aapcs_vfpcc void @test_vst1_u16_x3(ptr %a, %struct.uint16x4x3_t %b) nounwind {
138; CHECK-LABEL: test_vst1_u16_x3:
139; CHECK:         vst1.16 {d0, d1, d2}, [r0]
140; CHECK-NEXT:    bx lr
141entry:
142  %b0 = extractvalue %struct.uint16x4x3_t %b, 0, 0
143  %b1 = extractvalue %struct.uint16x4x3_t %b, 0, 1
144  %b2 = extractvalue %struct.uint16x4x3_t %b, 0, 2
145  tail call void @llvm.arm.neon.vst1x3.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1, <4 x i16> %b2)
146  ret void
147}
148
149define arm_aapcs_vfpcc void @test_vst1_u16_x4(ptr %a, %struct.uint16x4x4_t %b) nounwind {
150; CHECK-LABEL: test_vst1_u16_x4:
151; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0]
152; CHECK-NEXT:    bx lr
153entry:
154  %b0 = extractvalue %struct.uint16x4x4_t %b, 0, 0
155  %b1 = extractvalue %struct.uint16x4x4_t %b, 0, 1
156  %b2 = extractvalue %struct.uint16x4x4_t %b, 0, 2
157  %b3 = extractvalue %struct.uint16x4x4_t %b, 0, 3
158  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)
159  ret void
160}
161
162define arm_aapcs_vfpcc void @test_vst1_u32_x2(ptr %a, %struct.uint32x2x2_t %b) nounwind {
163; CHECK-LABEL: test_vst1_u32_x2:
164; CHECK:         vst1.32 {d0, d1}, [r0]
165; CHECK-NEXT:    bx lr
166entry:
167  %b0 = extractvalue %struct.uint32x2x2_t %b, 0, 0
168  %b1 = extractvalue %struct.uint32x2x2_t %b, 0, 1
169  tail call void @llvm.arm.neon.vst1x2.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1)
170  ret void
171}
172
173define arm_aapcs_vfpcc void @test_vst1_u32_x3(ptr %a, %struct.uint32x2x3_t %b) nounwind {
174; CHECK-LABEL: test_vst1_u32_x3:
175; CHECK:         vst1.32 {d0, d1, d2}, [r0]
176; CHECK-NEXT:    bx lr
177entry:
178  %b0 = extractvalue %struct.uint32x2x3_t %b, 0, 0
179  %b1 = extractvalue %struct.uint32x2x3_t %b, 0, 1
180  %b2 = extractvalue %struct.uint32x2x3_t %b, 0, 2
181  tail call void @llvm.arm.neon.vst1x3.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1, <2 x i32> %b2)
182  ret void
183}
184
185define arm_aapcs_vfpcc void @test_vst1_u32_x4(ptr %a, %struct.uint32x2x4_t %b) nounwind {
186; CHECK-LABEL: test_vst1_u32_x4:
187; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0]
188; CHECK-NEXT:    bx lr
189entry:
190  %b0 = extractvalue %struct.uint32x2x4_t %b, 0, 0
191  %b1 = extractvalue %struct.uint32x2x4_t %b, 0, 1
192  %b2 = extractvalue %struct.uint32x2x4_t %b, 0, 2
193  %b3 = extractvalue %struct.uint32x2x4_t %b, 0, 3
194  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)
195  ret void
196}
197
198define arm_aapcs_vfpcc void @test_vst1_u64_x2(ptr %a, %struct.uint64x1x2_t %b) nounwind {
199; CHECK-LABEL: test_vst1_u64_x2:
200; CHECK:         vst1.64 {d0, d1}, [r0]
201; CHECK-NEXT:    bx lr
202entry:
203  %b0 = extractvalue %struct.uint64x1x2_t %b, 0, 0
204  %b1 = extractvalue %struct.uint64x1x2_t %b, 0, 1
205  tail call void @llvm.arm.neon.vst1x2.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1)
206  ret void
207}
208
209define arm_aapcs_vfpcc void @test_vst1_u64_x3(ptr %a, %struct.uint64x1x3_t %b) nounwind {
210; CHECK-LABEL: test_vst1_u64_x3:
211; CHECK:         vst1.64 {d0, d1, d2}, [r0]
212; CHECK-NEXT:    bx lr
213entry:
214  %b0 = extractvalue %struct.uint64x1x3_t %b, 0, 0
215  %b1 = extractvalue %struct.uint64x1x3_t %b, 0, 1
216  %b2 = extractvalue %struct.uint64x1x3_t %b, 0, 2
217  tail call void @llvm.arm.neon.vst1x3.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1, <1 x i64> %b2)
218  ret void
219}
220
221define arm_aapcs_vfpcc void @test_vst1_u64_x4(ptr %a, %struct.uint64x1x4_t %b) nounwind {
222; CHECK-LABEL: test_vst1_u64_x4:
223; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0]
224; CHECK-NEXT:    bx lr
225entry:
226  %b0 = extractvalue %struct.uint64x1x4_t %b, 0, 0
227  %b1 = extractvalue %struct.uint64x1x4_t %b, 0, 1
228  %b2 = extractvalue %struct.uint64x1x4_t %b, 0, 2
229  %b3 = extractvalue %struct.uint64x1x4_t %b, 0, 3
230  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)
231  ret void
232}
233
234define arm_aapcs_vfpcc void @test_vst1_u8_x2(ptr %a, %struct.uint8x8x2_t %b) nounwind {
235; CHECK-LABEL: test_vst1_u8_x2:
236; CHECK:         vst1.8 {d0, d1}, [r0]
237; CHECK-NEXT:    bx lr
238entry:
239  %b0 = extractvalue %struct.uint8x8x2_t %b, 0, 0
240  %b1 = extractvalue %struct.uint8x8x2_t %b, 0, 1
241  tail call void @llvm.arm.neon.vst1x2.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1)
242  ret void
243}
244
245define arm_aapcs_vfpcc void @test_vst1_u8_x3(ptr %a, %struct.uint8x8x3_t %b) nounwind {
246; CHECK-LABEL: test_vst1_u8_x3:
247; CHECK:         vst1.8 {d0, d1, d2}, [r0]
248; CHECK-NEXT:    bx lr
249entry:
250  %b0 = extractvalue %struct.uint8x8x3_t %b, 0, 0
251  %b1 = extractvalue %struct.uint8x8x3_t %b, 0, 1
252  %b2 = extractvalue %struct.uint8x8x3_t %b, 0, 2
253  tail call void @llvm.arm.neon.vst1x3.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1, <8 x i8> %b2)
254  ret void
255}
256
257define arm_aapcs_vfpcc void @test_vst1_u8_x4(ptr %a, %struct.uint8x8x4_t %b) nounwind {
258; CHECK-LABEL: test_vst1_u8_x4:
259; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0]
260; CHECK-NEXT:    bx lr
261entry:
262  %b0 = extractvalue %struct.uint8x8x4_t %b, 0, 0
263  %b1 = extractvalue %struct.uint8x8x4_t %b, 0, 1
264  %b2 = extractvalue %struct.uint8x8x4_t %b, 0, 2
265  %b3 = extractvalue %struct.uint8x8x4_t %b, 0, 3
266  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)
267  ret void
268}
269
270define arm_aapcs_vfpcc void @test_vst1q_u16_x2(ptr %a, %struct.uint16x8x2_t %b) nounwind {
271; CHECK-LABEL: test_vst1q_u16_x2:
272; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0]
273; CHECK-NEXT:    bx lr
274entry:
275  %b0 = extractvalue %struct.uint16x8x2_t %b, 0, 0
276  %b1 = extractvalue %struct.uint16x8x2_t %b, 0, 1
277  tail call void @llvm.arm.neon.vst1x2.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1)
278  ret void
279}
280
281define arm_aapcs_vfpcc void @test_vst1q_u16_x3(ptr %a, %struct.uint16x8x3_t %b) nounwind {
282; CHECK-LABEL: test_vst1q_u16_x3:
283; CHECK:         vst1.16 {d0, d1, d2}, [r0]!
284; CHECK-NEXT:    vst1.16 {d3, d4, d5}, [r0]
285; CHECK-NEXT:    bx lr
286entry:
287  %b0 = extractvalue %struct.uint16x8x3_t %b, 0, 0
288  %b1 = extractvalue %struct.uint16x8x3_t %b, 0, 1
289  %b2 = extractvalue %struct.uint16x8x3_t %b, 0, 2
290  tail call void @llvm.arm.neon.vst1x3.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1, <8 x i16> %b2)
291  ret void
292}
293
294define arm_aapcs_vfpcc void @test_vst1q_u16_x4(ptr %a, %struct.uint16x8x4_t %b) nounwind {
295; CHECK-LABEL: test_vst1q_u16_x4:
296; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0]!
297; CHECK-NEXT:    vst1.16 {d4, d5, d6, d7}, [r0]
298; CHECK-NEXT:    bx lr
299entry:
300  %b0 = extractvalue %struct.uint16x8x4_t %b, 0, 0
301  %b1 = extractvalue %struct.uint16x8x4_t %b, 0, 1
302  %b2 = extractvalue %struct.uint16x8x4_t %b, 0, 2
303  %b3 = extractvalue %struct.uint16x8x4_t %b, 0, 3
304  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)
305  ret void
306}
307
308define arm_aapcs_vfpcc void @test_vst1q_u32_x2(ptr %a, %struct.uint32x4x2_t %b) nounwind {
309; CHECK-LABEL: test_vst1q_u32_x2:
310; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0]
311; CHECK-NEXT:    bx lr
312entry:
313  %b0 = extractvalue %struct.uint32x4x2_t %b, 0, 0
314  %b1 = extractvalue %struct.uint32x4x2_t %b, 0, 1
315  tail call void @llvm.arm.neon.vst1x2.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1)
316  ret void
317}
318
319define arm_aapcs_vfpcc void @test_vst1q_u32_x3(ptr %a, %struct.uint32x4x3_t %b) nounwind {
320; CHECK-LABEL: test_vst1q_u32_x3:
321; CHECK:         vst1.32 {d0, d1, d2}, [r0]!
322; CHECK-NEXT:    vst1.32 {d3, d4, d5}, [r0]
323; CHECK-NEXT:    bx lr
324entry:
325  %b0 = extractvalue %struct.uint32x4x3_t %b, 0, 0
326  %b1 = extractvalue %struct.uint32x4x3_t %b, 0, 1
327  %b2 = extractvalue %struct.uint32x4x3_t %b, 0, 2
328  tail call void @llvm.arm.neon.vst1x3.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1, <4 x i32> %b2)
329  ret void
330}
331
332define arm_aapcs_vfpcc void @test_vst1q_u32_x4(ptr %a, %struct.uint32x4x4_t %b) nounwind {
333; CHECK-LABEL: test_vst1q_u32_x4:
334; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0]!
335; CHECK-NEXT:    vst1.32 {d4, d5, d6, d7}, [r0]
336; CHECK-NEXT:    bx lr
337entry:
338  %b0 = extractvalue %struct.uint32x4x4_t %b, 0, 0
339  %b1 = extractvalue %struct.uint32x4x4_t %b, 0, 1
340  %b2 = extractvalue %struct.uint32x4x4_t %b, 0, 2
341  %b3 = extractvalue %struct.uint32x4x4_t %b, 0, 3
342  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)
343  ret void
344}
345
346define arm_aapcs_vfpcc void @test_vst1q_u64_x2(ptr %a, %struct.uint64x2x2_t %b) nounwind {
347; CHECK-LABEL: test_vst1q_u64_x2:
348; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0]
349; CHECK-NEXT:    bx lr
350entry:
351  %b0 = extractvalue %struct.uint64x2x2_t %b, 0, 0
352  %b1 = extractvalue %struct.uint64x2x2_t %b, 0, 1
353  tail call void @llvm.arm.neon.vst1x2.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1)
354  ret void
355}
356
357define arm_aapcs_vfpcc void @test_vst1q_u64_x3(ptr %a, %struct.uint64x2x3_t %b) nounwind {
358; CHECK-LABEL: test_vst1q_u64_x3:
359; CHECK:         vst1.64 {d0, d1, d2}, [r0]!
360; CHECK-NEXT:    vst1.64 {d3, d4, d5}, [r0]
361; CHECK-NEXT:    bx lr
362entry:
363  %b0 = extractvalue %struct.uint64x2x3_t %b, 0, 0
364  %b1 = extractvalue %struct.uint64x2x3_t %b, 0, 1
365  %b2 = extractvalue %struct.uint64x2x3_t %b, 0, 2
366  tail call void @llvm.arm.neon.vst1x3.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1, <2 x i64> %b2)
367  ret void
368}
369
370define arm_aapcs_vfpcc void @test_vst1q_u64_x4(ptr %a, %struct.uint64x2x4_t %b) nounwind {
371; CHECK-LABEL: test_vst1q_u64_x4:
372; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0]!
373; CHECK-NEXT:    vst1.64 {d4, d5, d6, d7}, [r0]
374; CHECK-NEXT:    bx lr
375entry:
376  %b0 = extractvalue %struct.uint64x2x4_t %b, 0, 0
377  %b1 = extractvalue %struct.uint64x2x4_t %b, 0, 1
378  %b2 = extractvalue %struct.uint64x2x4_t %b, 0, 2
379  %b3 = extractvalue %struct.uint64x2x4_t %b, 0, 3
380  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)
381  ret void
382}
383
384define arm_aapcs_vfpcc void @test_vst1q_u8_x2(ptr %a, %struct.uint8x16x2_t %b) nounwind {
385; CHECK-LABEL: test_vst1q_u8_x2:
386; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0]
387; CHECK-NEXT:    bx lr
388entry:
389  %b0 = extractvalue %struct.uint8x16x2_t %b, 0, 0
390  %b1 = extractvalue %struct.uint8x16x2_t %b, 0, 1
391  tail call void @llvm.arm.neon.vst1x2.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1)
392  ret void
393}
394
395define arm_aapcs_vfpcc void @test_vst1q_u8_x3(ptr %a, %struct.uint8x16x3_t %b) nounwind {
396; CHECK-LABEL: test_vst1q_u8_x3:
397; CHECK:         vst1.8 {d0, d1, d2}, [r0]!
398; CHECK-NEXT:    vst1.8 {d3, d4, d5}, [r0]
399; CHECK-NEXT:    bx lr
400entry:
401  %b0 = extractvalue %struct.uint8x16x3_t %b, 0, 0
402  %b1 = extractvalue %struct.uint8x16x3_t %b, 0, 1
403  %b2 = extractvalue %struct.uint8x16x3_t %b, 0, 2
404  tail call void @llvm.arm.neon.vst1x3.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1, <16 x i8> %b2)
405  ret void
406}
407
408define arm_aapcs_vfpcc void @test_vst1q_u8_x4(ptr %a, %struct.uint8x16x4_t %b) nounwind {
409; CHECK-LABEL: test_vst1q_u8_x4:
410; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0]!
411; CHECK-NEXT:    vst1.8 {d4, d5, d6, d7}, [r0]
412; CHECK-NEXT:    bx lr
413entry:
414  %b0 = extractvalue %struct.uint8x16x4_t %b, 0, 0
415  %b1 = extractvalue %struct.uint8x16x4_t %b, 0, 1
416  %b2 = extractvalue %struct.uint8x16x4_t %b, 0, 2
417  %b3 = extractvalue %struct.uint8x16x4_t %b, 0, 3
418  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)
419  ret void
420}
421
422; Post increment
423
424define arm_aapcs_vfpcc ptr @test_vst1_u8_x2_post_imm(ptr %a, %struct.uint8x8x2_t %b) nounwind {
425; CHECK-LABEL: test_vst1_u8_x2_post_imm:
426; CHECK:         vst1.8 {d0, d1}, [r0]!
427; CHECK-NEXT:    bx lr
428entry:
429  %b0 = extractvalue %struct.uint8x8x2_t %b, 0, 0
430  %b1 = extractvalue %struct.uint8x8x2_t %b, 0, 1
431  tail call void @llvm.arm.neon.vst1x2.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1)
432  %tmp = getelementptr i8, ptr %a, i32 16
433  ret ptr %tmp
434}
435
436define arm_aapcs_vfpcc ptr @test_vst1_u8_x2_post_reg(ptr %a, %struct.uint8x8x2_t %b, i32 %inc) nounwind {
437; CHECK-LABEL: test_vst1_u8_x2_post_reg:
438; CHECK:         vst1.8 {d0, d1}, [r0], r1
439; CHECK-NEXT:    bx lr
440entry:
441  %b0 = extractvalue %struct.uint8x8x2_t %b, 0, 0
442  %b1 = extractvalue %struct.uint8x8x2_t %b, 0, 1
443  tail call void @llvm.arm.neon.vst1x2.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1)
444  %tmp = getelementptr i8, ptr %a, i32 %inc
445  ret ptr %tmp
446}
447
448define arm_aapcs_vfpcc ptr @test_vst1_u16_x2_post_imm(ptr %a, %struct.uint16x4x2_t %b) nounwind {
449; CHECK-LABEL: test_vst1_u16_x2_post_imm:
450; CHECK:         vst1.16 {d0, d1}, [r0]!
451; CHECK-NEXT:    bx lr
452  %b0 = extractvalue %struct.uint16x4x2_t %b, 0, 0
453  %b1 = extractvalue %struct.uint16x4x2_t %b, 0, 1
454  tail call void @llvm.arm.neon.vst1x2.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1)
455  %tmp = getelementptr i16, ptr %a, i32 8
456  ret ptr %tmp
457}
458
459define arm_aapcs_vfpcc ptr @test_vst1_u16_x2_post_reg(ptr %a, %struct.uint16x4x2_t %b, i32 %inc) nounwind {
460; CHECK-LABEL: test_vst1_u16_x2_post_reg:
461; CHECK:         lsl r1, r1, #1
462; CHECK-NEXT:    vst1.16 {d0, d1}, [r0], r1
463; CHECK-NEXT:    bx lr
464  %b0 = extractvalue %struct.uint16x4x2_t %b, 0, 0
465  %b1 = extractvalue %struct.uint16x4x2_t %b, 0, 1
466  tail call void @llvm.arm.neon.vst1x2.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1)
467  %tmp = getelementptr i16, ptr %a, i32 %inc
468  ret ptr %tmp
469}
470
471define arm_aapcs_vfpcc ptr @test_vst1_u32_x2_post_imm(ptr %a, %struct.uint32x2x2_t %b) nounwind {
472; CHECK-LABEL: test_vst1_u32_x2_post_imm:
473; CHECK:         vst1.32 {d0, d1}, [r0]!
474; CHECK-NEXT:    bx lr
475entry:
476  %b0 = extractvalue %struct.uint32x2x2_t %b, 0, 0
477  %b1 = extractvalue %struct.uint32x2x2_t %b, 0, 1
478  tail call void @llvm.arm.neon.vst1x2.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1)
479  %tmp = getelementptr i32, ptr %a, i32 4
480  ret ptr %tmp
481}
482
483define arm_aapcs_vfpcc ptr @test_vst1_u32_x2_post_reg(ptr %a, %struct.uint32x2x2_t %b, i32 %inc) nounwind {
484; CHECK-LABEL: test_vst1_u32_x2_post_reg:
485; CHECK:         lsl r1, r1, #2
486; CHECK-NEXT:    vst1.32 {d0, d1}, [r0], r1
487; CHECK-NEXT:    bx lr
488entry:
489  %b0 = extractvalue %struct.uint32x2x2_t %b, 0, 0
490  %b1 = extractvalue %struct.uint32x2x2_t %b, 0, 1
491  tail call void @llvm.arm.neon.vst1x2.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1)
492  %tmp = getelementptr i32, ptr %a, i32 %inc
493  ret ptr %tmp
494}
495
496define arm_aapcs_vfpcc ptr @test_vst1_u64_x2_post_imm(ptr %a, %struct.uint64x1x2_t %b) nounwind {
497; CHECK-LABEL: test_vst1_u64_x2_post_imm:
498; CHECK:         vst1.64 {d0, d1}, [r0]!
499; CHECK-NEXT:    bx lr
500entry:
501  %b0 = extractvalue %struct.uint64x1x2_t %b, 0, 0
502  %b1 = extractvalue %struct.uint64x1x2_t %b, 0, 1
503  tail call void @llvm.arm.neon.vst1x2.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1)
504  %tmp = getelementptr i64, ptr %a, i32 2
505  ret ptr %tmp
506}
507
508define arm_aapcs_vfpcc ptr @test_vst1_u64_x2_post_reg(ptr %a, %struct.uint64x1x2_t %b, i32 %inc) nounwind {
509; CHECK-LABEL: test_vst1_u64_x2_post_reg:
510; CHECK:         lsl r1, r1, #3
511; CHECK-NEXT:    vst1.64 {d0, d1}, [r0], r1
512; CHECK-NEXT:    bx lr
513entry:
514  %b0 = extractvalue %struct.uint64x1x2_t %b, 0, 0
515  %b1 = extractvalue %struct.uint64x1x2_t %b, 0, 1
516  tail call void @llvm.arm.neon.vst1x2.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1)
517  %tmp = getelementptr i64, ptr %a, i32 %inc
518  ret ptr %tmp
519}
520
521define arm_aapcs_vfpcc ptr @test_vst1q_u8_x2_post_imm(ptr %a, %struct.uint8x16x2_t %b) nounwind {
522; CHECK-LABEL: test_vst1q_u8_x2_post_imm:
523; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0]!
524; CHECK-NEXT:    bx lr
525entry:
526  %b0 = extractvalue %struct.uint8x16x2_t %b, 0, 0
527  %b1 = extractvalue %struct.uint8x16x2_t %b, 0, 1
528  tail call void @llvm.arm.neon.vst1x2.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1)
529  %tmp = getelementptr i8, ptr %a, i32 32
530  ret ptr %tmp
531}
532
533define arm_aapcs_vfpcc ptr @test_vst1q_u8_x2_post_reg(ptr %a, %struct.uint8x16x2_t %b, i32 %inc) nounwind {
534; CHECK-LABEL: test_vst1q_u8_x2_post_reg:
535; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0], r1
536; CHECK-NEXT:    bx lr
537entry:
538  %b0 = extractvalue %struct.uint8x16x2_t %b, 0, 0
539  %b1 = extractvalue %struct.uint8x16x2_t %b, 0, 1
540  tail call void @llvm.arm.neon.vst1x2.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1)
541  %tmp = getelementptr i8, ptr %a, i32 %inc
542  ret ptr %tmp
543}
544
545define arm_aapcs_vfpcc ptr @test_vst1q_u16_x2_post_imm(ptr %a, %struct.uint16x8x2_t %b) nounwind {
546; CHECK-LABEL: test_vst1q_u16_x2_post_imm:
547; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0]!
548; CHECK-NEXT:    bx lr
549entry:
550  %b0 = extractvalue %struct.uint16x8x2_t %b, 0, 0
551  %b1 = extractvalue %struct.uint16x8x2_t %b, 0, 1
552  tail call void @llvm.arm.neon.vst1x2.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1)
553  %tmp = getelementptr i16, ptr %a, i32 16
554  ret ptr %tmp
555}
556
557define arm_aapcs_vfpcc ptr @test_vst1q_u16_x2_post_reg(ptr %a, %struct.uint16x8x2_t %b, i32 %inc) nounwind {
558; CHECK-LABEL: test_vst1q_u16_x2_post_reg:
559; CHECK:         lsl r1, r1, #1
560; CHECK-NEXT:    vst1.16 {d0, d1, d2, d3}, [r0], r1
561; CHECK-NEXT:    bx lr
562entry:
563  %b0 = extractvalue %struct.uint16x8x2_t %b, 0, 0
564  %b1 = extractvalue %struct.uint16x8x2_t %b, 0, 1
565  tail call void @llvm.arm.neon.vst1x2.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1)
566  %tmp = getelementptr i16, ptr %a, i32 %inc
567  ret ptr %tmp
568}
569
570define arm_aapcs_vfpcc ptr @test_vst1q_u32_x2_post_imm(ptr %a, %struct.uint32x4x2_t %b) nounwind {
571; CHECK-LABEL: test_vst1q_u32_x2_post_imm:
572; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0]!
573; CHECK-NEXT:    bx lr
574entry:
575  %b0 = extractvalue %struct.uint32x4x2_t %b, 0, 0
576  %b1 = extractvalue %struct.uint32x4x2_t %b, 0, 1
577  tail call void @llvm.arm.neon.vst1x2.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1)
578  %tmp = getelementptr i32, ptr %a, i32 8
579  ret ptr %tmp
580}
581
582define arm_aapcs_vfpcc ptr @test_vst1q_u32_x2_post_reg(ptr %a, %struct.uint32x4x2_t %b, i32 %inc) nounwind {
583; CHECK-LABEL: test_vst1q_u32_x2_post_reg:
584; CHECK:         lsl r1, r1, #2
585; CHECK-NEXT:    vst1.32 {d0, d1, d2, d3}, [r0], r1
586; CHECK-NEXT:    bx lr
587entry:
588  %b0 = extractvalue %struct.uint32x4x2_t %b, 0, 0
589  %b1 = extractvalue %struct.uint32x4x2_t %b, 0, 1
590  tail call void @llvm.arm.neon.vst1x2.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1)
591  %tmp = getelementptr i32, ptr %a, i32 %inc
592  ret ptr %tmp
593}
594
595define arm_aapcs_vfpcc ptr @test_vst1q_u64_x2_post_imm(ptr %a, %struct.uint64x2x2_t %b) nounwind {
596; CHECK-LABEL: test_vst1q_u64_x2_post_imm:
597; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0]!
598; CHECK-NEXT:    bx lr
599entry:
600  %b0 = extractvalue %struct.uint64x2x2_t %b, 0, 0
601  %b1 = extractvalue %struct.uint64x2x2_t %b, 0, 1
602  tail call void @llvm.arm.neon.vst1x2.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1)
603  %tmp = getelementptr i64, ptr %a, i32 4
604  ret ptr %tmp
605}
606
607define arm_aapcs_vfpcc ptr @test_vst1q_u64_x2_post_reg(ptr %a, %struct.uint64x2x2_t %b, i32 %inc) nounwind {
608; CHECK-LABEL: test_vst1q_u64_x2_post_reg:
609; CHECK:         lsl r1, r1, #3
610; CHECK-NEXT:    vst1.64 {d0, d1, d2, d3}, [r0], r1
611; CHECK-NEXT:    bx lr
612entry:
613  %b0 = extractvalue %struct.uint64x2x2_t %b, 0, 0
614  %b1 = extractvalue %struct.uint64x2x2_t %b, 0, 1
615  tail call void @llvm.arm.neon.vst1x2.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1)
616  %tmp = getelementptr i64, ptr %a, i32 %inc
617  ret ptr %tmp
618}
619
620
621define arm_aapcs_vfpcc ptr @test_vst1_u8_x3_post_imm(ptr %a, %struct.uint8x8x3_t %b) nounwind {
622; CHECK-LABEL: test_vst1_u8_x3_post_imm:
623; CHECK:         vst1.8 {d0, d1, d2}, [r0]!
624; CHECK-NEXT:    bx lr
625entry:
626  %b0 = extractvalue %struct.uint8x8x3_t %b, 0, 0
627  %b1 = extractvalue %struct.uint8x8x3_t %b, 0, 1
628  %b2 = extractvalue %struct.uint8x8x3_t %b, 0, 2
629  tail call void @llvm.arm.neon.vst1x3.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1, <8 x i8> %b2)
630  %tmp = getelementptr i8, ptr %a, i32 24
631  ret ptr %tmp
632}
633
634define arm_aapcs_vfpcc ptr @test_vst1_u8_x3_post_reg(ptr %a, %struct.uint8x8x3_t %b, i32 %inc) nounwind {
635; CHECK-LABEL: test_vst1_u8_x3_post_reg:
636; CHECK:         vst1.8 {d0, d1, d2}, [r0], r1
637; CHECK-NEXT:    bx lr
638entry:
639  %b0 = extractvalue %struct.uint8x8x3_t %b, 0, 0
640  %b1 = extractvalue %struct.uint8x8x3_t %b, 0, 1
641  %b2 = extractvalue %struct.uint8x8x3_t %b, 0, 2
642  tail call void @llvm.arm.neon.vst1x3.p0.v8i8(ptr %a, <8 x i8> %b0, <8 x i8> %b1, <8 x i8> %b2)
643  %tmp = getelementptr i8, ptr %a, i32 %inc
644  ret ptr %tmp
645}
646
647define arm_aapcs_vfpcc ptr @test_vst1_u16_x3_post_imm(ptr %a, %struct.uint16x4x3_t %b) nounwind {
648; CHECK-LABEL: test_vst1_u16_x3_post_imm:
649; CHECK:         vst1.16 {d0, d1, d2}, [r0]!
650; CHECK-NEXT:    bx lr
651  %b0 = extractvalue %struct.uint16x4x3_t %b, 0, 0
652  %b1 = extractvalue %struct.uint16x4x3_t %b, 0, 1
653  %b2 = extractvalue %struct.uint16x4x3_t %b, 0, 2
654  tail call void @llvm.arm.neon.vst1x3.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1, <4 x i16> %b2)
655  %tmp = getelementptr i16, ptr %a, i32 12
656  ret ptr %tmp
657}
658
659define arm_aapcs_vfpcc ptr @test_vst1_u16_x3_post_reg(ptr %a, %struct.uint16x4x3_t %b, i32 %inc) nounwind {
660; CHECK-LABEL: test_vst1_u16_x3_post_reg:
661; CHECK:         lsl r1, r1, #1
662; CHECK-NEXT:    vst1.16 {d0, d1, d2}, [r0], r1
663; CHECK-NEXT:    bx lr
664  %b0 = extractvalue %struct.uint16x4x3_t %b, 0, 0
665  %b1 = extractvalue %struct.uint16x4x3_t %b, 0, 1
666  %b2 = extractvalue %struct.uint16x4x3_t %b, 0, 2
667  tail call void @llvm.arm.neon.vst1x3.p0.v4i16(ptr %a, <4 x i16> %b0, <4 x i16> %b1, <4 x i16> %b2)
668  %tmp = getelementptr i16, ptr %a, i32 %inc
669  ret ptr %tmp
670}
671
672define arm_aapcs_vfpcc ptr @test_vst1_u32_x3_post_imm(ptr %a, %struct.uint32x2x3_t %b) nounwind {
673; CHECK-LABEL: test_vst1_u32_x3_post_imm:
674; CHECK:         vst1.32 {d0, d1, d2}, [r0]!
675; CHECK-NEXT:    bx lr
676entry:
677  %b0 = extractvalue %struct.uint32x2x3_t %b, 0, 0
678  %b1 = extractvalue %struct.uint32x2x3_t %b, 0, 1
679  %b2 = extractvalue %struct.uint32x2x3_t %b, 0, 2
680  tail call void @llvm.arm.neon.vst1x3.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1, <2 x i32> %b2)
681  %tmp = getelementptr i32, ptr %a, i32 6
682  ret ptr %tmp
683}
684
685define arm_aapcs_vfpcc ptr @test_vst1_u32_x3_post_reg(ptr %a, %struct.uint32x2x3_t %b, i32 %inc) nounwind {
686; CHECK-LABEL: test_vst1_u32_x3_post_reg:
687; CHECK:         lsl r1, r1, #2
688; CHECK-NEXT:    vst1.32 {d0, d1, d2}, [r0], r1
689; CHECK-NEXT:    bx lr
690entry:
691  %b0 = extractvalue %struct.uint32x2x3_t %b, 0, 0
692  %b1 = extractvalue %struct.uint32x2x3_t %b, 0, 1
693  %b2 = extractvalue %struct.uint32x2x3_t %b, 0, 2
694  tail call void @llvm.arm.neon.vst1x3.p0.v2i32(ptr %a, <2 x i32> %b0, <2 x i32> %b1, <2 x i32> %b2)
695  %tmp = getelementptr i32, ptr %a, i32 %inc
696  ret ptr %tmp
697}
698
699define arm_aapcs_vfpcc ptr @test_vst1_u64_x3_post_imm(ptr %a, %struct.uint64x1x3_t %b) nounwind {
700; CHECK-LABEL: test_vst1_u64_x3_post_imm:
701; CHECK:         vst1.64 {d0, d1, d2}, [r0]!
702; CHECK-NEXT:    bx lr
703entry:
704  %b0 = extractvalue %struct.uint64x1x3_t %b, 0, 0
705  %b1 = extractvalue %struct.uint64x1x3_t %b, 0, 1
706  %b2 = extractvalue %struct.uint64x1x3_t %b, 0, 2
707  tail call void @llvm.arm.neon.vst1x3.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1, <1 x i64> %b2)
708  %tmp = getelementptr i64, ptr %a, i32 3
709  ret ptr %tmp
710}
711
712define arm_aapcs_vfpcc ptr @test_vst1_u64_x3_post_reg(ptr %a, %struct.uint64x1x3_t %b, i32 %inc) nounwind {
713; CHECK-LABEL: test_vst1_u64_x3_post_reg:
714; CHECK:         lsl r1, r1, #3
715; CHECK-NEXT:    vst1.64 {d0, d1, d2}, [r0], r1
716; CHECK-NEXT:    bx lr
717entry:
718  %b0 = extractvalue %struct.uint64x1x3_t %b, 0, 0
719  %b1 = extractvalue %struct.uint64x1x3_t %b, 0, 1
720  %b2 = extractvalue %struct.uint64x1x3_t %b, 0, 2
721  tail call void @llvm.arm.neon.vst1x3.p0.v1i64(ptr %a, <1 x i64> %b0, <1 x i64> %b1, <1 x i64> %b2)
722  %tmp = getelementptr i64, ptr %a, i32 %inc
723  ret ptr %tmp
724}
725
726define arm_aapcs_vfpcc ptr @test_vst1q_u8_x3_post_imm(ptr %a, %struct.uint8x16x3_t %b) nounwind {
727; CHECK-LABEL: test_vst1q_u8_x3_post_imm:
728; CHECK:         vst1.8 {d0, d1, d2}, [r0]!
729; CHECK-NEXT:    vst1.8 {d3, d4, d5}, [r0]!
730; CHECK-NEXT:    bx lr
731entry:
732  %b0 = extractvalue %struct.uint8x16x3_t %b, 0, 0
733  %b1 = extractvalue %struct.uint8x16x3_t %b, 0, 1
734  %b2 = extractvalue %struct.uint8x16x3_t %b, 0, 2
735  tail call void @llvm.arm.neon.vst1x3.p0.v16i8(ptr %a, <16 x i8> %b0, <16 x i8> %b1, <16 x i8> %b2)
736  %tmp = getelementptr i8, ptr %a, i32 48
737  ret ptr %tmp
738}
739
740define arm_aapcs_vfpcc ptr @test_vst1q_u16_x3_post_imm(ptr %a, %struct.uint16x8x3_t %b) nounwind {
741; CHECK-LABEL: test_vst1q_u16_x3_post_imm:
742; CHECK:         vst1.16 {d0, d1, d2}, [r0]!
743; CHECK-NEXT:    vst1.16 {d3, d4, d5}, [r0]!
744; CHECK-NEXT:    bx lr
745entry:
746  %b0 = extractvalue %struct.uint16x8x3_t %b, 0, 0
747  %b1 = extractvalue %struct.uint16x8x3_t %b, 0, 1
748  %b2 = extractvalue %struct.uint16x8x3_t %b, 0, 2
749  tail call void @llvm.arm.neon.vst1x3.p0.v8i16(ptr %a, <8 x i16> %b0, <8 x i16> %b1, <8 x i16> %b2)
750  %tmp = getelementptr i16, ptr %a, i32 24
751  ret ptr %tmp
752}
753
754define arm_aapcs_vfpcc ptr @test_vst1q_u32_x3_post_imm(ptr %a, %struct.uint32x4x3_t %b) nounwind {
755; CHECK-LABEL: test_vst1q_u32_x3_post_imm:
756; CHECK:         vst1.32 {d0, d1, d2}, [r0]!
757; CHECK-NEXT:    vst1.32 {d3, d4, d5}, [r0]!
758; CHECK-NEXT:    bx lr
759entry:
760  %b0 = extractvalue %struct.uint32x4x3_t %b, 0, 0
761  %b1 = extractvalue %struct.uint32x4x3_t %b, 0, 1
762  %b2 = extractvalue %struct.uint32x4x3_t %b, 0, 2
763  tail call void @llvm.arm.neon.vst1x3.p0.v4i32(ptr %a, <4 x i32> %b0, <4 x i32> %b1, <4 x i32> %b2)
764  %tmp = getelementptr i32, ptr %a, i32 12
765  ret ptr %tmp
766}
767
768define arm_aapcs_vfpcc ptr @test_vst1q_u64_x3_post_imm(ptr %a, %struct.uint64x2x3_t %b) nounwind {
769; CHECK-LABEL: test_vst1q_u64_x3_post_imm:
770; CHECK:         vst1.64 {d0, d1, d2}, [r0]!
771; CHECK-NEXT:    vst1.64 {d3, d4, d5}, [r0]!
772; CHECK-NEXT:    bx lr
773entry:
774  %b0 = extractvalue %struct.uint64x2x3_t %b, 0, 0
775  %b1 = extractvalue %struct.uint64x2x3_t %b, 0, 1
776  %b2 = extractvalue %struct.uint64x2x3_t %b, 0, 2
777  tail call void @llvm.arm.neon.vst1x3.p0.v2i64(ptr %a, <2 x i64> %b0, <2 x i64> %b1, <2 x i64> %b2)
778  %tmp = getelementptr i64, ptr %a, i32 6
779  ret ptr %tmp
780}
781
782define arm_aapcs_vfpcc ptr @test_vst1_u8_x4_post_imm(ptr %a, %struct.uint8x8x4_t %b) nounwind {
783; CHECK-LABEL: test_vst1_u8_x4_post_imm:
784; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0]!
785; CHECK-NEXT:    bx lr
786entry:
787  %b0 = extractvalue %struct.uint8x8x4_t %b, 0, 0
788  %b1 = extractvalue %struct.uint8x8x4_t %b, 0, 1
789  %b2 = extractvalue %struct.uint8x8x4_t %b, 0, 2
790  %b3 = extractvalue %struct.uint8x8x4_t %b, 0, 3
791  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)
792  %tmp = getelementptr i8, ptr %a, i32 32
793  ret ptr %tmp
794}
795
796define arm_aapcs_vfpcc ptr @test_vst1_u8_x4_post_reg(ptr %a, %struct.uint8x8x4_t %b, i32 %inc) nounwind {
797; CHECK-LABEL: test_vst1_u8_x4_post_reg:
798; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0], r1
799; CHECK-NEXT:    bx lr
800entry:
801  %b0 = extractvalue %struct.uint8x8x4_t %b, 0, 0
802  %b1 = extractvalue %struct.uint8x8x4_t %b, 0, 1
803  %b2 = extractvalue %struct.uint8x8x4_t %b, 0, 2
804  %b3 = extractvalue %struct.uint8x8x4_t %b, 0, 3
805  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)
806  %tmp = getelementptr i8, ptr %a, i32 %inc
807  ret ptr %tmp
808}
809
810define arm_aapcs_vfpcc ptr @test_vst1_u16_x4_post_imm(ptr %a, %struct.uint16x4x4_t %b) nounwind {
811; CHECK-LABEL: test_vst1_u16_x4_post_imm:
812; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0]!
813; CHECK-NEXT:    bx lr
814  %b0 = extractvalue %struct.uint16x4x4_t %b, 0, 0
815  %b1 = extractvalue %struct.uint16x4x4_t %b, 0, 1
816  %b2 = extractvalue %struct.uint16x4x4_t %b, 0, 2
817  %b3 = extractvalue %struct.uint16x4x4_t %b, 0, 3
818  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)
819  %tmp = getelementptr i16, ptr %a, i32 16
820  ret ptr %tmp
821}
822
823define arm_aapcs_vfpcc ptr @test_vst1_u16_x4_post_reg(ptr %a, %struct.uint16x4x4_t %b, i32 %inc) nounwind {
824; CHECK-LABEL: test_vst1_u16_x4_post_reg:
825; CHECK:         lsl r1, r1, #1
826; CHECK-NEXT:    vst1.16 {d0, d1, d2, d3}, [r0], r1
827; CHECK-NEXT:    bx lr
828  %b0 = extractvalue %struct.uint16x4x4_t %b, 0, 0
829  %b1 = extractvalue %struct.uint16x4x4_t %b, 0, 1
830  %b2 = extractvalue %struct.uint16x4x4_t %b, 0, 2
831  %b3 = extractvalue %struct.uint16x4x4_t %b, 0, 3
832  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)
833  %tmp = getelementptr i16, ptr %a, i32 %inc
834  ret ptr %tmp
835}
836
837define arm_aapcs_vfpcc ptr @test_vst1_u32_x4_post_imm(ptr %a, %struct.uint32x2x4_t %b) nounwind {
838; CHECK-LABEL: test_vst1_u32_x4_post_imm:
839; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0]!
840; CHECK-NEXT:    bx lr
841entry:
842  %b0 = extractvalue %struct.uint32x2x4_t %b, 0, 0
843  %b1 = extractvalue %struct.uint32x2x4_t %b, 0, 1
844  %b2 = extractvalue %struct.uint32x2x4_t %b, 0, 2
845  %b3 = extractvalue %struct.uint32x2x4_t %b, 0, 3
846  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)
847  %tmp = getelementptr i32, ptr %a, i32 8
848  ret ptr %tmp
849}
850
851define arm_aapcs_vfpcc ptr @test_vst1_u32_x4_post_reg(ptr %a, %struct.uint32x2x4_t %b, i32 %inc) nounwind {
852; CHECK-LABEL: test_vst1_u32_x4_post_reg:
853; CHECK:         lsl r1, r1, #2
854; CHECK-NEXT:    vst1.32 {d0, d1, d2, d3}, [r0], r1
855; CHECK-NEXT:    bx lr
856entry:
857  %b0 = extractvalue %struct.uint32x2x4_t %b, 0, 0
858  %b1 = extractvalue %struct.uint32x2x4_t %b, 0, 1
859  %b2 = extractvalue %struct.uint32x2x4_t %b, 0, 2
860  %b3 = extractvalue %struct.uint32x2x4_t %b, 0, 3
861  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)
862  %tmp = getelementptr i32, ptr %a, i32 %inc
863  ret ptr %tmp
864}
865
866define arm_aapcs_vfpcc ptr @test_vst1_u64_x4_post_imm(ptr %a, %struct.uint64x1x4_t %b) nounwind {
867; CHECK-LABEL: test_vst1_u64_x4_post_imm:
868; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0]!
869; CHECK-NEXT:    bx lr
870entry:
871  %b0 = extractvalue %struct.uint64x1x4_t %b, 0, 0
872  %b1 = extractvalue %struct.uint64x1x4_t %b, 0, 1
873  %b2 = extractvalue %struct.uint64x1x4_t %b, 0, 2
874  %b3 = extractvalue %struct.uint64x1x4_t %b, 0, 3
875  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)
876  %tmp = getelementptr i64, ptr %a, i32 4
877  ret ptr %tmp
878}
879
880define arm_aapcs_vfpcc ptr @test_vst1_u64_x4_post_reg(ptr %a, %struct.uint64x1x4_t %b, i32 %inc) nounwind {
881; CHECK-LABEL: test_vst1_u64_x4_post_reg:
882; CHECK:         lsl r1, r1, #3
883; CHECK-NEXT:    vst1.64 {d0, d1, d2, d3}, [r0], r1
884; CHECK-NEXT:    bx lr
885entry:
886  %b0 = extractvalue %struct.uint64x1x4_t %b, 0, 0
887  %b1 = extractvalue %struct.uint64x1x4_t %b, 0, 1
888  %b2 = extractvalue %struct.uint64x1x4_t %b, 0, 2
889  %b3 = extractvalue %struct.uint64x1x4_t %b, 0, 3
890  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)
891  %tmp = getelementptr i64, ptr %a, i32 %inc
892  ret ptr %tmp
893}
894
895define arm_aapcs_vfpcc ptr @test_vst1q_u8_x4_post_imm(ptr %a, %struct.uint8x16x4_t %b) nounwind {
896; CHECK-LABEL: test_vst1q_u8_x4_post_imm:
897; CHECK:         vst1.8 {d0, d1, d2, d3}, [r0]!
898; CHECK-NEXT:    vst1.8 {d4, d5, d6, d7}, [r0]!
899; CHECK-NEXT:    bx lr
900entry:
901  %b0 = extractvalue %struct.uint8x16x4_t %b, 0, 0
902  %b1 = extractvalue %struct.uint8x16x4_t %b, 0, 1
903  %b2 = extractvalue %struct.uint8x16x4_t %b, 0, 2
904  %b3 = extractvalue %struct.uint8x16x4_t %b, 0, 3
905  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)
906  %tmp = getelementptr i8, ptr %a, i32 64
907  ret ptr %tmp
908}
909
910define arm_aapcs_vfpcc ptr @test_vst1q_u16_x4_post_imm(ptr %a, %struct.uint16x8x4_t %b) nounwind {
911; CHECK-LABEL: test_vst1q_u16_x4_post_imm:
912; CHECK:         vst1.16 {d0, d1, d2, d3}, [r0]!
913; CHECK-NEXT:    vst1.16 {d4, d5, d6, d7}, [r0]!
914; CHECK-NEXT:    bx lr
915entry:
916  %b0 = extractvalue %struct.uint16x8x4_t %b, 0, 0
917  %b1 = extractvalue %struct.uint16x8x4_t %b, 0, 1
918  %b2 = extractvalue %struct.uint16x8x4_t %b, 0, 2
919  %b3 = extractvalue %struct.uint16x8x4_t %b, 0, 3
920  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)
921  %tmp = getelementptr i16, ptr %a, i32 32
922  ret ptr %tmp
923}
924
925define arm_aapcs_vfpcc ptr @test_vst1q_u32_x4_post_imm(ptr %a, %struct.uint32x4x4_t %b) nounwind {
926; CHECK-LABEL: test_vst1q_u32_x4_post_imm:
927; CHECK:         vst1.32 {d0, d1, d2, d3}, [r0]!
928; CHECK-NEXT:    vst1.32 {d4, d5, d6, d7}, [r0]!
929; CHECK-NEXT:    bx lr
930entry:
931  %b0 = extractvalue %struct.uint32x4x4_t %b, 0, 0
932  %b1 = extractvalue %struct.uint32x4x4_t %b, 0, 1
933  %b2 = extractvalue %struct.uint32x4x4_t %b, 0, 2
934  %b3 = extractvalue %struct.uint32x4x4_t %b, 0, 3
935  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)
936  %tmp = getelementptr i32, ptr %a, i32 16
937  ret ptr %tmp
938}
939
940define arm_aapcs_vfpcc ptr @test_vst1q_u64_x4_post_imm(ptr %a, %struct.uint64x2x4_t %b) nounwind {
941; CHECK-LABEL: test_vst1q_u64_x4_post_imm:
942; CHECK:         vst1.64 {d0, d1, d2, d3}, [r0]!
943; CHECK-NEXT:    vst1.64 {d4, d5, d6, d7}, [r0]!
944; CHECK-NEXT:    bx lr
945entry:
946  %b0 = extractvalue %struct.uint64x2x4_t %b, 0, 0
947  %b1 = extractvalue %struct.uint64x2x4_t %b, 0, 1
948  %b2 = extractvalue %struct.uint64x2x4_t %b, 0, 2
949  %b3 = extractvalue %struct.uint64x2x4_t %b, 0, 3
950  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)
951  %tmp = getelementptr i64, ptr %a, i32 8
952  ret ptr %tmp
953}
954