xref: /llvm-project/llvm/test/CodeGen/ARM/vsel.ll (revision bed1c7f061aa12417aa081e334afdba45767b938)
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
4define 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, ptr @varfloat
9; CHECK: cmp r0, r1
10; CHECK: vselgt.f32 s0, s0, s1
11  ret void
12}
13define 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, ptr @vardouble
18; CHECK: cmp r0, r1
19; CHECK: vselgt.f64 d16, d0, d1
20  ret void
21}
22define 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, ptr @varfloat
27; CHECK: cmp r0, r1
28; CHECK: vselge.f32 s0, s0, s1
29  ret void
30}
31define 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, ptr @vardouble
36; CHECK: cmp r0, r1
37; CHECK: vselge.f64 d16, d0, d1
38  ret void
39}
40define 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, ptr @varfloat
45; CHECK: cmp r0, r1
46; CHECK: vseleq.f32 s0, s0, s1
47  ret void
48}
49define 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, ptr @vardouble
54; CHECK: cmp r0, r1
55; CHECK: vseleq.f64 d16, d0, d1
56  ret void
57}
58define 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, ptr @varfloat
63; CHECK: cmp r0, r1
64; CHECK: vselge.f32 s0, s1, s0
65  ret void
66}
67define 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, ptr @vardouble
72; CHECK: cmp r0, r1
73; CHECK: vselge.f64 d16, d1, d0
74  ret void
75}
76define 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, ptr @varfloat
81; CHECK: cmp r0, r1
82; CHECK: vselgt.f32 s0, s1, s0
83  ret void
84}
85define 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, ptr @vardouble
90; CHECK: cmp r0, r1
91; CHECK: vselgt.f64 d16, d1, d0
92  ret void
93}
94define 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, ptr @varfloat
99; CHECK: vcmp.f32 s0, s1
100; CHECK: vselgt.f32 s0, s2, s3
101  ret void
102}
103define 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, ptr @vardouble
108; CHECK: vcmp.f32 s0, s1
109; CHECK: vselgt.f64 d16, d1, d2
110  ret void
111}
112define 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, ptr @varfloat
117; CHECK: vcmp.f32 s0, s1
118; CHECK: vselge.f32 s0, s2, s3
119  ret void
120}
121define 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, ptr @vardouble
126; CHECK: vcmp.f32 s0, s1
127; CHECK: vselge.f64 d16, d1, d2
128  ret void
129}
130define 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, ptr @varfloat
135; CHECK: vcmp.f32 s0, s1
136; CHECK: vseleq.f32 s0, s2, s3
137  ret void
138}
139define 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, ptr @vardouble
144; CHECK: vcmp.f32 s0, s1
145; CHECK: vseleq.f64 d16, d1, d2
146  ret void
147}
148define 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, ptr @varfloat
153; CHECK: vcmp.f32 s1, s0
154; CHECK: vselge.f32 s0, s3, s2
155  ret void
156}
157define 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, ptr @vardouble
162; CHECK: vcmp.f32 s1, s0
163; CHECK: vselge.f64 d16, d2, d1
164  ret void
165}
166define 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, ptr @varfloat
171; CHECK: vcmp.f32 s1, s0
172; CHECK: vselgt.f32 s0, s3, s2
173  ret void
174}
175define 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, ptr @vardouble
180; CHECK: vcmp.f32 s1, s0
181; CHECK: vselgt.f64 d16, d2, d1
182  ret void
183}
184define 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, ptr @varfloat
189; CHECK: vcmp.f32 s1, s0
190; CHECK: vselgt.f32 s0, s2, s3
191  ret void
192}
193define 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, ptr @vardouble
198; CHECK: vcmp.f32 s1, s0
199; CHECK: vselgt.f64 d16, d1, d2
200  ret void
201}
202define 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, ptr @varfloat
207; CHECK: vcmp.f32 s0, s1
208; CHECK: vselge.f32 s0, s3, s2
209  ret void
210}
211define 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, ptr @vardouble
216; CHECK: vcmp.f32 s0, s1
217; CHECK: vselge.f64 d16, d2, d1
218  ret void
219}
220define 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, ptr @varfloat
225; CHECK: vcmp.f32 s1, s0
226; CHECK: vselge.f32 s0, s2, s3
227  ret void
228}
229define 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, ptr @vardouble
234; CHECK: vcmp.f32 s1, s0
235; CHECK: vselge.f64 d16, d1, d2
236  ret void
237}
238define 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, ptr @varfloat
243; CHECK: vcmp.f32 s0, s1
244; CHECK: vselgt.f32 s0, s3, s2
245  ret void
246}
247define 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, ptr @vardouble
252; CHECK: vcmp.f32 s0, s1
253; CHECK: vselgt.f64 d16, d2, d1
254  ret void
255}
256define 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, ptr @varfloat
261; CHECK: vcmp.f32 s0, s1
262; CHECK: vselvs.f32 s0, s3, s2
263  ret void
264}
265define 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, ptr @vardouble
270; CHECK: vcmp.f32 s0, s1
271; CHECK: vselvs.f64 d16, d2, d1
272  ret void
273}
274define 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, ptr @varfloat
279; CHECK: vcmp.f32 s0, s1
280; CHECK: vseleq.f32 s0, s3, s2
281  ret void
282}
283define 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, ptr @vardouble
288; CHECK: vcmp.f32 s0, s1
289; CHECK: vseleq.f64 d16, d2, d1
290  ret void
291}
292define 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, ptr @varfloat
297; CHECK: vcmp.f32 s0, s1
298; CHECK: vselvs.f32 s0, s2, s3
299  ret void
300}
301define 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, ptr @vardouble
306; CHECK: vcmp.f32 s0, s1
307; CHECK: vselvs.f64 d16, d1, d2
308  ret void
309}
310
311define 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, ptr @varfloat
316; CHECK: vcmp.f32 s0, s1
317; CHECK: vselgt.f32 s0, s2, s3
318  ret void
319}
320define 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, ptr @vardouble
325; CHECK: vcmp.f32 s0, s1
326; CHECK: vselgt.f64 d16, d1, d2
327  ret void
328}
329define 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, ptr @varfloat
334; CHECK: vcmp.f32 s0, s1
335; CHECK: vselge.f32 s0, s2, s3
336  ret void
337}
338define 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, ptr @vardouble
343; CHECK: vcmp.f32 s0, s1
344; CHECK: vselge.f64 d16, d1, d2
345  ret void
346}
347define 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, ptr @varfloat
352; CHECK: vcmp.f32 s0, s1
353; CHECK: vseleq.f32 s0, s2, s3
354  ret void
355}
356define 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, ptr @vardouble
361; CHECK: vcmp.f32 s0, s1
362; CHECK: vseleq.f64 d16, d1, d2
363  ret void
364}
365define 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, ptr @varfloat
370; CHECK: vcmp.f32	s0, s1
371; CHECK: vselgt.f32	s0, s2, s3
372  ret void
373}
374define 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, ptr @vardouble
379; CHECK: vcmp.f32 s0, s1
380; CHECK: vselgt.f64 d16, d1, d2
381  ret void
382}
383define 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, ptr @varfloat
388; CHECK: vcmp.f32 s0, s1
389; CHECK: vselge.f32 s0, s2, s3
390  ret void
391}
392define 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, ptr @vardouble
397; CHECK: vcmp.f32 s0, s1
398; CHECK: vselge.f64 d16, d1, d2
399  ret void
400}
401define 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, ptr @varfloat
406; CHECK: vcmp.f32 s1, s0
407; CHECK: vselgt.f32 s0, s2, s3
408  ret void
409}
410define 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, ptr @vardouble
415; CHECK: vcmp.f32 s1, s0
416; CHECK: vselgt.f64 d16, d1, d2
417  ret void
418}
419define 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, ptr @varfloat
424; CHECK: vcmp.f32 s1, s0
425; CHECK: vselgt.f32 s0, s2, s3
426  ret void
427}
428define 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, ptr @vardouble
433; CHECK: vcmp.f32 s1, s0
434; CHECK: vselgt.f64 d16, d1, d2
435  ret void
436}
437define 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, ptr @varfloat
442; CHECK: vcmp.f32 s1, s0
443; CHECK: vselge.f32 s0, s2, s3
444  ret void
445}
446define 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, ptr @vardouble
451; CHECK: vcmp.f32 s1, s0
452; CHECK: vselge.f64 d16, d1, d2
453  ret void
454}
455define 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, ptr @varfloat
460; CHECK: vcmp.f32 s1, s0
461; CHECK: vselge.f32 s0, s2, s3
462  ret void
463}
464define 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, ptr @vardouble
469; CHECK: vcmp.f32 s1, s0
470; CHECK: vselge.f64 d16, d1, d2
471  ret void
472}
473define 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, ptr @varfloat
478; CHECK: vcmp.f32 s0, s1
479; CHECK: vselvs.f32 s0, s3, s2
480  ret void
481}
482define 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, ptr @vardouble
487; CHECK: vcmp.f32 s0, s1
488; CHECK: vselvs.f64 d16, d2, d1
489  ret void
490}
491define 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, ptr @varfloat
496; CHECK: vcmp.f32 s0, s1
497; CHECK: vseleq.f32 s0, s3, s2
498  ret void
499}
500define 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, ptr @vardouble
505; CHECK: vcmp.f32 s0, s1
506; CHECK: vseleq.f64 d16, d2, d1
507  ret void
508}
509define 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, ptr @varfloat
514; CHECK: vcmp.f32 s0, s1
515; CHECK: vselvs.f32 s0, s2, s3
516  ret void
517}
518define 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, ptr @vardouble
523; CHECK: vcmp.f32 s0, s1
524; CHECK: vselvs.f64 d16, d1, d2
525  ret void
526}
527
528define 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, ptr @varfloat
533; CHECK: cmp r0, #0
534; CHECK: vselge.f32 s0, s1, s0
535  ret void
536}
537
538define 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, ptr @varfloat
543; CHECK: cmp r0, #1
544; CHECK: vselge.f32 s0, s1, s0
545  ret void
546}
547
548define 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, ptr @varfloat
553; CHECK: cmp r0, #0
554; CHECK: vselgt.f32 s0, s0, s1
555  ret void
556}
557
558define 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, ptr @varfloat
563; CHECK: cmn r0, #1
564; CHECK: vselgt.f32 s0, s0, s1
565  ret void
566}
567
568define 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, ptr @vardouble
573; CHECK: cmp r0, #0
574; CHECK: vselge.f64 d16, d1, d0
575  ret void
576}
577
578define 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, ptr @vardouble
583; CHECK: cmp r0, #1
584; CHECK: vselge.f64 d16, d1, d0
585  ret void
586}
587
588define 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, ptr @vardouble
593; CHECK: cmp r0, #0
594; CHECK: vselgt.f64 d16, d0, d1
595  ret void
596}
597
598define 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, ptr @vardouble
603; CHECK: cmn r0, #1
604; CHECK: vselgt.f64 d16, d0, d1
605  ret void
606}
607