1 ; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32
2 ; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64
4 ;; Test integers selection after `fcmp`
6 define i32 @f32_fcmp_false(float %a, float %b, i32 %x, i32 %y) {
7 ; LA32-LABEL: f32_fcmp_false:
9 ; LA32-NEXT: move $a0, $a1
10 ; LA32-NEXT: jirl $zero, $ra, 0
12 ; LA64-LABEL: f32_fcmp_false:
14 ; LA64-NEXT: move $a0, $a1
15 ; LA64-NEXT: jirl $zero, $ra, 0
16 %cmp = fcmp false float %a, %b
17 %res = select i1 %cmp, i32 %x, i32 %y
21 define i32 @f32_fcmp_oeq(float %a, float %b, i32 %x, i32 %y) {
22 ; LA32-LABEL: f32_fcmp_oeq:
24 ; LA32-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1
25 ; LA32-NEXT: movcf2gr $a2, $fcc0
26 ; LA32-NEXT: masknez $a1, $a1, $a2
27 ; LA32-NEXT: maskeqz $a0, $a0, $a2
28 ; LA32-NEXT: or $a0, $a0, $a1
29 ; LA32-NEXT: jirl $zero, $ra, 0
31 ; LA64-LABEL: f32_fcmp_oeq:
33 ; LA64-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1
34 ; LA64-NEXT: movcf2gr $a2, $fcc0
35 ; LA64-NEXT: masknez $a1, $a1, $a2
36 ; LA64-NEXT: maskeqz $a0, $a0, $a2
37 ; LA64-NEXT: or $a0, $a0, $a1
38 ; LA64-NEXT: jirl $zero, $ra, 0
39 %cmp = fcmp oeq float %a, %b
40 %res = select i1 %cmp, i32 %x, i32 %y
44 define i32 @f32_fcmp_ogt(float %a, float %b, i32 %x, i32 %y) {
45 ; LA32-LABEL: f32_fcmp_ogt:
47 ; LA32-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0
48 ; LA32-NEXT: movcf2gr $a2, $fcc0
49 ; LA32-NEXT: masknez $a1, $a1, $a2
50 ; LA32-NEXT: maskeqz $a0, $a0, $a2
51 ; LA32-NEXT: or $a0, $a0, $a1
52 ; LA32-NEXT: jirl $zero, $ra, 0
54 ; LA64-LABEL: f32_fcmp_ogt:
56 ; LA64-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0
57 ; LA64-NEXT: movcf2gr $a2, $fcc0
58 ; LA64-NEXT: masknez $a1, $a1, $a2
59 ; LA64-NEXT: maskeqz $a0, $a0, $a2
60 ; LA64-NEXT: or $a0, $a0, $a1
61 ; LA64-NEXT: jirl $zero, $ra, 0
62 %cmp = fcmp ogt float %a, %b
63 %res = select i1 %cmp, i32 %x, i32 %y
67 define i32 @f32_fcmp_oge(float %a, float %b, i32 %x, i32 %y) {
68 ; LA32-LABEL: f32_fcmp_oge:
70 ; LA32-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0
71 ; LA32-NEXT: movcf2gr $a2, $fcc0
72 ; LA32-NEXT: masknez $a1, $a1, $a2
73 ; LA32-NEXT: maskeqz $a0, $a0, $a2
74 ; LA32-NEXT: or $a0, $a0, $a1
75 ; LA32-NEXT: jirl $zero, $ra, 0
77 ; LA64-LABEL: f32_fcmp_oge:
79 ; LA64-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0
80 ; LA64-NEXT: movcf2gr $a2, $fcc0
81 ; LA64-NEXT: masknez $a1, $a1, $a2
82 ; LA64-NEXT: maskeqz $a0, $a0, $a2
83 ; LA64-NEXT: or $a0, $a0, $a1
84 ; LA64-NEXT: jirl $zero, $ra, 0
85 %cmp = fcmp oge float %a, %b
86 %res = select i1 %cmp, i32 %x, i32 %y
90 define i32 @f32_fcmp_olt(float %a, float %b, i32 %x, i32 %y) {
91 ; LA32-LABEL: f32_fcmp_olt:
93 ; LA32-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1
94 ; LA32-NEXT: movcf2gr $a2, $fcc0
95 ; LA32-NEXT: masknez $a1, $a1, $a2
96 ; LA32-NEXT: maskeqz $a0, $a0, $a2
97 ; LA32-NEXT: or $a0, $a0, $a1
98 ; LA32-NEXT: jirl $zero, $ra, 0
100 ; LA64-LABEL: f32_fcmp_olt:
102 ; LA64-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1
103 ; LA64-NEXT: movcf2gr $a2, $fcc0
104 ; LA64-NEXT: masknez $a1, $a1, $a2
105 ; LA64-NEXT: maskeqz $a0, $a0, $a2
106 ; LA64-NEXT: or $a0, $a0, $a1
107 ; LA64-NEXT: jirl $zero, $ra, 0
108 %cmp = fcmp olt float %a, %b
109 %res = select i1 %cmp, i32 %x, i32 %y
113 define i32 @f32_fcmp_ole(float %a, float %b, i32 %x, i32 %y) {
114 ; LA32-LABEL: f32_fcmp_ole:
116 ; LA32-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1
117 ; LA32-NEXT: movcf2gr $a2, $fcc0
118 ; LA32-NEXT: masknez $a1, $a1, $a2
119 ; LA32-NEXT: maskeqz $a0, $a0, $a2
120 ; LA32-NEXT: or $a0, $a0, $a1
121 ; LA32-NEXT: jirl $zero, $ra, 0
123 ; LA64-LABEL: f32_fcmp_ole:
125 ; LA64-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1
126 ; LA64-NEXT: movcf2gr $a2, $fcc0
127 ; LA64-NEXT: masknez $a1, $a1, $a2
128 ; LA64-NEXT: maskeqz $a0, $a0, $a2
129 ; LA64-NEXT: or $a0, $a0, $a1
130 ; LA64-NEXT: jirl $zero, $ra, 0
131 %cmp = fcmp ole float %a, %b
132 %res = select i1 %cmp, i32 %x, i32 %y
136 define i32 @f32_fcmp_one(float %a, float %b, i32 %x, i32 %y) {
137 ; LA32-LABEL: f32_fcmp_one:
139 ; LA32-NEXT: fcmp.cne.s $fcc0, $fa0, $fa1
140 ; LA32-NEXT: movcf2gr $a2, $fcc0
141 ; LA32-NEXT: masknez $a1, $a1, $a2
142 ; LA32-NEXT: maskeqz $a0, $a0, $a2
143 ; LA32-NEXT: or $a0, $a0, $a1
144 ; LA32-NEXT: jirl $zero, $ra, 0
146 ; LA64-LABEL: f32_fcmp_one:
148 ; LA64-NEXT: fcmp.cne.s $fcc0, $fa0, $fa1
149 ; LA64-NEXT: movcf2gr $a2, $fcc0
150 ; LA64-NEXT: masknez $a1, $a1, $a2
151 ; LA64-NEXT: maskeqz $a0, $a0, $a2
152 ; LA64-NEXT: or $a0, $a0, $a1
153 ; LA64-NEXT: jirl $zero, $ra, 0
154 %cmp = fcmp one float %a, %b
155 %res = select i1 %cmp, i32 %x, i32 %y
159 define i32 @f32_fcmp_ord(float %a, float %b, i32 %x, i32 %y) {
160 ; LA32-LABEL: f32_fcmp_ord:
162 ; LA32-NEXT: fcmp.cor.s $fcc0, $fa0, $fa1
163 ; LA32-NEXT: movcf2gr $a2, $fcc0
164 ; LA32-NEXT: masknez $a1, $a1, $a2
165 ; LA32-NEXT: maskeqz $a0, $a0, $a2
166 ; LA32-NEXT: or $a0, $a0, $a1
167 ; LA32-NEXT: jirl $zero, $ra, 0
169 ; LA64-LABEL: f32_fcmp_ord:
171 ; LA64-NEXT: fcmp.cor.s $fcc0, $fa0, $fa1
172 ; LA64-NEXT: movcf2gr $a2, $fcc0
173 ; LA64-NEXT: masknez $a1, $a1, $a2
174 ; LA64-NEXT: maskeqz $a0, $a0, $a2
175 ; LA64-NEXT: or $a0, $a0, $a1
176 ; LA64-NEXT: jirl $zero, $ra, 0
177 %cmp = fcmp ord float %a, %b
178 %res = select i1 %cmp, i32 %x, i32 %y
182 define i32 @f32_fcmp_ueq(float %a, float %b, i32 %x, i32 %y) {
183 ; LA32-LABEL: f32_fcmp_ueq:
185 ; LA32-NEXT: fcmp.cueq.s $fcc0, $fa0, $fa1
186 ; LA32-NEXT: movcf2gr $a2, $fcc0
187 ; LA32-NEXT: masknez $a1, $a1, $a2
188 ; LA32-NEXT: maskeqz $a0, $a0, $a2
189 ; LA32-NEXT: or $a0, $a0, $a1
190 ; LA32-NEXT: jirl $zero, $ra, 0
192 ; LA64-LABEL: f32_fcmp_ueq:
194 ; LA64-NEXT: fcmp.cueq.s $fcc0, $fa0, $fa1
195 ; LA64-NEXT: movcf2gr $a2, $fcc0
196 ; LA64-NEXT: masknez $a1, $a1, $a2
197 ; LA64-NEXT: maskeqz $a0, $a0, $a2
198 ; LA64-NEXT: or $a0, $a0, $a1
199 ; LA64-NEXT: jirl $zero, $ra, 0
200 %cmp = fcmp ueq float %a, %b
201 %res = select i1 %cmp, i32 %x, i32 %y
205 define i32 @f32_fcmp_ugt(float %a, float %b, i32 %x, i32 %y) {
206 ; LA32-LABEL: f32_fcmp_ugt:
208 ; LA32-NEXT: fcmp.cult.s $fcc0, $fa1, $fa0
209 ; LA32-NEXT: movcf2gr $a2, $fcc0
210 ; LA32-NEXT: masknez $a1, $a1, $a2
211 ; LA32-NEXT: maskeqz $a0, $a0, $a2
212 ; LA32-NEXT: or $a0, $a0, $a1
213 ; LA32-NEXT: jirl $zero, $ra, 0
215 ; LA64-LABEL: f32_fcmp_ugt:
217 ; LA64-NEXT: fcmp.cult.s $fcc0, $fa1, $fa0
218 ; LA64-NEXT: movcf2gr $a2, $fcc0
219 ; LA64-NEXT: masknez $a1, $a1, $a2
220 ; LA64-NEXT: maskeqz $a0, $a0, $a2
221 ; LA64-NEXT: or $a0, $a0, $a1
222 ; LA64-NEXT: jirl $zero, $ra, 0
223 %cmp = fcmp ugt float %a, %b
224 %res = select i1 %cmp, i32 %x, i32 %y
228 define i32 @f32_fcmp_uge(float %a, float %b, i32 %x, i32 %y) {
229 ; LA32-LABEL: f32_fcmp_uge:
231 ; LA32-NEXT: fcmp.cule.s $fcc0, $fa1, $fa0
232 ; LA32-NEXT: movcf2gr $a2, $fcc0
233 ; LA32-NEXT: masknez $a1, $a1, $a2
234 ; LA32-NEXT: maskeqz $a0, $a0, $a2
235 ; LA32-NEXT: or $a0, $a0, $a1
236 ; LA32-NEXT: jirl $zero, $ra, 0
238 ; LA64-LABEL: f32_fcmp_uge:
240 ; LA64-NEXT: fcmp.cule.s $fcc0, $fa1, $fa0
241 ; LA64-NEXT: movcf2gr $a2, $fcc0
242 ; LA64-NEXT: masknez $a1, $a1, $a2
243 ; LA64-NEXT: maskeqz $a0, $a0, $a2
244 ; LA64-NEXT: or $a0, $a0, $a1
245 ; LA64-NEXT: jirl $zero, $ra, 0
246 %cmp = fcmp uge float %a, %b
247 %res = select i1 %cmp, i32 %x, i32 %y
251 define i32 @f32_fcmp_ult(float %a, float %b, i32 %x, i32 %y) {
252 ; LA32-LABEL: f32_fcmp_ult:
254 ; LA32-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1
255 ; LA32-NEXT: movcf2gr $a2, $fcc0
256 ; LA32-NEXT: masknez $a1, $a1, $a2
257 ; LA32-NEXT: maskeqz $a0, $a0, $a2
258 ; LA32-NEXT: or $a0, $a0, $a1
259 ; LA32-NEXT: jirl $zero, $ra, 0
261 ; LA64-LABEL: f32_fcmp_ult:
263 ; LA64-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1
264 ; LA64-NEXT: movcf2gr $a2, $fcc0
265 ; LA64-NEXT: masknez $a1, $a1, $a2
266 ; LA64-NEXT: maskeqz $a0, $a0, $a2
267 ; LA64-NEXT: or $a0, $a0, $a1
268 ; LA64-NEXT: jirl $zero, $ra, 0
269 %cmp = fcmp ult float %a, %b
270 %res = select i1 %cmp, i32 %x, i32 %y
274 define i32 @f32_fcmp_ule(float %a, float %b, i32 %x, i32 %y) {
275 ; LA32-LABEL: f32_fcmp_ule:
277 ; LA32-NEXT: fcmp.cule.s $fcc0, $fa0, $fa1
278 ; LA32-NEXT: movcf2gr $a2, $fcc0
279 ; LA32-NEXT: masknez $a1, $a1, $a2
280 ; LA32-NEXT: maskeqz $a0, $a0, $a2
281 ; LA32-NEXT: or $a0, $a0, $a1
282 ; LA32-NEXT: jirl $zero, $ra, 0
284 ; LA64-LABEL: f32_fcmp_ule:
286 ; LA64-NEXT: fcmp.cule.s $fcc0, $fa0, $fa1
287 ; LA64-NEXT: movcf2gr $a2, $fcc0
288 ; LA64-NEXT: masknez $a1, $a1, $a2
289 ; LA64-NEXT: maskeqz $a0, $a0, $a2
290 ; LA64-NEXT: or $a0, $a0, $a1
291 ; LA64-NEXT: jirl $zero, $ra, 0
292 %cmp = fcmp ule float %a, %b
293 %res = select i1 %cmp, i32 %x, i32 %y
297 define i32 @f32_fcmp_une(float %a, float %b, i32 %x, i32 %y) {
298 ; LA32-LABEL: f32_fcmp_une:
300 ; LA32-NEXT: fcmp.cune.s $fcc0, $fa0, $fa1
301 ; LA32-NEXT: movcf2gr $a2, $fcc0
302 ; LA32-NEXT: masknez $a1, $a1, $a2
303 ; LA32-NEXT: maskeqz $a0, $a0, $a2
304 ; LA32-NEXT: or $a0, $a0, $a1
305 ; LA32-NEXT: jirl $zero, $ra, 0
307 ; LA64-LABEL: f32_fcmp_une:
309 ; LA64-NEXT: fcmp.cune.s $fcc0, $fa0, $fa1
310 ; LA64-NEXT: movcf2gr $a2, $fcc0
311 ; LA64-NEXT: masknez $a1, $a1, $a2
312 ; LA64-NEXT: maskeqz $a0, $a0, $a2
313 ; LA64-NEXT: or $a0, $a0, $a1
314 ; LA64-NEXT: jirl $zero, $ra, 0
315 %cmp = fcmp une float %a, %b
316 %res = select i1 %cmp, i32 %x, i32 %y
320 define i32 @f32_fcmp_uno(float %a, float %b, i32 %x, i32 %y) {
321 ; LA32-LABEL: f32_fcmp_uno:
323 ; LA32-NEXT: fcmp.cun.s $fcc0, $fa0, $fa1
324 ; LA32-NEXT: movcf2gr $a2, $fcc0
325 ; LA32-NEXT: masknez $a1, $a1, $a2
326 ; LA32-NEXT: maskeqz $a0, $a0, $a2
327 ; LA32-NEXT: or $a0, $a0, $a1
328 ; LA32-NEXT: jirl $zero, $ra, 0
330 ; LA64-LABEL: f32_fcmp_uno:
332 ; LA64-NEXT: fcmp.cun.s $fcc0, $fa0, $fa1
333 ; LA64-NEXT: movcf2gr $a2, $fcc0
334 ; LA64-NEXT: masknez $a1, $a1, $a2
335 ; LA64-NEXT: maskeqz $a0, $a0, $a2
336 ; LA64-NEXT: or $a0, $a0, $a1
337 ; LA64-NEXT: jirl $zero, $ra, 0
338 %cmp = fcmp uno float %a, %b
339 %res = select i1 %cmp, i32 %x, i32 %y
343 define i32 @f32_fcmp_true(float %a, float %b, i32 %x, i32 %y) {
344 ; LA32-LABEL: f32_fcmp_true:
346 ; LA32-NEXT: jirl $zero, $ra, 0
348 ; LA64-LABEL: f32_fcmp_true:
350 ; LA64-NEXT: jirl $zero, $ra, 0
351 %cmp = fcmp true float %a, %b
352 %res = select i1 %cmp, i32 %x, i32 %y
356 define i32 @f64_fcmp_false(double %a, double %b, i32 %x, i32 %y) {
357 ; LA32-LABEL: f64_fcmp_false:
359 ; LA32-NEXT: move $a0, $a1
360 ; LA32-NEXT: jirl $zero, $ra, 0
362 ; LA64-LABEL: f64_fcmp_false:
364 ; LA64-NEXT: move $a0, $a1
365 ; LA64-NEXT: jirl $zero, $ra, 0
366 %cmp = fcmp false double %a, %b
367 %res = select i1 %cmp, i32 %x, i32 %y
371 define i32 @f64_fcmp_oeq(double %a, double %b, i32 %x, i32 %y) {
372 ; LA32-LABEL: f64_fcmp_oeq:
374 ; LA32-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1
375 ; LA32-NEXT: movcf2gr $a2, $fcc0
376 ; LA32-NEXT: masknez $a1, $a1, $a2
377 ; LA32-NEXT: maskeqz $a0, $a0, $a2
378 ; LA32-NEXT: or $a0, $a0, $a1
379 ; LA32-NEXT: jirl $zero, $ra, 0
381 ; LA64-LABEL: f64_fcmp_oeq:
383 ; LA64-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1
384 ; LA64-NEXT: movcf2gr $a2, $fcc0
385 ; LA64-NEXT: masknez $a1, $a1, $a2
386 ; LA64-NEXT: maskeqz $a0, $a0, $a2
387 ; LA64-NEXT: or $a0, $a0, $a1
388 ; LA64-NEXT: jirl $zero, $ra, 0
389 %cmp = fcmp oeq double %a, %b
390 %res = select i1 %cmp, i32 %x, i32 %y
394 define i32 @f64_fcmp_ogt(double %a, double %b, i32 %x, i32 %y) {
395 ; LA32-LABEL: f64_fcmp_ogt:
397 ; LA32-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0
398 ; LA32-NEXT: movcf2gr $a2, $fcc0
399 ; LA32-NEXT: masknez $a1, $a1, $a2
400 ; LA32-NEXT: maskeqz $a0, $a0, $a2
401 ; LA32-NEXT: or $a0, $a0, $a1
402 ; LA32-NEXT: jirl $zero, $ra, 0
404 ; LA64-LABEL: f64_fcmp_ogt:
406 ; LA64-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0
407 ; LA64-NEXT: movcf2gr $a2, $fcc0
408 ; LA64-NEXT: masknez $a1, $a1, $a2
409 ; LA64-NEXT: maskeqz $a0, $a0, $a2
410 ; LA64-NEXT: or $a0, $a0, $a1
411 ; LA64-NEXT: jirl $zero, $ra, 0
412 %cmp = fcmp ogt double %a, %b
413 %res = select i1 %cmp, i32 %x, i32 %y
417 define i32 @f64_fcmp_oge(double %a, double %b, i32 %x, i32 %y) {
418 ; LA32-LABEL: f64_fcmp_oge:
420 ; LA32-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0
421 ; LA32-NEXT: movcf2gr $a2, $fcc0
422 ; LA32-NEXT: masknez $a1, $a1, $a2
423 ; LA32-NEXT: maskeqz $a0, $a0, $a2
424 ; LA32-NEXT: or $a0, $a0, $a1
425 ; LA32-NEXT: jirl $zero, $ra, 0
427 ; LA64-LABEL: f64_fcmp_oge:
429 ; LA64-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0
430 ; LA64-NEXT: movcf2gr $a2, $fcc0
431 ; LA64-NEXT: masknez $a1, $a1, $a2
432 ; LA64-NEXT: maskeqz $a0, $a0, $a2
433 ; LA64-NEXT: or $a0, $a0, $a1
434 ; LA64-NEXT: jirl $zero, $ra, 0
435 %cmp = fcmp oge double %a, %b
436 %res = select i1 %cmp, i32 %x, i32 %y
440 define i32 @f64_fcmp_olt(double %a, double %b, i32 %x, i32 %y) {
441 ; LA32-LABEL: f64_fcmp_olt:
443 ; LA32-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1
444 ; LA32-NEXT: movcf2gr $a2, $fcc0
445 ; LA32-NEXT: masknez $a1, $a1, $a2
446 ; LA32-NEXT: maskeqz $a0, $a0, $a2
447 ; LA32-NEXT: or $a0, $a0, $a1
448 ; LA32-NEXT: jirl $zero, $ra, 0
450 ; LA64-LABEL: f64_fcmp_olt:
452 ; LA64-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1
453 ; LA64-NEXT: movcf2gr $a2, $fcc0
454 ; LA64-NEXT: masknez $a1, $a1, $a2
455 ; LA64-NEXT: maskeqz $a0, $a0, $a2
456 ; LA64-NEXT: or $a0, $a0, $a1
457 ; LA64-NEXT: jirl $zero, $ra, 0
458 %cmp = fcmp olt double %a, %b
459 %res = select i1 %cmp, i32 %x, i32 %y
463 define i32 @f64_fcmp_ole(double %a, double %b, i32 %x, i32 %y) {
464 ; LA32-LABEL: f64_fcmp_ole:
466 ; LA32-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1
467 ; LA32-NEXT: movcf2gr $a2, $fcc0
468 ; LA32-NEXT: masknez $a1, $a1, $a2
469 ; LA32-NEXT: maskeqz $a0, $a0, $a2
470 ; LA32-NEXT: or $a0, $a0, $a1
471 ; LA32-NEXT: jirl $zero, $ra, 0
473 ; LA64-LABEL: f64_fcmp_ole:
475 ; LA64-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1
476 ; LA64-NEXT: movcf2gr $a2, $fcc0
477 ; LA64-NEXT: masknez $a1, $a1, $a2
478 ; LA64-NEXT: maskeqz $a0, $a0, $a2
479 ; LA64-NEXT: or $a0, $a0, $a1
480 ; LA64-NEXT: jirl $zero, $ra, 0
481 %cmp = fcmp ole double %a, %b
482 %res = select i1 %cmp, i32 %x, i32 %y
486 define i32 @f64_fcmp_one(double %a, double %b, i32 %x, i32 %y) {
487 ; LA32-LABEL: f64_fcmp_one:
489 ; LA32-NEXT: fcmp.cne.d $fcc0, $fa0, $fa1
490 ; LA32-NEXT: movcf2gr $a2, $fcc0
491 ; LA32-NEXT: masknez $a1, $a1, $a2
492 ; LA32-NEXT: maskeqz $a0, $a0, $a2
493 ; LA32-NEXT: or $a0, $a0, $a1
494 ; LA32-NEXT: jirl $zero, $ra, 0
496 ; LA64-LABEL: f64_fcmp_one:
498 ; LA64-NEXT: fcmp.cne.d $fcc0, $fa0, $fa1
499 ; LA64-NEXT: movcf2gr $a2, $fcc0
500 ; LA64-NEXT: masknez $a1, $a1, $a2
501 ; LA64-NEXT: maskeqz $a0, $a0, $a2
502 ; LA64-NEXT: or $a0, $a0, $a1
503 ; LA64-NEXT: jirl $zero, $ra, 0
504 %cmp = fcmp one double %a, %b
505 %res = select i1 %cmp, i32 %x, i32 %y
509 define i32 @f64_fcmp_ord(double %a, double %b, i32 %x, i32 %y) {
510 ; LA32-LABEL: f64_fcmp_ord:
512 ; LA32-NEXT: fcmp.cor.d $fcc0, $fa0, $fa1
513 ; LA32-NEXT: movcf2gr $a2, $fcc0
514 ; LA32-NEXT: masknez $a1, $a1, $a2
515 ; LA32-NEXT: maskeqz $a0, $a0, $a2
516 ; LA32-NEXT: or $a0, $a0, $a1
517 ; LA32-NEXT: jirl $zero, $ra, 0
519 ; LA64-LABEL: f64_fcmp_ord:
521 ; LA64-NEXT: fcmp.cor.d $fcc0, $fa0, $fa1
522 ; LA64-NEXT: movcf2gr $a2, $fcc0
523 ; LA64-NEXT: masknez $a1, $a1, $a2
524 ; LA64-NEXT: maskeqz $a0, $a0, $a2
525 ; LA64-NEXT: or $a0, $a0, $a1
526 ; LA64-NEXT: jirl $zero, $ra, 0
527 %cmp = fcmp ord double %a, %b
528 %res = select i1 %cmp, i32 %x, i32 %y
532 define i32 @f64_fcmp_ueq(double %a, double %b, i32 %x, i32 %y) {
533 ; LA32-LABEL: f64_fcmp_ueq:
535 ; LA32-NEXT: fcmp.cueq.d $fcc0, $fa0, $fa1
536 ; LA32-NEXT: movcf2gr $a2, $fcc0
537 ; LA32-NEXT: masknez $a1, $a1, $a2
538 ; LA32-NEXT: maskeqz $a0, $a0, $a2
539 ; LA32-NEXT: or $a0, $a0, $a1
540 ; LA32-NEXT: jirl $zero, $ra, 0
542 ; LA64-LABEL: f64_fcmp_ueq:
544 ; LA64-NEXT: fcmp.cueq.d $fcc0, $fa0, $fa1
545 ; LA64-NEXT: movcf2gr $a2, $fcc0
546 ; LA64-NEXT: masknez $a1, $a1, $a2
547 ; LA64-NEXT: maskeqz $a0, $a0, $a2
548 ; LA64-NEXT: or $a0, $a0, $a1
549 ; LA64-NEXT: jirl $zero, $ra, 0
550 %cmp = fcmp ueq double %a, %b
551 %res = select i1 %cmp, i32 %x, i32 %y
555 define i32 @f64_fcmp_ugt(double %a, double %b, i32 %x, i32 %y) {
556 ; LA32-LABEL: f64_fcmp_ugt:
558 ; LA32-NEXT: fcmp.cult.d $fcc0, $fa1, $fa0
559 ; LA32-NEXT: movcf2gr $a2, $fcc0
560 ; LA32-NEXT: masknez $a1, $a1, $a2
561 ; LA32-NEXT: maskeqz $a0, $a0, $a2
562 ; LA32-NEXT: or $a0, $a0, $a1
563 ; LA32-NEXT: jirl $zero, $ra, 0
565 ; LA64-LABEL: f64_fcmp_ugt:
567 ; LA64-NEXT: fcmp.cult.d $fcc0, $fa1, $fa0
568 ; LA64-NEXT: movcf2gr $a2, $fcc0
569 ; LA64-NEXT: masknez $a1, $a1, $a2
570 ; LA64-NEXT: maskeqz $a0, $a0, $a2
571 ; LA64-NEXT: or $a0, $a0, $a1
572 ; LA64-NEXT: jirl $zero, $ra, 0
573 %cmp = fcmp ugt double %a, %b
574 %res = select i1 %cmp, i32 %x, i32 %y
578 define i32 @f64_fcmp_uge(double %a, double %b, i32 %x, i32 %y) {
579 ; LA32-LABEL: f64_fcmp_uge:
581 ; LA32-NEXT: fcmp.cule.d $fcc0, $fa1, $fa0
582 ; LA32-NEXT: movcf2gr $a2, $fcc0
583 ; LA32-NEXT: masknez $a1, $a1, $a2
584 ; LA32-NEXT: maskeqz $a0, $a0, $a2
585 ; LA32-NEXT: or $a0, $a0, $a1
586 ; LA32-NEXT: jirl $zero, $ra, 0
588 ; LA64-LABEL: f64_fcmp_uge:
590 ; LA64-NEXT: fcmp.cule.d $fcc0, $fa1, $fa0
591 ; LA64-NEXT: movcf2gr $a2, $fcc0
592 ; LA64-NEXT: masknez $a1, $a1, $a2
593 ; LA64-NEXT: maskeqz $a0, $a0, $a2
594 ; LA64-NEXT: or $a0, $a0, $a1
595 ; LA64-NEXT: jirl $zero, $ra, 0
596 %cmp = fcmp uge double %a, %b
597 %res = select i1 %cmp, i32 %x, i32 %y
601 define i32 @f64_fcmp_ult(double %a, double %b, i32 %x, i32 %y) {
602 ; LA32-LABEL: f64_fcmp_ult:
604 ; LA32-NEXT: fcmp.cult.d $fcc0, $fa0, $fa1
605 ; LA32-NEXT: movcf2gr $a2, $fcc0
606 ; LA32-NEXT: masknez $a1, $a1, $a2
607 ; LA32-NEXT: maskeqz $a0, $a0, $a2
608 ; LA32-NEXT: or $a0, $a0, $a1
609 ; LA32-NEXT: jirl $zero, $ra, 0
611 ; LA64-LABEL: f64_fcmp_ult:
613 ; LA64-NEXT: fcmp.cult.d $fcc0, $fa0, $fa1
614 ; LA64-NEXT: movcf2gr $a2, $fcc0
615 ; LA64-NEXT: masknez $a1, $a1, $a2
616 ; LA64-NEXT: maskeqz $a0, $a0, $a2
617 ; LA64-NEXT: or $a0, $a0, $a1
618 ; LA64-NEXT: jirl $zero, $ra, 0
619 %cmp = fcmp ult double %a, %b
620 %res = select i1 %cmp, i32 %x, i32 %y
624 define i32 @f64_fcmp_ule(double %a, double %b, i32 %x, i32 %y) {
625 ; LA32-LABEL: f64_fcmp_ule:
627 ; LA32-NEXT: fcmp.cule.d $fcc0, $fa0, $fa1
628 ; LA32-NEXT: movcf2gr $a2, $fcc0
629 ; LA32-NEXT: masknez $a1, $a1, $a2
630 ; LA32-NEXT: maskeqz $a0, $a0, $a2
631 ; LA32-NEXT: or $a0, $a0, $a1
632 ; LA32-NEXT: jirl $zero, $ra, 0
634 ; LA64-LABEL: f64_fcmp_ule:
636 ; LA64-NEXT: fcmp.cule.d $fcc0, $fa0, $fa1
637 ; LA64-NEXT: movcf2gr $a2, $fcc0
638 ; LA64-NEXT: masknez $a1, $a1, $a2
639 ; LA64-NEXT: maskeqz $a0, $a0, $a2
640 ; LA64-NEXT: or $a0, $a0, $a1
641 ; LA64-NEXT: jirl $zero, $ra, 0
642 %cmp = fcmp ule double %a, %b
643 %res = select i1 %cmp, i32 %x, i32 %y
647 define i32 @f64_fcmp_une(double %a, double %b, i32 %x, i32 %y) {
648 ; LA32-LABEL: f64_fcmp_une:
650 ; LA32-NEXT: fcmp.cune.d $fcc0, $fa0, $fa1
651 ; LA32-NEXT: movcf2gr $a2, $fcc0
652 ; LA32-NEXT: masknez $a1, $a1, $a2
653 ; LA32-NEXT: maskeqz $a0, $a0, $a2
654 ; LA32-NEXT: or $a0, $a0, $a1
655 ; LA32-NEXT: jirl $zero, $ra, 0
657 ; LA64-LABEL: f64_fcmp_une:
659 ; LA64-NEXT: fcmp.cune.d $fcc0, $fa0, $fa1
660 ; LA64-NEXT: movcf2gr $a2, $fcc0
661 ; LA64-NEXT: masknez $a1, $a1, $a2
662 ; LA64-NEXT: maskeqz $a0, $a0, $a2
663 ; LA64-NEXT: or $a0, $a0, $a1
664 ; LA64-NEXT: jirl $zero, $ra, 0
665 %cmp = fcmp une double %a, %b
666 %res = select i1 %cmp, i32 %x, i32 %y
670 define i32 @f64_fcmp_uno(double %a, double %b, i32 %x, i32 %y) {
671 ; LA32-LABEL: f64_fcmp_uno:
673 ; LA32-NEXT: fcmp.cun.d $fcc0, $fa0, $fa1
674 ; LA32-NEXT: movcf2gr $a2, $fcc0
675 ; LA32-NEXT: masknez $a1, $a1, $a2
676 ; LA32-NEXT: maskeqz $a0, $a0, $a2
677 ; LA32-NEXT: or $a0, $a0, $a1
678 ; LA32-NEXT: jirl $zero, $ra, 0
680 ; LA64-LABEL: f64_fcmp_uno:
682 ; LA64-NEXT: fcmp.cun.d $fcc0, $fa0, $fa1
683 ; LA64-NEXT: movcf2gr $a2, $fcc0
684 ; LA64-NEXT: masknez $a1, $a1, $a2
685 ; LA64-NEXT: maskeqz $a0, $a0, $a2
686 ; LA64-NEXT: or $a0, $a0, $a1
687 ; LA64-NEXT: jirl $zero, $ra, 0
688 %cmp = fcmp uno double %a, %b
689 %res = select i1 %cmp, i32 %x, i32 %y
693 define i32 @f64_fcmp_true(double %a, double %b, i32 %x, i32 %y) {
694 ; LA32-LABEL: f64_fcmp_true:
696 ; LA32-NEXT: jirl $zero, $ra, 0
698 ; LA64-LABEL: f64_fcmp_true:
700 ; LA64-NEXT: jirl $zero, $ra, 0
701 %cmp = fcmp true double %a, %b
702 %res = select i1 %cmp, i32 %x, i32 %y