blob: 758b355736d06d1d61aefd57ad8c75b983a3827e [file] [log] [blame]
Dan Gohmanfce288f2009-09-09 00:09:15 +00001; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
Bob Wilson8a3198b2009-09-01 18:51:56 +00002
Bob Wilsond168cef2010-11-03 16:24:53 +00003define void @vst1lanei8(i8* %A, <8 x i8>* %B) nounwind {
4;CHECK: vst1lanei8:
5;Check the (default) alignment.
6;CHECK: vst1.8 {d16[3]}, [r0]
7 %tmp1 = load <8 x i8>* %B
8 %tmp2 = extractelement <8 x i8> %tmp1, i32 3
9 store i8 %tmp2, i8* %A, align 8
10 ret void
11}
12
Bob Wilsonda525062011-02-25 06:42:42 +000013;Check for a post-increment updating store.
14define void @vst1lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind {
15;CHECK: vst1lanei8_update:
16;CHECK: vst1.8 {d16[3]}, [r2]!
17 %A = load i8** %ptr
18 %tmp1 = load <8 x i8>* %B
19 %tmp2 = extractelement <8 x i8> %tmp1, i32 3
20 store i8 %tmp2, i8* %A, align 8
21 %tmp3 = getelementptr i8* %A, i32 1
22 store i8* %tmp3, i8** %ptr
23 ret void
24}
25
Bob Wilsond168cef2010-11-03 16:24:53 +000026define void @vst1lanei16(i16* %A, <4 x i16>* %B) nounwind {
27;CHECK: vst1lanei16:
28;Check the alignment value. Max for this instruction is 16 bits:
29;CHECK: vst1.16 {d16[2]}, [r0, :16]
30 %tmp1 = load <4 x i16>* %B
31 %tmp2 = extractelement <4 x i16> %tmp1, i32 2
32 store i16 %tmp2, i16* %A, align 8
33 ret void
34}
35
36define void @vst1lanei32(i32* %A, <2 x i32>* %B) nounwind {
37;CHECK: vst1lanei32:
38;Check the alignment value. Max for this instruction is 32 bits:
39;CHECK: vst1.32 {d16[1]}, [r0, :32]
40 %tmp1 = load <2 x i32>* %B
41 %tmp2 = extractelement <2 x i32> %tmp1, i32 1
42 store i32 %tmp2, i32* %A, align 8
43 ret void
44}
45
Bob Wilson746fa172010-12-10 22:13:32 +000046define void @vst1lanef(float* %A, <2 x float>* %B) nounwind {
47;CHECK: vst1lanef:
Jakob Stoklund Olesenb0117ee2011-10-27 22:39:16 +000048;CHECK: vst1.32 {d16[1]}, [r0, :32]
Bob Wilson746fa172010-12-10 22:13:32 +000049 %tmp1 = load <2 x float>* %B
50 %tmp2 = extractelement <2 x float> %tmp1, i32 1
51 store float %tmp2, float* %A
52 ret void
53}
54
Bob Wilsond168cef2010-11-03 16:24:53 +000055define void @vst1laneQi8(i8* %A, <16 x i8>* %B) nounwind {
56;CHECK: vst1laneQi8:
Nadav Rotem42febc62011-05-11 14:40:50 +000057; // Can use scalar load. No need to use vectors.
58; // CHE-CK: vst1.8 {d17[1]}, [r0]
Bob Wilsond168cef2010-11-03 16:24:53 +000059 %tmp1 = load <16 x i8>* %B
60 %tmp2 = extractelement <16 x i8> %tmp1, i32 9
61 store i8 %tmp2, i8* %A, align 8
62 ret void
63}
64
65define void @vst1laneQi16(i16* %A, <8 x i16>* %B) nounwind {
66;CHECK: vst1laneQi16:
67;CHECK: vst1.16 {d17[1]}, [r0, :16]
68 %tmp1 = load <8 x i16>* %B
69 %tmp2 = extractelement <8 x i16> %tmp1, i32 5
70 store i16 %tmp2, i16* %A, align 8
71 ret void
72}
73
74define void @vst1laneQi32(i32* %A, <4 x i32>* %B) nounwind {
75;CHECK: vst1laneQi32:
Nadav Rotem42febc62011-05-11 14:40:50 +000076; // Can use scalar load. No need to use vectors.
77; // CHE-CK: vst1.32 {d17[1]}, [r0, :32]
Bob Wilsond168cef2010-11-03 16:24:53 +000078 %tmp1 = load <4 x i32>* %B
79 %tmp2 = extractelement <4 x i32> %tmp1, i32 3
80 store i32 %tmp2, i32* %A, align 8
81 ret void
82}
83
Bob Wilsonda525062011-02-25 06:42:42 +000084;Check for a post-increment updating store.
85define void @vst1laneQi32_update(i32** %ptr, <4 x i32>* %B) nounwind {
86;CHECK: vst1laneQi32_update:
Nadav Rotem42febc62011-05-11 14:40:50 +000087; // Can use scalar load. No need to use vectors.
88; // CHE-CK: vst1.32 {d17[1]}, [r1, :32]!
Bob Wilsonda525062011-02-25 06:42:42 +000089 %A = load i32** %ptr
90 %tmp1 = load <4 x i32>* %B
91 %tmp2 = extractelement <4 x i32> %tmp1, i32 3
92 store i32 %tmp2, i32* %A, align 8
93 %tmp3 = getelementptr i32* %A, i32 1
94 store i32* %tmp3, i32** %ptr
95 ret void
96}
97
Bob Wilson746fa172010-12-10 22:13:32 +000098define void @vst1laneQf(float* %A, <4 x float>* %B) nounwind {
99;CHECK: vst1laneQf:
Nadav Rotem42febc62011-05-11 14:40:50 +0000100; // Can use scalar load. No need to use vectors.
101; // CHE-CK: vst1.32 {d17[1]}, [r0]
Bob Wilson746fa172010-12-10 22:13:32 +0000102 %tmp1 = load <4 x float>* %B
103 %tmp2 = extractelement <4 x float> %tmp1, i32 3
104 store float %tmp2, float* %A
105 ret void
106}
107
Bob Wilson8a3198b2009-09-01 18:51:56 +0000108define void @vst2lanei8(i8* %A, <8 x i8>* %B) nounwind {
109;CHECK: vst2lanei8:
Bob Wilson3454ed92010-10-19 00:16:32 +0000110;Check the alignment value. Max for this instruction is 16 bits:
111;CHECK: vst2.8 {d16[1], d17[1]}, [r0, :16]
Bob Wilson8a3198b2009-09-01 18:51:56 +0000112 %tmp1 = load <8 x i8>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000113 call void @llvm.arm.neon.vst2lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 4)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000114 ret void
115}
116
117define void @vst2lanei16(i16* %A, <4 x i16>* %B) nounwind {
118;CHECK: vst2lanei16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000119;Check the alignment value. Max for this instruction is 32 bits:
120;CHECK: vst2.16 {d16[1], d17[1]}, [r0, :32]
Bob Wilson02170c02010-04-20 00:17:16 +0000121 %tmp0 = bitcast i16* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000122 %tmp1 = load <4 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000123 call void @llvm.arm.neon.vst2lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 8)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000124 ret void
125}
126
Bob Wilson1c3ef902011-02-07 17:43:21 +0000127;Check for a post-increment updating store with register increment.
128define void @vst2lanei16_update(i16** %ptr, <4 x i16>* %B, i32 %inc) nounwind {
129;CHECK: vst2lanei16_update:
130;CHECK: vst2.16 {d16[1], d17[1]}, [r1], r2
131 %A = load i16** %ptr
132 %tmp0 = bitcast i16* %A to i8*
133 %tmp1 = load <4 x i16>* %B
134 call void @llvm.arm.neon.vst2lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 2)
135 %tmp2 = getelementptr i16* %A, i32 %inc
136 store i16* %tmp2, i16** %ptr
137 ret void
138}
139
Bob Wilson8a3198b2009-09-01 18:51:56 +0000140define void @vst2lanei32(i32* %A, <2 x i32>* %B) nounwind {
141;CHECK: vst2lanei32:
142;CHECK: vst2.32
Bob Wilson02170c02010-04-20 00:17:16 +0000143 %tmp0 = bitcast i32* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000144 %tmp1 = load <2 x i32>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000145 call void @llvm.arm.neon.vst2lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 1)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000146 ret void
147}
148
149define void @vst2lanef(float* %A, <2 x float>* %B) nounwind {
150;CHECK: vst2lanef:
151;CHECK: vst2.32
Bob Wilson02170c02010-04-20 00:17:16 +0000152 %tmp0 = bitcast float* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000153 %tmp1 = load <2 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000154 call void @llvm.arm.neon.vst2lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000155 ret void
156}
157
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000158define void @vst2laneQi16(i16* %A, <8 x i16>* %B) nounwind {
159;CHECK: vst2laneQi16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000160;Check the (default) alignment.
161;CHECK: vst2.16 {d17[1], d19[1]}, [r0]
Bob Wilson02170c02010-04-20 00:17:16 +0000162 %tmp0 = bitcast i16* %A to i8*
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000163 %tmp1 = load <8 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000164 call void @llvm.arm.neon.vst2lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 5, i32 1)
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000165 ret void
166}
167
168define void @vst2laneQi32(i32* %A, <4 x i32>* %B) nounwind {
169;CHECK: vst2laneQi32:
Bob Wilson3454ed92010-10-19 00:16:32 +0000170;Check the alignment value. Max for this instruction is 64 bits:
171;CHECK: vst2.32 {d17[0], d19[0]}, [r0, :64]
Bob Wilson02170c02010-04-20 00:17:16 +0000172 %tmp0 = bitcast i32* %A to i8*
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000173 %tmp1 = load <4 x i32>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000174 call void @llvm.arm.neon.vst2lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2, i32 16)
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000175 ret void
176}
177
178define void @vst2laneQf(float* %A, <4 x float>* %B) nounwind {
179;CHECK: vst2laneQf:
180;CHECK: vst2.32
Bob Wilson02170c02010-04-20 00:17:16 +0000181 %tmp0 = bitcast float* %A to i8*
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000182 %tmp1 = load <4 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000183 call void @llvm.arm.neon.vst2lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, i32 3, i32 1)
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000184 ret void
185}
186
Bob Wilson7a9ef442010-08-27 17:13:24 +0000187declare void @llvm.arm.neon.vst2lane.v8i8(i8*, <8 x i8>, <8 x i8>, i32, i32) nounwind
188declare void @llvm.arm.neon.vst2lane.v4i16(i8*, <4 x i16>, <4 x i16>, i32, i32) nounwind
189declare void @llvm.arm.neon.vst2lane.v2i32(i8*, <2 x i32>, <2 x i32>, i32, i32) nounwind
190declare void @llvm.arm.neon.vst2lane.v2f32(i8*, <2 x float>, <2 x float>, i32, i32) nounwind
Bob Wilson8a3198b2009-09-01 18:51:56 +0000191
Bob Wilson7a9ef442010-08-27 17:13:24 +0000192declare void @llvm.arm.neon.vst2lane.v8i16(i8*, <8 x i16>, <8 x i16>, i32, i32) nounwind
193declare void @llvm.arm.neon.vst2lane.v4i32(i8*, <4 x i32>, <4 x i32>, i32, i32) nounwind
194declare void @llvm.arm.neon.vst2lane.v4f32(i8*, <4 x float>, <4 x float>, i32, i32) nounwind
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000195
Bob Wilson8a3198b2009-09-01 18:51:56 +0000196define void @vst3lanei8(i8* %A, <8 x i8>* %B) nounwind {
197;CHECK: vst3lanei8:
198;CHECK: vst3.8
199 %tmp1 = load <8 x i8>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000200 call void @llvm.arm.neon.vst3lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 1)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000201 ret void
202}
203
204define void @vst3lanei16(i16* %A, <4 x i16>* %B) nounwind {
205;CHECK: vst3lanei16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000206;Check the (default) alignment value. VST3 does not support alignment.
207;CHECK: vst3.16 {d16[1], d17[1], d18[1]}, [r0]
Bob Wilson02170c02010-04-20 00:17:16 +0000208 %tmp0 = bitcast i16* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000209 %tmp1 = load <4 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000210 call void @llvm.arm.neon.vst3lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 8)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000211 ret void
212}
213
214define void @vst3lanei32(i32* %A, <2 x i32>* %B) nounwind {
215;CHECK: vst3lanei32:
216;CHECK: vst3.32
Bob Wilson02170c02010-04-20 00:17:16 +0000217 %tmp0 = bitcast i32* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000218 %tmp1 = load <2 x i32>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000219 call void @llvm.arm.neon.vst3lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 1)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000220 ret void
221}
222
223define void @vst3lanef(float* %A, <2 x float>* %B) nounwind {
224;CHECK: vst3lanef:
225;CHECK: vst3.32
Bob Wilson02170c02010-04-20 00:17:16 +0000226 %tmp0 = bitcast float* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000227 %tmp1 = load <2 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000228 call void @llvm.arm.neon.vst3lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000229 ret void
230}
231
Bob Wilson8cdb2692009-10-08 23:51:31 +0000232define void @vst3laneQi16(i16* %A, <8 x i16>* %B) nounwind {
233;CHECK: vst3laneQi16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000234;Check the (default) alignment value. VST3 does not support alignment.
235;CHECK: vst3.16 {d17[2], d19[2], d21[2]}, [r0]
Bob Wilson02170c02010-04-20 00:17:16 +0000236 %tmp0 = bitcast i16* %A to i8*
Bob Wilson8cdb2692009-10-08 23:51:31 +0000237 %tmp1 = load <8 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000238 call void @llvm.arm.neon.vst3lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 6, i32 8)
Bob Wilson8cdb2692009-10-08 23:51:31 +0000239 ret void
240}
241
242define void @vst3laneQi32(i32* %A, <4 x i32>* %B) nounwind {
243;CHECK: vst3laneQi32:
244;CHECK: vst3.32
Bob Wilson02170c02010-04-20 00:17:16 +0000245 %tmp0 = bitcast i32* %A to i8*
Bob Wilson8cdb2692009-10-08 23:51:31 +0000246 %tmp1 = load <4 x i32>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000247 call void @llvm.arm.neon.vst3lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 0, i32 1)
Bob Wilson8cdb2692009-10-08 23:51:31 +0000248 ret void
249}
250
Bob Wilson1c3ef902011-02-07 17:43:21 +0000251;Check for a post-increment updating store.
252define void @vst3laneQi32_update(i32** %ptr, <4 x i32>* %B) nounwind {
253;CHECK: vst3laneQi32_update:
254;CHECK: vst3.32 {d16[0], d18[0], d20[0]}, [r1]!
255 %A = load i32** %ptr
256 %tmp0 = bitcast i32* %A to i8*
257 %tmp1 = load <4 x i32>* %B
258 call void @llvm.arm.neon.vst3lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 0, i32 1)
259 %tmp2 = getelementptr i32* %A, i32 3
260 store i32* %tmp2, i32** %ptr
261 ret void
262}
263
Bob Wilson8cdb2692009-10-08 23:51:31 +0000264define void @vst3laneQf(float* %A, <4 x float>* %B) nounwind {
265;CHECK: vst3laneQf:
266;CHECK: vst3.32
Bob Wilson02170c02010-04-20 00:17:16 +0000267 %tmp0 = bitcast float* %A to i8*
Bob Wilson8cdb2692009-10-08 23:51:31 +0000268 %tmp1 = load <4 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000269 call void @llvm.arm.neon.vst3lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1, i32 1)
Bob Wilson8cdb2692009-10-08 23:51:31 +0000270 ret void
271}
272
Bob Wilson7a9ef442010-08-27 17:13:24 +0000273declare void @llvm.arm.neon.vst3lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind
274declare void @llvm.arm.neon.vst3lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind
275declare void @llvm.arm.neon.vst3lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind
276declare void @llvm.arm.neon.vst3lane.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, i32, i32) nounwind
Bob Wilson8a3198b2009-09-01 18:51:56 +0000277
Bob Wilson7a9ef442010-08-27 17:13:24 +0000278declare void @llvm.arm.neon.vst3lane.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind
279declare void @llvm.arm.neon.vst3lane.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind
280declare void @llvm.arm.neon.vst3lane.v4f32(i8*, <4 x float>, <4 x float>, <4 x float>, i32, i32) nounwind
Bob Wilson8cdb2692009-10-08 23:51:31 +0000281
Bob Wilson8a3198b2009-09-01 18:51:56 +0000282
283define void @vst4lanei8(i8* %A, <8 x i8>* %B) nounwind {
284;CHECK: vst4lanei8:
Bob Wilson3454ed92010-10-19 00:16:32 +0000285;Check the alignment value. Max for this instruction is 32 bits:
286;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32]
Bob Wilson8a3198b2009-09-01 18:51:56 +0000287 %tmp1 = load <8 x i8>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000288 call void @llvm.arm.neon.vst4lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 8)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000289 ret void
290}
291
Bob Wilson1c3ef902011-02-07 17:43:21 +0000292;Check for a post-increment updating store.
293define void @vst4lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind {
294;CHECK: vst4lanei8_update:
295;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32]!
296 %A = load i8** %ptr
297 %tmp1 = load <8 x i8>* %B
298 call void @llvm.arm.neon.vst4lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 8)
299 %tmp2 = getelementptr i8* %A, i32 4
300 store i8* %tmp2, i8** %ptr
301 ret void
302}
303
Bob Wilson8a3198b2009-09-01 18:51:56 +0000304define void @vst4lanei16(i16* %A, <4 x i16>* %B) nounwind {
305;CHECK: vst4lanei16:
306;CHECK: vst4.16
Bob Wilson02170c02010-04-20 00:17:16 +0000307 %tmp0 = bitcast i16* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000308 %tmp1 = load <4 x i16>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000309 call void @llvm.arm.neon.vst4lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 1)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000310 ret void
311}
312
313define void @vst4lanei32(i32* %A, <2 x i32>* %B) nounwind {
314;CHECK: vst4lanei32:
Bob Wilson3454ed92010-10-19 00:16:32 +0000315;Check the alignment value. Max for this instruction is 128 bits:
316;CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128]
Bob Wilson02170c02010-04-20 00:17:16 +0000317 %tmp0 = bitcast i32* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000318 %tmp1 = load <2 x i32>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000319 call void @llvm.arm.neon.vst4lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 16)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000320 ret void
321}
322
323define void @vst4lanef(float* %A, <2 x float>* %B) nounwind {
324;CHECK: vst4lanef:
325;CHECK: vst4.32
Bob Wilson02170c02010-04-20 00:17:16 +0000326 %tmp0 = bitcast float* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000327 %tmp1 = load <2 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000328 call void @llvm.arm.neon.vst4lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1)
Bob Wilson8a3198b2009-09-01 18:51:56 +0000329 ret void
330}
331
Bob Wilson56311392009-10-09 00:01:36 +0000332define void @vst4laneQi16(i16* %A, <8 x i16>* %B) nounwind {
333;CHECK: vst4laneQi16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000334;Check the alignment value. Max for this instruction is 64 bits:
335;CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0, :64]
Bob Wilson02170c02010-04-20 00:17:16 +0000336 %tmp0 = bitcast i16* %A to i8*
Bob Wilson56311392009-10-09 00:01:36 +0000337 %tmp1 = load <8 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000338 call void @llvm.arm.neon.vst4lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 7, i32 16)
Bob Wilson56311392009-10-09 00:01:36 +0000339 ret void
340}
341
342define void @vst4laneQi32(i32* %A, <4 x i32>* %B) nounwind {
343;CHECK: vst4laneQi32:
Bob Wilson3454ed92010-10-19 00:16:32 +0000344;Check the (default) alignment.
345;CHECK: vst4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0]
Bob Wilson02170c02010-04-20 00:17:16 +0000346 %tmp0 = bitcast i32* %A to i8*
Bob Wilson56311392009-10-09 00:01:36 +0000347 %tmp1 = load <4 x i32>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000348 call void @llvm.arm.neon.vst4lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2, i32 1)
Bob Wilson56311392009-10-09 00:01:36 +0000349 ret void
350}
351
352define void @vst4laneQf(float* %A, <4 x float>* %B) nounwind {
353;CHECK: vst4laneQf:
354;CHECK: vst4.32
Bob Wilson02170c02010-04-20 00:17:16 +0000355 %tmp0 = bitcast float* %A to i8*
Bob Wilson56311392009-10-09 00:01:36 +0000356 %tmp1 = load <4 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000357 call void @llvm.arm.neon.vst4lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, <4 x float> %tmp1, i32 1, i32 1)
Bob Wilson56311392009-10-09 00:01:36 +0000358 ret void
359}
360
Eli Friedman5c89cb82011-10-24 23:08:52 +0000361; Make sure this doesn't crash; PR10258
362define <8 x i16> @variable_insertelement(<8 x i16> %a, i16 %b, i32 %c) nounwind readnone {
363;CHECK: variable_insertelement:
364 %r = insertelement <8 x i16> %a, i16 %b, i32 %c
365 ret <8 x i16> %r
366}
367
Bob Wilson7a9ef442010-08-27 17:13:24 +0000368declare void @llvm.arm.neon.vst4lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind
369declare void @llvm.arm.neon.vst4lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind
370declare void @llvm.arm.neon.vst4lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind
371declare void @llvm.arm.neon.vst4lane.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, <2 x float>, i32, i32) nounwind
Bob Wilson56311392009-10-09 00:01:36 +0000372
Bob Wilson7a9ef442010-08-27 17:13:24 +0000373declare void @llvm.arm.neon.vst4lane.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind
374declare void @llvm.arm.neon.vst4lane.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind
375declare void @llvm.arm.neon.vst4lane.v4f32(i8*, <4 x float>, <4 x float>, <4 x float>, <4 x float>, i32, i32) nounwind