Fixed some bugs.
[llvm/zpu.git] / test / CodeGen / X86 / sse-minmax.ll
blob348121ac8bcfad39d4fc107b78891415010951f6
1 ; RUN: llc < %s -march=x86-64 -asm-verbose=false | FileCheck %s
2 ; RUN: llc < %s -march=x86-64 -asm-verbose=false -enable-unsafe-fp-math -enable-no-nans-fp-math | FileCheck -check-prefix=UNSAFE %s
3 ; RUN: llc < %s -march=x86-64 -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.
15 ; CHECK:      ogt:
16 ; CHECK-NEXT: maxsd %xmm1, %xmm0
17 ; CHECK-NEXT: ret
18 ; UNSAFE:      ogt:
19 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
20 ; UNSAFE-NEXT: ret
21 ; FINITE:      ogt:
22 ; FINITE-NEXT: maxsd %xmm1, %xmm0
23 ; FINITE-NEXT: ret
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
27   ret double %d
30 ; CHECK:      olt:
31 ; CHECK-NEXT: minsd %xmm1, %xmm0
32 ; CHECK-NEXT: ret
33 ; UNSAFE:      olt:
34 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
35 ; UNSAFE-NEXT: ret
36 ; FINITE:      olt:
37 ; FINITE-NEXT: minsd %xmm1, %xmm0
38 ; FINITE-NEXT: ret
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
42   ret double %d
45 ; CHECK:      ogt_inverse:
46 ; CHECK-NEXT: minsd  %xmm0, %xmm1
47 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
48 ; CHECK-NEXT: ret
49 ; UNSAFE:      ogt_inverse:
50 ; UNSAFE-NEXT: minsd  %xmm0, %xmm1
51 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
52 ; UNSAFE-NEXT: ret
53 ; FINITE:      ogt_inverse:
54 ; FINITE-NEXT: minsd  %xmm0, %xmm1
55 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
56 ; FINITE-NEXT: ret
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
60   ret double %d
63 ; CHECK:      olt_inverse:
64 ; CHECK-NEXT: maxsd  %xmm0, %xmm1
65 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
66 ; CHECK-NEXT: ret
67 ; UNSAFE:      olt_inverse:
68 ; UNSAFE-NEXT: maxsd  %xmm0, %xmm1
69 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
70 ; UNSAFE-NEXT: ret
71 ; FINITE:      olt_inverse:
72 ; FINITE-NEXT: maxsd  %xmm0, %xmm1
73 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
74 ; FINITE-NEXT: ret
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
78   ret double %d
81 ; CHECK:      oge:
82 ; CHECK-NEXT: ucomisd %xmm1, %xmm0
83 ; UNSAFE:      oge:
84 ; UNSAFE-NEXT: maxsd    %xmm1, %xmm0
85 ; UNSAFE-NEXT: ret
86 ; FINITE:      oge:
87 ; FINITE-NEXT: maxsd    %xmm1, %xmm0
88 ; FINITE-NEXT: ret
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
92   ret double %d
95 ; CHECK:      ole:
96 ; CHECK-NEXT: ucomisd %xmm0, %xmm1
97 ; UNSAFE:      ole:
98 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
99 ; FINITE:      ole:
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
104   ret double %d
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
112 ; UNSAFE-NEXT: ret
113 ; FINITE:      oge_inverse:
114 ; FINITE-NEXT: minsd %xmm0, %xmm1
115 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
116 ; FINITE-NEXT: ret
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
120   ret double %d
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
128 ; UNSAFE-NEXT: ret
129 ; FINITE:      ole_inverse:
130 ; FINITE-NEXT: maxsd %xmm0, %xmm1
131 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
132 ; FINITE-NEXT: ret
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
136   ret double %d
139 ; CHECK:      x_ogt:
140 ; CHECK-NEXT: pxor  %xmm1, %xmm1
141 ; CHECK-NEXT: maxsd %xmm1, %xmm0
142 ; CHECK-NEXT: ret
143 ; UNSAFE:      x_ogt:
144 ; UNSAFE-NEXT: pxor  %xmm1, %xmm1
145 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
146 ; UNSAFE-NEXT: ret
147 ; FINITE:      x_ogt:
148 ; FINITE-NEXT: pxor  %xmm1, %xmm1
149 ; FINITE-NEXT: maxsd %xmm1, %xmm0
150 ; FINITE-NEXT: ret
151 define double @x_ogt(double %x) nounwind {
152   %c = fcmp ogt double %x, 0.000000e+00
153   %d = select i1 %c, double %x, double 0.000000e+00
154   ret double %d
157 ; CHECK:      x_olt:
158 ; CHECK-NEXT: pxor  %xmm1, %xmm1
159 ; CHECK-NEXT: minsd %xmm1, %xmm0
160 ; CHECK-NEXT: ret
161 ; UNSAFE:      x_olt:
162 ; UNSAFE-NEXT: pxor  %xmm1, %xmm1
163 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
164 ; UNSAFE-NEXT: ret
165 ; FINITE:      x_olt:
166 ; FINITE-NEXT: pxor  %xmm1, %xmm1
167 ; FINITE-NEXT: minsd %xmm1, %xmm0
168 ; FINITE-NEXT: ret
169 define double @x_olt(double %x) nounwind {
170   %c = fcmp olt double %x, 0.000000e+00
171   %d = select i1 %c, double %x, double 0.000000e+00
172   ret double %d
175 ; CHECK:      x_ogt_inverse:
176 ; CHECK-NEXT: pxor   %xmm1, %xmm1
177 ; CHECK-NEXT: minsd  %xmm0, %xmm1
178 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
179 ; CHECK-NEXT: ret
180 ; UNSAFE:      x_ogt_inverse:
181 ; UNSAFE-NEXT: pxor   %xmm1, %xmm1
182 ; UNSAFE-NEXT: minsd  %xmm0, %xmm1
183 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
184 ; UNSAFE-NEXT: ret
185 ; FINITE:      x_ogt_inverse:
186 ; FINITE-NEXT: pxor   %xmm1, %xmm1
187 ; FINITE-NEXT: minsd  %xmm0, %xmm1
188 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
189 ; FINITE-NEXT: ret
190 define double @x_ogt_inverse(double %x) nounwind {
191   %c = fcmp ogt double %x, 0.000000e+00
192   %d = select i1 %c, double 0.000000e+00, double %x
193   ret double %d
196 ; CHECK:      x_olt_inverse:
197 ; CHECK-NEXT: pxor   %xmm1, %xmm1
198 ; CHECK-NEXT: maxsd  %xmm0, %xmm1
199 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
200 ; CHECK-NEXT: ret
201 ; UNSAFE:      x_olt_inverse:
202 ; UNSAFE-NEXT: pxor   %xmm1, %xmm1
203 ; UNSAFE-NEXT: maxsd  %xmm0, %xmm1
204 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
205 ; UNSAFE-NEXT: ret
206 ; FINITE:      x_olt_inverse:
207 ; FINITE-NEXT: pxor   %xmm1, %xmm1
208 ; FINITE-NEXT: maxsd  %xmm0, %xmm1
209 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
210 ; FINITE-NEXT: ret
211 define double @x_olt_inverse(double %x) nounwind {
212   %c = fcmp olt double %x, 0.000000e+00
213   %d = select i1 %c, double 0.000000e+00, double %x
214   ret double %d
217 ; CHECK:      x_oge:
218 ; CHECK:      ucomisd %xmm1, %xmm0
219 ; UNSAFE:      x_oge:
220 ; UNSAFE-NEXT: pxor    %xmm1, %xmm1
221 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
222 ; UNSAFE-NEXT: ret
223 ; FINITE:      x_oge:
224 ; FINITE-NEXT: pxor    %xmm1, %xmm1
225 ; FINITE-NEXT: maxsd   %xmm1, %xmm0
226 ; FINITE-NEXT: ret
227 define double @x_oge(double %x) nounwind {
228   %c = fcmp oge double %x, 0.000000e+00
229   %d = select i1 %c, double %x, double 0.000000e+00
230   ret double %d
233 ; CHECK:      x_ole:
234 ; CHECK:      ucomisd %xmm0, %xmm1
235 ; UNSAFE:      x_ole:
236 ; UNSAFE-NEXT: pxor %xmm1, %xmm1
237 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
238 ; UNSAFE-NEXT: ret
239 ; FINITE:      x_ole:
240 ; FINITE-NEXT: pxor %xmm1, %xmm1
241 ; FINITE-NEXT: minsd %xmm1, %xmm0
242 ; FINITE-NEXT: ret
243 define double @x_ole(double %x) nounwind {
244   %c = fcmp ole double %x, 0.000000e+00
245   %d = select i1 %c, double %x, double 0.000000e+00
246   ret double %d
249 ; CHECK:      x_oge_inverse:
250 ; CHECK:      ucomisd %xmm1, %xmm0
251 ; UNSAFE:      x_oge_inverse:
252 ; UNSAFE-NEXT: pxor    %xmm1, %xmm1
253 ; UNSAFE-NEXT: minsd   %xmm0, %xmm1
254 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
255 ; UNSAFE-NEXT: ret
256 ; FINITE:      x_oge_inverse:
257 ; FINITE-NEXT: pxor    %xmm1, %xmm1
258 ; FINITE-NEXT: minsd   %xmm0, %xmm1
259 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
260 ; FINITE-NEXT: ret
261 define double @x_oge_inverse(double %x) nounwind {
262   %c = fcmp oge double %x, 0.000000e+00
263   %d = select i1 %c, double 0.000000e+00, double %x
264   ret double %d
267 ; CHECK:      x_ole_inverse:
268 ; CHECK:      ucomisd %xmm0, %xmm1
269 ; UNSAFE:      x_ole_inverse:
270 ; UNSAFE-NEXT: pxor    %xmm1, %xmm1
271 ; UNSAFE-NEXT: maxsd   %xmm0, %xmm1
272 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
273 ; UNSAFE-NEXT: ret
274 ; FINITE:      x_ole_inverse:
275 ; FINITE-NEXT: pxor    %xmm1, %xmm1
276 ; FINITE-NEXT: maxsd   %xmm0, %xmm1
277 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
278 ; FINITE-NEXT: ret
279 define double @x_ole_inverse(double %x) nounwind {
280   %c = fcmp ole double %x, 0.000000e+00
281   %d = select i1 %c, double 0.000000e+00, double %x
282   ret double %d
285 ; CHECK:      ugt:
286 ; CHECK:      ucomisd %xmm0, %xmm1
287 ; UNSAFE:      ugt:
288 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
289 ; UNSAFE-NEXT: ret
290 ; FINITE:      ugt:
291 ; FINITE-NEXT: maxsd   %xmm1, %xmm0
292 ; FINITE-NEXT: ret
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
296   ret double %d
299 ; CHECK:      ult:
300 ; CHECK:      ucomisd %xmm1, %xmm0
301 ; UNSAFE:      ult:
302 ; UNSAFE-NEXT: minsd   %xmm1, %xmm0
303 ; UNSAFE-NEXT: ret
304 ; FINITE:      ult:
305 ; FINITE-NEXT: minsd   %xmm1, %xmm0
306 ; FINITE-NEXT: ret
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
310   ret double %d
313 ; CHECK:      ugt_inverse:
314 ; CHECK:      ucomisd %xmm0, %xmm1
315 ; UNSAFE:      ugt_inverse:
316 ; UNSAFE-NEXT: minsd   %xmm0, %xmm1
317 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
318 ; UNSAFE-NEXT: ret
319 ; FINITE:      ugt_inverse:
320 ; FINITE-NEXT: minsd   %xmm0, %xmm1
321 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
322 ; FINITE-NEXT: ret
323 define double @ugt_inverse(double %x, double %y) nounwind {
324   %c = fcmp ugt double %x, %y
325   %d = select i1 %c, double %y, double %x
326   ret double %d
329 ; CHECK:      ult_inverse:
330 ; CHECK:      ucomisd %xmm1, %xmm0
331 ; UNSAFE:      ult_inverse:
332 ; UNSAFE-NEXT: maxsd   %xmm0, %xmm1
333 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
334 ; UNSAFE-NEXT: ret
335 ; FINITE:      ult_inverse:
336 ; FINITE-NEXT: maxsd   %xmm0, %xmm1
337 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
338 ; FINITE-NEXT: ret
339 define double @ult_inverse(double %x, double %y) nounwind {
340   %c = fcmp ult double %x, %y
341   %d = select i1 %c, double %y, double %x
342   ret double %d
345 ; CHECK:      uge:
346 ; CHECK-NEXT: maxsd   %xmm0, %xmm1
347 ; CHECK-NEXT: movap{{[sd]}}  %xmm1, %xmm0
348 ; CHECK-NEXT: ret
349 ; UNSAFE:      uge:
350 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
351 ; UNSAFE-NEXT: ret
352 ; FINITE:      uge:
353 ; FINITE-NEXT: maxsd   %xmm1, %xmm0
354 ; FINITE-NEXT: ret
355 define double @uge(double %x, double %y) nounwind {
356   %c = fcmp uge double %x, %y
357   %d = select i1 %c, double %x, double %y
358   ret double %d
361 ; CHECK:      ule:
362 ; CHECK-NEXT: minsd  %xmm0, %xmm1
363 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
364 ; CHECK-NEXT: ret
365 ; UNSAFE:      ule:
366 ; UNSAFE-NEXT: minsd   %xmm1, %xmm0
367 ; UNSAFE-NEXT: ret
368 ; FINITE:      ule:
369 ; FINITE-NEXT: minsd   %xmm1, %xmm0
370 ; FINITE-NEXT: ret
371 define double @ule(double %x, double %y) nounwind {
372   %c = fcmp ule double %x, %y
373   %d = select i1 %c, double %x, double %y
374   ret double %d
377 ; CHECK:      uge_inverse:
378 ; CHECK-NEXT: minsd %xmm1, %xmm0
379 ; CHECK-NEXT: ret
380 ; UNSAFE:      uge_inverse:
381 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
382 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
383 ; UNSAFE-NEXT: ret
384 ; FINITE:      uge_inverse:
385 ; FINITE-NEXT: minsd %xmm0, %xmm1
386 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
387 ; FINITE-NEXT: ret
388 define double @uge_inverse(double %x, double %y) nounwind {
389   %c = fcmp uge double %x, %y
390   %d = select i1 %c, double %y, double %x
391   ret double %d
394 ; CHECK:      ule_inverse:
395 ; CHECK-NEXT: maxsd %xmm1, %xmm0
396 ; CHECK-NEXT: ret
397 ; UNSAFE:      ule_inverse:
398 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
399 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
400 ; UNSAFE-NEXT: ret
401 ; FINITE:      ule_inverse:
402 ; FINITE-NEXT: maxsd %xmm0, %xmm1
403 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
404 ; FINITE-NEXT: ret
405 define double @ule_inverse(double %x, double %y) nounwind {
406   %c = fcmp ule double %x, %y
407   %d = select i1 %c, double %y, double %x
408   ret double %d
411 ; CHECK:      x_ugt:
412 ; CHECK:      ucomisd %xmm0, %xmm1
413 ; UNSAFE:      x_ugt:
414 ; UNSAFE-NEXT: pxor    %xmm1, %xmm1
415 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
416 ; UNSAFE-NEXT: ret
417 ; FINITE:      x_ugt:
418 ; FINITE-NEXT: pxor    %xmm1, %xmm1
419 ; FINITE-NEXT: maxsd   %xmm1, %xmm0
420 ; FINITE-NEXT: ret
421 define double @x_ugt(double %x) nounwind {
422   %c = fcmp ugt double %x, 0.000000e+00
423   %d = select i1 %c, double %x, double 0.000000e+00
424   ret double %d
427 ; CHECK:      x_ult:
428 ; CHECK:      ucomisd %xmm1, %xmm0
429 ; UNSAFE:      x_ult:
430 ; UNSAFE-NEXT: pxor    %xmm1, %xmm1
431 ; UNSAFE-NEXT: minsd   %xmm1, %xmm0
432 ; UNSAFE-NEXT: ret
433 ; FINITE:      x_ult:
434 ; FINITE-NEXT: pxor    %xmm1, %xmm1
435 ; FINITE-NEXT: minsd   %xmm1, %xmm0
436 ; FINITE-NEXT: ret
437 define double @x_ult(double %x) nounwind {
438   %c = fcmp ult double %x, 0.000000e+00
439   %d = select i1 %c, double %x, double 0.000000e+00
440   ret double %d
443 ; CHECK:      x_ugt_inverse:
444 ; CHECK:      ucomisd %xmm0, %xmm1
445 ; UNSAFE:      x_ugt_inverse:
446 ; UNSAFE-NEXT: pxor    %xmm1, %xmm1
447 ; UNSAFE-NEXT: minsd   %xmm0, %xmm1
448 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
449 ; UNSAFE-NEXT: ret
450 ; FINITE:      x_ugt_inverse:
451 ; FINITE-NEXT: pxor    %xmm1, %xmm1
452 ; FINITE-NEXT: minsd   %xmm0, %xmm1
453 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
454 ; FINITE-NEXT: ret
455 define double @x_ugt_inverse(double %x) nounwind {
456   %c = fcmp ugt double %x, 0.000000e+00
457   %d = select i1 %c, double 0.000000e+00, double %x
458   ret double %d
461 ; CHECK:      x_ult_inverse:
462 ; CHECK:      ucomisd %xmm1, %xmm0
463 ; UNSAFE:      x_ult_inverse:
464 ; UNSAFE-NEXT: pxor    %xmm1, %xmm1
465 ; UNSAFE-NEXT: maxsd   %xmm0, %xmm1
466 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
467 ; UNSAFE-NEXT: ret
468 ; FINITE:      x_ult_inverse:
469 ; FINITE-NEXT: pxor    %xmm1, %xmm1
470 ; FINITE-NEXT: maxsd   %xmm0, %xmm1
471 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
472 ; FINITE-NEXT: ret
473 define double @x_ult_inverse(double %x) nounwind {
474   %c = fcmp ult double %x, 0.000000e+00
475   %d = select i1 %c, double 0.000000e+00, double %x
476   ret double %d
479 ; CHECK:      x_uge:
480 ; CHECK-NEXT: pxor   %xmm1, %xmm1
481 ; CHECK-NEXT: maxsd  %xmm0, %xmm1
482 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
483 ; CHECK-NEXT: ret
484 ; UNSAFE:      x_uge:
485 ; UNSAFE-NEXT: pxor   %xmm1, %xmm1
486 ; UNSAFE-NEXT: maxsd  %xmm1, %xmm0
487 ; UNSAFE-NEXT: ret
488 ; FINITE:      x_uge:
489 ; FINITE-NEXT: pxor   %xmm1, %xmm1
490 ; FINITE-NEXT: maxsd  %xmm1, %xmm0
491 ; FINITE-NEXT: ret
492 define double @x_uge(double %x) nounwind {
493   %c = fcmp uge double %x, 0.000000e+00
494   %d = select i1 %c, double %x, double 0.000000e+00
495   ret double %d
498 ; CHECK:      x_ule:
499 ; CHECK-NEXT: pxor   %xmm1, %xmm1
500 ; CHECK-NEXT: minsd  %xmm0, %xmm1
501 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
502 ; CHECK-NEXT: ret
503 ; UNSAFE:      x_ule:
504 ; UNSAFE-NEXT: pxor   %xmm1, %xmm1
505 ; UNSAFE-NEXT: minsd  %xmm1, %xmm0
506 ; UNSAFE-NEXT: ret
507 ; FINITE:      x_ule:
508 ; FINITE-NEXT: pxor   %xmm1, %xmm1
509 ; FINITE-NEXT: minsd  %xmm1, %xmm0
510 ; FINITE-NEXT: ret
511 define double @x_ule(double %x) nounwind {
512   %c = fcmp ule double %x, 0.000000e+00
513   %d = select i1 %c, double %x, double 0.000000e+00
514   ret double %d
517 ; CHECK:      x_uge_inverse:
518 ; CHECK-NEXT: pxor  %xmm1, %xmm1
519 ; CHECK-NEXT: minsd %xmm1, %xmm0
520 ; CHECK-NEXT: ret
521 ; UNSAFE:      x_uge_inverse:
522 ; UNSAFE-NEXT: pxor  %xmm1, %xmm1
523 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
524 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
525 ; UNSAFE-NEXT: ret
526 ; FINITE:      x_uge_inverse:
527 ; FINITE-NEXT: pxor  %xmm1, %xmm1
528 ; FINITE-NEXT: minsd %xmm0, %xmm1
529 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
530 ; FINITE-NEXT: ret
531 define double @x_uge_inverse(double %x) nounwind {
532   %c = fcmp uge double %x, 0.000000e+00
533   %d = select i1 %c, double 0.000000e+00, double %x
534   ret double %d
537 ; CHECK:      x_ule_inverse:
538 ; CHECK-NEXT: pxor  %xmm1, %xmm1
539 ; CHECK-NEXT: maxsd %xmm1, %xmm0
540 ; CHECK-NEXT: ret
541 ; UNSAFE:      x_ule_inverse:
542 ; UNSAFE-NEXT: pxor  %xmm1, %xmm1
543 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
544 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
545 ; UNSAFE-NEXT: ret
546 ; FINITE:      x_ule_inverse:
547 ; FINITE-NEXT: pxor  %xmm1, %xmm1
548 ; FINITE-NEXT: maxsd %xmm0, %xmm1
549 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
550 ; FINITE-NEXT: ret
551 define double @x_ule_inverse(double %x) nounwind {
552   %c = fcmp ule double %x, 0.000000e+00
553   %d = select i1 %c, double 0.000000e+00, double %x
554   ret double %d
557 ; CHECK:      y_ogt:
558 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
559 ; CHECK-NEXT: ret
560 ; UNSAFE:      y_ogt:
561 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
562 ; UNSAFE-NEXT: ret
563 ; FINITE:      y_ogt:
564 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
565 ; FINITE-NEXT: ret
566 define double @y_ogt(double %x) nounwind {
567   %c = fcmp ogt double %x, -0.000000e+00
568   %d = select i1 %c, double %x, double -0.000000e+00
569   ret double %d
572 ; CHECK:      y_olt:
573 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
574 ; CHECK-NEXT: ret
575 ; UNSAFE:      y_olt:
576 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
577 ; UNSAFE-NEXT: ret
578 ; FINITE:      y_olt:
579 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
580 ; FINITE-NEXT: ret
581 define double @y_olt(double %x) nounwind {
582   %c = fcmp olt double %x, -0.000000e+00
583   %d = select i1 %c, double %x, double -0.000000e+00
584   ret double %d
587 ; CHECK:      y_ogt_inverse:
588 ; CHECK-NEXT: movsd  {{[^,]*}}, %xmm1
589 ; CHECK-NEXT: minsd  %xmm0, %xmm1
590 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
591 ; CHECK-NEXT: ret
592 ; UNSAFE:      y_ogt_inverse:
593 ; UNSAFE-NEXT: movsd  {{[^,]*}}, %xmm1
594 ; UNSAFE-NEXT: minsd  %xmm0, %xmm1
595 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
596 ; UNSAFE-NEXT: ret
597 ; FINITE:      y_ogt_inverse:
598 ; FINITE-NEXT: movsd  {{[^,]*}}, %xmm1
599 ; FINITE-NEXT: minsd  %xmm0, %xmm1
600 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
601 ; FINITE-NEXT: ret
602 define double @y_ogt_inverse(double %x) nounwind {
603   %c = fcmp ogt double %x, -0.000000e+00
604   %d = select i1 %c, double -0.000000e+00, double %x
605   ret double %d
608 ; CHECK:      y_olt_inverse:
609 ; CHECK-NEXT: movsd  {{[^,]*}}, %xmm1
610 ; CHECK-NEXT: maxsd  %xmm0, %xmm1
611 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
612 ; CHECK-NEXT: ret
613 ; UNSAFE:      y_olt_inverse:
614 ; UNSAFE-NEXT: movsd  {{[^,]*}}, %xmm1
615 ; UNSAFE-NEXT: maxsd  %xmm0, %xmm1
616 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
617 ; UNSAFE-NEXT: ret
618 ; FINITE:      y_olt_inverse:
619 ; FINITE-NEXT: movsd  {{[^,]*}}, %xmm1
620 ; FINITE-NEXT: maxsd  %xmm0, %xmm1
621 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
622 ; FINITE-NEXT: ret
623 define double @y_olt_inverse(double %x) nounwind {
624   %c = fcmp olt double %x, -0.000000e+00
625   %d = select i1 %c, double -0.000000e+00, double %x
626   ret double %d
629 ; CHECK:      y_oge:
630 ; CHECK:      ucomisd %xmm1, %xmm0
631 ; UNSAFE:      y_oge:
632 ; UNSAFE-NEXT: maxsd   {{[^,]*}}, %xmm0
633 ; UNSAFE-NEXT: ret
634 ; FINITE:      y_oge:
635 ; FINITE-NEXT: maxsd   {{[^,]*}}, %xmm0
636 ; FINITE-NEXT: ret
637 define double @y_oge(double %x) nounwind {
638   %c = fcmp oge double %x, -0.000000e+00
639   %d = select i1 %c, double %x, double -0.000000e+00
640   ret double %d
643 ; CHECK:      y_ole:
644 ; CHECK:      ucomisd %xmm0, %xmm1
645 ; UNSAFE:      y_ole:
646 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
647 ; UNSAFE-NEXT: ret
648 ; FINITE:      y_ole:
649 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
650 ; FINITE-NEXT: ret
651 define double @y_ole(double %x) nounwind {
652   %c = fcmp ole double %x, -0.000000e+00
653   %d = select i1 %c, double %x, double -0.000000e+00
654   ret double %d
657 ; CHECK:      y_oge_inverse:
658 ; CHECK:      ucomisd %xmm1, %xmm0
659 ; UNSAFE:      y_oge_inverse:
660 ; UNSAFE-NEXT: movsd   {{[^,]*}}, %xmm1
661 ; UNSAFE-NEXT: minsd   %xmm0, %xmm1
662 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
663 ; UNSAFE-NEXT: ret
664 ; FINITE:      y_oge_inverse:
665 ; FINITE-NEXT: movsd   {{[^,]*}}, %xmm1
666 ; FINITE-NEXT: minsd   %xmm0, %xmm1
667 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
668 ; FINITE-NEXT: ret
669 define double @y_oge_inverse(double %x) nounwind {
670   %c = fcmp oge double %x, -0.000000e+00
671   %d = select i1 %c, double -0.000000e+00, double %x
672   ret double %d
675 ; CHECK:      y_ole_inverse:
676 ; CHECK:      ucomisd %xmm0, %xmm1
677 ; UNSAFE:      y_ole_inverse:
678 ; UNSAFE-NEXT: movsd   {{[^,]*}}, %xmm1
679 ; UNSAFE-NEXT: maxsd   %xmm0, %xmm1
680 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
681 ; UNSAFE-NEXT: ret
682 ; FINITE:      y_ole_inverse:
683 ; FINITE-NEXT: movsd   {{[^,]*}}, %xmm1
684 ; FINITE-NEXT: maxsd   %xmm0, %xmm1
685 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
686 ; FINITE-NEXT: ret
687 define double @y_ole_inverse(double %x) nounwind {
688   %c = fcmp ole double %x, -0.000000e+00
689   %d = select i1 %c, double -0.000000e+00, double %x
690   ret double %d
693 ; CHECK:      y_ugt:
694 ; CHECK:      ucomisd %xmm0, %xmm1
695 ; UNSAFE:      y_ugt:
696 ; UNSAFE-NEXT: maxsd   {{[^,]*}}, %xmm0
697 ; UNSAFE-NEXT: ret
698 ; FINITE:      y_ugt:
699 ; FINITE-NEXT: maxsd   {{[^,]*}}, %xmm0
700 ; FINITE-NEXT: ret
701 define double @y_ugt(double %x) nounwind {
702   %c = fcmp ugt double %x, -0.000000e+00
703   %d = select i1 %c, double %x, double -0.000000e+00
704   ret double %d
707 ; CHECK:      y_ult:
708 ; CHECK:      ucomisd %xmm1, %xmm0
709 ; UNSAFE:      y_ult:
710 ; UNSAFE-NEXT: minsd   {{[^,]*}}, %xmm0
711 ; UNSAFE-NEXT: ret
712 ; FINITE:      y_ult:
713 ; FINITE-NEXT: minsd   {{[^,]*}}, %xmm0
714 ; FINITE-NEXT: ret
715 define double @y_ult(double %x) nounwind {
716   %c = fcmp ult double %x, -0.000000e+00
717   %d = select i1 %c, double %x, double -0.000000e+00
718   ret double %d
721 ; CHECK:      y_ugt_inverse:
722 ; CHECK:      ucomisd %xmm0, %xmm1
723 ; UNSAFE:      y_ugt_inverse:
724 ; UNSAFE-NEXT: movsd   {{[^,]*}}, %xmm1
725 ; UNSAFE-NEXT: minsd   %xmm0, %xmm1
726 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
727 ; UNSAFE-NEXT: ret
728 ; FINITE:      y_ugt_inverse:
729 ; FINITE-NEXT: movsd   {{[^,]*}}, %xmm1
730 ; FINITE-NEXT: minsd   %xmm0, %xmm1
731 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
732 ; FINITE-NEXT: ret
733 define double @y_ugt_inverse(double %x) nounwind {
734   %c = fcmp ugt double %x, -0.000000e+00
735   %d = select i1 %c, double -0.000000e+00, double %x
736   ret double %d
739 ; CHECK:      y_ult_inverse:
740 ; CHECK:      ucomisd %xmm1, %xmm0
741 ; UNSAFE:      y_ult_inverse:
742 ; UNSAFE-NEXT: movsd   {{[^,]*}}, %xmm1
743 ; UNSAFE-NEXT: maxsd   %xmm0, %xmm1
744 ; UNSAFE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
745 ; UNSAFE-NEXT: ret
746 ; FINITE:      y_ult_inverse:
747 ; FINITE-NEXT: movsd   {{[^,]*}}, %xmm1
748 ; FINITE-NEXT: maxsd   %xmm0, %xmm1
749 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
750 ; FINITE-NEXT: ret
751 define double @y_ult_inverse(double %x) nounwind {
752   %c = fcmp ult double %x, -0.000000e+00
753   %d = select i1 %c, double -0.000000e+00, double %x
754   ret double %d
757 ; CHECK:      y_uge:
758 ; CHECK-NEXT: movsd  {{[^,]*}}, %xmm1
759 ; CHECK-NEXT: maxsd  %xmm0, %xmm1
760 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
761 ; CHECK-NEXT: ret
762 ; UNSAFE:      y_uge:
763 ; UNSAFE-NEXT: maxsd  {{[^,]*}}, %xmm0
764 ; UNSAFE-NEXT: ret
765 ; FINITE:      y_uge:
766 ; FINITE-NEXT: maxsd  {{[^,]*}}, %xmm0
767 ; FINITE-NEXT: ret
768 define double @y_uge(double %x) nounwind {
769   %c = fcmp uge double %x, -0.000000e+00
770   %d = select i1 %c, double %x, double -0.000000e+00
771   ret double %d
774 ; CHECK:      y_ule:
775 ; CHECK-NEXT: movsd  {{[^,]*}}, %xmm1
776 ; CHECK-NEXT: minsd  %xmm0, %xmm1
777 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
778 ; CHECK-NEXT: ret
779 ; UNSAFE:      y_ule:
780 ; UNSAFE-NEXT: minsd  {{[^,]*}}, %xmm0
781 ; UNSAFE-NEXT: ret
782 ; FINITE:      y_ule:
783 ; FINITE-NEXT: minsd  {{[^,]*}}, %xmm0
784 ; FINITE-NEXT: ret
785 define double @y_ule(double %x) nounwind {
786   %c = fcmp ule double %x, -0.000000e+00
787   %d = select i1 %c, double %x, double -0.000000e+00
788   ret double %d
791 ; CHECK:      y_uge_inverse:
792 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
793 ; CHECK-NEXT: ret
794 ; UNSAFE:      y_uge_inverse:
795 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
796 ; UNSAFE-NEXT: minsd %xmm0, %xmm1
797 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
798 ; UNSAFE-NEXT: ret
799 ; FINITE:      y_uge_inverse:
800 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
801 ; FINITE-NEXT: minsd %xmm0, %xmm1
802 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
803 ; FINITE-NEXT: ret
804 define double @y_uge_inverse(double %x) nounwind {
805   %c = fcmp uge double %x, -0.000000e+00
806   %d = select i1 %c, double -0.000000e+00, double %x
807   ret double %d
810 ; CHECK:      y_ule_inverse:
811 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
812 ; CHECK-NEXT: ret
813 ; UNSAFE:      y_ule_inverse:
814 ; UNSAFE-NEXT: movsd {{[^,]*}}, %xmm1
815 ; UNSAFE-NEXT: maxsd %xmm0, %xmm1
816 ; UNSAFE-NEXT: movap{{[sd]}} %xmm1, %xmm0
817 ; UNSAFE-NEXT: ret
818 ; FINITE:      y_ule_inverse:
819 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
820 ; FINITE-NEXT: maxsd %xmm0, %xmm1
821 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
822 ; FINITE-NEXT: ret
823 define double @y_ule_inverse(double %x) nounwind {
824   %c = fcmp ule double %x, -0.000000e+00
825   %d = select i1 %c, double -0.000000e+00, double %x
826   ret double %d
828 ; Test a few more misc. cases.
830 ; CHECK: clampTo3k_a:
831 ; CHECK: minsd
832 ; UNSAFE: clampTo3k_a:
833 ; UNSAFE: minsd
834 ; FINITE: clampTo3k_a:
835 ; FINITE: minsd
836 define double @clampTo3k_a(double %x) nounwind readnone {
837 entry:
838   %0 = fcmp ogt double %x, 3.000000e+03           ; <i1> [#uses=1]
839   %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
840   ret double %x_addr.0
843 ; CHECK: clampTo3k_b:
844 ; CHECK: minsd
845 ; UNSAFE: clampTo3k_b:
846 ; UNSAFE: minsd
847 ; FINITE: clampTo3k_b:
848 ; FINITE: minsd
849 define double @clampTo3k_b(double %x) nounwind readnone {
850 entry:
851   %0 = fcmp uge double %x, 3.000000e+03           ; <i1> [#uses=1]
852   %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
853   ret double %x_addr.0
856 ; CHECK: clampTo3k_c:
857 ; CHECK: maxsd
858 ; UNSAFE: clampTo3k_c:
859 ; UNSAFE: maxsd
860 ; FINITE: clampTo3k_c:
861 ; FINITE: maxsd
862 define double @clampTo3k_c(double %x) nounwind readnone {
863 entry:
864   %0 = fcmp olt double %x, 3.000000e+03           ; <i1> [#uses=1]
865   %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
866   ret double %x_addr.0
869 ; CHECK: clampTo3k_d:
870 ; CHECK: maxsd
871 ; UNSAFE: clampTo3k_d:
872 ; UNSAFE: maxsd
873 ; FINITE: clampTo3k_d:
874 ; FINITE: maxsd
875 define double @clampTo3k_d(double %x) nounwind readnone {
876 entry:
877   %0 = fcmp ule double %x, 3.000000e+03           ; <i1> [#uses=1]
878   %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
879   ret double %x_addr.0
882 ; CHECK: clampTo3k_e:
883 ; CHECK: maxsd
884 ; UNSAFE: clampTo3k_e:
885 ; UNSAFE: maxsd
886 ; FINITE: clampTo3k_e:
887 ; FINITE: maxsd
888 define double @clampTo3k_e(double %x) nounwind readnone {
889 entry:
890   %0 = fcmp olt double %x, 3.000000e+03           ; <i1> [#uses=1]
891   %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
892   ret double %x_addr.0
895 ; CHECK: clampTo3k_f:
896 ; CHECK: maxsd
897 ; UNSAFE: clampTo3k_f:
898 ; UNSAFE: maxsd
899 ; FINITE: clampTo3k_f:
900 ; FINITE: maxsd
901 define double @clampTo3k_f(double %x) nounwind readnone {
902 entry:
903   %0 = fcmp ule double %x, 3.000000e+03           ; <i1> [#uses=1]
904   %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
905   ret double %x_addr.0
908 ; CHECK: clampTo3k_g:
909 ; CHECK: minsd
910 ; UNSAFE: clampTo3k_g:
911 ; UNSAFE: minsd
912 ; FINITE: clampTo3k_g:
913 ; FINITE: minsd
914 define double @clampTo3k_g(double %x) nounwind readnone {
915 entry:
916   %0 = fcmp ogt double %x, 3.000000e+03           ; <i1> [#uses=1]
917   %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
918   ret double %x_addr.0
921 ; CHECK: clampTo3k_h:
922 ; CHECK: minsd
923 ; UNSAFE: clampTo3k_h:
924 ; UNSAFE: minsd
925 ; FINITE: clampTo3k_h:
926 ; FINITE: minsd
927 define double @clampTo3k_h(double %x) nounwind readnone {
928 entry:
929   %0 = fcmp uge double %x, 3.000000e+03           ; <i1> [#uses=1]
930   %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
931   ret double %x_addr.0