Provide correct encodings for NEON vcvt, which has its own special immediate encoding
[oota-llvm.git] / test / MC / ARM / neon-cmp-encoding.ll
1 ; RUN: llc -show-mc-encoding -march=arm -mcpu=cortex-a8 -mattr=+neon < %s | FileCheck %s
2
3 ; FIXME: We cannot currently test the following instructions, which are 
4 ; currently marked as for-disassembly only in the .td files:
5 ;  - VCEQz
6 ;  - VCGEz, VCLEz
7 ;  - VCGTz, VCLTz
8
9 ; CHECK: vceq_8xi8
10 define <8 x i8> @vceq_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
11         %tmp1 = load <8 x i8>* %A
12         %tmp2 = load <8 x i8>* %B
13 ; CHECK: vceq.i8        d16, d16, d17           @ encoding: [0xb1,0x08,0x40,0xf3]
14         %tmp3 = icmp eq <8 x i8> %tmp1, %tmp2
15   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
16         ret <8 x i8> %tmp4
17 }
18
19 ; CHECK: vceq_4xi16
20 define <4 x i16> @vceq_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
21         %tmp1 = load <4 x i16>* %A
22         %tmp2 = load <4 x i16>* %B
23 ; CHECK: vceq.i16       d16, d16, d17   @ encoding: [0xb1,0x08,0x50,0xf3]
24         %tmp3 = icmp eq <4 x i16> %tmp1, %tmp2
25   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
26         ret <4 x i16> %tmp4
27 }
28
29 ; CHECK: vceq_2xi32
30 define <2 x i32> @vceq_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
31         %tmp1 = load <2 x i32>* %A
32         %tmp2 = load <2 x i32>* %B
33 ; CHECK: vceq.i32       d16, d16, d17   @ encoding: [0xb1,0x08,0x60,0xf3]
34         %tmp3 = icmp eq <2 x i32> %tmp1, %tmp2
35   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
36         ret <2 x i32> %tmp4
37 }
38
39 ; CHECK: vceq_2xfloat
40 define <2 x i32> @vceq_2xfloat(<2 x float>* %A, <2 x float>* %B) nounwind {
41         %tmp1 = load <2 x float>* %A
42         %tmp2 = load <2 x float>* %B
43 ; CHECK: vceq.f32       d16, d16, d17   @ encoding: [0xa1,0x0e,0x40,0xf2]
44         %tmp3 = fcmp oeq <2 x float> %tmp1, %tmp2
45   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
46         ret <2 x i32> %tmp4
47 }
48
49 ; CHECK: vceq_16xi8
50 define <16 x i8> @vceq_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
51         %tmp1 = load <16 x i8>* %A
52         %tmp2 = load <16 x i8>* %B
53 ; CHECK: vceq.i8        q8, q8, q9              @ encoding: [0xf2,0x08,0x40,0xf3]
54         %tmp3 = icmp eq <16 x i8> %tmp1, %tmp2
55   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
56         ret <16 x i8> %tmp4
57 }
58
59 ; CHECK: vceq_8xi16
60 define <8 x i16> @vceq_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
61         %tmp1 = load <8 x i16>* %A
62         %tmp2 = load <8 x i16>* %B
63 ; CHECK: vceq.i16       q8, q8, q9      @ encoding: [0xf2,0x08,0x50,0xf3]
64         %tmp3 = icmp eq <8 x i16> %tmp1, %tmp2
65   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
66         ret <8 x i16> %tmp4
67 }
68
69 ; CHECK: vceq_4xi32
70 define <4 x i32> @vceq_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
71         %tmp1 = load <4 x i32>* %A
72         %tmp2 = load <4 x i32>* %B
73 ; CHECK: vceq.i32       q8, q8, q9      @ encoding: [0xf2,0x08,0x60,0xf3]
74         %tmp3 = icmp eq <4 x i32> %tmp1, %tmp2
75   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
76         ret <4 x i32> %tmp4
77 }
78
79 ; CHECK: vceq_4xfloat
80 define <4 x i32> @vceq_4xfloat(<4 x float>* %A, <4 x float>* %B) nounwind {
81         %tmp1 = load <4 x float>* %A
82         %tmp2 = load <4 x float>* %B
83 ; CHECK: vceq.f32       q8, q8, q9      @ encoding: [0xe2,0x0e,0x40,0xf2]
84         %tmp3 = fcmp oeq <4 x float> %tmp1, %tmp2
85   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
86         ret <4 x i32> %tmp4
87 }
88
89 ; CHECK: vcges_8xi8
90 define <8 x i8> @vcges_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
91         %tmp1 = load <8 x i8>* %A
92         %tmp2 = load <8 x i8>* %B
93 ; CHECK: vcge.s8        d16, d16, d17           @ encoding: [0xb1,0x03,0x40,0xf2]
94         %tmp3 = icmp sge <8 x i8> %tmp1, %tmp2
95   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
96         ret <8 x i8> %tmp4
97 }
98
99 ; CHECK: vcges_4xi16
100 define <4 x i16> @vcges_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
101         %tmp1 = load <4 x i16>* %A
102         %tmp2 = load <4 x i16>* %B
103         %tmp3 = icmp sge <4 x i16> %tmp1, %tmp2
104 ; CHECK: vcge.s16       d16, d16, d17   @ encoding: [0xb1,0x03,0x50,0xf2]
105   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
106         ret <4 x i16> %tmp4
107 }
108
109 ; CHECK: vcges_2xi32
110 define <2 x i32> @vcges_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
111         %tmp1 = load <2 x i32>* %A
112         %tmp2 = load <2 x i32>* %B
113 ; CHECK: vcge.s32       d16, d16, d17   @ encoding: [0xb1,0x03,0x60,0xf2]
114         %tmp3 = icmp sge <2 x i32> %tmp1, %tmp2
115   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
116         ret <2 x i32> %tmp4
117 }
118
119 ; CHECK: vcgeu_8xi8
120 define <8 x i8> @vcgeu_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
121         %tmp1 = load <8 x i8>* %A
122         %tmp2 = load <8 x i8>* %B
123 ; CHECK: vcge.u8        d16, d16, d17           @ encoding: [0xb1,0x03,0x40,0xf3]
124         %tmp3 = icmp uge <8 x i8> %tmp1, %tmp2
125   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
126         ret <8 x i8> %tmp4
127 }
128
129 ; CHECK: vcgeu_4xi16
130 define <4 x i16> @vcgeu_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
131         %tmp1 = load <4 x i16>* %A
132         %tmp2 = load <4 x i16>* %B
133 ; CHECK: vcge.u16       d16, d16, d17   @ encoding: [0xb1,0x03,0x50,0xf3]
134         %tmp3 = icmp uge <4 x i16> %tmp1, %tmp2
135   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
136         ret <4 x i16> %tmp4
137 }
138
139 ; CHECK: vcgeu_2xi32
140 define <2 x i32> @vcgeu_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
141         %tmp1 = load <2 x i32>* %A
142         %tmp2 = load <2 x i32>* %B
143         %tmp3 = icmp uge <2 x i32> %tmp1, %tmp2
144 ; CHECK: vcge.u32       d16, d16, d17   @ encoding: [0xb1,0x03,0x60,0xf3]
145   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
146         ret <2 x i32> %tmp4
147 }
148
149 ; CHECK: vcge_2xfloat
150 define <2 x i32> @vcge_2xfloat(<2 x float>* %A, <2 x float>* %B) nounwind {
151         %tmp1 = load <2 x float>* %A
152         %tmp2 = load <2 x float>* %B
153 ; CHECK: vcge.f32       d16, d16, d17   @ encoding: [0xa1,0x0e,0x40,0xf3]
154         %tmp3 = fcmp oge <2 x float> %tmp1, %tmp2
155   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
156         ret <2 x i32> %tmp4
157 }
158
159 ; CHECK: vcges_16xi8
160 define <16 x i8> @vcges_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
161         %tmp1 = load <16 x i8>* %A
162         %tmp2 = load <16 x i8>* %B
163 ; CHECK: vcge.s8        q8, q8, q9              @ encoding: [0xf2,0x03,0x40,0xf2]
164         %tmp3 = icmp sge <16 x i8> %tmp1, %tmp2
165   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
166         ret <16 x i8> %tmp4
167 }
168
169 ; CHECK: vcges_8xi16
170 define <8 x i16> @vcges_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
171         %tmp1 = load <8 x i16>* %A
172         %tmp2 = load <8 x i16>* %B
173 ; CHECK: vcge.s16       q8, q8, q9      @ encoding: [0xf2,0x03,0x50,0xf2]
174         %tmp3 = icmp sge <8 x i16> %tmp1, %tmp2
175   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
176         ret <8 x i16> %tmp4
177 }
178
179 ; CHECK: vcges_4xi32
180 define <4 x i32> @vcges_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
181         %tmp1 = load <4 x i32>* %A
182         %tmp2 = load <4 x i32>* %B
183 ; CHECK: vcge.s32       q8, q8, q9      @ encoding: [0xf2,0x03,0x60,0xf2]
184         %tmp3 = icmp sge <4 x i32> %tmp1, %tmp2
185   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
186         ret <4 x i32> %tmp4
187 }
188
189 ; CHECK: vcgeu_16xi8
190 define <16 x i8> @vcgeu_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
191         %tmp1 = load <16 x i8>* %A
192         %tmp2 = load <16 x i8>* %B
193 ; CHECK: vcge.u8        q8, q8, q9              @ encoding: [0xf2,0x03,0x40,0xf3]
194         %tmp3 = icmp uge <16 x i8> %tmp1, %tmp2
195   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
196         ret <16 x i8> %tmp4
197 }
198
199 ; CHECK: vcgeu_8xi16
200 define <8 x i16> @vcgeu_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
201         %tmp1 = load <8 x i16>* %A
202         %tmp2 = load <8 x i16>* %B
203 ; CHECK: vcge.u16       q8, q8, q9      @ encoding: [0xf2,0x03,0x50,0xf3]
204         %tmp3 = icmp uge <8 x i16> %tmp1, %tmp2
205   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
206         ret <8 x i16> %tmp4
207 }
208
209 ; CHECK: vcgeu_4xi32
210 define <4 x i32> @vcgeu_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
211         %tmp1 = load <4 x i32>* %A
212         %tmp2 = load <4 x i32>* %B
213 ; CHECK: vcge.u32       q8, q8, q9      @ encoding: [0xf2,0x03,0x60,0xf3]
214         %tmp3 = icmp uge <4 x i32> %tmp1, %tmp2
215   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
216         ret <4 x i32> %tmp4
217 }
218
219 ; CHECK: vcge_4xfloat
220 define <4 x i32> @vcge_4xfloat(<4 x float>* %A, <4 x float>* %B) nounwind {
221         %tmp1 = load <4 x float>* %A
222         %tmp2 = load <4 x float>* %B
223 ; CHECK: vcge.f32       q8, q8, q9      @ encoding: [0xe2,0x0e,0x40,0xf3]
224         %tmp3 = fcmp oge <4 x float> %tmp1, %tmp2
225   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
226         ret <4 x i32> %tmp4
227 }
228
229 declare <2 x i32> @llvm.arm.neon.vacged(<2 x float>, <2 x float>) nounwind readnone
230 declare <4 x i32> @llvm.arm.neon.vacgeq(<4 x float>, <4 x float>) nounwind readnone
231
232 ; CHECK: vacge_2xfloat
233 define <2 x i32> @vacge_2xfloat(<2 x float>* %A, <2 x float>* %B) nounwind {
234         %tmp1 = load <2 x float>* %A
235         %tmp2 = load <2 x float>* %B
236 ; vacge.f32     d16, d16, d17   @ encoding: [0xb1,0x0e,0x40,0xf3]
237         %tmp3 = call <2 x i32> @llvm.arm.neon.vacged(<2 x float> %tmp1, <2 x float> %tmp2)
238         ret <2 x i32> %tmp3
239 }
240
241 ; CHECK: vacge_4xfloat
242 define <4 x i32> @vacge_4xfloat(<4 x float>* %A, <4 x float>* %B) nounwind {
243         %tmp1 = load <4 x float>* %A
244         %tmp2 = load <4 x float>* %B
245 ; CHECK: vacge.f32      q8, q8, q9      @ encoding: [0xf2,0x0e,0x40,0xf3]
246         %tmp3 = call <4 x i32> @llvm.arm.neon.vacgeq(<4 x float> %tmp1, <4 x float> %tmp2)
247         ret <4 x i32> %tmp3
248 }
249
250 ; CHECK: vcgts_8xi8
251 define <8 x i8> @vcgts_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
252         %tmp1 = load <8 x i8>* %A
253         %tmp2 = load <8 x i8>* %B
254 ; CHECK: vcgt.s8        d16, d16, d17           @ encoding: [0xa1,0x03,0x40,0xf2]
255         %tmp3 = icmp sgt <8 x i8> %tmp1, %tmp2
256   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
257         ret <8 x i8> %tmp4
258 }
259
260 ; CHECK: vcgts_4xi16
261 define <4 x i16> @vcgts_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
262         %tmp1 = load <4 x i16>* %A
263         %tmp2 = load <4 x i16>* %B
264 ; CHECK: vcgt.s16       d16, d16, d17   @ encoding: [0xa1,0x03,0x50,0xf2]
265         %tmp3 = icmp sgt <4 x i16> %tmp1, %tmp2
266   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
267         ret <4 x i16> %tmp4
268 }
269
270 ; CHECK: vcgts_2xi32
271 define <2 x i32> @vcgts_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
272         %tmp1 = load <2 x i32>* %A
273         %tmp2 = load <2 x i32>* %B
274 ; CHECK: vcgt.s32       d16, d16, d17   @ encoding: [0xa1,0x03,0x60,0xf2]
275         %tmp3 = icmp sgt <2 x i32> %tmp1, %tmp2
276   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
277         ret <2 x i32> %tmp4
278 }
279
280 ; CHECK: vcgtu_8xi8
281 define <8 x i8> @vcgtu_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
282         %tmp1 = load <8 x i8>* %A
283         %tmp2 = load <8 x i8>* %B
284 ; CHECK: vcgt.u8        d16, d16, d17           @ encoding: [0xa1,0x03,0x40,0xf3]
285         %tmp3 = icmp ugt <8 x i8> %tmp1, %tmp2
286   %tmp4 = sext <8 x i1> %tmp3 to <8 x i8>
287         ret <8 x i8> %tmp4
288 }
289
290 ; CHECK: vcgtu_4xi16
291 define <4 x i16> @vcgtu_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
292         %tmp1 = load <4 x i16>* %A
293         %tmp2 = load <4 x i16>* %B
294 ; CHECK: vcgt.u16       d16, d16, d17   @ encoding: [0xa1,0x03,0x50,0xf3]
295         %tmp3 = icmp ugt <4 x i16> %tmp1, %tmp2
296   %tmp4 = sext <4 x i1> %tmp3 to <4 x i16>
297         ret <4 x i16> %tmp4
298 }
299
300 ; CHECK: vcgtu_2xi32
301 define <2 x i32> @vcgtu_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
302         %tmp1 = load <2 x i32>* %A
303         %tmp2 = load <2 x i32>* %B
304 ; CHECK: vcgt.u32       d16, d16, d17   @ encoding: [0xa1,0x03,0x60,0xf3]
305         %tmp3 = icmp ugt <2 x i32> %tmp1, %tmp2
306   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
307         ret <2 x i32> %tmp4
308 }
309
310 ; CHECK: vcgt_2xfloat
311 define <2 x i32> @vcgt_2xfloat(<2 x float>* %A, <2 x float>* %B) nounwind {
312         %tmp1 = load <2 x float>* %A
313         %tmp2 = load <2 x float>* %B
314 ; CHECK: vcgt.f32       d16, d16, d17   @ encoding: [0xa1,0x0e,0x60,0xf3]
315         %tmp3 = fcmp ogt <2 x float> %tmp1, %tmp2
316   %tmp4 = sext <2 x i1> %tmp3 to <2 x i32>
317         ret <2 x i32> %tmp4
318 }
319
320 ; CHECK: vcgts_16xi8
321 define <16 x i8> @vcgts_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
322         %tmp1 = load <16 x i8>* %A
323         %tmp2 = load <16 x i8>* %B
324 ; CHECK: vcgt.s8        q8, q8, q9              @ encoding: [0xe2,0x03,0x40,0xf2]
325         %tmp3 = icmp sgt <16 x i8> %tmp1, %tmp2
326   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
327         ret <16 x i8> %tmp4
328 }
329
330 ; CHECK: vcgts_8xi16
331 define <8 x i16> @vcgts_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
332         %tmp1 = load <8 x i16>* %A
333         %tmp2 = load <8 x i16>* %B
334 ; CHECK: vcgt.s16       q8, q8, q9      @ encoding: [0xe2,0x03,0x50,0xf2]
335         %tmp3 = icmp sgt <8 x i16> %tmp1, %tmp2
336   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
337         ret <8 x i16> %tmp4
338 }
339
340 ; CHECK: vcgts_4xi32
341 define <4 x i32> @vcgts_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
342         %tmp1 = load <4 x i32>* %A
343         %tmp2 = load <4 x i32>* %B
344 ; CHECK: vcgt.s32       q8, q8, q9      @ encoding: [0xe2,0x03,0x60,0xf2]
345         %tmp3 = icmp sgt <4 x i32> %tmp1, %tmp2
346   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
347         ret <4 x i32> %tmp4
348 }
349
350 ; CHECK: vcgtu_16xi8
351 define <16 x i8> @vcgtu_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
352         %tmp1 = load <16 x i8>* %A
353         %tmp2 = load <16 x i8>* %B
354 ; CHECK: vcgt.u8        q8, q8, q9              @ encoding: [0xe2,0x03,0x40,0xf3]
355         %tmp3 = icmp ugt <16 x i8> %tmp1, %tmp2
356   %tmp4 = sext <16 x i1> %tmp3 to <16 x i8>
357         ret <16 x i8> %tmp4
358 }
359
360 ; CHECK: vcgtu_8xi16
361 define <8 x i16> @vcgtu_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
362         %tmp1 = load <8 x i16>* %A
363         %tmp2 = load <8 x i16>* %B
364 ; CHECK: vcgt.u16       q8, q8, q9      @ encoding: [0xe2,0x03,0x50,0xf3]
365         %tmp3 = icmp ugt <8 x i16> %tmp1, %tmp2
366   %tmp4 = sext <8 x i1> %tmp3 to <8 x i16>
367         ret <8 x i16> %tmp4
368 }
369
370 ; CHECK: vcgtu_4xi32
371 define <4 x i32> @vcgtu_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
372         %tmp1 = load <4 x i32>* %A
373         %tmp2 = load <4 x i32>* %B
374 ; CHECK: vcgt.u32       q8, q8, q9      @ encoding: [0xe2,0x03,0x60,0xf3]
375         %tmp3 = icmp ugt <4 x i32> %tmp1, %tmp2
376   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
377         ret <4 x i32> %tmp4
378 }
379
380 ; CHECK: vcgt_4xfloat
381 define <4 x i32> @vcgt_4xfloat(<4 x float>* %A, <4 x float>* %B) nounwind {
382         %tmp1 = load <4 x float>* %A
383         %tmp2 = load <4 x float>* %B
384 ; CHECK: vcgt.f32       q8, q8, q9      @ encoding: [0xe2,0x0e,0x60,0xf3]
385         %tmp3 = fcmp ogt <4 x float> %tmp1, %tmp2
386   %tmp4 = sext <4 x i1> %tmp3 to <4 x i32>
387         ret <4 x i32> %tmp4
388 }
389
390 declare <2 x i32> @llvm.arm.neon.vacgtd(<2 x float>, <2 x float>) nounwind readnone
391 declare <4 x i32> @llvm.arm.neon.vacgtq(<4 x float>, <4 x float>) nounwind readnone
392
393 ; CHECK: vacgt_2xfloat
394 define <2 x i32> @vacgt_2xfloat(<2 x float>* %A, <2 x float>* %B) nounwind {
395         %tmp1 = load <2 x float>* %A
396         %tmp2 = load <2 x float>* %B
397 ; CHECK: vacgt.f32      d16, d16, d17   @ encoding: [0xb1,0x0e,0x60,0xf3]
398         %tmp3 = call <2 x i32> @llvm.arm.neon.vacgtd(<2 x float> %tmp1, <2 x float> %tmp2)
399         ret <2 x i32> %tmp3
400 }
401
402 ; CHECK: vacgt_4xfloat
403 define <4 x i32> @vacgt_4xfloat(<4 x float>* %A, <4 x float>* %B) nounwind {
404         %tmp1 = load <4 x float>* %A
405         %tmp2 = load <4 x float>* %B
406 ; CHECK: vacgt.f32      q8, q8, q9      @ encoding: [0xf2,0x0e,0x60,0xf3]
407         %tmp3 = call <4 x i32> @llvm.arm.neon.vacgtq(<4 x float> %tmp1, <4 x float> %tmp2)
408         ret <4 x i32> %tmp3
409 }
410
411 ; CHECK: vtst_8xi8
412 define <8 x i8> @vtst_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
413         %tmp1 = load <8 x i8>* %A
414         %tmp2 = load <8 x i8>* %B
415 ; CHECK: vtst.8 d16, d16, d17           @ encoding: [0xb1,0x08,0x40,0xf2]
416         %tmp3 = and <8 x i8> %tmp1, %tmp2
417         %tmp4 = icmp ne <8 x i8> %tmp3, zeroinitializer
418   %tmp5 = sext <8 x i1> %tmp4 to <8 x i8>
419         ret <8 x i8> %tmp5
420 }
421
422 ; CHECK: vtst_4xi16
423 define <4 x i16> @vtst_4xi16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
424         %tmp1 = load <4 x i16>* %A
425         %tmp2 = load <4 x i16>* %B
426 ; CHECK: vtst.16        d16, d16, d17           @ encoding: [0xb1,0x08,0x50,0xf2]
427         %tmp3 = and <4 x i16> %tmp1, %tmp2
428         %tmp4 = icmp ne <4 x i16> %tmp3, zeroinitializer
429   %tmp5 = sext <4 x i1> %tmp4 to <4 x i16>
430         ret <4 x i16> %tmp5
431 }
432
433 ; CHECK: vtst_2xi32
434 define <2 x i32> @vtst_2xi32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
435         %tmp1 = load <2 x i32>* %A
436         %tmp2 = load <2 x i32>* %B
437 ; CHECK: vtst.32        d16, d16, d17           @ encoding: [0xb1,0x08,0x60,0xf2]
438         %tmp3 = and <2 x i32> %tmp1, %tmp2
439         %tmp4 = icmp ne <2 x i32> %tmp3, zeroinitializer
440   %tmp5 = sext <2 x i1> %tmp4 to <2 x i32>
441         ret <2 x i32> %tmp5
442 }
443
444 ; CHECK: vtst_16xi8
445 define <16 x i8> @vtst_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
446         %tmp1 = load <16 x i8>* %A
447         %tmp2 = load <16 x i8>* %B
448 ; CHECK: vtst.8 q8, q8, q9              @ encoding: [0xf2,0x08,0x40,0xf2]
449         %tmp3 = and <16 x i8> %tmp1, %tmp2
450         %tmp4 = icmp ne <16 x i8> %tmp3, zeroinitializer
451   %tmp5 = sext <16 x i1> %tmp4 to <16 x i8>
452         ret <16 x i8> %tmp5
453 }
454
455 ; CHECK: vtst_8xi16
456 define <8 x i16> @vtst_8xi16(<8 x i16>* %A, <8 x i16>* %B) nounwind {
457         %tmp1 = load <8 x i16>* %A
458         %tmp2 = load <8 x i16>* %B
459 ; CHECK: vtst.16        q8, q8, q9              @ encoding: [0xf2,0x08,0x50,0xf2]
460         %tmp3 = and <8 x i16> %tmp1, %tmp2
461         %tmp4 = icmp ne <8 x i16> %tmp3, zeroinitializer
462   %tmp5 = sext <8 x i1> %tmp4 to <8 x i16>
463         ret <8 x i16> %tmp5
464 }
465
466 ; CHECK: vtst_4xi32
467 define <4 x i32> @vtst_4xi32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
468         %tmp1 = load <4 x i32>* %A
469         %tmp2 = load <4 x i32>* %B
470 ; CHECK: vtst.32        q8, q8, q9              @ encoding: [0xf2,0x08,0x60,0xf2]
471         %tmp3 = and <4 x i32> %tmp1, %tmp2
472         %tmp4 = icmp ne <4 x i32> %tmp3, zeroinitializer
473   %tmp5 = sext <4 x i1> %tmp4 to <4 x i32>
474         ret <4 x i32> %tmp5
475 }