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
10 ; CHECK: vselgt.f32 s0, s0, s1
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
19 ; CHECK: vselgt.f64 d16, d0, d1
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
28 ; CHECK: vselge.f32 s0, s0, s1
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
37 ; CHECK: vselge.f64 d16, d0, d1
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
46 ; CHECK: vseleq.f32 s0, s0, s1
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
55 ; CHECK: vseleq.f64 d16, d0, d1
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
64 ; CHECK: vselge.f32 s0, s1, s0
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
73 ; CHECK: vselge.f64 d16, d1, d0
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
82 ; CHECK: vselgt.f32 s0, s1, s0
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
91 ; CHECK: vselgt.f64 d16, d1, d0
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
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
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
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
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: vcmp.f32 s0, s1
136 ; CHECK: vseleq.f32 s0, s2, s3
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: vcmp.f32 s0, s1
145 ; CHECK: vseleq.f64 d16, d1, d2
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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: vcmp.f32 s0, s1
280 ; CHECK: vseleq.f32 s0, s3, s2
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: vcmp.f32 s0, s1
289 ; CHECK: vseleq.f64 d16, d2, d1
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
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