fix PR8602, a bug in an assertion: a volatile store *of* a pointer
[oota-llvm.git] / test / CodeGen / ARM / vstlane.ll
1 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
2
3 define 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
13 define void @vst1lanei16(i16* %A, <4 x i16>* %B) nounwind {
14 ;CHECK: vst1lanei16:
15 ;Check the alignment value.  Max for this instruction is 16 bits:
16 ;CHECK: vst1.16 {d16[2]}, [r0, :16]
17         %tmp1 = load <4 x i16>* %B
18         %tmp2 = extractelement <4 x i16> %tmp1, i32 2
19         store i16 %tmp2, i16* %A, align 8
20         ret void
21 }
22
23 define void @vst1lanei32(i32* %A, <2 x i32>* %B) nounwind {
24 ;CHECK: vst1lanei32:
25 ;Check the alignment value.  Max for this instruction is 32 bits:
26 ;CHECK: vst1.32 {d16[1]}, [r0, :32]
27         %tmp1 = load <2 x i32>* %B
28         %tmp2 = extractelement <2 x i32> %tmp1, i32 1
29         store i32 %tmp2, i32* %A, align 8
30         ret void
31 }
32
33 define void @vst1lanef(float* %A, <2 x float>* %B) nounwind {
34 ;CHECK: vst1lanef:
35 ;CHECK: vst1.32 {d16[1]}, [r0]
36         %tmp1 = load <2 x float>* %B
37         %tmp2 = extractelement <2 x float> %tmp1, i32 1
38         store float %tmp2, float* %A
39         ret void
40 }
41
42 define void @vst1laneQi8(i8* %A, <16 x i8>* %B) nounwind {
43 ;CHECK: vst1laneQi8:
44 ;CHECK: vst1.8 {d17[1]}, [r0]
45         %tmp1 = load <16 x i8>* %B
46         %tmp2 = extractelement <16 x i8> %tmp1, i32 9
47         store i8 %tmp2, i8* %A, align 8
48         ret void
49 }
50
51 define void @vst1laneQi16(i16* %A, <8 x i16>* %B) nounwind {
52 ;CHECK: vst1laneQi16:
53 ;CHECK: vst1.16 {d17[1]}, [r0, :16]
54         %tmp1 = load <8 x i16>* %B
55         %tmp2 = extractelement <8 x i16> %tmp1, i32 5
56         store i16 %tmp2, i16* %A, align 8
57         ret void
58 }
59
60 define void @vst1laneQi32(i32* %A, <4 x i32>* %B) nounwind {
61 ;CHECK: vst1laneQi32:
62 ;CHECK: vst1.32 {d17[1]}, [r0, :32]
63         %tmp1 = load <4 x i32>* %B
64         %tmp2 = extractelement <4 x i32> %tmp1, i32 3
65         store i32 %tmp2, i32* %A, align 8
66         ret void
67 }
68
69 define void @vst1laneQf(float* %A, <4 x float>* %B) nounwind {
70 ;CHECK: vst1laneQf:
71 ;CHECK: vst1.32 {d17[1]}, [r0]
72         %tmp1 = load <4 x float>* %B
73         %tmp2 = extractelement <4 x float> %tmp1, i32 3
74         store float %tmp2, float* %A
75         ret void
76 }
77
78 define void @vst2lanei8(i8* %A, <8 x i8>* %B) nounwind {
79 ;CHECK: vst2lanei8:
80 ;Check the alignment value.  Max for this instruction is 16 bits:
81 ;CHECK: vst2.8 {d16[1], d17[1]}, [r0, :16]
82         %tmp1 = load <8 x i8>* %B
83         call void @llvm.arm.neon.vst2lane.v8i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 4)
84         ret void
85 }
86
87 define void @vst2lanei16(i16* %A, <4 x i16>* %B) nounwind {
88 ;CHECK: vst2lanei16:
89 ;Check the alignment value.  Max for this instruction is 32 bits:
90 ;CHECK: vst2.16 {d16[1], d17[1]}, [r0, :32]
91         %tmp0 = bitcast i16* %A to i8*
92         %tmp1 = load <4 x i16>* %B
93         call void @llvm.arm.neon.vst2lane.v4i16(i8* %tmp0, <4 x i16> %tmp1, <4 x i16> %tmp1, i32 1, i32 8)
94         ret void
95 }
96
97 define void @vst2lanei32(i32* %A, <2 x i32>* %B) nounwind {
98 ;CHECK: vst2lanei32:
99 ;CHECK: vst2.32
100         %tmp0 = bitcast i32* %A to i8*
101         %tmp1 = load <2 x i32>* %B
102         call void @llvm.arm.neon.vst2lane.v2i32(i8* %tmp0, <2 x i32> %tmp1, <2 x i32> %tmp1, i32 1, i32 1)
103         ret void
104 }
105
106 define void @vst2lanef(float* %A, <2 x float>* %B) nounwind {
107 ;CHECK: vst2lanef:
108 ;CHECK: vst2.32
109         %tmp0 = bitcast float* %A to i8*
110         %tmp1 = load <2 x float>* %B
111         call void @llvm.arm.neon.vst2lane.v2f32(i8* %tmp0, <2 x float> %tmp1, <2 x float> %tmp1, i32 1, i32 1)
112         ret void
113 }
114
115 define void @vst2laneQi16(i16* %A, <8 x i16>* %B) nounwind {
116 ;CHECK: vst2laneQi16:
117 ;Check the (default) alignment.
118 ;CHECK: vst2.16 {d17[1], d19[1]}, [r0]
119         %tmp0 = bitcast i16* %A to i8*
120         %tmp1 = load <8 x i16>* %B
121         call void @llvm.arm.neon.vst2lane.v8i16(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 5, i32 1)
122         ret void
123 }
124
125 define void @vst2laneQi32(i32* %A, <4 x i32>* %B) nounwind {
126 ;CHECK: vst2laneQi32:
127 ;Check the alignment value.  Max for this instruction is 64 bits:
128 ;CHECK: vst2.32 {d17[0], d19[0]}, [r0, :64]
129         %tmp0 = bitcast i32* %A to i8*
130         %tmp1 = load <4 x i32>* %B
131         call void @llvm.arm.neon.vst2lane.v4i32(i8* %tmp0, <4 x i32> %tmp1, <4 x i32> %tmp1, i32 2, i32 16)
132         ret void
133 }
134
135 define void @vst2laneQf(float* %A, <4 x float>* %B) nounwind {
136 ;CHECK: vst2laneQf:
137 ;CHECK: vst2.32
138         %tmp0 = bitcast float* %A to i8*
139         %tmp1 = load <4 x float>* %B
140         call void @llvm.arm.neon.vst2lane.v4f32(i8* %tmp0, <4 x float> %tmp1, <4 x float> %tmp1, i32 3, i32 1)
141         ret void
142 }
143
144 declare void @llvm.arm.neon.vst2lane.v8i8(i8*, <8 x i8>, <8 x i8>, i32, i32) nounwind
145 declare void @llvm.arm.neon.vst2lane.v4i16(i8*, <4 x i16>, <4 x i16>, i32, i32) nounwind
146 declare void @llvm.arm.neon.vst2lane.v2i32(i8*, <2 x i32>, <2 x i32>, i32, i32) nounwind
147 declare void @llvm.arm.neon.vst2lane.v2f32(i8*, <2 x float>, <2 x float>, i32, i32) nounwind
148
149 declare void @llvm.arm.neon.vst2lane.v8i16(i8*, <8 x i16>, <8 x i16>, i32, i32) nounwind
150 declare void @llvm.arm.neon.vst2lane.v4i32(i8*, <4 x i32>, <4 x i32>, i32, i32) nounwind
151 declare void @llvm.arm.neon.vst2lane.v4f32(i8*, <4 x float>, <4 x float>, i32, i32) nounwind
152
153 define void @vst3lanei8(i8* %A, <8 x i8>* %B) nounwind {
154 ;CHECK: vst3lanei8:
155 ;CHECK: vst3.8
156         %tmp1 = load <8 x i8>* %B
157         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)
158         ret void
159 }
160
161 define void @vst3lanei16(i16* %A, <4 x i16>* %B) nounwind {
162 ;CHECK: vst3lanei16:
163 ;Check the (default) alignment value.  VST3 does not support alignment.
164 ;CHECK: vst3.16 {d16[1], d17[1], d18[1]}, [r0]
165         %tmp0 = bitcast i16* %A to i8*
166         %tmp1 = load <4 x i16>* %B
167         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)
168         ret void
169 }
170
171 define void @vst3lanei32(i32* %A, <2 x i32>* %B) nounwind {
172 ;CHECK: vst3lanei32:
173 ;CHECK: vst3.32
174         %tmp0 = bitcast i32* %A to i8*
175         %tmp1 = load <2 x i32>* %B
176         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)
177         ret void
178 }
179
180 define void @vst3lanef(float* %A, <2 x float>* %B) nounwind {
181 ;CHECK: vst3lanef:
182 ;CHECK: vst3.32
183         %tmp0 = bitcast float* %A to i8*
184         %tmp1 = load <2 x float>* %B
185         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)
186         ret void
187 }
188
189 define void @vst3laneQi16(i16* %A, <8 x i16>* %B) nounwind {
190 ;CHECK: vst3laneQi16:
191 ;Check the (default) alignment value.  VST3 does not support alignment.
192 ;CHECK: vst3.16 {d17[2], d19[2], d21[2]}, [r0]
193         %tmp0 = bitcast i16* %A to i8*
194         %tmp1 = load <8 x i16>* %B
195         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)
196         ret void
197 }
198
199 define void @vst3laneQi32(i32* %A, <4 x i32>* %B) nounwind {
200 ;CHECK: vst3laneQi32:
201 ;CHECK: vst3.32
202         %tmp0 = bitcast i32* %A to i8*
203         %tmp1 = load <4 x i32>* %B
204         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)
205         ret void
206 }
207
208 define void @vst3laneQf(float* %A, <4 x float>* %B) nounwind {
209 ;CHECK: vst3laneQf:
210 ;CHECK: vst3.32
211         %tmp0 = bitcast float* %A to i8*
212         %tmp1 = load <4 x float>* %B
213         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)
214         ret void
215 }
216
217 declare void @llvm.arm.neon.vst3lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind
218 declare void @llvm.arm.neon.vst3lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind
219 declare void @llvm.arm.neon.vst3lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind
220 declare void @llvm.arm.neon.vst3lane.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, i32, i32) nounwind
221
222 declare void @llvm.arm.neon.vst3lane.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind
223 declare void @llvm.arm.neon.vst3lane.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind
224 declare void @llvm.arm.neon.vst3lane.v4f32(i8*, <4 x float>, <4 x float>, <4 x float>, i32, i32) nounwind
225
226
227 define void @vst4lanei8(i8* %A, <8 x i8>* %B) nounwind {
228 ;CHECK: vst4lanei8:
229 ;Check the alignment value.  Max for this instruction is 32 bits:
230 ;CHECK: vst4.8 {d16[1], d17[1], d18[1], d19[1]}, [r0, :32]
231         %tmp1 = load <8 x i8>* %B
232         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)
233         ret void
234 }
235
236 define void @vst4lanei16(i16* %A, <4 x i16>* %B) nounwind {
237 ;CHECK: vst4lanei16:
238 ;CHECK: vst4.16
239         %tmp0 = bitcast i16* %A to i8*
240         %tmp1 = load <4 x i16>* %B
241         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)
242         ret void
243 }
244
245 define void @vst4lanei32(i32* %A, <2 x i32>* %B) nounwind {
246 ;CHECK: vst4lanei32:
247 ;Check the alignment value.  Max for this instruction is 128 bits:
248 ;CHECK: vst4.32 {d16[1], d17[1], d18[1], d19[1]}, [r0, :128]
249         %tmp0 = bitcast i32* %A to i8*
250         %tmp1 = load <2 x i32>* %B
251         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)
252         ret void
253 }
254
255 define void @vst4lanef(float* %A, <2 x float>* %B) nounwind {
256 ;CHECK: vst4lanef:
257 ;CHECK: vst4.32
258         %tmp0 = bitcast float* %A to i8*
259         %tmp1 = load <2 x float>* %B
260         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)
261         ret void
262 }
263
264 define void @vst4laneQi16(i16* %A, <8 x i16>* %B) nounwind {
265 ;CHECK: vst4laneQi16:
266 ;Check the alignment value.  Max for this instruction is 64 bits:
267 ;CHECK: vst4.16 {d17[3], d19[3], d21[3], d23[3]}, [r0, :64]
268         %tmp0 = bitcast i16* %A to i8*
269         %tmp1 = load <8 x i16>* %B
270         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)
271         ret void
272 }
273
274 define void @vst4laneQi32(i32* %A, <4 x i32>* %B) nounwind {
275 ;CHECK: vst4laneQi32:
276 ;Check the (default) alignment.
277 ;CHECK: vst4.32 {d17[0], d19[0], d21[0], d23[0]}, [r0]
278         %tmp0 = bitcast i32* %A to i8*
279         %tmp1 = load <4 x i32>* %B
280         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)
281         ret void
282 }
283
284 define void @vst4laneQf(float* %A, <4 x float>* %B) nounwind {
285 ;CHECK: vst4laneQf:
286 ;CHECK: vst4.32
287         %tmp0 = bitcast float* %A to i8*
288         %tmp1 = load <4 x float>* %B
289         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)
290         ret void
291 }
292
293 declare void @llvm.arm.neon.vst4lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind
294 declare void @llvm.arm.neon.vst4lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind
295 declare void @llvm.arm.neon.vst4lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind
296 declare void @llvm.arm.neon.vst4lane.v2f32(i8*, <2 x float>, <2 x float>, <2 x float>, <2 x float>, i32, i32) nounwind
297
298 declare void @llvm.arm.neon.vst4lane.v8i16(i8*, <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i32, i32) nounwind
299 declare void @llvm.arm.neon.vst4lane.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32) nounwind
300 declare void @llvm.arm.neon.vst4lane.v4f32(i8*, <4 x float>, <4 x float>, <4 x float>, <4 x float>, i32, i32) nounwind