Convert more NEON tests to use FileCheck.
[oota-llvm.git] / test / CodeGen / ARM / vshl.ll
1 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
2
3 define <8 x i8> @vshls8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
4 ;CHECK: vshls8:
5 ;CHECK: vshl.s8
6         %tmp1 = load <8 x i8>* %A
7         %tmp2 = load <8 x i8>* %B
8         %tmp3 = call <8 x i8> @llvm.arm.neon.vshifts.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
9         ret <8 x i8> %tmp3
10 }
11
12 define <4 x i16> @vshls16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
13 ;CHECK: vshls16:
14 ;CHECK: vshl.s16
15         %tmp1 = load <4 x i16>* %A
16         %tmp2 = load <4 x i16>* %B
17         %tmp3 = call <4 x i16> @llvm.arm.neon.vshifts.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
18         ret <4 x i16> %tmp3
19 }
20
21 define <2 x i32> @vshls32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
22 ;CHECK: vshls32:
23 ;CHECK: vshl.s32
24         %tmp1 = load <2 x i32>* %A
25         %tmp2 = load <2 x i32>* %B
26         %tmp3 = call <2 x i32> @llvm.arm.neon.vshifts.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
27         ret <2 x i32> %tmp3
28 }
29
30 define <1 x i64> @vshls64(<1 x i64>* %A, <1 x i64>* %B) nounwind {
31 ;CHECK: vshls64:
32 ;CHECK: vshl.s64
33         %tmp1 = load <1 x i64>* %A
34         %tmp2 = load <1 x i64>* %B
35         %tmp3 = call <1 x i64> @llvm.arm.neon.vshifts.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)
36         ret <1 x i64> %tmp3
37 }
38
39 define <8 x i8> @vshlu8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
40 ;CHECK: vshlu8:
41 ;CHECK: vshl.u8
42         %tmp1 = load <8 x i8>* %A
43         %tmp2 = load <8 x i8>* %B
44         %tmp3 = call <8 x i8> @llvm.arm.neon.vshiftu.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
45         ret <8 x i8> %tmp3
46 }
47
48 define <4 x i16> @vshlu16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
49 ;CHECK: vshlu16:
50 ;CHECK: vshl.u16
51         %tmp1 = load <4 x i16>* %A
52         %tmp2 = load <4 x i16>* %B
53         %tmp3 = call <4 x i16> @llvm.arm.neon.vshiftu.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
54         ret <4 x i16> %tmp3
55 }
56
57 define <2 x i32> @vshlu32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
58 ;CHECK: vshlu32:
59 ;CHECK: vshl.u32
60         %tmp1 = load <2 x i32>* %A
61         %tmp2 = load <2 x i32>* %B
62         %tmp3 = call <2 x i32> @llvm.arm.neon.vshiftu.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
63         ret <2 x i32> %tmp3
64 }
65
66 define <1 x i64> @vshlu64(<1 x i64>* %A, <1 x i64>* %B) nounwind {
67 ;CHECK: vshlu64:
68 ;CHECK: vshl.u64
69         %tmp1 = load <1 x i64>* %A
70         %tmp2 = load <1 x i64>* %B
71         %tmp3 = call <1 x i64> @llvm.arm.neon.vshiftu.v1i64(<1 x i64> %tmp1, <1 x i64> %tmp2)
72         ret <1 x i64> %tmp3
73 }
74
75 define <16 x i8> @vshlQs8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
76 ;CHECK: vshlQs8:
77 ;CHECK: vshl.s8
78         %tmp1 = load <16 x i8>* %A
79         %tmp2 = load <16 x i8>* %B
80         %tmp3 = call <16 x i8> @llvm.arm.neon.vshifts.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
81         ret <16 x i8> %tmp3
82 }
83
84 define <8 x i16> @vshlQs16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
85 ;CHECK: vshlQs16:
86 ;CHECK: vshl.s16
87         %tmp1 = load <8 x i16>* %A
88         %tmp2 = load <8 x i16>* %B
89         %tmp3 = call <8 x i16> @llvm.arm.neon.vshifts.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
90         ret <8 x i16> %tmp3
91 }
92
93 define <4 x i32> @vshlQs32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
94 ;CHECK: vshlQs32:
95 ;CHECK: vshl.s32
96         %tmp1 = load <4 x i32>* %A
97         %tmp2 = load <4 x i32>* %B
98         %tmp3 = call <4 x i32> @llvm.arm.neon.vshifts.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
99         ret <4 x i32> %tmp3
100 }
101
102 define <2 x i64> @vshlQs64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
103 ;CHECK: vshlQs64:
104 ;CHECK: vshl.s64
105         %tmp1 = load <2 x i64>* %A
106         %tmp2 = load <2 x i64>* %B
107         %tmp3 = call <2 x i64> @llvm.arm.neon.vshifts.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
108         ret <2 x i64> %tmp3
109 }
110
111 define <16 x i8> @vshlQu8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
112 ;CHECK: vshlQu8:
113 ;CHECK: vshl.u8
114         %tmp1 = load <16 x i8>* %A
115         %tmp2 = load <16 x i8>* %B
116         %tmp3 = call <16 x i8> @llvm.arm.neon.vshiftu.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
117         ret <16 x i8> %tmp3
118 }
119
120 define <8 x i16> @vshlQu16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
121 ;CHECK: vshlQu16:
122 ;CHECK: vshl.u16
123         %tmp1 = load <8 x i16>* %A
124         %tmp2 = load <8 x i16>* %B
125         %tmp3 = call <8 x i16> @llvm.arm.neon.vshiftu.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
126         ret <8 x i16> %tmp3
127 }
128
129 define <4 x i32> @vshlQu32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
130 ;CHECK: vshlQu32:
131 ;CHECK: vshl.u32
132         %tmp1 = load <4 x i32>* %A
133         %tmp2 = load <4 x i32>* %B
134         %tmp3 = call <4 x i32> @llvm.arm.neon.vshiftu.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
135         ret <4 x i32> %tmp3
136 }
137
138 define <2 x i64> @vshlQu64(<2 x i64>* %A, <2 x i64>* %B) nounwind {
139 ;CHECK: vshlQu64:
140 ;CHECK: vshl.u64
141         %tmp1 = load <2 x i64>* %A
142         %tmp2 = load <2 x i64>* %B
143         %tmp3 = call <2 x i64> @llvm.arm.neon.vshiftu.v2i64(<2 x i64> %tmp1, <2 x i64> %tmp2)
144         ret <2 x i64> %tmp3
145 }
146
147 ; For left shifts by immediates, the signedness is irrelevant.
148 ; Test a mix of both signed and unsigned intrinsics.
149
150 define <8 x i8> @vshli8(<8 x i8>* %A) nounwind {
151 ;CHECK: vshli8:
152 ;CHECK: vshl.i8
153         %tmp1 = load <8 x i8>* %A
154         %tmp2 = call <8 x i8> @llvm.arm.neon.vshifts.v8i8(<8 x i8> %tmp1, <8 x i8> < i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7 >)
155         ret <8 x i8> %tmp2
156 }
157
158 define <4 x i16> @vshli16(<4 x i16>* %A) nounwind {
159 ;CHECK: vshli16:
160 ;CHECK: vshl.i16
161         %tmp1 = load <4 x i16>* %A
162         %tmp2 = call <4 x i16> @llvm.arm.neon.vshiftu.v4i16(<4 x i16> %tmp1, <4 x i16> < i16 15, i16 15, i16 15, i16 15 >)
163         ret <4 x i16> %tmp2
164 }
165
166 define <2 x i32> @vshli32(<2 x i32>* %A) nounwind {
167 ;CHECK: vshli32:
168 ;CHECK: vshl.i32
169         %tmp1 = load <2 x i32>* %A
170         %tmp2 = call <2 x i32> @llvm.arm.neon.vshifts.v2i32(<2 x i32> %tmp1, <2 x i32> < i32 31, i32 31 >)
171         ret <2 x i32> %tmp2
172 }
173
174 define <1 x i64> @vshli64(<1 x i64>* %A) nounwind {
175 ;CHECK: vshli64:
176 ;CHECK: vshl.i64
177         %tmp1 = load <1 x i64>* %A
178         %tmp2 = call <1 x i64> @llvm.arm.neon.vshiftu.v1i64(<1 x i64> %tmp1, <1 x i64> < i64 63 >)
179         ret <1 x i64> %tmp2
180 }
181
182 define <16 x i8> @vshlQi8(<16 x i8>* %A) nounwind {
183 ;CHECK: vshlQi8:
184 ;CHECK: vshl.i8
185         %tmp1 = load <16 x i8>* %A
186         %tmp2 = call <16 x i8> @llvm.arm.neon.vshifts.v16i8(<16 x i8> %tmp1, <16 x i8> < i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7 >)
187         ret <16 x i8> %tmp2
188 }
189
190 define <8 x i16> @vshlQi16(<8 x i16>* %A) nounwind {
191 ;CHECK: vshlQi16:
192 ;CHECK: vshl.i16
193         %tmp1 = load <8 x i16>* %A
194         %tmp2 = call <8 x i16> @llvm.arm.neon.vshiftu.v8i16(<8 x i16> %tmp1, <8 x i16> < i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15 >)
195         ret <8 x i16> %tmp2
196 }
197
198 define <4 x i32> @vshlQi32(<4 x i32>* %A) nounwind {
199 ;CHECK: vshlQi32:
200 ;CHECK: vshl.i32
201         %tmp1 = load <4 x i32>* %A
202         %tmp2 = call <4 x i32> @llvm.arm.neon.vshifts.v4i32(<4 x i32> %tmp1, <4 x i32> < i32 31, i32 31, i32 31, i32 31 >)
203         ret <4 x i32> %tmp2
204 }
205
206 define <2 x i64> @vshlQi64(<2 x i64>* %A) nounwind {
207 ;CHECK: vshlQi64:
208 ;CHECK: vshl.i64
209         %tmp1 = load <2 x i64>* %A
210         %tmp2 = call <2 x i64> @llvm.arm.neon.vshiftu.v2i64(<2 x i64> %tmp1, <2 x i64> < i64 63, i64 63 >)
211         ret <2 x i64> %tmp2
212 }
213
214 ; Right shift by immediate:
215
216 define <8 x i8> @vshrs8(<8 x i8>* %A) nounwind {
217 ;CHECK: vshrs8:
218 ;CHECK: vshr.s8
219         %tmp1 = load <8 x i8>* %A
220         %tmp2 = call <8 x i8> @llvm.arm.neon.vshifts.v8i8(<8 x i8> %tmp1, <8 x i8> < i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8 >)
221         ret <8 x i8> %tmp2
222 }
223
224 define <4 x i16> @vshrs16(<4 x i16>* %A) nounwind {
225 ;CHECK: vshrs16:
226 ;CHECK: vshr.s16
227         %tmp1 = load <4 x i16>* %A
228         %tmp2 = call <4 x i16> @llvm.arm.neon.vshifts.v4i16(<4 x i16> %tmp1, <4 x i16> < i16 -16, i16 -16, i16 -16, i16 -16 >)
229         ret <4 x i16> %tmp2
230 }
231
232 define <2 x i32> @vshrs32(<2 x i32>* %A) nounwind {
233 ;CHECK: vshrs32:
234 ;CHECK: vshr.s32
235         %tmp1 = load <2 x i32>* %A
236         %tmp2 = call <2 x i32> @llvm.arm.neon.vshifts.v2i32(<2 x i32> %tmp1, <2 x i32> < i32 -32, i32 -32 >)
237         ret <2 x i32> %tmp2
238 }
239
240 define <1 x i64> @vshrs64(<1 x i64>* %A) nounwind {
241 ;CHECK: vshrs64:
242 ;CHECK: vshr.s64
243         %tmp1 = load <1 x i64>* %A
244         %tmp2 = call <1 x i64> @llvm.arm.neon.vshifts.v1i64(<1 x i64> %tmp1, <1 x i64> < i64 -64 >)
245         ret <1 x i64> %tmp2
246 }
247
248 define <8 x i8> @vshru8(<8 x i8>* %A) nounwind {
249 ;CHECK: vshru8:
250 ;CHECK: vshr.u8
251         %tmp1 = load <8 x i8>* %A
252         %tmp2 = call <8 x i8> @llvm.arm.neon.vshiftu.v8i8(<8 x i8> %tmp1, <8 x i8> < i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8 >)
253         ret <8 x i8> %tmp2
254 }
255
256 define <4 x i16> @vshru16(<4 x i16>* %A) nounwind {
257 ;CHECK: vshru16:
258 ;CHECK: vshr.u16
259         %tmp1 = load <4 x i16>* %A
260         %tmp2 = call <4 x i16> @llvm.arm.neon.vshiftu.v4i16(<4 x i16> %tmp1, <4 x i16> < i16 -16, i16 -16, i16 -16, i16 -16 >)
261         ret <4 x i16> %tmp2
262 }
263
264 define <2 x i32> @vshru32(<2 x i32>* %A) nounwind {
265 ;CHECK: vshru32:
266 ;CHECK: vshr.u32
267         %tmp1 = load <2 x i32>* %A
268         %tmp2 = call <2 x i32> @llvm.arm.neon.vshiftu.v2i32(<2 x i32> %tmp1, <2 x i32> < i32 -32, i32 -32 >)
269         ret <2 x i32> %tmp2
270 }
271
272 define <1 x i64> @vshru64(<1 x i64>* %A) nounwind {
273 ;CHECK: vshru64:
274 ;CHECK: vshr.u64
275         %tmp1 = load <1 x i64>* %A
276         %tmp2 = call <1 x i64> @llvm.arm.neon.vshiftu.v1i64(<1 x i64> %tmp1, <1 x i64> < i64 -64 >)
277         ret <1 x i64> %tmp2
278 }
279
280 define <16 x i8> @vshrQs8(<16 x i8>* %A) nounwind {
281 ;CHECK: vshrQs8:
282 ;CHECK: vshr.s8
283         %tmp1 = load <16 x i8>* %A
284         %tmp2 = call <16 x i8> @llvm.arm.neon.vshifts.v16i8(<16 x i8> %tmp1, <16 x i8> < i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8 >)
285         ret <16 x i8> %tmp2
286 }
287
288 define <8 x i16> @vshrQs16(<8 x i16>* %A) nounwind {
289 ;CHECK: vshrQs16:
290 ;CHECK: vshr.s16
291         %tmp1 = load <8 x i16>* %A
292         %tmp2 = call <8 x i16> @llvm.arm.neon.vshifts.v8i16(<8 x i16> %tmp1, <8 x i16> < i16 -16, i16 -16, i16 -16, i16 -16, i16 -16, i16 -16, i16 -16, i16 -16 >)
293         ret <8 x i16> %tmp2
294 }
295
296 define <4 x i32> @vshrQs32(<4 x i32>* %A) nounwind {
297 ;CHECK: vshrQs32:
298 ;CHECK: vshr.s32
299         %tmp1 = load <4 x i32>* %A
300         %tmp2 = call <4 x i32> @llvm.arm.neon.vshifts.v4i32(<4 x i32> %tmp1, <4 x i32> < i32 -32, i32 -32, i32 -32, i32 -32 >)
301         ret <4 x i32> %tmp2
302 }
303
304 define <2 x i64> @vshrQs64(<2 x i64>* %A) nounwind {
305 ;CHECK: vshrQs64:
306 ;CHECK: vshr.s64
307         %tmp1 = load <2 x i64>* %A
308         %tmp2 = call <2 x i64> @llvm.arm.neon.vshifts.v2i64(<2 x i64> %tmp1, <2 x i64> < i64 -64, i64 -64 >)
309         ret <2 x i64> %tmp2
310 }
311
312 define <16 x i8> @vshrQu8(<16 x i8>* %A) nounwind {
313 ;CHECK: vshrQu8:
314 ;CHECK: vshr.u8
315         %tmp1 = load <16 x i8>* %A
316         %tmp2 = call <16 x i8> @llvm.arm.neon.vshiftu.v16i8(<16 x i8> %tmp1, <16 x i8> < i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8, i8 -8 >)
317         ret <16 x i8> %tmp2
318 }
319
320 define <8 x i16> @vshrQu16(<8 x i16>* %A) nounwind {
321 ;CHECK: vshrQu16:
322 ;CHECK: vshr.u16
323         %tmp1 = load <8 x i16>* %A
324         %tmp2 = call <8 x i16> @llvm.arm.neon.vshiftu.v8i16(<8 x i16> %tmp1, <8 x i16> < i16 -16, i16 -16, i16 -16, i16 -16, i16 -16, i16 -16, i16 -16, i16 -16 >)
325         ret <8 x i16> %tmp2
326 }
327
328 define <4 x i32> @vshrQu32(<4 x i32>* %A) nounwind {
329 ;CHECK: vshrQu32:
330 ;CHECK: vshr.u32
331         %tmp1 = load <4 x i32>* %A
332         %tmp2 = call <4 x i32> @llvm.arm.neon.vshiftu.v4i32(<4 x i32> %tmp1, <4 x i32> < i32 -32, i32 -32, i32 -32, i32 -32 >)
333         ret <4 x i32> %tmp2
334 }
335
336 define <2 x i64> @vshrQu64(<2 x i64>* %A) nounwind {
337 ;CHECK: vshrQu64:
338 ;CHECK: vshr.u64
339         %tmp1 = load <2 x i64>* %A
340         %tmp2 = call <2 x i64> @llvm.arm.neon.vshiftu.v2i64(<2 x i64> %tmp1, <2 x i64> < i64 -64, i64 -64 >)
341         ret <2 x i64> %tmp2
342 }
343
344 declare <8 x i8>  @llvm.arm.neon.vshifts.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
345 declare <4 x i16> @llvm.arm.neon.vshifts.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
346 declare <2 x i32> @llvm.arm.neon.vshifts.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
347 declare <1 x i64> @llvm.arm.neon.vshifts.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
348
349 declare <8 x i8>  @llvm.arm.neon.vshiftu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
350 declare <4 x i16> @llvm.arm.neon.vshiftu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
351 declare <2 x i32> @llvm.arm.neon.vshiftu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
352 declare <1 x i64> @llvm.arm.neon.vshiftu.v1i64(<1 x i64>, <1 x i64>) nounwind readnone
353
354 declare <16 x i8> @llvm.arm.neon.vshifts.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
355 declare <8 x i16> @llvm.arm.neon.vshifts.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
356 declare <4 x i32> @llvm.arm.neon.vshifts.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
357 declare <2 x i64> @llvm.arm.neon.vshifts.v2i64(<2 x i64>, <2 x i64>) nounwind readnone
358
359 declare <16 x i8> @llvm.arm.neon.vshiftu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
360 declare <8 x i16> @llvm.arm.neon.vshiftu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
361 declare <4 x i32> @llvm.arm.neon.vshiftu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
362 declare <2 x i64> @llvm.arm.neon.vshiftu.v2i64(<2 x i64>, <2 x i64>) nounwind readnone