Add explicit -mtriple=arm-unknown to llvm/test/CodeGen/ARM/disable-tail-calls.ll...
[oota-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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: vcmpe.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: 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: vcmpe.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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: vcmpe.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: 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: vcmpe.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: 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: 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 }