1 ; RUN: llc < %s -march=x86-64 -mcpu=nehalem -asm-verbose=false | FileCheck %s
2 ; RUN: llc < %s -march=x86-64 -mcpu=nehalem -asm-verbose=false -enable-unsafe-fp-math -enable-no-nans-fp-math | FileCheck -check-prefix=UNSAFE %s
3 ; RUN: llc < %s -march=x86-64 -mcpu=nehalem -asm-verbose=false -enable-no-nans-fp-math | 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.
16 ; CHECK-NEXT: maxsd %xmm1, %xmm0
19 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
22 ; FINITE-NEXT: maxsd %xmm1, %xmm0
24 define double @ogt(double %x, double %y) nounwind {
25 %c = fcmp ogt double %x, %y
26 %d = select i1 %c, double %x, double %y
31 ; CHECK-NEXT: minsd %xmm1, %xmm0
34 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
37 ; FINITE-NEXT: minsd %xmm1, %xmm0
39 define double @olt(double %x, double %y) nounwind {
40 %c = fcmp olt double %x, %y
41 %d = select i1 %c, double %x, double %y
46 ; CHECK-NEXT: minsd %xmm0, %xmm1
47 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
49 ; UNSAFE: ogt_inverse:
50 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
51 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
53 ; FINITE: ogt_inverse:
54 ; FINITE-NEXT: minsd %xmm0, %xmm1
55 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
57 define double @ogt_inverse(double %x, double %y) nounwind {
58 %c = fcmp ogt double %x, %y
59 %d = select i1 %c, double %y, double %x
64 ; CHECK-NEXT: maxsd %xmm0, %xmm1
65 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
67 ; UNSAFE: olt_inverse:
68 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
69 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
71 ; FINITE: olt_inverse:
72 ; FINITE-NEXT: maxsd %xmm0, %xmm1
73 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
75 define double @olt_inverse(double %x, double %y) nounwind {
76 %c = fcmp olt double %x, %y
77 %d = select i1 %c, double %y, double %x
82 ; CHECK-NEXT: ucomisd %xmm1, %xmm0
84 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
87 ; FINITE-NEXT: maxsd %xmm1, %xmm0
89 define double @oge(double %x, double %y) nounwind {
90 %c = fcmp oge double %x, %y
91 %d = select i1 %c, double %x, double %y
96 ; CHECK-NEXT: ucomisd %xmm0, %xmm1
98 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
100 ; FINITE-NEXT: minsd %xmm1, %xmm0
101 define double @ole(double %x, double %y) nounwind {
102 %c = fcmp ole double %x, %y
103 %d = select i1 %c, double %x, double %y
107 ; CHECK: oge_inverse:
108 ; CHECK-NEXT: ucomisd %xmm1, %xmm0
109 ; UNSAFE: oge_inverse:
110 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
111 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
113 ; FINITE: oge_inverse:
114 ; FINITE-NEXT: minsd %xmm0, %xmm1
115 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
117 define double @oge_inverse(double %x, double %y) nounwind {
118 %c = fcmp oge double %x, %y
119 %d = select i1 %c, double %y, double %x
123 ; CHECK: ole_inverse:
124 ; CHECK-NEXT: ucomisd %xmm0, %xmm1
125 ; UNSAFE: ole_inverse:
126 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
127 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
129 ; FINITE: ole_inverse:
130 ; FINITE-NEXT: maxsd %xmm0, %xmm1
131 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
133 define double @ole_inverse(double %x, double %y) nounwind {
134 %c = fcmp ole double %x, %y
135 %d = select i1 %c, double %y, double %x
140 ; CHECK-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
143 ; UNSAFE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
146 ; FINITE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
148 define double @ogt_x(double %x) nounwind {
149 %c = fcmp ogt double %x, 0.000000e+00
150 %d = select i1 %c, double %x, double 0.000000e+00
155 ; CHECK-NEXT: minsd LCP{{.*}}(%rip), %xmm0
158 ; UNSAFE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
161 ; FINITE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
163 define double @olt_x(double %x) nounwind {
164 %c = fcmp olt double %x, 0.000000e+00
165 %d = select i1 %c, double %x, double 0.000000e+00
169 ; CHECK: ogt_inverse_x:
170 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
171 ; CHECK-NEXT: minsd %xmm0, %xmm1
172 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
174 ; UNSAFE: ogt_inverse_x:
175 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
176 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
177 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
179 ; FINITE: ogt_inverse_x:
180 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
181 ; FINITE-NEXT: minsd %xmm0, %xmm1
182 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
184 define double @ogt_inverse_x(double %x) nounwind {
185 %c = fcmp ogt double %x, 0.000000e+00
186 %d = select i1 %c, double 0.000000e+00, double %x
190 ; CHECK: olt_inverse_x:
191 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
192 ; CHECK-NEXT: maxsd %xmm0, %xmm1
193 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
195 ; UNSAFE: olt_inverse_x:
196 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
197 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
198 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
200 ; FINITE: olt_inverse_x:
201 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
202 ; FINITE-NEXT: maxsd %xmm0, %xmm1
203 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
205 define double @olt_inverse_x(double %x) nounwind {
206 %c = fcmp olt double %x, 0.000000e+00
207 %d = select i1 %c, double 0.000000e+00, double %x
212 ; CHECK: ucomisd %xmm1, %xmm0
214 ; UNSAFE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
217 ; FINITE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
219 define double @oge_x(double %x) nounwind {
220 %c = fcmp oge double %x, 0.000000e+00
221 %d = select i1 %c, double %x, double 0.000000e+00
226 ; CHECK: ucomisd %xmm0, %xmm1
228 ; UNSAFE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
231 ; FINITE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
233 define double @ole_x(double %x) nounwind {
234 %c = fcmp ole double %x, 0.000000e+00
235 %d = select i1 %c, double %x, double 0.000000e+00
239 ; CHECK: oge_inverse_x:
240 ; CHECK: ucomisd %xmm
241 ; UNSAFE: oge_inverse_x:
242 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
243 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
244 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
246 ; FINITE: oge_inverse_x:
247 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
248 ; FINITE-NEXT: minsd %xmm0, %xmm1
249 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
251 define double @oge_inverse_x(double %x) nounwind {
252 %c = fcmp oge double %x, 0.000000e+00
253 %d = select i1 %c, double 0.000000e+00, double %x
257 ; CHECK: ole_inverse_x:
258 ; CHECK: ucomisd %xmm
259 ; UNSAFE: ole_inverse_x:
260 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
261 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
262 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
264 ; FINITE: ole_inverse_x:
265 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
266 ; FINITE-NEXT: maxsd %xmm0, %xmm1
267 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
269 define double @ole_inverse_x(double %x) nounwind {
270 %c = fcmp ole double %x, 0.000000e+00
271 %d = select i1 %c, double 0.000000e+00, double %x
276 ; CHECK: ucomisd %xmm0, %xmm1
278 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
281 ; FINITE-NEXT: maxsd %xmm1, %xmm0
283 define double @ugt(double %x, double %y) nounwind {
284 %c = fcmp ugt double %x, %y
285 %d = select i1 %c, double %x, double %y
290 ; CHECK: ucomisd %xmm1, %xmm0
292 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
295 ; FINITE-NEXT: minsd %xmm1, %xmm0
297 define double @ult(double %x, double %y) nounwind {
298 %c = fcmp ult double %x, %y
299 %d = select i1 %c, double %x, double %y
303 ; CHECK: ugt_inverse:
304 ; CHECK: ucomisd %xmm0, %xmm1
305 ; UNSAFE: ugt_inverse:
306 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
307 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
309 ; FINITE: ugt_inverse:
310 ; FINITE-NEXT: minsd %xmm0, %xmm1
311 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
313 define double @ugt_inverse(double %x, double %y) nounwind {
314 %c = fcmp ugt double %x, %y
315 %d = select i1 %c, double %y, double %x
319 ; CHECK: ult_inverse:
320 ; CHECK: ucomisd %xmm1, %xmm0
321 ; UNSAFE: ult_inverse:
322 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
323 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
325 ; FINITE: ult_inverse:
326 ; FINITE-NEXT: maxsd %xmm0, %xmm1
327 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
329 define double @ult_inverse(double %x, double %y) nounwind {
330 %c = fcmp ult double %x, %y
331 %d = select i1 %c, double %y, double %x
336 ; CHECK-NEXT: maxsd %xmm0, %xmm1
337 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
340 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
343 ; FINITE-NEXT: maxsd %xmm1, %xmm0
345 define double @uge(double %x, double %y) nounwind {
346 %c = fcmp uge double %x, %y
347 %d = select i1 %c, double %x, double %y
352 ; CHECK-NEXT: minsd %xmm0, %xmm1
353 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
356 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
359 ; FINITE-NEXT: minsd %xmm1, %xmm0
361 define double @ule(double %x, double %y) nounwind {
362 %c = fcmp ule double %x, %y
363 %d = select i1 %c, double %x, double %y
367 ; CHECK: uge_inverse:
368 ; CHECK-NEXT: minsd %xmm1, %xmm0
370 ; UNSAFE: uge_inverse:
371 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
372 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
374 ; FINITE: uge_inverse:
375 ; FINITE-NEXT: minsd %xmm0, %xmm1
376 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
378 define double @uge_inverse(double %x, double %y) nounwind {
379 %c = fcmp uge double %x, %y
380 %d = select i1 %c, double %y, double %x
384 ; CHECK: ule_inverse:
385 ; CHECK-NEXT: maxsd %xmm1, %xmm0
387 ; UNSAFE: ule_inverse:
388 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
389 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
391 ; FINITE: ule_inverse:
392 ; FINITE-NEXT: maxsd %xmm0, %xmm1
393 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
395 define double @ule_inverse(double %x, double %y) nounwind {
396 %c = fcmp ule double %x, %y
397 %d = select i1 %c, double %y, double %x
402 ; CHECK: ucomisd %xmm0, %xmm1
404 ; UNSAFE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
407 ; FINITE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
409 define double @ugt_x(double %x) nounwind {
410 %c = fcmp ugt double %x, 0.000000e+00
411 %d = select i1 %c, double %x, double 0.000000e+00
416 ; CHECK: ucomisd %xmm1, %xmm0
418 ; UNSAFE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
421 ; FINITE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
423 define double @ult_x(double %x) nounwind {
424 %c = fcmp ult double %x, 0.000000e+00
425 %d = select i1 %c, double %x, double 0.000000e+00
429 ; CHECK: ugt_inverse_x:
430 ; CHECK: ucomisd %xmm
431 ; UNSAFE: ugt_inverse_x:
432 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
433 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
434 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
436 ; FINITE: ugt_inverse_x:
437 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
438 ; FINITE-NEXT: minsd %xmm0, %xmm1
439 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
441 define double @ugt_inverse_x(double %x) nounwind {
442 %c = fcmp ugt double %x, 0.000000e+00
443 %d = select i1 %c, double 0.000000e+00, double %x
447 ; CHECK: ult_inverse_x:
448 ; CHECK: ucomisd %xmm
449 ; UNSAFE: ult_inverse_x:
450 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
451 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
452 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
454 ; FINITE: ult_inverse_x:
455 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
456 ; FINITE-NEXT: maxsd %xmm0, %xmm1
457 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
459 define double @ult_inverse_x(double %x) nounwind {
460 %c = fcmp ult double %x, 0.000000e+00
461 %d = select i1 %c, double 0.000000e+00, double %x
466 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
467 ; CHECK-NEXT: maxsd %xmm0, %xmm1
468 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
471 ; UNSAFE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
474 ; FINITE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
476 define double @uge_x(double %x) nounwind {
477 %c = fcmp uge double %x, 0.000000e+00
478 %d = select i1 %c, double %x, double 0.000000e+00
483 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
484 ; CHECK-NEXT: minsd %xmm0, %xmm1
485 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
488 ; UNSAFE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
491 ; FINITE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
493 define double @ule_x(double %x) nounwind {
494 %c = fcmp ule double %x, 0.000000e+00
495 %d = select i1 %c, double %x, double 0.000000e+00
499 ; CHECK: uge_inverse_x:
500 ; CHECK-NEXT: minsd LCP{{.*}}(%rip), %xmm0
502 ; UNSAFE: uge_inverse_x:
503 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
504 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
505 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
507 ; FINITE: uge_inverse_x:
508 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
509 ; FINITE-NEXT: minsd %xmm0, %xmm1
510 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
512 define double @uge_inverse_x(double %x) nounwind {
513 %c = fcmp uge double %x, 0.000000e+00
514 %d = select i1 %c, double 0.000000e+00, double %x
518 ; CHECK: ule_inverse_x:
519 ; CHECK-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
521 ; UNSAFE: ule_inverse_x:
522 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
523 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
524 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
526 ; FINITE: ule_inverse_x:
527 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
528 ; FINITE-NEXT: maxsd %xmm0, %xmm1
529 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
531 define double @ule_inverse_x(double %x) nounwind {
532 %c = fcmp ule double %x, 0.000000e+00
533 %d = select i1 %c, double 0.000000e+00, double %x
538 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
541 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
544 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
546 define double @ogt_y(double %x) nounwind {
547 %c = fcmp ogt double %x, -0.000000e+00
548 %d = select i1 %c, double %x, double -0.000000e+00
553 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
556 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
559 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
561 define double @olt_y(double %x) nounwind {
562 %c = fcmp olt double %x, -0.000000e+00
563 %d = select i1 %c, double %x, double -0.000000e+00
567 ; CHECK: ogt_inverse_y:
568 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
569 ; CHECK-NEXT: minsd %xmm0, %xmm1
570 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
572 ; UNSAFE: ogt_inverse_y:
573 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
574 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
575 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
577 ; FINITE: ogt_inverse_y:
578 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
579 ; FINITE-NEXT: minsd %xmm0, %xmm1
580 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
582 define double @ogt_inverse_y(double %x) nounwind {
583 %c = fcmp ogt double %x, -0.000000e+00
584 %d = select i1 %c, double -0.000000e+00, double %x
588 ; CHECK: olt_inverse_y:
589 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
590 ; CHECK-NEXT: maxsd %xmm0, %xmm1
591 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
593 ; UNSAFE: olt_inverse_y:
594 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
595 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
596 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
598 ; FINITE: olt_inverse_y:
599 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
600 ; FINITE-NEXT: maxsd %xmm0, %xmm1
601 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
603 define double @olt_inverse_y(double %x) nounwind {
604 %c = fcmp olt double %x, -0.000000e+00
605 %d = select i1 %c, double -0.000000e+00, double %x
610 ; CHECK: ucomisd %xmm1, %xmm0
612 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
615 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
617 define double @oge_y(double %x) nounwind {
618 %c = fcmp oge double %x, -0.000000e+00
619 %d = select i1 %c, double %x, double -0.000000e+00
624 ; CHECK: ucomisd %xmm0, %xmm1
626 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
629 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
631 define double @ole_y(double %x) nounwind {
632 %c = fcmp ole double %x, -0.000000e+00
633 %d = select i1 %c, double %x, double -0.000000e+00
637 ; CHECK: oge_inverse_y:
638 ; CHECK: ucomisd %xmm
639 ; UNSAFE: oge_inverse_y:
640 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
641 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
642 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
644 ; FINITE: oge_inverse_y:
645 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
646 ; FINITE-NEXT: minsd %xmm0, %xmm1
647 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
649 define double @oge_inverse_y(double %x) nounwind {
650 %c = fcmp oge double %x, -0.000000e+00
651 %d = select i1 %c, double -0.000000e+00, double %x
655 ; CHECK: ole_inverse_y:
656 ; CHECK: ucomisd %xmm
657 ; UNSAFE: ole_inverse_y:
658 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
659 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
660 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
662 ; FINITE: ole_inverse_y:
663 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
664 ; FINITE-NEXT: maxsd %xmm0, %xmm1
665 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
667 define double @ole_inverse_y(double %x) nounwind {
668 %c = fcmp ole double %x, -0.000000e+00
669 %d = select i1 %c, double -0.000000e+00, double %x
674 ; CHECK: ucomisd %xmm0, %xmm1
676 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
679 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
681 define double @ugt_y(double %x) nounwind {
682 %c = fcmp ugt double %x, -0.000000e+00
683 %d = select i1 %c, double %x, double -0.000000e+00
688 ; CHECK: ucomisd %xmm1, %xmm0
690 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
693 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
695 define double @ult_y(double %x) nounwind {
696 %c = fcmp ult double %x, -0.000000e+00
697 %d = select i1 %c, double %x, double -0.000000e+00
701 ; CHECK: ugt_inverse_y:
702 ; CHECK: ucomisd %xmm
703 ; UNSAFE: ugt_inverse_y:
704 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
705 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
706 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
708 ; FINITE: ugt_inverse_y:
709 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
710 ; FINITE-NEXT: minsd %xmm0, %xmm1
711 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
713 define double @ugt_inverse_y(double %x) nounwind {
714 %c = fcmp ugt double %x, -0.000000e+00
715 %d = select i1 %c, double -0.000000e+00, double %x
719 ; CHECK: ult_inverse_y:
720 ; CHECK: ucomisd %xmm
721 ; UNSAFE: ult_inverse_y:
722 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
723 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
724 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
726 ; FINITE: ult_inverse_y:
727 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
728 ; FINITE-NEXT: maxsd %xmm0, %xmm1
729 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
731 define double @ult_inverse_y(double %x) nounwind {
732 %c = fcmp ult double %x, -0.000000e+00
733 %d = select i1 %c, double -0.000000e+00, double %x
738 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
739 ; CHECK-NEXT: maxsd %xmm0, %xmm1
740 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
743 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
746 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
748 define double @uge_y(double %x) nounwind {
749 %c = fcmp uge double %x, -0.000000e+00
750 %d = select i1 %c, double %x, double -0.000000e+00
755 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
756 ; CHECK-NEXT: minsd %xmm0, %xmm1
757 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
760 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
763 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
765 define double @ule_y(double %x) nounwind {
766 %c = fcmp ule double %x, -0.000000e+00
767 %d = select i1 %c, double %x, double -0.000000e+00
771 ; CHECK: uge_inverse_y:
772 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
774 ; UNSAFE: uge_inverse_y:
775 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
776 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
777 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
779 ; FINITE: uge_inverse_y:
780 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
781 ; FINITE-NEXT: minsd %xmm0, %xmm1
782 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
784 define double @uge_inverse_y(double %x) nounwind {
785 %c = fcmp uge double %x, -0.000000e+00
786 %d = select i1 %c, double -0.000000e+00, double %x
790 ; CHECK: ule_inverse_y:
791 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
793 ; UNSAFE: ule_inverse_y:
794 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
795 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
796 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
798 ; FINITE: ule_inverse_y:
799 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
800 ; FINITE-NEXT: maxsd %xmm0, %xmm1
801 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
803 define double @ule_inverse_y(double %x) nounwind {
804 %c = fcmp ule double %x, -0.000000e+00
805 %d = select i1 %c, double -0.000000e+00, double %x
808 ; Test a few more misc. cases.
810 ; CHECK: clampTo3k_a:
812 ; UNSAFE: clampTo3k_a:
814 ; FINITE: clampTo3k_a:
816 define double @clampTo3k_a(double %x) nounwind readnone {
818 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
819 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
823 ; CHECK: clampTo3k_b:
825 ; UNSAFE: clampTo3k_b:
827 ; FINITE: clampTo3k_b:
829 define double @clampTo3k_b(double %x) nounwind readnone {
831 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
832 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
836 ; CHECK: clampTo3k_c:
838 ; UNSAFE: clampTo3k_c:
840 ; FINITE: clampTo3k_c:
842 define double @clampTo3k_c(double %x) nounwind readnone {
844 %0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
845 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
849 ; CHECK: clampTo3k_d:
851 ; UNSAFE: clampTo3k_d:
853 ; FINITE: clampTo3k_d:
855 define double @clampTo3k_d(double %x) nounwind readnone {
857 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
858 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
862 ; CHECK: clampTo3k_e:
864 ; UNSAFE: clampTo3k_e:
866 ; FINITE: clampTo3k_e:
868 define double @clampTo3k_e(double %x) nounwind readnone {
870 %0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
871 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
875 ; CHECK: clampTo3k_f:
877 ; UNSAFE: clampTo3k_f:
879 ; FINITE: clampTo3k_f:
881 define double @clampTo3k_f(double %x) nounwind readnone {
883 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
884 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
888 ; CHECK: clampTo3k_g:
890 ; UNSAFE: clampTo3k_g:
892 ; FINITE: clampTo3k_g:
894 define double @clampTo3k_g(double %x) nounwind readnone {
896 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
897 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
901 ; CHECK: clampTo3k_h:
903 ; UNSAFE: clampTo3k_h:
905 ; FINITE: clampTo3k_h:
907 define double @clampTo3k_h(double %x) nounwind readnone {
909 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
910 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
916 define <2 x double> @maxpd(<2 x double> %x, <2 x double> %y) {
917 %max_is_x = fcmp oge <2 x double> %x, %y
918 %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
919 ret <2 x double> %max
924 define <2 x double> @minpd(<2 x double> %x, <2 x double> %y) {
925 %min_is_x = fcmp ole <2 x double> %x, %y
926 %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
927 ret <2 x double> %min
932 define <4 x float> @maxps(<4 x float> %x, <4 x float> %y) {
933 %max_is_x = fcmp oge <4 x float> %x, %y
934 %max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
940 define <4 x float> @minps(<4 x float> %x, <4 x float> %y) {
941 %min_is_x = fcmp ole <4 x float> %x, %y
942 %min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y