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 ; them 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
45 ; CHECK-LABEL: ogt_inverse:
46 ; CHECK-NEXT: minsd %xmm0, %xmm1
47 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
49 ; UNSAFE-LABEL: ogt_inverse:
50 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
52 ; FINITE-LABEL: 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
62 ; CHECK-LABEL: olt_inverse:
63 ; CHECK-NEXT: maxsd %xmm0, %xmm1
64 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
66 ; UNSAFE-LABEL: olt_inverse:
67 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
69 ; FINITE-LABEL: 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: cmplesd %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: cmplesd %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-LABEL: oge_inverse:
106 ; CHECK: cmplesd %xmm0
107 ; UNSAFE-LABEL: oge_inverse:
108 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
110 ; FINITE-LABEL: 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-LABEL: ole_inverse:
121 ; CHECK: cmplesd %xmm1
122 ; UNSAFE-LABEL: ole_inverse:
123 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
125 ; FINITE-LABEL: 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
135 ; CHECK-LABEL: ogt_x:
136 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
137 ; CHECK-NEXT: maxsd %xmm1, %xmm0
139 ; UNSAFE-LABEL: ogt_x:
140 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
141 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
143 ; FINITE-LABEL: ogt_x:
144 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
145 ; FINITE-NEXT: maxsd %xmm1, %xmm0
147 define double @ogt_x(double %x) nounwind {
148 %c = fcmp ogt double %x, 0.000000e+00
149 %d = select i1 %c, double %x, double 0.000000e+00
153 ; CHECK-LABEL: olt_x:
154 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
155 ; CHECK-NEXT: minsd %xmm1, %xmm0
157 ; UNSAFE-LABEL: olt_x:
158 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
159 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
161 ; FINITE-LABEL: olt_x:
162 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
163 ; FINITE-NEXT: minsd %xmm1, %xmm0
165 define double @olt_x(double %x) nounwind {
166 %c = fcmp olt double %x, 0.000000e+00
167 %d = select i1 %c, double %x, double 0.000000e+00
171 ; CHECK-LABEL: ogt_inverse_x:
172 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
173 ; CHECK-NEXT: minsd %xmm0, %xmm1
174 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
176 ; UNSAFE-LABEL: ogt_inverse_x:
177 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
178 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
180 ; FINITE-LABEL: ogt_inverse_x:
181 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
182 ; FINITE-NEXT: minsd %xmm0, %xmm1
183 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
185 define double @ogt_inverse_x(double %x) nounwind {
186 %c = fcmp ogt double %x, 0.000000e+00
187 %d = select i1 %c, double 0.000000e+00, double %x
191 ; CHECK-LABEL: olt_inverse_x:
192 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
193 ; CHECK-NEXT: maxsd %xmm0, %xmm1
194 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
196 ; UNSAFE-LABEL: olt_inverse_x:
197 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
198 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
200 ; FINITE-LABEL: 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
211 ; CHECK-LABEL: oge_x:
212 ; CHECK: cmplesd %xmm
214 ; UNSAFE-LABEL: oge_x:
215 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
216 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
218 ; FINITE-LABEL: oge_x:
219 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
220 ; FINITE-NEXT: maxsd %xmm1, %xmm0
222 define double @oge_x(double %x) nounwind {
223 %c = fcmp oge double %x, 0.000000e+00
224 %d = select i1 %c, double %x, double 0.000000e+00
228 ; CHECK-LABEL: ole_x:
229 ; CHECK: cmplesd %xmm
231 ; UNSAFE-LABEL: ole_x:
232 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
233 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
235 ; FINITE-LABEL: ole_x:
236 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
237 ; FINITE-NEXT: minsd %xmm1, %xmm0
239 define double @ole_x(double %x) nounwind {
240 %c = fcmp ole double %x, 0.000000e+00
241 %d = select i1 %c, double %x, double 0.000000e+00
245 ; CHECK-LABEL: oge_inverse_x:
246 ; CHECK: cmplesd %xmm
248 ; UNSAFE-LABEL: oge_inverse_x:
249 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
250 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
252 ; FINITE-LABEL: oge_inverse_x:
253 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
254 ; FINITE-NEXT: minsd %xmm0, %xmm1
255 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
257 define double @oge_inverse_x(double %x) nounwind {
258 %c = fcmp oge double %x, 0.000000e+00
259 %d = select i1 %c, double 0.000000e+00, double %x
263 ; CHECK-LABEL: ole_inverse_x:
264 ; CHECK: cmplesd %xmm
265 ; UNSAFE-LABEL: ole_inverse_x:
266 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
267 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
269 ; FINITE-LABEL: ole_inverse_x:
270 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
271 ; FINITE-NEXT: maxsd %xmm0, %xmm1
272 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
274 define double @ole_inverse_x(double %x) nounwind {
275 %c = fcmp ole double %x, 0.000000e+00
276 %d = select i1 %c, double 0.000000e+00, double %x
281 ; CHECK: cmpnlesd %xmm1
283 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
286 ; FINITE-NEXT: maxsd %xmm1, %xmm0
288 define double @ugt(double %x, double %y) nounwind {
289 %c = fcmp ugt double %x, %y
290 %d = select i1 %c, double %x, double %y
295 ; CHECK: cmpnlesd %xmm0
297 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
300 ; FINITE-NEXT: minsd %xmm1, %xmm0
302 define double @ult(double %x, double %y) nounwind {
303 %c = fcmp ult double %x, %y
304 %d = select i1 %c, double %x, double %y
308 ; CHECK-LABEL: ugt_inverse:
309 ; CHECK: cmpnlesd %xmm1
310 ; UNSAFE-LABEL: ugt_inverse:
311 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
313 ; FINITE-LABEL: ugt_inverse:
314 ; FINITE-NEXT: minsd %xmm0, %xmm1
315 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
317 define double @ugt_inverse(double %x, double %y) nounwind {
318 %c = fcmp ugt double %x, %y
319 %d = select i1 %c, double %y, double %x
323 ; CHECK-LABEL: ult_inverse:
324 ; CHECK: cmpnlesd %xmm0
325 ; UNSAFE-LABEL: ult_inverse:
326 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
328 ; FINITE-LABEL: ult_inverse:
329 ; FINITE-NEXT: maxsd %xmm0, %xmm1
330 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
332 define double @ult_inverse(double %x, double %y) nounwind {
333 %c = fcmp ult double %x, %y
334 %d = select i1 %c, double %y, double %x
339 ; CHECK-NEXT: maxsd %xmm0, %xmm1
340 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
343 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
346 ; FINITE-NEXT: maxsd %xmm1, %xmm0
348 define double @uge(double %x, double %y) nounwind {
349 %c = fcmp uge double %x, %y
350 %d = select i1 %c, double %x, double %y
355 ; CHECK-NEXT: minsd %xmm0, %xmm1
356 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
359 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
362 ; FINITE-NEXT: minsd %xmm1, %xmm0
364 define double @ule(double %x, double %y) nounwind {
365 %c = fcmp ule double %x, %y
366 %d = select i1 %c, double %x, double %y
370 ; CHECK-LABEL: uge_inverse:
371 ; CHECK-NEXT: minsd %xmm1, %xmm0
373 ; UNSAFE-LABEL: uge_inverse:
374 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
376 ; FINITE-LABEL: uge_inverse:
377 ; FINITE-NEXT: minsd %xmm0, %xmm1
378 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
380 define double @uge_inverse(double %x, double %y) nounwind {
381 %c = fcmp uge double %x, %y
382 %d = select i1 %c, double %y, double %x
386 ; CHECK-LABEL: ule_inverse:
387 ; CHECK-NEXT: maxsd %xmm1, %xmm0
389 ; UNSAFE-LABEL: ule_inverse:
390 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
392 ; FINITE-LABEL: ule_inverse:
393 ; FINITE-NEXT: maxsd %xmm0, %xmm1
394 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
396 define double @ule_inverse(double %x, double %y) nounwind {
397 %c = fcmp ule double %x, %y
398 %d = select i1 %c, double %y, double %x
402 ; CHECK-LABEL: ugt_x:
403 ; CHECK: cmpnlesd %xmm
405 ; UNSAFE-LABEL: ugt_x:
406 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
407 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
409 ; FINITE-LABEL: ugt_x:
410 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
411 ; FINITE-NEXT: maxsd %xmm1, %xmm0
413 define double @ugt_x(double %x) nounwind {
414 %c = fcmp ugt double %x, 0.000000e+00
415 %d = select i1 %c, double %x, double 0.000000e+00
419 ; CHECK-LABEL: ult_x:
420 ; CHECK: cmpnlesd %xmm
422 ; UNSAFE-LABEL: ult_x:
423 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
424 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
426 ; FINITE-LABEL: ult_x:
427 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
428 ; FINITE-NEXT: minsd %xmm1, %xmm0
430 define double @ult_x(double %x) nounwind {
431 %c = fcmp ult double %x, 0.000000e+00
432 %d = select i1 %c, double %x, double 0.000000e+00
436 ; CHECK-LABEL: ugt_inverse_x:
437 ; CHECK: cmpnlesd %xmm
439 ; UNSAFE-LABEL: ugt_inverse_x:
440 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
441 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
443 ; FINITE-LABEL: ugt_inverse_x:
444 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
445 ; FINITE-NEXT: minsd %xmm0, %xmm1
446 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
448 define double @ugt_inverse_x(double %x) nounwind {
449 %c = fcmp ugt double %x, 0.000000e+00
450 %d = select i1 %c, double 0.000000e+00, double %x
454 ; CHECK-LABEL: ult_inverse_x:
455 ; CHECK: cmpnlesd %xmm
457 ; UNSAFE-LABEL: ult_inverse_x:
458 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
459 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
461 ; FINITE-LABEL: ult_inverse_x:
462 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
463 ; FINITE-NEXT: maxsd %xmm0, %xmm1
464 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
466 define double @ult_inverse_x(double %x) nounwind {
467 %c = fcmp ult double %x, 0.000000e+00
468 %d = select i1 %c, double 0.000000e+00, double %x
472 ; CHECK-LABEL: uge_x:
473 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
474 ; CHECK-NEXT: maxsd %xmm0, %xmm1
475 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
477 ; UNSAFE-LABEL: uge_x:
478 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
479 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
481 ; FINITE-LABEL: uge_x:
482 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
483 ; FINITE-NEXT: maxsd %xmm1, %xmm0
485 define double @uge_x(double %x) nounwind {
486 %c = fcmp uge double %x, 0.000000e+00
487 %d = select i1 %c, double %x, double 0.000000e+00
491 ; CHECK-LABEL: ule_x:
492 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
493 ; CHECK-NEXT: minsd %xmm0, %xmm1
494 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
496 ; UNSAFE-LABEL: ule_x:
497 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
498 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
500 ; FINITE-LABEL: ule_x:
501 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
502 ; FINITE-NEXT: minsd %xmm1, %xmm0
504 define double @ule_x(double %x) nounwind {
505 %c = fcmp ule double %x, 0.000000e+00
506 %d = select i1 %c, double %x, double 0.000000e+00
510 ; CHECK-LABEL: uge_inverse_x:
511 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
512 ; CHECK-NEXT: minsd %xmm1, %xmm0
514 ; UNSAFE-LABEL: uge_inverse_x:
515 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
516 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
518 ; FINITE-LABEL: uge_inverse_x:
519 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
520 ; FINITE-NEXT: minsd %xmm0, %xmm1
521 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
523 define double @uge_inverse_x(double %x) nounwind {
524 %c = fcmp uge double %x, 0.000000e+00
525 %d = select i1 %c, double 0.000000e+00, double %x
529 ; CHECK-LABEL: ule_inverse_x:
530 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
531 ; CHECK-NEXT: maxsd %xmm1, %xmm0
533 ; UNSAFE-LABEL: ule_inverse_x:
534 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
535 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
537 ; FINITE-LABEL: ule_inverse_x:
538 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
539 ; FINITE-NEXT: maxsd %xmm0, %xmm1
540 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
542 define double @ule_inverse_x(double %x) nounwind {
543 %c = fcmp ule double %x, 0.000000e+00
544 %d = select i1 %c, double 0.000000e+00, double %x
548 ; CHECK-LABEL: ogt_y:
549 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
551 ; UNSAFE-LABEL: ogt_y:
552 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
554 ; FINITE-LABEL: ogt_y:
555 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
557 define double @ogt_y(double %x) nounwind {
558 %c = fcmp ogt double %x, -0.000000e+00
559 %d = select i1 %c, double %x, double -0.000000e+00
563 ; CHECK-LABEL: olt_y:
564 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
566 ; UNSAFE-LABEL: olt_y:
567 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
569 ; FINITE-LABEL: olt_y:
570 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
572 define double @olt_y(double %x) nounwind {
573 %c = fcmp olt double %x, -0.000000e+00
574 %d = select i1 %c, double %x, double -0.000000e+00
578 ; CHECK-LABEL: ogt_inverse_y:
579 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
580 ; CHECK-NEXT: minsd %xmm0, %xmm1
581 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
583 ; UNSAFE-LABEL: ogt_inverse_y:
584 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
586 ; FINITE-LABEL: ogt_inverse_y:
587 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
588 ; FINITE-NEXT: minsd %xmm0, %xmm1
589 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
591 define double @ogt_inverse_y(double %x) nounwind {
592 %c = fcmp ogt double %x, -0.000000e+00
593 %d = select i1 %c, double -0.000000e+00, double %x
597 ; CHECK-LABEL: olt_inverse_y:
598 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
599 ; CHECK-NEXT: maxsd %xmm0, %xmm1
600 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
602 ; UNSAFE-LABEL: olt_inverse_y:
603 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
605 ; FINITE-LABEL: olt_inverse_y:
606 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
607 ; FINITE-NEXT: maxsd %xmm0, %xmm1
608 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
610 define double @olt_inverse_y(double %x) nounwind {
611 %c = fcmp olt double %x, -0.000000e+00
612 %d = select i1 %c, double -0.000000e+00, double %x
616 ; CHECK-LABEL: oge_y:
617 ; CHECK: cmplesd %xmm0
618 ; UNSAFE-LABEL: oge_y:
619 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
621 ; FINITE-LABEL: oge_y:
622 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
624 define double @oge_y(double %x) nounwind {
625 %c = fcmp oge double %x, -0.000000e+00
626 %d = select i1 %c, double %x, double -0.000000e+00
630 ; CHECK-LABEL: ole_y:
631 ; CHECK: cmplesd %xmm
632 ; UNSAFE-LABEL: ole_y:
633 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
635 ; FINITE-LABEL: ole_y:
636 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
638 define double @ole_y(double %x) nounwind {
639 %c = fcmp ole double %x, -0.000000e+00
640 %d = select i1 %c, double %x, double -0.000000e+00
644 ; CHECK-LABEL: oge_inverse_y:
645 ; CHECK: cmplesd %xmm0
646 ; UNSAFE-LABEL: oge_inverse_y:
647 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
649 ; FINITE-LABEL: oge_inverse_y:
650 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
651 ; FINITE-NEXT: minsd %xmm0, %xmm1
652 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
654 define double @oge_inverse_y(double %x) nounwind {
655 %c = fcmp oge double %x, -0.000000e+00
656 %d = select i1 %c, double -0.000000e+00, double %x
660 ; CHECK-LABEL: ole_inverse_y:
661 ; CHECK: cmplesd %xmm
662 ; UNSAFE-LABEL: ole_inverse_y:
663 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
665 ; FINITE-LABEL: ole_inverse_y:
666 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
667 ; FINITE-NEXT: maxsd %xmm0, %xmm1
668 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
670 define double @ole_inverse_y(double %x) nounwind {
671 %c = fcmp ole double %x, -0.000000e+00
672 %d = select i1 %c, double -0.000000e+00, double %x
676 ; CHECK-LABEL: ugt_y:
677 ; CHECK: cmpnlesd %xmm
678 ; UNSAFE-LABEL: ugt_y:
679 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
681 ; FINITE-LABEL: ugt_y:
682 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
684 define double @ugt_y(double %x) nounwind {
685 %c = fcmp ugt double %x, -0.000000e+00
686 %d = select i1 %c, double %x, double -0.000000e+00
690 ; CHECK-LABEL: ult_y:
691 ; CHECK: cmpnlesd %xmm0
692 ; UNSAFE-LABEL: ult_y:
693 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
695 ; FINITE-LABEL: ult_y:
696 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
698 define double @ult_y(double %x) nounwind {
699 %c = fcmp ult double %x, -0.000000e+00
700 %d = select i1 %c, double %x, double -0.000000e+00
704 ; CHECK-LABEL: ugt_inverse_y:
705 ; CHECK: cmpnlesd %xmm
706 ; UNSAFE-LABEL: ugt_inverse_y:
707 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
709 ; FINITE-LABEL: ugt_inverse_y:
710 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
711 ; FINITE-NEXT: minsd %xmm0, %xmm1
712 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
714 define double @ugt_inverse_y(double %x) nounwind {
715 %c = fcmp ugt double %x, -0.000000e+00
716 %d = select i1 %c, double -0.000000e+00, double %x
720 ; CHECK-LABEL: ult_inverse_y:
721 ; CHECK: cmpnlesd %xmm
722 ; UNSAFE-LABEL: ult_inverse_y:
723 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
725 ; FINITE-LABEL: ult_inverse_y:
726 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
727 ; FINITE-NEXT: maxsd %xmm0, %xmm1
728 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
730 define double @ult_inverse_y(double %x) nounwind {
731 %c = fcmp ult double %x, -0.000000e+00
732 %d = select i1 %c, double -0.000000e+00, double %x
736 ; CHECK-LABEL: uge_y:
737 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
738 ; CHECK-NEXT: maxsd %xmm0, %xmm1
739 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
741 ; UNSAFE-LABEL: uge_y:
742 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
744 ; FINITE-LABEL: uge_y:
745 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
747 define double @uge_y(double %x) nounwind {
748 %c = fcmp uge double %x, -0.000000e+00
749 %d = select i1 %c, double %x, double -0.000000e+00
753 ; CHECK-LABEL: ule_y:
754 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
755 ; CHECK-NEXT: minsd %xmm0, %xmm1
756 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
758 ; UNSAFE-LABEL: ule_y:
759 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
761 ; FINITE-LABEL: ule_y:
762 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
764 define double @ule_y(double %x) nounwind {
765 %c = fcmp ule double %x, -0.000000e+00
766 %d = select i1 %c, double %x, double -0.000000e+00
770 ; CHECK-LABEL: uge_inverse_y:
771 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
773 ; UNSAFE-LABEL: uge_inverse_y:
774 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
776 ; FINITE-LABEL: uge_inverse_y:
777 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
778 ; FINITE-NEXT: minsd %xmm0, %xmm1
779 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
781 define double @uge_inverse_y(double %x) nounwind {
782 %c = fcmp uge double %x, -0.000000e+00
783 %d = select i1 %c, double -0.000000e+00, double %x
787 ; CHECK-LABEL: ule_inverse_y:
788 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
790 ; UNSAFE-LABEL: ule_inverse_y:
791 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
793 ; FINITE-LABEL: ule_inverse_y:
794 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
795 ; FINITE-NEXT: maxsd %xmm0, %xmm1
796 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
798 define double @ule_inverse_y(double %x) nounwind {
799 %c = fcmp ule double %x, -0.000000e+00
800 %d = select i1 %c, double -0.000000e+00, double %x
803 ; Test a few more misc. cases.
805 ; CHECK-LABEL: clampTo3k_a:
806 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
807 ; CHECK-NEXT: minsd %xmm0, %xmm1
808 ; CHECK-NEXT: movapd %xmm1, %xmm0
810 ; UNSAFE-LABEL: clampTo3k_a:
811 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
813 ; FINITE-LABEL: clampTo3k_a:
814 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
815 ; FINITE-NEXT: minsd %xmm0, %xmm1
816 ; FINITE-NEXT: movapd %xmm1, %xmm0
818 define double @clampTo3k_a(double %x) nounwind readnone {
820 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
821 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
825 ; CHECK-LABEL: clampTo3k_b:
826 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
828 ; UNSAFE-LABEL: clampTo3k_b:
829 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
831 ; FINITE-LABEL: clampTo3k_b:
832 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
833 ; FINITE-NEXT: minsd %xmm0, %xmm1
834 ; FINITE-NEXT: movapd %xmm1, %xmm0
836 define double @clampTo3k_b(double %x) nounwind readnone {
838 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
839 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
843 ; CHECK-LABEL: clampTo3k_c:
844 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
845 ; CHECK-NEXT: maxsd %xmm0, %xmm1
846 ; CHECK-NEXT: movapd %xmm1, %xmm0
848 ; UNSAFE-LABEL: clampTo3k_c:
849 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
851 ; FINITE-LABEL: clampTo3k_c:
852 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
853 ; FINITE-NEXT: maxsd %xmm0, %xmm1
854 ; FINITE-NEXT: movapd %xmm1, %xmm0
856 define double @clampTo3k_c(double %x) nounwind readnone {
858 %0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
859 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
863 ; CHECK-LABEL: clampTo3k_d:
864 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
866 ; UNSAFE-LABEL: clampTo3k_d:
867 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
869 ; FINITE-LABEL: clampTo3k_d:
870 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
871 ; FINITE-NEXT: maxsd %xmm0, %xmm1
872 ; FINITE-NEXT: movapd %xmm1, %xmm0
874 define double @clampTo3k_d(double %x) nounwind readnone {
876 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
877 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
881 ; CHECK-LABEL: clampTo3k_e:
882 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
883 ; CHECK-NEXT: maxsd %xmm0, %xmm1
884 ; CHECK-NEXT: movapd %xmm1, %xmm0
886 ; UNSAFE-LABEL: clampTo3k_e:
887 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
889 ; FINITE-LABEL: clampTo3k_e:
890 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
891 ; FINITE-NEXT: maxsd %xmm0, %xmm1
892 ; FINITE-NEXT: movapd %xmm1, %xmm0
894 define double @clampTo3k_e(double %x) nounwind readnone {
896 %0 = fcmp olt 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-LABEL: clampTo3k_f:
902 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
904 ; UNSAFE-LABEL: clampTo3k_f:
905 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
907 ; FINITE-LABEL: clampTo3k_f:
908 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
909 ; FINITE-NEXT: maxsd %xmm0, %xmm1
910 ; FINITE-NEXT: movapd %xmm1, %xmm0
912 define double @clampTo3k_f(double %x) nounwind readnone {
914 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
915 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
919 ; CHECK-LABEL: clampTo3k_g:
920 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
921 ; CHECK-NEXT: minsd %xmm0, %xmm1
922 ; CHECK-NEXT: movapd %xmm1, %xmm0
924 ; UNSAFE-LABEL: clampTo3k_g:
925 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
927 ; FINITE-LABEL: clampTo3k_g:
928 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
929 ; FINITE-NEXT: minsd %xmm0, %xmm1
930 ; FINITE-NEXT: movapd %xmm1, %xmm0
932 define double @clampTo3k_g(double %x) nounwind readnone {
934 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
935 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
939 ; CHECK-LABEL: clampTo3k_h:
940 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
942 ; UNSAFE-LABEL: clampTo3k_h:
943 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
945 ; FINITE-LABEL: clampTo3k_h:
946 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
947 ; FINITE-NEXT: minsd %xmm0, %xmm1
948 ; FINITE-NEXT: movapd %xmm1, %xmm0
950 define double @clampTo3k_h(double %x) nounwind readnone {
952 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
953 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
957 ; UNSAFE-LABEL: test_maxpd:
958 ; UNSAFE-NEXT: maxpd %xmm1, %xmm0
960 define <2 x double> @test_maxpd(<2 x double> %x, <2 x double> %y) nounwind {
961 %max_is_x = fcmp oge <2 x double> %x, %y
962 %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
963 ret <2 x double> %max
966 ; UNSAFE-LABEL: test_minpd:
967 ; UNSAFE-NEXT: minpd %xmm1, %xmm0
969 define <2 x double> @test_minpd(<2 x double> %x, <2 x double> %y) nounwind {
970 %min_is_x = fcmp ole <2 x double> %x, %y
971 %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
972 ret <2 x double> %min
975 ; UNSAFE-LABEL: test_maxps:
976 ; UNSAFE-NEXT: maxps %xmm1, %xmm0
978 define <4 x float> @test_maxps(<4 x float> %x, <4 x float> %y) nounwind {
979 %max_is_x = fcmp oge <4 x float> %x, %y
980 %max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
984 ; UNSAFE-LABEL: test_minps:
985 ; UNSAFE-NEXT: minps %xmm1, %xmm0
987 define <4 x float> @test_minps(<4 x float> %x, <4 x float> %y) nounwind {
988 %min_is_x = fcmp ole <4 x float> %x, %y
989 %min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y
993 ; UNSAFE-LABEL: test_maxps_illegal_v2f32:
994 ; UNSAFE-NEXT: maxps %xmm1, %xmm0
996 define <2 x float> @test_maxps_illegal_v2f32(<2 x float> %x, <2 x float> %y) nounwind {
997 %max_is_x = fcmp oge <2 x float> %x, %y
998 %max = select <2 x i1> %max_is_x, <2 x float> %x, <2 x float> %y
1002 ; UNSAFE-LABEL: test_minps_illegal_v2f32:
1003 ; UNSAFE-NEXT: minps %xmm1, %xmm0
1005 define <2 x float> @test_minps_illegal_v2f32(<2 x float> %x, <2 x float> %y) nounwind {
1006 %min_is_x = fcmp ole <2 x float> %x, %y
1007 %min = select <2 x i1> %min_is_x, <2 x float> %x, <2 x float> %y
1008 ret <2 x float> %min
1011 ; UNSAFE-LABEL: test_maxps_illegal_v3f32:
1012 ; UNSAFE-NEXT: maxps %xmm1, %xmm0
1014 define <3 x float> @test_maxps_illegal_v3f32(<3 x float> %x, <3 x float> %y) nounwind {
1015 %max_is_x = fcmp oge <3 x float> %x, %y
1016 %max = select <3 x i1> %max_is_x, <3 x float> %x, <3 x float> %y
1017 ret <3 x float> %max
1020 ; UNSAFE-LABEL: test_minps_illegal_v3f32:
1021 ; UNSAFE-NEXT: minps %xmm1, %xmm0
1023 define <3 x float> @test_minps_illegal_v3f32(<3 x float> %x, <3 x float> %y) nounwind {
1024 %min_is_x = fcmp ole <3 x float> %x, %y
1025 %min = select <3 x i1> %min_is_x, <3 x float> %x, <3 x float> %y
1026 ret <3 x float> %min