OSDN Git Service

[ARM] Added testing for D64160. NFC
[android-x86/external-llvm.git] / test / CodeGen / ARM / vsel.ll
1 ; RUN: llc < %s -mtriple=armv8-linux-gnueabihf -mattr=+fp-armv8 -float-abi=hard | FileCheck %s
2 @varfloat = global float 0.0
3 @vardouble = global double 0.0
4 define void @test_vsel32sgt(i32 %lhs32, i32 %rhs32, float %a, float %b) {
5 ; CHECK-LABEL: test_vsel32sgt
6   %tst1 = icmp sgt i32 %lhs32, %rhs32
7   %val1 = select i1 %tst1, float %a, float %b
8   store float %val1, float* @varfloat
9 ; CHECK: cmp r0, r1
10 ; CHECK: vselgt.f32 s0, s0, s1
11   ret void
12 }
13 define void @test_vsel64sgt(i32 %lhs32, i32 %rhs32, double %a, double %b) {
14 ; CHECK-LABEL: test_vsel64sgt
15   %tst1 = icmp sgt i32 %lhs32, %rhs32
16   %val1 = select i1 %tst1, double %a, double %b
17   store double %val1, double* @vardouble
18 ; CHECK: cmp r0, r1
19 ; CHECK: vselgt.f64 d16, d0, d1
20   ret void
21 }
22 define void @test_vsel32sge(i32 %lhs32, i32 %rhs32, float %a, float %b) {
23 ; CHECK-LABEL: test_vsel32sge
24   %tst1 = icmp sge i32 %lhs32, %rhs32
25   %val1 = select i1 %tst1, float %a, float %b
26   store float %val1, float* @varfloat
27 ; CHECK: cmp r0, r1
28 ; CHECK: vselge.f32 s0, s0, s1
29   ret void
30 }
31 define void @test_vsel64sge(i32 %lhs32, i32 %rhs32, double %a, double %b) {
32 ; CHECK-LABEL: test_vsel64sge
33   %tst1 = icmp sge i32 %lhs32, %rhs32
34   %val1 = select i1 %tst1, double %a, double %b
35   store double %val1, double* @vardouble
36 ; CHECK: cmp r0, r1
37 ; CHECK: vselge.f64 d16, d0, d1
38   ret void
39 }
40 define void @test_vsel32eq(i32 %lhs32, i32 %rhs32, float %a, float %b) {
41 ; CHECK-LABEL: test_vsel32eq
42   %tst1 = icmp eq i32 %lhs32, %rhs32
43   %val1 = select i1 %tst1, float %a, float %b
44   store float %val1, float* @varfloat
45 ; CHECK: cmp r0, r1
46 ; CHECK: vseleq.f32 s0, s0, s1
47   ret void
48 }
49 define void @test_vsel64eq(i32 %lhs32, i32 %rhs32, double %a, double %b) {
50 ; CHECK-LABEL: test_vsel64eq
51   %tst1 = icmp eq i32 %lhs32, %rhs32
52   %val1 = select i1 %tst1, double %a, double %b
53   store double %val1, double* @vardouble
54 ; CHECK: cmp r0, r1
55 ; CHECK: vseleq.f64 d16, d0, d1
56   ret void
57 }
58 define void @test_vsel32slt(i32 %lhs32, i32 %rhs32, float %a, float %b) {
59 ; CHECK-LABEL: test_vsel32slt
60   %tst1 = icmp slt i32 %lhs32, %rhs32
61   %val1 = select i1 %tst1, float %a, float %b
62   store float %val1, float* @varfloat
63 ; CHECK: cmp r0, r1
64 ; CHECK: vselge.f32 s0, s1, s0
65   ret void
66 }
67 define void @test_vsel64slt(i32 %lhs32, i32 %rhs32, double %a, double %b) {
68 ; CHECK-LABEL: test_vsel64slt
69   %tst1 = icmp slt i32 %lhs32, %rhs32
70   %val1 = select i1 %tst1, double %a, double %b
71   store double %val1, double* @vardouble
72 ; CHECK: cmp r0, r1
73 ; CHECK: vselge.f64 d16, d1, d0
74   ret void
75 }
76 define void @test_vsel32sle(i32 %lhs32, i32 %rhs32, float %a, float %b) {
77 ; CHECK-LABEL: test_vsel32sle
78   %tst1 = icmp sle i32 %lhs32, %rhs32
79   %val1 = select i1 %tst1, float %a, float %b
80   store float %val1, float* @varfloat
81 ; CHECK: cmp r0, r1
82 ; CHECK: vselgt.f32 s0, s1, s0
83   ret void
84 }
85 define void @test_vsel64sle(i32 %lhs32, i32 %rhs32, double %a, double %b) {
86 ; CHECK-LABEL: test_vsel64sle
87   %tst1 = icmp sle i32 %lhs32, %rhs32
88   %val1 = select i1 %tst1, double %a, double %b
89   store double %val1, double* @vardouble
90 ; CHECK: cmp r0, r1
91 ; CHECK: vselgt.f64 d16, d1, d0
92   ret void
93 }
94 define void @test_vsel32ogt(float %lhs32, float %rhs32, float %a, float %b) {
95 ; CHECK-LABEL: test_vsel32ogt
96   %tst1 = fcmp ogt float %lhs32, %rhs32
97   %val1 = select i1 %tst1, float %a, float %b
98   store float %val1, float* @varfloat
99 ; CHECK: vcmpe.f32 s0, s1
100 ; CHECK: vselgt.f32 s0, s2, s3
101   ret void
102 }
103 define void @test_vsel64ogt(float %lhs32, float %rhs32, double %a, double %b) {
104 ; CHECK-LABEL: test_vsel64ogt
105   %tst1 = fcmp ogt float %lhs32, %rhs32
106   %val1 = select i1 %tst1, double %a, double %b
107   store double %val1, double* @vardouble
108 ; CHECK: vcmpe.f32 s0, s1
109 ; CHECK: vselgt.f64 d16, d1, d2
110   ret void
111 }
112 define void @test_vsel32oge(float %lhs32, float %rhs32, float %a, float %b) {
113 ; CHECK-LABEL: test_vsel32oge
114   %tst1 = fcmp oge float %lhs32, %rhs32
115   %val1 = select i1 %tst1, float %a, float %b
116   store float %val1, float* @varfloat
117 ; CHECK: vcmpe.f32 s0, s1
118 ; CHECK: vselge.f32 s0, s2, s3
119   ret void
120 }
121 define void @test_vsel64oge(float %lhs32, float %rhs32, double %a, double %b) {
122 ; CHECK-LABEL: test_vsel64oge
123   %tst1 = fcmp oge float %lhs32, %rhs32
124   %val1 = select i1 %tst1, double %a, double %b
125   store double %val1, double* @vardouble
126 ; CHECK: vcmpe.f32 s0, s1
127 ; CHECK: vselge.f64 d16, d1, d2
128   ret void
129 }
130 define void @test_vsel32oeq(float %lhs32, float %rhs32, float %a, float %b) {
131 ; CHECK-LABEL: test_vsel32oeq
132   %tst1 = fcmp oeq float %lhs32, %rhs32
133   %val1 = select i1 %tst1, float %a, float %b
134   store float %val1, float* @varfloat
135 ; CHECK: vcmp.f32 s0, s1
136 ; CHECK: vseleq.f32 s0, s2, s3
137   ret void
138 }
139 define void @test_vsel64oeq(float %lhs32, float %rhs32, double %a, double %b) {
140 ; CHECK-LABEL: test_vsel64oeq
141   %tst1 = fcmp oeq float %lhs32, %rhs32
142   %val1 = select i1 %tst1, double %a, double %b
143   store double %val1, double* @vardouble
144 ; CHECK: vcmp.f32 s0, s1
145 ; CHECK: vseleq.f64 d16, d1, d2
146   ret void
147 }
148 define void @test_vsel32ugt(float %lhs32, float %rhs32, float %a, float %b) {
149 ; CHECK-LABEL: test_vsel32ugt
150   %tst1 = fcmp ugt float %lhs32, %rhs32
151   %val1 = select i1 %tst1, float %a, float %b
152   store float %val1, float* @varfloat
153 ; CHECK: vcmpe.f32 s1, s0
154 ; CHECK: vselge.f32 s0, s3, s2
155   ret void
156 }
157 define void @test_vsel64ugt(float %lhs32, float %rhs32, double %a, double %b) {
158 ; CHECK-LABEL: test_vsel64ugt
159   %tst1 = fcmp ugt float %lhs32, %rhs32
160   %val1 = select i1 %tst1, double %a, double %b
161   store double %val1, double* @vardouble
162 ; CHECK: vcmpe.f32 s1, s0
163 ; CHECK: vselge.f64 d16, d2, d1
164   ret void
165 }
166 define void @test_vsel32uge(float %lhs32, float %rhs32, float %a, float %b) {
167 ; CHECK-LABEL: test_vsel32uge
168   %tst1 = fcmp uge float %lhs32, %rhs32
169   %val1 = select i1 %tst1, float %a, float %b
170   store float %val1, float* @varfloat
171 ; CHECK: vcmpe.f32 s1, s0
172 ; CHECK: vselgt.f32 s0, s3, s2
173   ret void
174 }
175 define void @test_vsel64uge(float %lhs32, float %rhs32, double %a, double %b) {
176 ; CHECK-LABEL: test_vsel64uge
177   %tst1 = fcmp uge float %lhs32, %rhs32
178   %val1 = select i1 %tst1, double %a, double %b
179   store double %val1, double* @vardouble
180 ; CHECK: vcmpe.f32 s1, s0
181 ; CHECK: vselgt.f64 d16, d2, d1
182   ret void
183 }
184 define void @test_vsel32olt(float %lhs32, float %rhs32, float %a, float %b) {
185 ; CHECK-LABEL: test_vsel32olt
186   %tst1 = fcmp olt float %lhs32, %rhs32
187   %val1 = select i1 %tst1, float %a, float %b
188   store float %val1, float* @varfloat
189 ; CHECK: vcmpe.f32 s1, s0
190 ; CHECK: vselgt.f32 s0, s2, s3
191   ret void
192 }
193 define void @test_vsel64olt(float %lhs32, float %rhs32, double %a, double %b) {
194 ; CHECK-LABEL: test_vsel64olt
195   %tst1 = fcmp olt float %lhs32, %rhs32
196   %val1 = select i1 %tst1, double %a, double %b
197   store double %val1, double* @vardouble
198 ; CHECK: vcmpe.f32 s1, s0
199 ; CHECK: vselgt.f64 d16, d1, d2
200   ret void
201 }
202 define void @test_vsel32ult(float %lhs32, float %rhs32, float %a, float %b) {
203 ; CHECK-LABEL: test_vsel32ult
204   %tst1 = fcmp ult float %lhs32, %rhs32
205   %val1 = select i1 %tst1, float %a, float %b
206   store float %val1, float* @varfloat
207 ; CHECK: vcmpe.f32 s0, s1
208 ; CHECK: vselge.f32 s0, s3, s2
209   ret void
210 }
211 define void @test_vsel64ult(float %lhs32, float %rhs32, double %a, double %b) {
212 ; CHECK-LABEL: test_vsel64ult
213   %tst1 = fcmp ult float %lhs32, %rhs32
214   %val1 = select i1 %tst1, double %a, double %b
215   store double %val1, double* @vardouble
216 ; CHECK: vcmpe.f32 s0, s1
217 ; CHECK: vselge.f64 d16, d2, d1
218   ret void
219 }
220 define void @test_vsel32ole(float %lhs32, float %rhs32, float %a, float %b) {
221 ; CHECK-LABEL: test_vsel32ole
222   %tst1 = fcmp ole float %lhs32, %rhs32
223   %val1 = select i1 %tst1, float %a, float %b
224   store float %val1, float* @varfloat
225 ; CHECK: vcmpe.f32 s1, s0
226 ; CHECK: vselge.f32 s0, s2, s3
227   ret void
228 }
229 define void @test_vsel64ole(float %lhs32, float %rhs32, double %a, double %b) {
230 ; CHECK-LABEL: test_vsel64ole
231   %tst1 = fcmp ole float %lhs32, %rhs32
232   %val1 = select i1 %tst1, double %a, double %b
233   store double %val1, double* @vardouble
234 ; CHECK: vcmpe.f32 s1, s0
235 ; CHECK: vselge.f64 d16, d1, d2
236   ret void
237 }
238 define void @test_vsel32ule(float %lhs32, float %rhs32, float %a, float %b) {
239 ; CHECK-LABEL: test_vsel32ule
240   %tst1 = fcmp ule float %lhs32, %rhs32
241   %val1 = select i1 %tst1, float %a, float %b
242   store float %val1, float* @varfloat
243 ; CHECK: vcmpe.f32 s0, s1
244 ; CHECK: vselgt.f32 s0, s3, s2
245   ret void
246 }
247 define void @test_vsel64ule(float %lhs32, float %rhs32, double %a, double %b) {
248 ; CHECK-LABEL: test_vsel64ule
249   %tst1 = fcmp ule float %lhs32, %rhs32
250   %val1 = select i1 %tst1, double %a, double %b
251   store double %val1, double* @vardouble
252 ; CHECK: vcmpe.f32 s0, s1
253 ; CHECK: vselgt.f64 d16, d2, d1
254   ret void
255 }
256 define void @test_vsel32ord(float %lhs32, float %rhs32, float %a, float %b) {
257 ; CHECK-LABEL: test_vsel32ord
258   %tst1 = fcmp ord float %lhs32, %rhs32
259   %val1 = select i1 %tst1, float %a, float %b
260   store float %val1, float* @varfloat
261 ; CHECK: vcmpe.f32 s0, s1
262 ; CHECK: vselvs.f32 s0, s3, s2
263   ret void
264 }
265 define void @test_vsel64ord(float %lhs32, float %rhs32, double %a, double %b) {
266 ; CHECK-LABEL: test_vsel64ord
267   %tst1 = fcmp ord float %lhs32, %rhs32
268   %val1 = select i1 %tst1, double %a, double %b
269   store double %val1, double* @vardouble
270 ; CHECK: vcmpe.f32 s0, s1
271 ; CHECK: vselvs.f64 d16, d2, d1
272   ret void
273 }
274 define void @test_vsel32une(float %lhs32, float %rhs32, float %a, float %b) {
275 ; CHECK-LABEL: test_vsel32une
276   %tst1 = fcmp une float %lhs32, %rhs32
277   %val1 = select i1 %tst1, float %a, float %b
278   store float %val1, float* @varfloat
279 ; CHECK: vcmp.f32 s0, s1
280 ; CHECK: vseleq.f32 s0, s3, s2
281   ret void
282 }
283 define void @test_vsel64une(float %lhs32, float %rhs32, double %a, double %b) {
284 ; CHECK-LABEL: test_vsel64une
285   %tst1 = fcmp une float %lhs32, %rhs32
286   %val1 = select i1 %tst1, double %a, double %b
287   store double %val1, double* @vardouble
288 ; CHECK: vcmp.f32 s0, s1
289 ; CHECK: vseleq.f64 d16, d2, d1
290   ret void
291 }
292 define void @test_vsel32uno(float %lhs32, float %rhs32, float %a, float %b) {
293 ; CHECK-LABEL: test_vsel32uno
294   %tst1 = fcmp uno float %lhs32, %rhs32
295   %val1 = select i1 %tst1, float %a, float %b
296   store float %val1, float* @varfloat
297 ; CHECK: vcmpe.f32 s0, s1
298 ; CHECK: vselvs.f32 s0, s2, s3
299   ret void
300 }
301 define void @test_vsel64uno(float %lhs32, float %rhs32, double %a, double %b) {
302 ; CHECK-LABEL: test_vsel64uno
303   %tst1 = fcmp uno float %lhs32, %rhs32
304   %val1 = select i1 %tst1, double %a, double %b
305   store double %val1, double* @vardouble
306 ; CHECK: vcmpe.f32 s0, s1
307 ; CHECK: vselvs.f64 d16, d1, d2
308   ret void
309 }
310
311 define void @test_vsel32ogt_nnan(float %lhs32, float %rhs32, float %a, float %b) {
312 ; CHECK-LABEL: test_vsel32ogt_nnan
313   %tst1 = fcmp nnan ogt float %lhs32, %rhs32
314   %val1 = select i1 %tst1, float %a, float %b
315   store float %val1, float* @varfloat
316 ; CHECK: vcmpe.f32 s0, s1
317 ; CHECK: vselgt.f32 s0, s2, s3
318   ret void
319 }
320 define void @test_vsel64ogt_nnan(float %lhs32, float %rhs32, double %a, double %b) {
321 ; CHECK-LABEL: test_vsel64ogt_nnan
322   %tst1 = fcmp nnan ogt float %lhs32, %rhs32
323   %val1 = select i1 %tst1, double %a, double %b
324   store double %val1, double* @vardouble
325 ; CHECK: vcmpe.f32 s0, s1
326 ; CHECK: vselgt.f64 d16, d1, d2
327   ret void
328 }
329 define void @test_vsel32oge_nnan(float %lhs32, float %rhs32, float %a, float %b) {
330 ; CHECK-LABEL: test_vsel32oge_nnan
331   %tst1 = fcmp nnan oge float %lhs32, %rhs32
332   %val1 = select i1 %tst1, float %a, float %b
333   store float %val1, float* @varfloat
334 ; CHECK: vcmpe.f32 s0, s1
335 ; CHECK: vselge.f32 s0, s2, s3
336   ret void
337 }
338 define void @test_vsel64oge_nnan(float %lhs32, float %rhs32, double %a, double %b) {
339 ; CHECK-LABEL: test_vsel64oge_nnan
340   %tst1 = fcmp nnan oge float %lhs32, %rhs32
341   %val1 = select i1 %tst1, double %a, double %b
342   store double %val1, double* @vardouble
343 ; CHECK: vcmpe.f32 s0, s1
344 ; CHECK: vselge.f64 d16, d1, d2
345   ret void
346 }
347 define void @test_vsel32oeq_nnan(float %lhs32, float %rhs32, float %a, float %b) {
348 ; CHECK-LABEL: test_vsel32oeq_nnan
349   %tst1 = fcmp nnan oeq float %lhs32, %rhs32
350   %val1 = select i1 %tst1, float %a, float %b
351   store float %val1, float* @varfloat
352 ; CHECK: vcmp.f32 s0, s1
353 ; CHECK: vseleq.f32 s0, s2, s3
354   ret void
355 }
356 define void @test_vsel64oeq_nnan(float %lhs32, float %rhs32, double %a, double %b) {
357 ; CHECK-LABEL: test_vsel64oeq_nnan
358   %tst1 = fcmp nnan oeq float %lhs32, %rhs32
359   %val1 = select i1 %tst1, double %a, double %b
360   store double %val1, double* @vardouble
361 ; CHECK: vcmp.f32 s0, s1
362 ; CHECK: vseleq.f64 d16, d1, d2
363   ret void
364 }
365 define void @test_vsel32ugt_nnan(float %lhs32, float %rhs32, float %a, float %b) {
366 ; CHECK-LABEL: test_vsel32ugt_nnan
367   %tst1 = fcmp nnan ugt float %lhs32, %rhs32
368   %val1 = select i1 %tst1, float %a, float %b
369   store float %val1, float* @varfloat
370 ; CHECK: vcmpe.f32      s0, s1
371 ; CHECK: vselgt.f32     s0, s2, s3
372   ret void
373 }
374 define void @test_vsel64ugt_nnan(float %lhs32, float %rhs32, double %a, double %b) {
375 ; CHECK-LABEL: test_vsel64ugt_nnan
376   %tst1 = fcmp nnan ugt float %lhs32, %rhs32
377   %val1 = select i1 %tst1, double %a, double %b
378   store double %val1, double* @vardouble
379 ; CHECK: vcmpe.f32 s0, s1
380 ; CHECK: vselgt.f64 d16, d1, d2
381   ret void
382 }
383 define void @test_vsel32uge_nnan(float %lhs32, float %rhs32, float %a, float %b) {
384 ; CHECK-LABEL: test_vsel32uge_nnan
385   %tst1 = fcmp nnan uge float %lhs32, %rhs32
386   %val1 = select i1 %tst1, float %a, float %b
387   store float %val1, float* @varfloat
388 ; CHECK: vcmpe.f32 s0, s1
389 ; CHECK: vselge.f32 s0, s2, s3
390   ret void
391 }
392 define void @test_vsel64uge_nnan(float %lhs32, float %rhs32, double %a, double %b) {
393 ; CHECK-LABEL: test_vsel64uge_nnan
394   %tst1 = fcmp nnan uge float %lhs32, %rhs32
395   %val1 = select i1 %tst1, double %a, double %b
396   store double %val1, double* @vardouble
397 ; CHECK: vcmpe.f32 s0, s1
398 ; CHECK: vselge.f64 d16, d1, d2
399   ret void
400 }
401 define void @test_vsel32olt_nnan(float %lhs32, float %rhs32, float %a, float %b) {
402 ; CHECK-LABEL: test_vsel32olt_nnan
403   %tst1 = fcmp nnan olt float %lhs32, %rhs32
404   %val1 = select i1 %tst1, float %a, float %b
405   store float %val1, float* @varfloat
406 ; CHECK: vcmpe.f32 s1, s0
407 ; CHECK: vselgt.f32 s0, s2, s3
408   ret void
409 }
410 define void @test_vsel64olt_nnan(float %lhs32, float %rhs32, double %a, double %b) {
411 ; CHECK-LABEL: test_vsel64olt_nnan
412   %tst1 = fcmp nnan olt float %lhs32, %rhs32
413   %val1 = select i1 %tst1, double %a, double %b
414   store double %val1, double* @vardouble
415 ; CHECK: vcmpe.f32 s1, s0
416 ; CHECK: vselgt.f64 d16, d1, d2
417   ret void
418 }
419 define void @test_vsel32ult_nnan(float %lhs32, float %rhs32, float %a, float %b) {
420 ; CHECK-LABEL: test_vsel32ult_nnan
421   %tst1 = fcmp nnan ult float %lhs32, %rhs32
422   %val1 = select i1 %tst1, float %a, float %b
423   store float %val1, float* @varfloat
424 ; CHECK: vcmpe.f32 s1, s0
425 ; CHECK: vselgt.f32 s0, s2, s3
426   ret void
427 }
428 define void @test_vsel64ult_nnan(float %lhs32, float %rhs32, double %a, double %b) {
429 ; CHECK-LABEL: test_vsel64ult_nnan
430   %tst1 = fcmp nnan ult float %lhs32, %rhs32
431   %val1 = select i1 %tst1, double %a, double %b
432   store double %val1, double* @vardouble
433 ; CHECK: vcmpe.f32 s1, s0
434 ; CHECK: vselgt.f64 d16, d1, d2
435   ret void
436 }
437 define void @test_vsel32ole_nnan(float %lhs32, float %rhs32, float %a, float %b) {
438 ; CHECK-LABEL: test_vsel32ole_nnan
439   %tst1 = fcmp nnan ole float %lhs32, %rhs32
440   %val1 = select i1 %tst1, float %a, float %b
441   store float %val1, float* @varfloat
442 ; CHECK: vcmpe.f32 s1, s0
443 ; CHECK: vselge.f32 s0, s2, s3
444   ret void
445 }
446 define void @test_vsel64ole_nnan(float %lhs32, float %rhs32, double %a, double %b) {
447 ; CHECK-LABEL: test_vsel64ole_nnan
448   %tst1 = fcmp nnan ole float %lhs32, %rhs32
449   %val1 = select i1 %tst1, double %a, double %b
450   store double %val1, double* @vardouble
451 ; CHECK: vcmpe.f32 s1, s0
452 ; CHECK: vselge.f64 d16, d1, d2
453   ret void
454 }
455 define void @test_vsel32ule_nnan(float %lhs32, float %rhs32, float %a, float %b) {
456 ; CHECK-LABEL: test_vsel32ule_nnan
457   %tst1 = fcmp nnan ule float %lhs32, %rhs32
458   %val1 = select i1 %tst1, float %a, float %b
459   store float %val1, float* @varfloat
460 ; CHECK: vcmpe.f32 s1, s0
461 ; CHECK: vselge.f32 s0, s2, s3
462   ret void
463 }
464 define void @test_vsel64ule_nnan(float %lhs32, float %rhs32, double %a, double %b) {
465 ; CHECK-LABEL: test_vsel64ule_nnan
466   %tst1 = fcmp nnan ule float %lhs32, %rhs32
467   %val1 = select i1 %tst1, double %a, double %b
468   store double %val1, double* @vardouble
469 ; CHECK: vcmpe.f32 s1, s0
470 ; CHECK: vselge.f64 d16, d1, d2
471   ret void
472 }
473 define void @test_vsel32ord_nnan(float %lhs32, float %rhs32, float %a, float %b) {
474 ; CHECK-LABEL: test_vsel32ord_nnan
475   %tst1 = fcmp nnan ord float %lhs32, %rhs32
476   %val1 = select i1 %tst1, float %a, float %b
477   store float %val1, float* @varfloat
478 ; CHECK: vcmpe.f32 s0, s1
479 ; CHECK: vselvs.f32 s0, s3, s2
480   ret void
481 }
482 define void @test_vsel64ord_nnan(float %lhs32, float %rhs32, double %a, double %b) {
483 ; CHECK-LABEL: test_vsel64ord_nnan
484   %tst1 = fcmp nnan ord float %lhs32, %rhs32
485   %val1 = select i1 %tst1, double %a, double %b
486   store double %val1, double* @vardouble
487 ; CHECK: vcmpe.f32 s0, s1
488 ; CHECK: vselvs.f64 d16, d2, d1
489   ret void
490 }
491 define void @test_vsel32une_nnan(float %lhs32, float %rhs32, float %a, float %b) {
492 ; CHECK-LABEL: test_vsel32une_nnan
493   %tst1 = fcmp nnan une float %lhs32, %rhs32
494   %val1 = select i1 %tst1, float %a, float %b
495   store float %val1, float* @varfloat
496 ; CHECK: vcmp.f32 s0, s1
497 ; CHECK: vseleq.f32 s0, s3, s2
498   ret void
499 }
500 define void @test_vsel64une_nnan(float %lhs32, float %rhs32, double %a, double %b) {
501 ; CHECK-LABEL: test_vsel64une_nnan
502   %tst1 = fcmp nnan une float %lhs32, %rhs32
503   %val1 = select i1 %tst1, double %a, double %b
504   store double %val1, double* @vardouble
505 ; CHECK: vcmp.f32 s0, s1
506 ; CHECK: vseleq.f64 d16, d2, d1
507   ret void
508 }
509 define void @test_vsel32uno_nnan(float %lhs32, float %rhs32, float %a, float %b) {
510 ; CHECK-LABEL: test_vsel32uno_nnan
511   %tst1 = fcmp nnan uno float %lhs32, %rhs32
512   %val1 = select i1 %tst1, float %a, float %b
513   store float %val1, float* @varfloat
514 ; CHECK: vcmpe.f32 s0, s1
515 ; CHECK: vselvs.f32 s0, s2, s3
516   ret void
517 }
518 define void @test_vsel64uno_nnan(float %lhs32, float %rhs32, double %a, double %b) {
519 ; CHECK-LABEL: test_vsel64uno_nnan
520   %tst1 = fcmp nnan uno float %lhs32, %rhs32
521   %val1 = select i1 %tst1, double %a, double %b
522   store double %val1, double* @vardouble
523 ; CHECK: vcmpe.f32 s0, s1
524 ; CHECK: vselvs.f64 d16, d1, d2
525   ret void
526 }
527
528 define void @test_vsel_ltzero(i32 %lhs32, float %a, float %b) {
529 ; CHECK-LABEL: test_vsel_ltzero
530   %tst1 = icmp slt i32 %lhs32, 0
531   %val1 = select i1 %tst1, float %a, float %b
532   store float %val1, float* @varfloat
533 ; CHECK: cmp r0, #0
534 ; CHECK: vselge.f32 s0, s1, s0
535   ret void
536 }
537
538 define void @test_vsel_lezero(i32 %lhs32, float %a, float %b) {
539 ; CHECK-LABEL: test_vsel_lezero
540   %tst1 = icmp sle i32 %lhs32, 0
541   %val1 = select i1 %tst1, float %a, float %b
542   store float %val1, float* @varfloat
543 ; CHECK: cmp r0, #1
544 ; CHECK: vselge.f32 s0, s1, s0
545   ret void
546 }
547
548 define void @test_vsel_gtzero(i32 %lhs32, float %a, float %b) {
549 ; CHECK-LABEL: test_vsel_gtzero
550   %tst1 = icmp sgt i32 %lhs32, 0
551   %val1 = select i1 %tst1, float %a, float %b
552   store float %val1, float* @varfloat
553 ; CHECK: cmp r0, #0
554 ; CHECK: vselgt.f32 s0, s0, s1
555   ret void
556 }
557
558 define void @test_vsel_gezero(i32 %lhs32, float %a, float %b) {
559 ; CHECK-LABEL: test_vsel_gezero
560   %tst1 = icmp sge i32 %lhs32, 0
561   %val1 = select i1 %tst1, float %a, float %b
562   store float %val1, float* @varfloat
563 ; CHECK: cmn r0, #1
564 ; CHECK: vselgt.f32 s0, s0, s1
565   ret void
566 }
567
568 define void @test_vsel_ltzero64(i32 %lhs32, double %a, double %b) {
569 ; CHECK-LABEL: test_vsel_ltzero
570   %tst1 = icmp slt i32 %lhs32, 0
571   %val1 = select i1 %tst1, double %a, double %b
572   store double %val1, double* @vardouble
573 ; CHECK: cmp r0, #0
574 ; CHECK: vselge.f64 d16, d1, d0
575   ret void
576 }
577
578 define void @test_vsel_lezero64(i32 %lhs32, double %a, double %b) {
579 ; CHECK-LABEL: test_vsel_lezero
580   %tst1 = icmp sle i32 %lhs32, 0
581   %val1 = select i1 %tst1, double %a, double %b
582   store double %val1, double* @vardouble
583 ; CHECK: cmp r0, #1
584 ; CHECK: vselge.f64 d16, d1, d0
585   ret void
586 }
587
588 define void @test_vsel_gtzero64(i32 %lhs32, double %a, double %b) {
589 ; CHECK-LABEL: test_vsel_gtzero
590   %tst1 = icmp sgt i32 %lhs32, 0
591   %val1 = select i1 %tst1, double %a, double %b
592   store double %val1, double* @vardouble
593 ; CHECK: cmp r0, #0
594 ; CHECK: vselgt.f64 d16, d0, d1
595   ret void
596 }
597
598 define void @test_vsel_gezero64(i32 %lhs32, double %a, double %b) {
599 ; CHECK-LABEL: test_vsel_gezero
600   %tst1 = icmp sge i32 %lhs32, 0
601   %val1 = select i1 %tst1, double %a, double %b
602   store double %val1, double* @vardouble
603 ; CHECK: cmn r0, #1
604 ; CHECK: vselgt.f64 d16, d0, d1
605   ret void
606 }