blob: 34c5c70fffa36977f97bb05ac98e4059efb91206 [file] [log] [blame]
Dan Gohmanc8054d92009-09-09 00:09:15 +00001; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
Bob Wilsond7797752009-09-01 18:51:56 +00002
Bob Wilson7d0ac842010-11-03 16:24:53 +00003define void @vst1lanei8(i8* %A, <8 x i8>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +00004;CHECK-LABEL: vst1lanei8:
Bob Wilson7d0ac842010-11-03 16:24:53 +00005;Check the (default) alignment.
Matthias Braun77219d82013-10-11 18:09:19 +00006;CHECK: vst1.8 {d16[3]}, [r0]
Bob Wilson7d0ac842010-11-03 16:24:53 +00007 %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 Wilsone3ecd5f2011-02-25 06:42:42 +000013;Check for a post-increment updating store.
14define void @vst1lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +000015;CHECK-LABEL: vst1lanei8_update:
Matthias Braun77219d82013-10-11 18:09:19 +000016;CHECK: vst1.8 {d16[3]}, [{{r[0-9]}}]!
Bob Wilsone3ecd5f2011-02-25 06:42:42 +000017 %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 Wilson7d0ac842010-11-03 16:24:53 +000026define void @vst1lanei16(i16* %A, <4 x i16>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +000027;CHECK-LABEL: vst1lanei16:
Bob Wilson7d0ac842010-11-03 16:24:53 +000028;Check the alignment value. Max for this instruction is 16 bits:
Matthias Braun77219d82013-10-11 18:09:19 +000029;CHECK: vst1.16 {d16[2]}, [r0:16]
Bob Wilson7d0ac842010-11-03 16:24:53 +000030 %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 {
Stephen Lind24ab202013-07-14 06:24:09 +000037;CHECK-LABEL: vst1lanei32:
Bob Wilson7d0ac842010-11-03 16:24:53 +000038;Check the alignment value. Max for this instruction is 32 bits:
Matthias Braun77219d82013-10-11 18:09:19 +000039;CHECK: vst1.32 {d16[1]}, [r0:32]
Bob Wilson7d0ac842010-11-03 16:24:53 +000040 %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 Wilson9375d272010-12-10 22:13:32 +000046define void @vst1lanef(float* %A, <2 x float>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +000047;CHECK-LABEL: vst1lanef:
Matthias Braun77219d82013-10-11 18:09:19 +000048;CHECK: vst1.32 {d16[1]}, [r0:32]
Bob Wilson9375d272010-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 Wilson7d0ac842010-11-03 16:24:53 +000055define void @vst1laneQi8(i8* %A, <16 x i8>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +000056;CHECK-LABEL: vst1laneQi8:
Nadav Rotem8a7beb82011-05-11 14:40:50 +000057; // Can use scalar load. No need to use vectors.
Matthias Braun77219d82013-10-11 18:09:19 +000058; // CHE-CK: vst1.8 {d17[1]}, [r0]
Bob Wilson7d0ac842010-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 {
Stephen Lind24ab202013-07-14 06:24:09 +000066;CHECK-LABEL: vst1laneQi16:
Matthias Braun77219d82013-10-11 18:09:19 +000067;CHECK: vst1.16 {d17[1]}, [r0:16]
Bob Wilson7d0ac842010-11-03 16:24:53 +000068 %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 {
Stephen Lind24ab202013-07-14 06:24:09 +000075;CHECK-LABEL: vst1laneQi32:
Nadav Rotem8a7beb82011-05-11 14:40:50 +000076; // Can use scalar load. No need to use vectors.
Matthias Braun77219d82013-10-11 18:09:19 +000077; // CHE-CK: vst1.32 {d17[1]}, [r0:32]
Bob Wilson7d0ac842010-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 Wilsone3ecd5f2011-02-25 06:42:42 +000084;Check for a post-increment updating store.
85define void @vst1laneQi32_update(i32** %ptr, <4 x i32>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +000086;CHECK-LABEL: vst1laneQi32_update:
Nadav Rotem8a7beb82011-05-11 14:40:50 +000087; // Can use scalar load. No need to use vectors.
Matthias Braun77219d82013-10-11 18:09:19 +000088; // CHE-CK: vst1.32 {d17[1]}, [r1:32]!
Bob Wilsone3ecd5f2011-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 Wilson9375d272010-12-10 22:13:32 +000098define void @vst1laneQf(float* %A, <4 x float>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +000099;CHECK-LABEL: vst1laneQf:
Nadav Rotem8a7beb82011-05-11 14:40:50 +0000100; // Can use scalar load. No need to use vectors.
Matthias Braun77219d82013-10-11 18:09:19 +0000101; // CHE-CK: vst1.32 {d17[1]}, [r0]
Bob Wilson9375d272010-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 Wilsond7797752009-09-01 18:51:56 +0000108define void @vst2lanei8(i8* %A, <8 x i8>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000109;CHECK-LABEL: vst2lanei8:
Bob Wilsonb6d61dc2010-10-19 00:16:32 +0000110;Check the alignment value. Max for this instruction is 16 bits:
Kristof Beyls0ba797e2013-02-22 10:01:33 +0000111;CHECK: vst2.8 {d16[1], d17[1]}, [r0:16]
Bob Wilsond7797752009-09-01 18:51:56 +0000112 %tmp1 = load <8 x i8>* %B
Bob Wilsonb6d61dc2010-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 Wilsond7797752009-09-01 18:51:56 +0000114 ret void
115}
116
117define void @vst2lanei16(i16* %A, <4 x i16>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000118;CHECK-LABEL: vst2lanei16:
Bob Wilsonb6d61dc2010-10-19 00:16:32 +0000119;Check the alignment value. Max for this instruction is 32 bits:
Kristof Beyls0ba797e2013-02-22 10:01:33 +0000120;CHECK: vst2.16 {d16[1], d17[1]}, [r0:32]
Bob Wilson92a46852010-04-20 00:17:16 +0000121 %tmp0 = bitcast i16* %A to i8*
Bob Wilsond7797752009-09-01 18:51:56 +0000122 %tmp1 = load <4 x i16>* %B
Bob Wilsonb6d61dc2010-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 Wilsond7797752009-09-01 18:51:56 +0000124 ret void
125}
126
Bob Wilson06fce872011-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 {
Stephen Lind24ab202013-07-14 06:24:09 +0000129;CHECK-LABEL: vst2lanei16_update:
Matthias Braun77219d82013-10-11 18:09:19 +0000130;CHECK: vst2.16 {d16[1], d17[1]}, [r1], r2
Bob Wilson06fce872011-02-07 17:43:21 +0000131 %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 Wilsond7797752009-09-01 18:51:56 +0000140define void @vst2lanei32(i32* %A, <2 x i32>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000141;CHECK-LABEL: vst2lanei32:
Bob Wilsond7797752009-09-01 18:51:56 +0000142;CHECK: vst2.32
Bob Wilson92a46852010-04-20 00:17:16 +0000143 %tmp0 = bitcast i32* %A to i8*
Bob Wilsond7797752009-09-01 18:51:56 +0000144 %tmp1 = load <2 x i32>* %B
Bob Wilsonedf722a2010-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 Wilsond7797752009-09-01 18:51:56 +0000146 ret void
147}
148
149define void @vst2lanef(float* %A, <2 x float>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000150;CHECK-LABEL: vst2lanef:
Bob Wilsond7797752009-09-01 18:51:56 +0000151;CHECK: vst2.32
Bob Wilson92a46852010-04-20 00:17:16 +0000152 %tmp0 = bitcast float* %A to i8*
Bob Wilsond7797752009-09-01 18:51:56 +0000153 %tmp1 = load <2 x float>* %B
Bob Wilsonedf722a2010-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 Wilsond7797752009-09-01 18:51:56 +0000155 ret void
156}
157
Bob Wilsonb851eb32009-10-08 23:38:24 +0000158define void @vst2laneQi16(i16* %A, <8 x i16>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000159;CHECK-LABEL: vst2laneQi16:
Bob Wilsonb6d61dc2010-10-19 00:16:32 +0000160;Check the (default) alignment.
161;CHECK: vst2.16 {d17[1], d19[1]}, [r0]
Bob Wilson92a46852010-04-20 00:17:16 +0000162 %tmp0 = bitcast i16* %A to i8*
Bob Wilsonb851eb32009-10-08 23:38:24 +0000163 %tmp1 = load <8 x i16>* %B
Bob Wilsonb6d61dc2010-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 Wilsonb851eb32009-10-08 23:38:24 +0000165 ret void
166}
167
168define void @vst2laneQi32(i32* %A, <4 x i32>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000169;CHECK-LABEL: vst2laneQi32:
Bob Wilsonb6d61dc2010-10-19 00:16:32 +0000170;Check the alignment value. Max for this instruction is 64 bits:
Kristof Beyls0ba797e2013-02-22 10:01:33 +0000171;CHECK: vst2.32 {d17[0], d19[0]}, [r0:64]
Bob Wilson92a46852010-04-20 00:17:16 +0000172 %tmp0 = bitcast i32* %A to i8*
Bob Wilsonb851eb32009-10-08 23:38:24 +0000173 %tmp1 = load <4 x i32>* %B
Bob Wilsonb6d61dc2010-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 Wilsonb851eb32009-10-08 23:38:24 +0000175 ret void
176}
177
178define void @vst2laneQf(float* %A, <4 x float>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000179;CHECK-LABEL: vst2laneQf:
Bob Wilsonb851eb32009-10-08 23:38:24 +0000180;CHECK: vst2.32
Bob Wilson92a46852010-04-20 00:17:16 +0000181 %tmp0 = bitcast float* %A to i8*
Bob Wilsonb851eb32009-10-08 23:38:24 +0000182 %tmp1 = load <4 x float>* %B
Bob Wilsonedf722a2010-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 Wilsonb851eb32009-10-08 23:38:24 +0000184 ret void
185}
186
Bob Wilsonedf722a2010-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 Wilsond7797752009-09-01 18:51:56 +0000191
Bob Wilsonedf722a2010-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 Wilsonb851eb32009-10-08 23:38:24 +0000195
Bob Wilsond7797752009-09-01 18:51:56 +0000196define void @vst3lanei8(i8* %A, <8 x i8>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000197;CHECK-LABEL: vst3lanei8:
Bob Wilsond7797752009-09-01 18:51:56 +0000198;CHECK: vst3.8
199 %tmp1 = load <8 x i8>* %B
Bob Wilsonedf722a2010-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 Wilsond7797752009-09-01 18:51:56 +0000201 ret void
202}
203
204define void @vst3lanei16(i16* %A, <4 x i16>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000205;CHECK-LABEL: vst3lanei16:
Bob Wilsonb6d61dc2010-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 Wilson92a46852010-04-20 00:17:16 +0000208 %tmp0 = bitcast i16* %A to i8*
Bob Wilsond7797752009-09-01 18:51:56 +0000209 %tmp1 = load <4 x i16>* %B
Bob Wilsonb6d61dc2010-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 Wilsond7797752009-09-01 18:51:56 +0000211 ret void
212}
213
214define void @vst3lanei32(i32* %A, <2 x i32>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000215;CHECK-LABEL: vst3lanei32:
Bob Wilsond7797752009-09-01 18:51:56 +0000216;CHECK: vst3.32
Bob Wilson92a46852010-04-20 00:17:16 +0000217 %tmp0 = bitcast i32* %A to i8*
Bob Wilsond7797752009-09-01 18:51:56 +0000218 %tmp1 = load <2 x i32>* %B
Bob Wilsonedf722a2010-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 Wilsond7797752009-09-01 18:51:56 +0000220 ret void
221}
222
223define void @vst3lanef(float* %A, <2 x float>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000224;CHECK-LABEL: vst3lanef:
Bob Wilsond7797752009-09-01 18:51:56 +0000225;CHECK: vst3.32
Bob Wilson92a46852010-04-20 00:17:16 +0000226 %tmp0 = bitcast float* %A to i8*
Bob Wilsond7797752009-09-01 18:51:56 +0000227 %tmp1 = load <2 x float>* %B
Bob Wilsonedf722a2010-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 Wilsond7797752009-09-01 18:51:56 +0000229 ret void
230}
231
Bob Wilsonc40903082009-10-08 23:51:31 +0000232define void @vst3laneQi16(i16* %A, <8 x i16>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000233;CHECK-LABEL: vst3laneQi16:
Bob Wilsonb6d61dc2010-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 Wilson92a46852010-04-20 00:17:16 +0000236 %tmp0 = bitcast i16* %A to i8*
Bob Wilsonc40903082009-10-08 23:51:31 +0000237 %tmp1 = load <8 x i16>* %B
Bob Wilsonb6d61dc2010-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 Wilsonc40903082009-10-08 23:51:31 +0000239 ret void
240}
241
242define void @vst3laneQi32(i32* %A, <4 x i32>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000243;CHECK-LABEL: vst3laneQi32:
Bob Wilsonc40903082009-10-08 23:51:31 +0000244;CHECK: vst3.32
Bob Wilson92a46852010-04-20 00:17:16 +0000245 %tmp0 = bitcast i32* %A to i8*
Bob Wilsonc40903082009-10-08 23:51:31 +0000246 %tmp1 = load <4 x i32>* %B
Bob Wilsonedf722a2010-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 Wilsonc40903082009-10-08 23:51:31 +0000248 ret void
249}
250
Bob Wilson06fce872011-02-07 17:43:21 +0000251;Check for a post-increment updating store.
252define void @vst3laneQi32_update(i32** %ptr, <4 x i32>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000253;CHECK-LABEL: vst3laneQi32_update:
Matthias Braun77219d82013-10-11 18:09:19 +0000254;CHECK: vst3.32 {d16[0], d18[0], d20[0]}, [r1]!
Bob Wilson06fce872011-02-07 17:43:21 +0000255 %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 Wilsonc40903082009-10-08 23:51:31 +0000264define void @vst3laneQf(float* %A, <4 x float>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000265;CHECK-LABEL: vst3laneQf:
Bob Wilsonc40903082009-10-08 23:51:31 +0000266;CHECK: vst3.32
Bob Wilson92a46852010-04-20 00:17:16 +0000267 %tmp0 = bitcast float* %A to i8*
Bob Wilsonc40903082009-10-08 23:51:31 +0000268 %tmp1 = load <4 x float>* %B
Bob Wilsonedf722a2010-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 Wilsonc40903082009-10-08 23:51:31 +0000270 ret void
271}
272
Bob Wilsonedf722a2010-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 Wilsond7797752009-09-01 18:51:56 +0000277
Bob Wilsonedf722a2010-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 Wilsonc40903082009-10-08 23:51:31 +0000281
Bob Wilsond7797752009-09-01 18:51:56 +0000282
283define void @vst4lanei8(i8* %A, <8 x i8>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000284;CHECK-LABEL: vst4lanei8:
Bob Wilsonb6d61dc2010-10-19 00:16:32 +0000285;Check the alignment value. Max for this instruction is 32 bits:
Kristof Beyls0ba797e2013-02-22 10:01:33 +0000286;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0:32]
Bob Wilsond7797752009-09-01 18:51:56 +0000287 %tmp1 = load <8 x i8>* %B
Bob Wilsonb6d61dc2010-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 Wilsond7797752009-09-01 18:51:56 +0000289 ret void
290}
291
Bob Wilson06fce872011-02-07 17:43:21 +0000292;Check for a post-increment updating store.
293define void @vst4lanei8_update(i8** %ptr, <8 x i8>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000294;CHECK-LABEL: vst4lanei8_update:
Matthias Braun77219d82013-10-11 18:09:19 +0000295;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r1:32]!
Bob Wilson06fce872011-02-07 17:43:21 +0000296 %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 Wilsond7797752009-09-01 18:51:56 +0000304define void @vst4lanei16(i16* %A, <4 x i16>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000305;CHECK-LABEL: vst4lanei16:
Bob Wilsond7797752009-09-01 18:51:56 +0000306;CHECK: vst4.16
Bob Wilson92a46852010-04-20 00:17:16 +0000307 %tmp0 = bitcast i16* %A to i8*
Bob Wilsond7797752009-09-01 18:51:56 +0000308 %tmp1 = load <4 x i16>* %B
Bob Wilsonedf722a2010-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 Wilsond7797752009-09-01 18:51:56 +0000310 ret void
311}
312
313define void @vst4lanei32(i32* %A, <2 x i32>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000314;CHECK-LABEL: vst4lanei32:
Bob Wilsonb6d61dc2010-10-19 00:16:32 +0000315;Check the alignment value. Max for this instruction is 128 bits:
Kristof Beyls0ba797e2013-02-22 10:01:33 +0000316;CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0:128]
Bob Wilson92a46852010-04-20 00:17:16 +0000317 %tmp0 = bitcast i32* %A to i8*
Bob Wilsond7797752009-09-01 18:51:56 +0000318 %tmp1 = load <2 x i32>* %B
Bob Wilsonb6d61dc2010-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 Wilsond7797752009-09-01 18:51:56 +0000320 ret void
321}
322
323define void @vst4lanef(float* %A, <2 x float>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000324;CHECK-LABEL: vst4lanef:
Bob Wilsond7797752009-09-01 18:51:56 +0000325;CHECK: vst4.32
Bob Wilson92a46852010-04-20 00:17:16 +0000326 %tmp0 = bitcast float* %A to i8*
Bob Wilsond7797752009-09-01 18:51:56 +0000327 %tmp1 = load <2 x float>* %B
Bob Wilsonedf722a2010-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 Wilsond7797752009-09-01 18:51:56 +0000329 ret void
330}
331
Bob Wilson84e79672009-10-09 00:01:36 +0000332define void @vst4laneQi16(i16* %A, <8 x i16>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000333;CHECK-LABEL: vst4laneQi16:
Bob Wilsonb6d61dc2010-10-19 00:16:32 +0000334;Check the alignment value. Max for this instruction is 64 bits:
Kristof Beyls0ba797e2013-02-22 10:01:33 +0000335;CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0:64]
Bob Wilson92a46852010-04-20 00:17:16 +0000336 %tmp0 = bitcast i16* %A to i8*
Bob Wilson84e79672009-10-09 00:01:36 +0000337 %tmp1 = load <8 x i16>* %B
Bob Wilsonb6d61dc2010-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 Wilson84e79672009-10-09 00:01:36 +0000339 ret void
340}
341
342define void @vst4laneQi32(i32* %A, <4 x i32>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000343;CHECK-LABEL: vst4laneQi32:
Bob Wilsonb6d61dc2010-10-19 00:16:32 +0000344;Check the (default) alignment.
345;CHECK: vst4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0]
Bob Wilson92a46852010-04-20 00:17:16 +0000346 %tmp0 = bitcast i32* %A to i8*
Bob Wilson84e79672009-10-09 00:01:36 +0000347 %tmp1 = load <4 x i32>* %B
Bob Wilsonedf722a2010-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 Wilson84e79672009-10-09 00:01:36 +0000349 ret void
350}
351
352define void @vst4laneQf(float* %A, <4 x float>* %B) nounwind {
Stephen Lind24ab202013-07-14 06:24:09 +0000353;CHECK-LABEL: vst4laneQf:
Bob Wilson84e79672009-10-09 00:01:36 +0000354;CHECK: vst4.32
Bob Wilson92a46852010-04-20 00:17:16 +0000355 %tmp0 = bitcast float* %A to i8*
Bob Wilson84e79672009-10-09 00:01:36 +0000356 %tmp1 = load <4 x float>* %B
Bob Wilsonedf722a2010-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 Wilson84e79672009-10-09 00:01:36 +0000358 ret void
359}
360
Eli Friedmana5e244c2011-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 {
Stephen Lind24ab202013-07-14 06:24:09 +0000363;CHECK-LABEL: variable_insertelement:
Eli Friedmana5e244c2011-10-24 23:08:52 +0000364 %r = insertelement <8 x i16> %a, i16 %b, i32 %c
365 ret <8 x i16> %r
366}
367
Bob Wilsonedf722a2010-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 Wilson84e79672009-10-09 00:01:36 +0000372
Bob Wilsonedf722a2010-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