blob: d1bc15ad576da687cbafe01ebf7330ed3319ea31 [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:
48;CHECK: vst1.32 {d16[1]}, [r0]
49 %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:
57;CHECK: vst1.8 {d17[1]}, [r0]
58 %tmp1 = load <16 x i8>* %B
59 %tmp2 = extractelement <16 x i8> %tmp1, i32 9
60 store i8 %tmp2, i8* %A, align 8
61 ret void
62}
63
64define void @vst1laneQi16(i16* %A, <8 x i16>* %B) nounwind {
65;CHECK: vst1laneQi16:
66;CHECK: vst1.16 {d17[1]}, [r0, :16]
67 %tmp1 = load <8 x i16>* %B
68 %tmp2 = extractelement <8 x i16> %tmp1, i32 5
69 store i16 %tmp2, i16* %A, align 8
70 ret void
71}
72
73define void @vst1laneQi32(i32* %A, <4 x i32>* %B) nounwind {
74;CHECK: vst1laneQi32:
75;CHECK: vst1.32 {d17[1]}, [r0, :32]
76 %tmp1 = load <4 x i32>* %B
77 %tmp2 = extractelement <4 x i32> %tmp1, i32 3
78 store i32 %tmp2, i32* %A, align 8
79 ret void
80}
81
Bob Wilsonda525062011-02-25 06:42:42 +000082;Check for a post-increment updating store.
83define void @vst1laneQi32_update(i32** %ptr, <4 x i32>* %B) nounwind {
84;CHECK: vst1laneQi32_update:
85;CHECK: vst1.32 {d17[1]}, [r1, :32]!
86 %A = load i32** %ptr
87 %tmp1 = load <4 x i32>* %B
88 %tmp2 = extractelement <4 x i32> %tmp1, i32 3
89 store i32 %tmp2, i32* %A, align 8
90 %tmp3 = getelementptr i32* %A, i32 1
91 store i32* %tmp3, i32** %ptr
92 ret void
93}
94
Bob Wilson746fa172010-12-10 22:13:32 +000095define void @vst1laneQf(float* %A, <4 x float>* %B) nounwind {
96;CHECK: vst1laneQf:
97;CHECK: vst1.32 {d17[1]}, [r0]
98 %tmp1 = load <4 x float>* %B
99 %tmp2 = extractelement <4 x float> %tmp1, i32 3
100 store float %tmp2, float* %A
101 ret void
102}
103
Bob Wilson8a3198b2009-09-01 18:51:56 +0000104define void @vst2lanei8(i8* %A, <8 x i8>* %B) nounwind {
105;CHECK: vst2lanei8:
Bob Wilson3454ed92010-10-19 00:16:32 +0000106;Check the alignment value. Max for this instruction is 16 bits:
107;CHECK: vst2.8 {d16[1], d17[1]}, [r0, :16]
Bob Wilson8a3198b2009-09-01 18:51:56 +0000108 %tmp1 = load <8 x i8>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000109 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 +0000110 ret void
111}
112
113define void @vst2lanei16(i16* %A, <4 x i16>* %B) nounwind {
114;CHECK: vst2lanei16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000115;Check the alignment value. Max for this instruction is 32 bits:
116;CHECK: vst2.16 {d16[1], d17[1]}, [r0, :32]
Bob Wilson02170c02010-04-20 00:17:16 +0000117 %tmp0 = bitcast i16* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000118 %tmp1 = load <4 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000119 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 +0000120 ret void
121}
122
Bob Wilson1c3ef902011-02-07 17:43:21 +0000123;Check for a post-increment updating store with register increment.
124define void @vst2lanei16_update(i16** %ptr, <4 x i16>* %B, i32 %inc) nounwind {
125;CHECK: vst2lanei16_update:
126;CHECK: vst2.16 {d16[1], d17[1]}, [r1], r2
127 %A = load i16** %ptr
128 %tmp0 = bitcast i16* %A to i8*
129 %tmp1 = load <4 x i16>* %B
130 call void @llvm.arm.neon.vst2lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 2)
131 %tmp2 = getelementptr i16* %A, i32 %inc
132 store i16* %tmp2, i16** %ptr
133 ret void
134}
135
Bob Wilson8a3198b2009-09-01 18:51:56 +0000136define void @vst2lanei32(i32* %A, <2 x i32>* %B) nounwind {
137;CHECK: vst2lanei32:
138;CHECK: vst2.32
Bob Wilson02170c02010-04-20 00:17:16 +0000139 %tmp0 = bitcast i32* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000140 %tmp1 = load <2 x i32>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000141 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 +0000142 ret void
143}
144
145define void @vst2lanef(float* %A, <2 x float>* %B) nounwind {
146;CHECK: vst2lanef:
147;CHECK: vst2.32
Bob Wilson02170c02010-04-20 00:17:16 +0000148 %tmp0 = bitcast float* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000149 %tmp1 = load <2 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000150 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 +0000151 ret void
152}
153
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000154define void @vst2laneQi16(i16* %A, <8 x i16>* %B) nounwind {
155;CHECK: vst2laneQi16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000156;Check the (default) alignment.
157;CHECK: vst2.16 {d17[1], d19[1]}, [r0]
Bob Wilson02170c02010-04-20 00:17:16 +0000158 %tmp0 = bitcast i16* %A to i8*
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000159 %tmp1 = load <8 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000160 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 +0000161 ret void
162}
163
164define void @vst2laneQi32(i32* %A, <4 x i32>* %B) nounwind {
165;CHECK: vst2laneQi32:
Bob Wilson3454ed92010-10-19 00:16:32 +0000166;Check the alignment value. Max for this instruction is 64 bits:
167;CHECK: vst2.32 {d17[0], d19[0]}, [r0, :64]
Bob Wilson02170c02010-04-20 00:17:16 +0000168 %tmp0 = bitcast i32* %A to i8*
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000169 %tmp1 = load <4 x i32>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000170 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 +0000171 ret void
172}
173
174define void @vst2laneQf(float* %A, <4 x float>* %B) nounwind {
175;CHECK: vst2laneQf:
176;CHECK: vst2.32
Bob Wilson02170c02010-04-20 00:17:16 +0000177 %tmp0 = bitcast float* %A to i8*
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000178 %tmp1 = load <4 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000179 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 +0000180 ret void
181}
182
Bob Wilson7a9ef442010-08-27 17:13:24 +0000183declare void @llvm.arm.neon.vst2lane.v8i8(i8*, <8 x i8>, <8 x i8>, i32, i32) nounwind
184declare void @llvm.arm.neon.vst2lane.v4i16(i8*, <4 x i16>, <4 x i16>, i32, i32) nounwind
185declare void @llvm.arm.neon.vst2lane.v2i32(i8*, <2 x i32>, <2 x i32>, i32, i32) nounwind
186declare void @llvm.arm.neon.vst2lane.v2f32(i8*, <2 x float>, <2 x float>, i32, i32) nounwind
Bob Wilson8a3198b2009-09-01 18:51:56 +0000187
Bob Wilson7a9ef442010-08-27 17:13:24 +0000188declare void @llvm.arm.neon.vst2lane.v8i16(i8*, <8 x i16>, <8 x i16>, i32, i32) nounwind
189declare void @llvm.arm.neon.vst2lane.v4i32(i8*, <4 x i32>, <4 x i32>, i32, i32) nounwind
190declare void @llvm.arm.neon.vst2lane.v4f32(i8*, <4 x float>, <4 x float>, i32, i32) nounwind
Bob Wilsonc5c6edb2009-10-08 23:38:24 +0000191
Bob Wilson8a3198b2009-09-01 18:51:56 +0000192define void @vst3lanei8(i8* %A, <8 x i8>* %B) nounwind {
193;CHECK: vst3lanei8:
194;CHECK: vst3.8
195 %tmp1 = load <8 x i8>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000196 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 +0000197 ret void
198}
199
200define void @vst3lanei16(i16* %A, <4 x i16>* %B) nounwind {
201;CHECK: vst3lanei16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000202;Check the (default) alignment value. VST3 does not support alignment.
203;CHECK: vst3.16 {d16[1], d17[1], d18[1]}, [r0]
Bob Wilson02170c02010-04-20 00:17:16 +0000204 %tmp0 = bitcast i16* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000205 %tmp1 = load <4 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000206 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 +0000207 ret void
208}
209
210define void @vst3lanei32(i32* %A, <2 x i32>* %B) nounwind {
211;CHECK: vst3lanei32:
212;CHECK: vst3.32
Bob Wilson02170c02010-04-20 00:17:16 +0000213 %tmp0 = bitcast i32* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000214 %tmp1 = load <2 x i32>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000215 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 +0000216 ret void
217}
218
219define void @vst3lanef(float* %A, <2 x float>* %B) nounwind {
220;CHECK: vst3lanef:
221;CHECK: vst3.32
Bob Wilson02170c02010-04-20 00:17:16 +0000222 %tmp0 = bitcast float* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000223 %tmp1 = load <2 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000224 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 +0000225 ret void
226}
227
Bob Wilson8cdb2692009-10-08 23:51:31 +0000228define void @vst3laneQi16(i16* %A, <8 x i16>* %B) nounwind {
229;CHECK: vst3laneQi16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000230;Check the (default) alignment value. VST3 does not support alignment.
231;CHECK: vst3.16 {d17[2], d19[2], d21[2]}, [r0]
Bob Wilson02170c02010-04-20 00:17:16 +0000232 %tmp0 = bitcast i16* %A to i8*
Bob Wilson8cdb2692009-10-08 23:51:31 +0000233 %tmp1 = load <8 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000234 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 +0000235 ret void
236}
237
238define void @vst3laneQi32(i32* %A, <4 x i32>* %B) nounwind {
239;CHECK: vst3laneQi32:
240;CHECK: vst3.32
Bob Wilson02170c02010-04-20 00:17:16 +0000241 %tmp0 = bitcast i32* %A to i8*
Bob Wilson8cdb2692009-10-08 23:51:31 +0000242 %tmp1 = load <4 x i32>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000243 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 +0000244 ret void
245}
246
Bob Wilson1c3ef902011-02-07 17:43:21 +0000247;Check for a post-increment updating store.
248define void @vst3laneQi32_update(i32** %ptr, <4 x i32>* %B) nounwind {
249;CHECK: vst3laneQi32_update:
250;CHECK: vst3.32 {d16[0], d18[0], d20[0]}, [r1]!
251 %A = load i32** %ptr
252 %tmp0 = bitcast i32* %A to i8*
253 %tmp1 = load <4 x i32>* %B
254 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)
255 %tmp2 = getelementptr i32* %A, i32 3
256 store i32* %tmp2, i32** %ptr
257 ret void
258}
259
Bob Wilson8cdb2692009-10-08 23:51:31 +0000260define void @vst3laneQf(float* %A, <4 x float>* %B) nounwind {
261;CHECK: vst3laneQf:
262;CHECK: vst3.32
Bob Wilson02170c02010-04-20 00:17:16 +0000263 %tmp0 = bitcast float* %A to i8*
Bob Wilson8cdb2692009-10-08 23:51:31 +0000264 %tmp1 = load <4 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000265 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 +0000266 ret void
267}
268
Bob Wilson7a9ef442010-08-27 17:13:24 +0000269declare void @llvm.arm.neon.vst3lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind
270declare void @llvm.arm.neon.vst3lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind
271declare void @llvm.arm.neon.vst3lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind
272declare 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 +0000273
Bob Wilson7a9ef442010-08-27 17:13:24 +0000274declare void @llvm.arm.neon.vst3lane.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind
275declare void @llvm.arm.neon.vst3lane.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind
276declare 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 +0000277
Bob Wilson8a3198b2009-09-01 18:51:56 +0000278
279define void @vst4lanei8(i8* %A, <8 x i8>* %B) nounwind {
280;CHECK: vst4lanei8:
Bob Wilson3454ed92010-10-19 00:16:32 +0000281;Check the alignment value. Max for this instruction is 32 bits:
282;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32]
Bob Wilson8a3198b2009-09-01 18:51:56 +0000283 %tmp1 = load <8 x i8>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000284 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 +0000285 ret void
286}
287
Bob Wilson1c3ef902011-02-07 17:43:21 +0000288;Check for a post-increment updating store.
289define void @vst4lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind {
290;CHECK: vst4lanei8_update:
291;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1, :32]!
292 %A = load i8** %ptr
293 %tmp1 = load <8 x i8>* %B
294 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)
295 %tmp2 = getelementptr i8* %A, i32 4
296 store i8* %tmp2, i8** %ptr
297 ret void
298}
299
Bob Wilson8a3198b2009-09-01 18:51:56 +0000300define void @vst4lanei16(i16* %A, <4 x i16>* %B) nounwind {
301;CHECK: vst4lanei16:
302;CHECK: vst4.16
Bob Wilson02170c02010-04-20 00:17:16 +0000303 %tmp0 = bitcast i16* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000304 %tmp1 = load <4 x i16>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000305 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 +0000306 ret void
307}
308
309define void @vst4lanei32(i32* %A, <2 x i32>* %B) nounwind {
310;CHECK: vst4lanei32:
Bob Wilson3454ed92010-10-19 00:16:32 +0000311;Check the alignment value. Max for this instruction is 128 bits:
312;CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128]
Bob Wilson02170c02010-04-20 00:17:16 +0000313 %tmp0 = bitcast i32* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000314 %tmp1 = load <2 x i32>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000315 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 +0000316 ret void
317}
318
319define void @vst4lanef(float* %A, <2 x float>* %B) nounwind {
320;CHECK: vst4lanef:
321;CHECK: vst4.32
Bob Wilson02170c02010-04-20 00:17:16 +0000322 %tmp0 = bitcast float* %A to i8*
Bob Wilson8a3198b2009-09-01 18:51:56 +0000323 %tmp1 = load <2 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000324 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 +0000325 ret void
326}
327
Bob Wilson56311392009-10-09 00:01:36 +0000328define void @vst4laneQi16(i16* %A, <8 x i16>* %B) nounwind {
329;CHECK: vst4laneQi16:
Bob Wilson3454ed92010-10-19 00:16:32 +0000330;Check the alignment value. Max for this instruction is 64 bits:
331;CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0, :64]
Bob Wilson02170c02010-04-20 00:17:16 +0000332 %tmp0 = bitcast i16* %A to i8*
Bob Wilson56311392009-10-09 00:01:36 +0000333 %tmp1 = load <8 x i16>* %B
Bob Wilson3454ed92010-10-19 00:16:32 +0000334 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 +0000335 ret void
336}
337
338define void @vst4laneQi32(i32* %A, <4 x i32>* %B) nounwind {
339;CHECK: vst4laneQi32:
Bob Wilson3454ed92010-10-19 00:16:32 +0000340;Check the (default) alignment.
341;CHECK: vst4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0]
Bob Wilson02170c02010-04-20 00:17:16 +0000342 %tmp0 = bitcast i32* %A to i8*
Bob Wilson56311392009-10-09 00:01:36 +0000343 %tmp1 = load <4 x i32>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000344 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 +0000345 ret void
346}
347
348define void @vst4laneQf(float* %A, <4 x float>* %B) nounwind {
349;CHECK: vst4laneQf:
350;CHECK: vst4.32
Bob Wilson02170c02010-04-20 00:17:16 +0000351 %tmp0 = bitcast float* %A to i8*
Bob Wilson56311392009-10-09 00:01:36 +0000352 %tmp1 = load <4 x float>* %B
Bob Wilson7a9ef442010-08-27 17:13:24 +0000353 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 +0000354 ret void
355}
356
Bob Wilson7a9ef442010-08-27 17:13:24 +0000357declare void @llvm.arm.neon.vst4lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind
358declare void @llvm.arm.neon.vst4lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind
359declare void @llvm.arm.neon.vst4lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind
360declare 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 +0000361
Bob Wilson7a9ef442010-08-27 17:13:24 +0000362declare void @llvm.arm.neon.vst4lane.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind
363declare void @llvm.arm.neon.vst4lane.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind
364declare void @llvm.arm.neon.vst4lane.v4f32(i8*, <4 x float>, <4 x float>, <4 x float>, <4 x float>, i32, i32) nounwind