1 ; RUN: llc < %s -march=x86-64 -asm-verbose=false -join-physregs -promote-elements | FileCheck %s
2 ; RUN: llc < %s -march=x86-64 -asm-verbose=false -join-physregs -enable-unsafe-fp-math -enable-no-nans-fp-math -promote-elements | FileCheck -check-prefix=UNSAFE %s
3 ; RUN: llc < %s -march=x86-64 -asm-verbose=false -join-physregs -enable-no-nans-fp-math -promote-elements | FileCheck -check-prefix=FINITE %s
5 ; Some of these patterns can be matched as SSE min or max. Some of
6 ; then can be matched provided that the operands are swapped.
7 ; Some of them can't be matched at all and require a comparison
8 ; and a conditional branch.
10 ; The naming convention is {,x_,y_}{o,u}{gt,lt,ge,le}{,_inverse}
11 ; x_ : use 0.0 instead of %y
12 ; y_ : use -0.0 instead of %y
13 ; _inverse : swap the arms of the select.
15 ; Some of these tests depend on -join-physregs commuting instructions to
19 ; CHECK-NEXT: maxsd %xmm1, %xmm0
22 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
25 ; FINITE-NEXT: maxsd %xmm1, %xmm0
27 define double @ogt(double %x, double %y) nounwind {
28 %c = fcmp ogt double %x, %y
29 %d = select i1 %c, double %x, double %y
34 ; CHECK-NEXT: minsd %xmm1, %xmm0
37 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
40 ; FINITE-NEXT: minsd %xmm1, %xmm0
42 define double @olt(double %x, double %y) nounwind {
43 %c = fcmp olt double %x, %y
44 %d = select i1 %c, double %x, double %y
49 ; CHECK-NEXT: minsd %xmm0, %xmm1
50 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
52 ; UNSAFE: ogt_inverse:
53 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
54 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
56 ; FINITE: ogt_inverse:
57 ; FINITE-NEXT: minsd %xmm0, %xmm1
58 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
60 define double @ogt_inverse(double %x, double %y) nounwind {
61 %c = fcmp ogt double %x, %y
62 %d = select i1 %c, double %y, double %x
67 ; CHECK-NEXT: maxsd %xmm0, %xmm1
68 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
70 ; UNSAFE: olt_inverse:
71 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
72 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
74 ; FINITE: olt_inverse:
75 ; FINITE-NEXT: maxsd %xmm0, %xmm1
76 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
78 define double @olt_inverse(double %x, double %y) nounwind {
79 %c = fcmp olt double %x, %y
80 %d = select i1 %c, double %y, double %x
85 ; CHECK-NEXT: ucomisd %xmm1, %xmm0
87 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
90 ; FINITE-NEXT: maxsd %xmm1, %xmm0
92 define double @oge(double %x, double %y) nounwind {
93 %c = fcmp oge double %x, %y
94 %d = select i1 %c, double %x, double %y
99 ; CHECK-NEXT: ucomisd %xmm0, %xmm1
101 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
103 ; FINITE-NEXT: minsd %xmm1, %xmm0
104 define double @ole(double %x, double %y) nounwind {
105 %c = fcmp ole double %x, %y
106 %d = select i1 %c, double %x, double %y
110 ; CHECK: oge_inverse:
111 ; CHECK-NEXT: ucomisd %xmm1, %xmm0
112 ; UNSAFE: oge_inverse:
113 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
114 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
116 ; FINITE: oge_inverse:
117 ; FINITE-NEXT: minsd %xmm0, %xmm1
118 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
120 define double @oge_inverse(double %x, double %y) nounwind {
121 %c = fcmp oge double %x, %y
122 %d = select i1 %c, double %y, double %x
126 ; CHECK: ole_inverse:
127 ; CHECK-NEXT: ucomisd %xmm0, %xmm1
128 ; UNSAFE: ole_inverse:
129 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
130 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
132 ; FINITE: ole_inverse:
133 ; FINITE-NEXT: maxsd %xmm0, %xmm1
134 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
136 define double @ole_inverse(double %x, double %y) nounwind {
137 %c = fcmp ole double %x, %y
138 %d = select i1 %c, double %y, double %x
143 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
144 ; CHECK-NEXT: maxsd %xmm1, %xmm0
147 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
148 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
151 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
152 ; FINITE-NEXT: maxsd %xmm1, %xmm0
154 define double @x_ogt(double %x) nounwind {
155 %c = fcmp ogt double %x, 0.000000e+00
156 %d = select i1 %c, double %x, double 0.000000e+00
161 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
162 ; CHECK-NEXT: minsd %xmm1, %xmm0
165 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
166 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
169 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
170 ; FINITE-NEXT: minsd %xmm1, %xmm0
172 define double @x_olt(double %x) nounwind {
173 %c = fcmp olt double %x, 0.000000e+00
174 %d = select i1 %c, double %x, double 0.000000e+00
178 ; CHECK: x_ogt_inverse:
179 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
180 ; CHECK-NEXT: minsd %xmm0, %xmm1
181 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
183 ; UNSAFE: x_ogt_inverse:
184 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
185 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
186 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
188 ; FINITE: x_ogt_inverse:
189 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
190 ; FINITE-NEXT: minsd %xmm0, %xmm1
191 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
193 define double @x_ogt_inverse(double %x) nounwind {
194 %c = fcmp ogt double %x, 0.000000e+00
195 %d = select i1 %c, double 0.000000e+00, double %x
199 ; CHECK: x_olt_inverse:
200 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
201 ; CHECK-NEXT: maxsd %xmm0, %xmm1
202 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
204 ; UNSAFE: x_olt_inverse:
205 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
206 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
207 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
209 ; FINITE: x_olt_inverse:
210 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
211 ; FINITE-NEXT: maxsd %xmm0, %xmm1
212 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
214 define double @x_olt_inverse(double %x) nounwind {
215 %c = fcmp olt double %x, 0.000000e+00
216 %d = select i1 %c, double 0.000000e+00, double %x
221 ; CHECK: ucomisd %xmm1, %xmm0
223 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
224 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
227 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
228 ; FINITE-NEXT: maxsd %xmm1, %xmm0
230 define double @x_oge(double %x) nounwind {
231 %c = fcmp oge double %x, 0.000000e+00
232 %d = select i1 %c, double %x, double 0.000000e+00
237 ; CHECK: ucomisd %xmm0, %xmm1
239 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
240 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
243 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
244 ; FINITE-NEXT: minsd %xmm1, %xmm0
246 define double @x_ole(double %x) nounwind {
247 %c = fcmp ole double %x, 0.000000e+00
248 %d = select i1 %c, double %x, double 0.000000e+00
252 ; CHECK: x_oge_inverse:
253 ; CHECK: ucomisd %xmm1, %xmm0
254 ; UNSAFE: x_oge_inverse:
255 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
256 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
257 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
259 ; FINITE: x_oge_inverse:
260 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
261 ; FINITE-NEXT: minsd %xmm0, %xmm1
262 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
264 define double @x_oge_inverse(double %x) nounwind {
265 %c = fcmp oge double %x, 0.000000e+00
266 %d = select i1 %c, double 0.000000e+00, double %x
270 ; CHECK: x_ole_inverse:
271 ; CHECK: ucomisd %xmm0, %xmm1
272 ; UNSAFE: x_ole_inverse:
273 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
274 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
275 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
277 ; FINITE: x_ole_inverse:
278 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
279 ; FINITE-NEXT: maxsd %xmm0, %xmm1
280 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
282 define double @x_ole_inverse(double %x) nounwind {
283 %c = fcmp ole double %x, 0.000000e+00
284 %d = select i1 %c, double 0.000000e+00, double %x
289 ; CHECK: ucomisd %xmm0, %xmm1
291 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
294 ; FINITE-NEXT: maxsd %xmm1, %xmm0
296 define double @ugt(double %x, double %y) nounwind {
297 %c = fcmp ugt double %x, %y
298 %d = select i1 %c, double %x, double %y
303 ; CHECK: ucomisd %xmm1, %xmm0
305 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
308 ; FINITE-NEXT: minsd %xmm1, %xmm0
310 define double @ult(double %x, double %y) nounwind {
311 %c = fcmp ult double %x, %y
312 %d = select i1 %c, double %x, double %y
316 ; CHECK: ugt_inverse:
317 ; CHECK: ucomisd %xmm0, %xmm1
318 ; UNSAFE: ugt_inverse:
319 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
320 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
322 ; FINITE: ugt_inverse:
323 ; FINITE-NEXT: minsd %xmm0, %xmm1
324 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
326 define double @ugt_inverse(double %x, double %y) nounwind {
327 %c = fcmp ugt double %x, %y
328 %d = select i1 %c, double %y, double %x
332 ; CHECK: ult_inverse:
333 ; CHECK: ucomisd %xmm1, %xmm0
334 ; UNSAFE: ult_inverse:
335 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
336 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
338 ; FINITE: ult_inverse:
339 ; FINITE-NEXT: maxsd %xmm0, %xmm1
340 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
342 define double @ult_inverse(double %x, double %y) nounwind {
343 %c = fcmp ult double %x, %y
344 %d = select i1 %c, double %y, double %x
349 ; CHECK-NEXT: maxsd %xmm0, %xmm1
350 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
353 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
356 ; FINITE-NEXT: maxsd %xmm1, %xmm0
358 define double @uge(double %x, double %y) nounwind {
359 %c = fcmp uge double %x, %y
360 %d = select i1 %c, double %x, double %y
365 ; CHECK-NEXT: minsd %xmm0, %xmm1
366 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
369 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
372 ; FINITE-NEXT: minsd %xmm1, %xmm0
374 define double @ule(double %x, double %y) nounwind {
375 %c = fcmp ule double %x, %y
376 %d = select i1 %c, double %x, double %y
380 ; CHECK: uge_inverse:
381 ; CHECK-NEXT: minsd %xmm1, %xmm0
383 ; UNSAFE: uge_inverse:
384 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
385 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
387 ; FINITE: uge_inverse:
388 ; FINITE-NEXT: minsd %xmm0, %xmm1
389 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
391 define double @uge_inverse(double %x, double %y) nounwind {
392 %c = fcmp uge double %x, %y
393 %d = select i1 %c, double %y, double %x
397 ; CHECK: ule_inverse:
398 ; CHECK-NEXT: maxsd %xmm1, %xmm0
400 ; UNSAFE: ule_inverse:
401 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
402 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
404 ; FINITE: ule_inverse:
405 ; FINITE-NEXT: maxsd %xmm0, %xmm1
406 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
408 define double @ule_inverse(double %x, double %y) nounwind {
409 %c = fcmp ule double %x, %y
410 %d = select i1 %c, double %y, double %x
415 ; CHECK: ucomisd %xmm0, %xmm1
417 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
418 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
421 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
422 ; FINITE-NEXT: maxsd %xmm1, %xmm0
424 define double @x_ugt(double %x) nounwind {
425 %c = fcmp ugt double %x, 0.000000e+00
426 %d = select i1 %c, double %x, double 0.000000e+00
431 ; CHECK: ucomisd %xmm1, %xmm0
433 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
434 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
437 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
438 ; FINITE-NEXT: minsd %xmm1, %xmm0
440 define double @x_ult(double %x) nounwind {
441 %c = fcmp ult double %x, 0.000000e+00
442 %d = select i1 %c, double %x, double 0.000000e+00
446 ; CHECK: x_ugt_inverse:
447 ; CHECK: ucomisd %xmm0, %xmm1
448 ; UNSAFE: x_ugt_inverse:
449 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
450 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
451 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
453 ; FINITE: x_ugt_inverse:
454 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
455 ; FINITE-NEXT: minsd %xmm0, %xmm1
456 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
458 define double @x_ugt_inverse(double %x) nounwind {
459 %c = fcmp ugt double %x, 0.000000e+00
460 %d = select i1 %c, double 0.000000e+00, double %x
464 ; CHECK: x_ult_inverse:
465 ; CHECK: ucomisd %xmm1, %xmm0
466 ; UNSAFE: x_ult_inverse:
467 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
468 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
469 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
471 ; FINITE: x_ult_inverse:
472 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
473 ; FINITE-NEXT: maxsd %xmm0, %xmm1
474 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
476 define double @x_ult_inverse(double %x) nounwind {
477 %c = fcmp ult double %x, 0.000000e+00
478 %d = select i1 %c, double 0.000000e+00, double %x
483 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
484 ; CHECK-NEXT: maxsd %xmm0, %xmm1
485 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
488 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
489 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
492 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
493 ; FINITE-NEXT: maxsd %xmm1, %xmm0
495 define double @x_uge(double %x) nounwind {
496 %c = fcmp uge double %x, 0.000000e+00
497 %d = select i1 %c, double %x, double 0.000000e+00
502 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
503 ; CHECK-NEXT: minsd %xmm0, %xmm1
504 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
507 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
508 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
511 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
512 ; FINITE-NEXT: minsd %xmm1, %xmm0
514 define double @x_ule(double %x) nounwind {
515 %c = fcmp ule double %x, 0.000000e+00
516 %d = select i1 %c, double %x, double 0.000000e+00
520 ; CHECK: x_uge_inverse:
521 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
522 ; CHECK-NEXT: minsd %xmm1, %xmm0
524 ; UNSAFE: x_uge_inverse:
525 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
526 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
527 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
529 ; FINITE: x_uge_inverse:
530 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
531 ; FINITE-NEXT: minsd %xmm0, %xmm1
532 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
534 define double @x_uge_inverse(double %x) nounwind {
535 %c = fcmp uge double %x, 0.000000e+00
536 %d = select i1 %c, double 0.000000e+00, double %x
540 ; CHECK: x_ule_inverse:
541 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
542 ; CHECK-NEXT: maxsd %xmm1, %xmm0
544 ; UNSAFE: x_ule_inverse:
545 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
546 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
547 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
549 ; FINITE: x_ule_inverse:
550 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
551 ; FINITE-NEXT: maxsd %xmm0, %xmm1
552 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
554 define double @x_ule_inverse(double %x) nounwind {
555 %c = fcmp ule double %x, 0.000000e+00
556 %d = select i1 %c, double 0.000000e+00, double %x
561 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
564 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
567 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
569 define double @y_ogt(double %x) nounwind {
570 %c = fcmp ogt double %x, -0.000000e+00
571 %d = select i1 %c, double %x, double -0.000000e+00
576 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
579 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
582 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
584 define double @y_olt(double %x) nounwind {
585 %c = fcmp olt double %x, -0.000000e+00
586 %d = select i1 %c, double %x, double -0.000000e+00
590 ; CHECK: y_ogt_inverse:
591 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
592 ; CHECK-NEXT: minsd %xmm0, %xmm1
593 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
595 ; UNSAFE: y_ogt_inverse:
596 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
597 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
598 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
600 ; FINITE: y_ogt_inverse:
601 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
602 ; FINITE-NEXT: minsd %xmm0, %xmm1
603 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
605 define double @y_ogt_inverse(double %x) nounwind {
606 %c = fcmp ogt double %x, -0.000000e+00
607 %d = select i1 %c, double -0.000000e+00, double %x
611 ; CHECK: y_olt_inverse:
612 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
613 ; CHECK-NEXT: maxsd %xmm0, %xmm1
614 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
616 ; UNSAFE: y_olt_inverse:
617 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
618 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
619 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
621 ; FINITE: y_olt_inverse:
622 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
623 ; FINITE-NEXT: maxsd %xmm0, %xmm1
624 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
626 define double @y_olt_inverse(double %x) nounwind {
627 %c = fcmp olt double %x, -0.000000e+00
628 %d = select i1 %c, double -0.000000e+00, double %x
633 ; CHECK: ucomisd %xmm1, %xmm0
635 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
638 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
640 define double @y_oge(double %x) nounwind {
641 %c = fcmp oge double %x, -0.000000e+00
642 %d = select i1 %c, double %x, double -0.000000e+00
647 ; CHECK: ucomisd %xmm0, %xmm1
649 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
652 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
654 define double @y_ole(double %x) nounwind {
655 %c = fcmp ole double %x, -0.000000e+00
656 %d = select i1 %c, double %x, double -0.000000e+00
660 ; CHECK: y_oge_inverse:
661 ; CHECK: ucomisd %xmm1, %xmm0
662 ; UNSAFE: y_oge_inverse:
663 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
664 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
665 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
667 ; FINITE: y_oge_inverse:
668 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
669 ; FINITE-NEXT: minsd %xmm0, %xmm1
670 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
672 define double @y_oge_inverse(double %x) nounwind {
673 %c = fcmp oge double %x, -0.000000e+00
674 %d = select i1 %c, double -0.000000e+00, double %x
678 ; CHECK: y_ole_inverse:
679 ; CHECK: ucomisd %xmm0, %xmm1
680 ; UNSAFE: y_ole_inverse:
681 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
682 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
683 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
685 ; FINITE: y_ole_inverse:
686 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
687 ; FINITE-NEXT: maxsd %xmm0, %xmm1
688 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
690 define double @y_ole_inverse(double %x) nounwind {
691 %c = fcmp ole double %x, -0.000000e+00
692 %d = select i1 %c, double -0.000000e+00, double %x
697 ; CHECK: ucomisd %xmm0, %xmm1
699 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
702 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
704 define double @y_ugt(double %x) nounwind {
705 %c = fcmp ugt double %x, -0.000000e+00
706 %d = select i1 %c, double %x, double -0.000000e+00
711 ; CHECK: ucomisd %xmm1, %xmm0
713 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
716 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
718 define double @y_ult(double %x) nounwind {
719 %c = fcmp ult double %x, -0.000000e+00
720 %d = select i1 %c, double %x, double -0.000000e+00
724 ; CHECK: y_ugt_inverse:
725 ; CHECK: ucomisd %xmm0, %xmm1
726 ; UNSAFE: y_ugt_inverse:
727 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
728 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
729 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
731 ; FINITE: y_ugt_inverse:
732 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
733 ; FINITE-NEXT: minsd %xmm0, %xmm1
734 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
736 define double @y_ugt_inverse(double %x) nounwind {
737 %c = fcmp ugt double %x, -0.000000e+00
738 %d = select i1 %c, double -0.000000e+00, double %x
742 ; CHECK: y_ult_inverse:
743 ; CHECK: ucomisd %xmm1, %xmm0
744 ; UNSAFE: y_ult_inverse:
745 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
746 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
747 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
749 ; FINITE: y_ult_inverse:
750 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
751 ; FINITE-NEXT: maxsd %xmm0, %xmm1
752 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
754 define double @y_ult_inverse(double %x) nounwind {
755 %c = fcmp ult double %x, -0.000000e+00
756 %d = select i1 %c, double -0.000000e+00, double %x
761 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
762 ; CHECK-NEXT: maxsd %xmm0, %xmm1
763 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
766 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
769 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
771 define double @y_uge(double %x) nounwind {
772 %c = fcmp uge double %x, -0.000000e+00
773 %d = select i1 %c, double %x, double -0.000000e+00
778 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
779 ; CHECK-NEXT: minsd %xmm0, %xmm1
780 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
783 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
786 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
788 define double @y_ule(double %x) nounwind {
789 %c = fcmp ule double %x, -0.000000e+00
790 %d = select i1 %c, double %x, double -0.000000e+00
794 ; CHECK: y_uge_inverse:
795 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
797 ; UNSAFE: y_uge_inverse:
798 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
799 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
800 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
802 ; FINITE: y_uge_inverse:
803 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
804 ; FINITE-NEXT: minsd %xmm0, %xmm1
805 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
807 define double @y_uge_inverse(double %x) nounwind {
808 %c = fcmp uge double %x, -0.000000e+00
809 %d = select i1 %c, double -0.000000e+00, double %x
813 ; CHECK: y_ule_inverse:
814 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
816 ; UNSAFE: y_ule_inverse:
817 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
818 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
819 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
821 ; FINITE: y_ule_inverse:
822 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
823 ; FINITE-NEXT: maxsd %xmm0, %xmm1
824 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
826 define double @y_ule_inverse(double %x) nounwind {
827 %c = fcmp ule double %x, -0.000000e+00
828 %d = select i1 %c, double -0.000000e+00, double %x
831 ; Test a few more misc. cases.
833 ; CHECK: clampTo3k_a:
835 ; UNSAFE: clampTo3k_a:
837 ; FINITE: clampTo3k_a:
839 define double @clampTo3k_a(double %x) nounwind readnone {
841 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
842 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
846 ; CHECK: clampTo3k_b:
848 ; UNSAFE: clampTo3k_b:
850 ; FINITE: clampTo3k_b:
852 define double @clampTo3k_b(double %x) nounwind readnone {
854 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
855 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
859 ; CHECK: clampTo3k_c:
861 ; UNSAFE: clampTo3k_c:
863 ; FINITE: clampTo3k_c:
865 define double @clampTo3k_c(double %x) nounwind readnone {
867 %0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
868 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
872 ; CHECK: clampTo3k_d:
874 ; UNSAFE: clampTo3k_d:
876 ; FINITE: clampTo3k_d:
878 define double @clampTo3k_d(double %x) nounwind readnone {
880 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
881 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
885 ; CHECK: clampTo3k_e:
887 ; UNSAFE: clampTo3k_e:
889 ; FINITE: clampTo3k_e:
891 define double @clampTo3k_e(double %x) nounwind readnone {
893 %0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
894 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
898 ; CHECK: clampTo3k_f:
900 ; UNSAFE: clampTo3k_f:
902 ; FINITE: clampTo3k_f:
904 define double @clampTo3k_f(double %x) nounwind readnone {
906 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
907 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
911 ; CHECK: clampTo3k_g:
913 ; UNSAFE: clampTo3k_g:
915 ; FINITE: clampTo3k_g:
917 define double @clampTo3k_g(double %x) nounwind readnone {
919 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
920 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
924 ; CHECK: clampTo3k_h:
926 ; UNSAFE: clampTo3k_h:
928 ; FINITE: clampTo3k_h:
930 define double @clampTo3k_h(double %x) nounwind readnone {
932 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
933 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
939 define <2 x double> @maxpd(<2 x double> %x, <2 x double> %y) {
940 %max_is_x = fcmp oge <2 x double> %x, %y
941 %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
942 ret <2 x double> %max
947 define <2 x double> @minpd(<2 x double> %x, <2 x double> %y) {
948 %min_is_x = fcmp ole <2 x double> %x, %y
949 %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
950 ret <2 x double> %min
955 define <4 x float> @maxps(<4 x float> %x, <4 x float> %y) {
956 %max_is_x = fcmp oge <4 x float> %x, %y
957 %max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
963 define <4 x float> @minps(<4 x float> %x, <4 x float> %y) {
964 %min_is_x = fcmp ole <4 x float> %x, %y
965 %min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y