1 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=nehalem -asm-verbose=false | FileCheck %s
2 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -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 -mtriple=x86_64-apple-darwin -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 %xmm1, %xmm0
52 ; FINITE: ogt_inverse:
53 ; FINITE-NEXT: minsd %xmm0, %xmm1
54 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
56 define double @ogt_inverse(double %x, double %y) nounwind {
57 %c = fcmp ogt double %x, %y
58 %d = select i1 %c, double %y, double %x
63 ; CHECK-NEXT: maxsd %xmm0, %xmm1
64 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
66 ; UNSAFE: olt_inverse:
67 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
69 ; FINITE: olt_inverse:
70 ; FINITE-NEXT: maxsd %xmm0, %xmm1
71 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
73 define double @olt_inverse(double %x, double %y) nounwind {
74 %c = fcmp olt double %x, %y
75 %d = select i1 %c, double %y, double %x
80 ; CHECK-NEXT: ucomisd %xmm1, %xmm0
82 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
85 ; FINITE-NEXT: maxsd %xmm1, %xmm0
87 define double @oge(double %x, double %y) nounwind {
88 %c = fcmp oge double %x, %y
89 %d = select i1 %c, double %x, double %y
94 ; CHECK-NEXT: ucomisd %xmm0, %xmm1
96 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
98 ; FINITE-NEXT: minsd %xmm1, %xmm0
99 define double @ole(double %x, double %y) nounwind {
100 %c = fcmp ole double %x, %y
101 %d = select i1 %c, double %x, double %y
105 ; CHECK: oge_inverse:
106 ; CHECK-NEXT: ucomisd %xmm1, %xmm0
107 ; UNSAFE: oge_inverse:
108 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
110 ; FINITE: oge_inverse:
111 ; FINITE-NEXT: minsd %xmm0, %xmm1
112 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
114 define double @oge_inverse(double %x, double %y) nounwind {
115 %c = fcmp oge double %x, %y
116 %d = select i1 %c, double %y, double %x
120 ; CHECK: ole_inverse:
121 ; CHECK-NEXT: ucomisd %xmm0, %xmm1
122 ; UNSAFE: ole_inverse:
123 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
125 ; FINITE: ole_inverse:
126 ; FINITE-NEXT: maxsd %xmm0, %xmm1
127 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
129 define double @ole_inverse(double %x, double %y) nounwind {
130 %c = fcmp ole double %x, %y
131 %d = select i1 %c, double %y, double %x
136 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
137 ; CHECK-NEXT: maxsd %xmm1, %xmm0
140 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
141 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
142 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
145 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
146 ; FINITE-NEXT: maxsd %xmm1, %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: xorp{{[sd]}} %xmm1, %xmm1
156 ; CHECK-NEXT: minsd %xmm1, %xmm0
159 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
160 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
161 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
164 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
165 ; FINITE-NEXT: minsd %xmm1, %xmm0
167 define double @olt_x(double %x) nounwind {
168 %c = fcmp olt double %x, 0.000000e+00
169 %d = select i1 %c, double %x, double 0.000000e+00
173 ; CHECK: ogt_inverse_x:
174 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
175 ; CHECK-NEXT: minsd %xmm0, %xmm1
176 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
178 ; UNSAFE: ogt_inverse_x:
179 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
180 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
181 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
183 ; FINITE: ogt_inverse_x:
184 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
185 ; FINITE-NEXT: minsd %xmm0, %xmm1
186 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
188 define double @ogt_inverse_x(double %x) nounwind {
189 %c = fcmp ogt double %x, 0.000000e+00
190 %d = select i1 %c, double 0.000000e+00, double %x
194 ; CHECK: olt_inverse_x:
195 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
196 ; CHECK-NEXT: maxsd %xmm0, %xmm1
197 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
199 ; UNSAFE: olt_inverse_x:
200 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
201 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
202 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
204 ; FINITE: olt_inverse_x:
205 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
206 ; FINITE-NEXT: maxsd %xmm0, %xmm1
207 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
209 define double @olt_inverse_x(double %x) nounwind {
210 %c = fcmp olt double %x, 0.000000e+00
211 %d = select i1 %c, double 0.000000e+00, double %x
216 ; CHECK: ucomisd %xmm1, %xmm0
218 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
219 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
220 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
223 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
224 ; FINITE-NEXT: maxsd %xmm1, %xmm0
226 define double @oge_x(double %x) nounwind {
227 %c = fcmp oge double %x, 0.000000e+00
228 %d = select i1 %c, double %x, double 0.000000e+00
233 ; CHECK: ucomisd %xmm0, %xmm1
235 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
236 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
237 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
240 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
241 ; FINITE-NEXT: minsd %xmm1, %xmm0
243 define double @ole_x(double %x) nounwind {
244 %c = fcmp ole double %x, 0.000000e+00
245 %d = select i1 %c, double %x, double 0.000000e+00
249 ; CHECK: oge_inverse_x:
250 ; CHECK: ucomisd %xmm
251 ; UNSAFE: oge_inverse_x:
252 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
253 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
254 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
256 ; FINITE: oge_inverse_x:
257 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
258 ; FINITE-NEXT: minsd %xmm0, %xmm1
259 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
261 define double @oge_inverse_x(double %x) nounwind {
262 %c = fcmp oge double %x, 0.000000e+00
263 %d = select i1 %c, double 0.000000e+00, double %x
267 ; CHECK: ole_inverse_x:
268 ; CHECK: ucomisd %xmm
269 ; UNSAFE: ole_inverse_x:
270 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
271 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
272 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
274 ; FINITE: ole_inverse_x:
275 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
276 ; FINITE-NEXT: maxsd %xmm0, %xmm1
277 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
279 define double @ole_inverse_x(double %x) nounwind {
280 %c = fcmp ole double %x, 0.000000e+00
281 %d = select i1 %c, double 0.000000e+00, double %x
286 ; CHECK: ucomisd %xmm0, %xmm1
288 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
291 ; FINITE-NEXT: maxsd %xmm1, %xmm0
293 define double @ugt(double %x, double %y) nounwind {
294 %c = fcmp ugt double %x, %y
295 %d = select i1 %c, double %x, double %y
300 ; CHECK: ucomisd %xmm1, %xmm0
302 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
305 ; FINITE-NEXT: minsd %xmm1, %xmm0
307 define double @ult(double %x, double %y) nounwind {
308 %c = fcmp ult double %x, %y
309 %d = select i1 %c, double %x, double %y
313 ; CHECK: ugt_inverse:
314 ; CHECK: ucomisd %xmm0, %xmm1
315 ; UNSAFE: ugt_inverse:
316 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
318 ; FINITE: ugt_inverse:
319 ; FINITE-NEXT: minsd %xmm0, %xmm1
320 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
322 define double @ugt_inverse(double %x, double %y) nounwind {
323 %c = fcmp ugt double %x, %y
324 %d = select i1 %c, double %y, double %x
328 ; CHECK: ult_inverse:
329 ; CHECK: ucomisd %xmm1, %xmm0
330 ; UNSAFE: ult_inverse:
331 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
333 ; FINITE: ult_inverse:
334 ; FINITE-NEXT: maxsd %xmm0, %xmm1
335 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
337 define double @ult_inverse(double %x, double %y) nounwind {
338 %c = fcmp ult double %x, %y
339 %d = select i1 %c, double %y, double %x
344 ; CHECK-NEXT: maxsd %xmm0, %xmm1
345 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
348 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
351 ; FINITE-NEXT: maxsd %xmm1, %xmm0
353 define double @uge(double %x, double %y) nounwind {
354 %c = fcmp uge double %x, %y
355 %d = select i1 %c, double %x, double %y
360 ; CHECK-NEXT: minsd %xmm0, %xmm1
361 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
364 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
367 ; FINITE-NEXT: minsd %xmm1, %xmm0
369 define double @ule(double %x, double %y) nounwind {
370 %c = fcmp ule double %x, %y
371 %d = select i1 %c, double %x, double %y
375 ; CHECK: uge_inverse:
376 ; CHECK-NEXT: minsd %xmm1, %xmm0
378 ; UNSAFE: uge_inverse:
379 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
381 ; FINITE: uge_inverse:
382 ; FINITE-NEXT: minsd %xmm0, %xmm1
383 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
385 define double @uge_inverse(double %x, double %y) nounwind {
386 %c = fcmp uge double %x, %y
387 %d = select i1 %c, double %y, double %x
391 ; CHECK: ule_inverse:
392 ; CHECK-NEXT: maxsd %xmm1, %xmm0
394 ; UNSAFE: ule_inverse:
395 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
397 ; FINITE: ule_inverse:
398 ; FINITE-NEXT: maxsd %xmm0, %xmm1
399 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
401 define double @ule_inverse(double %x, double %y) nounwind {
402 %c = fcmp ule double %x, %y
403 %d = select i1 %c, double %y, double %x
408 ; CHECK: ucomisd %xmm0, %xmm1
410 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
411 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
412 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
415 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
416 ; FINITE-NEXT: maxsd %xmm1, %xmm0
418 define double @ugt_x(double %x) nounwind {
419 %c = fcmp ugt double %x, 0.000000e+00
420 %d = select i1 %c, double %x, double 0.000000e+00
425 ; CHECK: ucomisd %xmm1, %xmm0
427 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
428 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
429 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
432 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
433 ; FINITE-NEXT: minsd %xmm1, %xmm0
435 define double @ult_x(double %x) nounwind {
436 %c = fcmp ult double %x, 0.000000e+00
437 %d = select i1 %c, double %x, double 0.000000e+00
441 ; CHECK: ugt_inverse_x:
442 ; CHECK: ucomisd %xmm
443 ; UNSAFE: ugt_inverse_x:
444 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
445 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
446 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
448 ; FINITE: ugt_inverse_x:
449 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
450 ; FINITE-NEXT: minsd %xmm0, %xmm1
451 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
453 define double @ugt_inverse_x(double %x) nounwind {
454 %c = fcmp ugt double %x, 0.000000e+00
455 %d = select i1 %c, double 0.000000e+00, double %x
459 ; CHECK: ult_inverse_x:
460 ; CHECK: ucomisd %xmm
461 ; UNSAFE: ult_inverse_x:
462 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
463 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
464 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
466 ; FINITE: ult_inverse_x:
467 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
468 ; FINITE-NEXT: maxsd %xmm0, %xmm1
469 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
471 define double @ult_inverse_x(double %x) nounwind {
472 %c = fcmp ult double %x, 0.000000e+00
473 %d = select i1 %c, double 0.000000e+00, double %x
478 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
479 ; CHECK-NEXT: maxsd %xmm0, %xmm1
480 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
483 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
484 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
485 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
488 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
489 ; FINITE-NEXT: maxsd %xmm1, %xmm0
491 define double @uge_x(double %x) nounwind {
492 %c = fcmp uge double %x, 0.000000e+00
493 %d = select i1 %c, double %x, double 0.000000e+00
498 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
499 ; CHECK-NEXT: minsd %xmm0, %xmm1
500 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
503 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
504 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
505 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
508 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
509 ; FINITE-NEXT: minsd %xmm1, %xmm0
511 define double @ule_x(double %x) nounwind {
512 %c = fcmp ule double %x, 0.000000e+00
513 %d = select i1 %c, double %x, double 0.000000e+00
517 ; CHECK: uge_inverse_x:
518 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
519 ; CHECK-NEXT: minsd %xmm1, %xmm0
521 ; UNSAFE: uge_inverse_x:
522 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
523 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
524 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
526 ; FINITE: uge_inverse_x:
527 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
528 ; FINITE-NEXT: minsd %xmm0, %xmm1
529 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
531 define double @uge_inverse_x(double %x) nounwind {
532 %c = fcmp uge double %x, 0.000000e+00
533 %d = select i1 %c, double 0.000000e+00, double %x
537 ; CHECK: ule_inverse_x:
538 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
539 ; CHECK-NEXT: maxsd %xmm1, %xmm0
541 ; UNSAFE: ule_inverse_x:
542 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
543 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
544 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
546 ; FINITE: ule_inverse_x:
547 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
548 ; FINITE-NEXT: maxsd %xmm0, %xmm1
549 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
551 define double @ule_inverse_x(double %x) nounwind {
552 %c = fcmp ule double %x, 0.000000e+00
553 %d = select i1 %c, double 0.000000e+00, double %x
558 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
561 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
564 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
566 define double @ogt_y(double %x) nounwind {
567 %c = fcmp ogt double %x, -0.000000e+00
568 %d = select i1 %c, double %x, double -0.000000e+00
573 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
576 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
579 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
581 define double @olt_y(double %x) nounwind {
582 %c = fcmp olt double %x, -0.000000e+00
583 %d = select i1 %c, double %x, double -0.000000e+00
587 ; CHECK: ogt_inverse_y:
588 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
589 ; CHECK-NEXT: minsd %xmm0, %xmm1
590 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
592 ; UNSAFE: ogt_inverse_y:
593 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
595 ; FINITE: ogt_inverse_y:
596 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
597 ; FINITE-NEXT: minsd %xmm0, %xmm1
598 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
600 define double @ogt_inverse_y(double %x) nounwind {
601 %c = fcmp ogt double %x, -0.000000e+00
602 %d = select i1 %c, double -0.000000e+00, double %x
606 ; CHECK: olt_inverse_y:
607 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
608 ; CHECK-NEXT: maxsd %xmm0, %xmm1
609 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
611 ; UNSAFE: olt_inverse_y:
612 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
614 ; FINITE: olt_inverse_y:
615 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
616 ; FINITE-NEXT: maxsd %xmm0, %xmm1
617 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
619 define double @olt_inverse_y(double %x) nounwind {
620 %c = fcmp olt double %x, -0.000000e+00
621 %d = select i1 %c, double -0.000000e+00, double %x
626 ; CHECK: ucomisd %xmm1, %xmm0
628 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
631 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
633 define double @oge_y(double %x) nounwind {
634 %c = fcmp oge double %x, -0.000000e+00
635 %d = select i1 %c, double %x, double -0.000000e+00
640 ; CHECK: ucomisd %xmm0, %xmm1
642 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
645 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
647 define double @ole_y(double %x) nounwind {
648 %c = fcmp ole double %x, -0.000000e+00
649 %d = select i1 %c, double %x, double -0.000000e+00
653 ; CHECK: oge_inverse_y:
654 ; CHECK: ucomisd %xmm
655 ; UNSAFE: oge_inverse_y:
656 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
658 ; FINITE: oge_inverse_y:
659 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
660 ; FINITE-NEXT: minsd %xmm0, %xmm1
661 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
663 define double @oge_inverse_y(double %x) nounwind {
664 %c = fcmp oge double %x, -0.000000e+00
665 %d = select i1 %c, double -0.000000e+00, double %x
669 ; CHECK: ole_inverse_y:
670 ; CHECK: ucomisd %xmm
671 ; UNSAFE: ole_inverse_y:
672 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
674 ; FINITE: ole_inverse_y:
675 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
676 ; FINITE-NEXT: maxsd %xmm0, %xmm1
677 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
679 define double @ole_inverse_y(double %x) nounwind {
680 %c = fcmp ole double %x, -0.000000e+00
681 %d = select i1 %c, double -0.000000e+00, double %x
686 ; CHECK: ucomisd %xmm0, %xmm1
688 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
691 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
693 define double @ugt_y(double %x) nounwind {
694 %c = fcmp ugt double %x, -0.000000e+00
695 %d = select i1 %c, double %x, double -0.000000e+00
700 ; CHECK: ucomisd %xmm1, %xmm0
702 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
705 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
707 define double @ult_y(double %x) nounwind {
708 %c = fcmp ult double %x, -0.000000e+00
709 %d = select i1 %c, double %x, double -0.000000e+00
713 ; CHECK: ugt_inverse_y:
714 ; CHECK: ucomisd %xmm
715 ; UNSAFE: ugt_inverse_y:
716 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
718 ; FINITE: ugt_inverse_y:
719 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
720 ; FINITE-NEXT: minsd %xmm0, %xmm1
721 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
723 define double @ugt_inverse_y(double %x) nounwind {
724 %c = fcmp ugt double %x, -0.000000e+00
725 %d = select i1 %c, double -0.000000e+00, double %x
729 ; CHECK: ult_inverse_y:
730 ; CHECK: ucomisd %xmm
731 ; UNSAFE: ult_inverse_y:
732 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
734 ; FINITE: ult_inverse_y:
735 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
736 ; FINITE-NEXT: maxsd %xmm0, %xmm1
737 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
739 define double @ult_inverse_y(double %x) nounwind {
740 %c = fcmp ult double %x, -0.000000e+00
741 %d = select i1 %c, double -0.000000e+00, double %x
746 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
747 ; CHECK-NEXT: maxsd %xmm0, %xmm1
748 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
751 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
754 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
756 define double @uge_y(double %x) nounwind {
757 %c = fcmp uge double %x, -0.000000e+00
758 %d = select i1 %c, double %x, double -0.000000e+00
763 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
764 ; CHECK-NEXT: minsd %xmm0, %xmm1
765 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
768 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
771 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
773 define double @ule_y(double %x) nounwind {
774 %c = fcmp ule double %x, -0.000000e+00
775 %d = select i1 %c, double %x, double -0.000000e+00
779 ; CHECK: uge_inverse_y:
780 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
782 ; UNSAFE: uge_inverse_y:
783 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
785 ; FINITE: uge_inverse_y:
786 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
787 ; FINITE-NEXT: minsd %xmm0, %xmm1
788 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
790 define double @uge_inverse_y(double %x) nounwind {
791 %c = fcmp uge double %x, -0.000000e+00
792 %d = select i1 %c, double -0.000000e+00, double %x
796 ; CHECK: ule_inverse_y:
797 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
799 ; UNSAFE: ule_inverse_y:
800 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
802 ; FINITE: ule_inverse_y:
803 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
804 ; FINITE-NEXT: maxsd %xmm0, %xmm1
805 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
807 define double @ule_inverse_y(double %x) nounwind {
808 %c = fcmp ule double %x, -0.000000e+00
809 %d = select i1 %c, double -0.000000e+00, double %x
812 ; Test a few more misc. cases.
814 ; CHECK: clampTo3k_a:
816 ; UNSAFE: clampTo3k_a:
818 ; FINITE: clampTo3k_a:
820 define double @clampTo3k_a(double %x) nounwind readnone {
822 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
823 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
827 ; CHECK: clampTo3k_b:
829 ; UNSAFE: clampTo3k_b:
831 ; FINITE: clampTo3k_b:
833 define double @clampTo3k_b(double %x) nounwind readnone {
835 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
836 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
840 ; CHECK: clampTo3k_c:
842 ; UNSAFE: clampTo3k_c:
844 ; FINITE: clampTo3k_c:
846 define double @clampTo3k_c(double %x) nounwind readnone {
848 %0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
849 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
853 ; CHECK: clampTo3k_d:
855 ; UNSAFE: clampTo3k_d:
857 ; FINITE: clampTo3k_d:
859 define double @clampTo3k_d(double %x) nounwind readnone {
861 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
862 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
866 ; CHECK: clampTo3k_e:
868 ; UNSAFE: clampTo3k_e:
870 ; FINITE: clampTo3k_e:
872 define double @clampTo3k_e(double %x) nounwind readnone {
874 %0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
875 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
879 ; CHECK: clampTo3k_f:
881 ; UNSAFE: clampTo3k_f:
883 ; FINITE: clampTo3k_f:
885 define double @clampTo3k_f(double %x) nounwind readnone {
887 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
888 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
892 ; CHECK: clampTo3k_g:
894 ; UNSAFE: clampTo3k_g:
896 ; FINITE: clampTo3k_g:
898 define double @clampTo3k_g(double %x) nounwind readnone {
900 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
901 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
905 ; CHECK: clampTo3k_h:
907 ; UNSAFE: clampTo3k_h:
909 ; FINITE: clampTo3k_h:
911 define double @clampTo3k_h(double %x) nounwind readnone {
913 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
914 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
920 define <2 x double> @maxpd(<2 x double> %x, <2 x double> %y) {
921 %max_is_x = fcmp oge <2 x double> %x, %y
922 %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
923 ret <2 x double> %max
928 define <2 x double> @minpd(<2 x double> %x, <2 x double> %y) {
929 %min_is_x = fcmp ole <2 x double> %x, %y
930 %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
931 ret <2 x double> %min
936 define <4 x float> @maxps(<4 x float> %x, <4 x float> %y) {
937 %max_is_x = fcmp oge <4 x float> %x, %y
938 %max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
944 define <4 x float> @minps(<4 x float> %x, <4 x float> %y) {
945 %min_is_x = fcmp ole <4 x float> %x, %y
946 %min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y