fix typo; NFC
[oota-llvm.git] / test / CodeGen / X86 / sse-minmax.ll
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
4
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.
9
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.
14
15 ; CHECK-LABEL:      ogt:
16 ; CHECK-NEXT: maxsd %xmm1, %xmm0
17 ; CHECK-NEXT: ret
18 ; UNSAFE-LABEL:      ogt:
19 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
20 ; UNSAFE-NEXT: ret
21 ; FINITE-LABEL:      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
28 }
29
30 ; CHECK-LABEL:      olt:
31 ; CHECK-NEXT: minsd %xmm1, %xmm0
32 ; CHECK-NEXT: ret
33 ; UNSAFE-LABEL:      olt:
34 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
35 ; UNSAFE-NEXT: ret
36 ; FINITE-LABEL:      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
43 }
44
45 ; CHECK-LABEL:      ogt_inverse:
46 ; CHECK-NEXT: minsd  %xmm0, %xmm1
47 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
48 ; CHECK-NEXT: ret
49 ; UNSAFE-LABEL:      ogt_inverse:
50 ; UNSAFE-NEXT: minsd  %xmm1, %xmm0
51 ; UNSAFE-NEXT: ret
52 ; FINITE-LABEL:      ogt_inverse:
53 ; FINITE-NEXT: minsd  %xmm0, %xmm1
54 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
55 ; FINITE-NEXT: ret
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
59   ret double %d
60 }
61
62 ; CHECK-LABEL:      olt_inverse:
63 ; CHECK-NEXT: maxsd  %xmm0, %xmm1
64 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
65 ; CHECK-NEXT: ret
66 ; UNSAFE-LABEL:      olt_inverse:
67 ; UNSAFE-NEXT: maxsd  %xmm1, %xmm0
68 ; UNSAFE-NEXT: ret
69 ; FINITE-LABEL:      olt_inverse:
70 ; FINITE-NEXT: maxsd  %xmm0, %xmm1
71 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
72 ; FINITE-NEXT: ret
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
76   ret double %d
77 }
78
79 ; CHECK-LABEL:      oge:
80 ; CHECK: cmplesd %xmm0
81 ; UNSAFE-LABEL:      oge:
82 ; UNSAFE-NEXT: maxsd    %xmm1, %xmm0
83 ; UNSAFE-NEXT: ret
84 ; FINITE-LABEL:      oge:
85 ; FINITE-NEXT: maxsd    %xmm1, %xmm0
86 ; FINITE-NEXT: ret
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
90   ret double %d
91 }
92
93 ; CHECK-LABEL:      ole:
94 ; CHECK: cmplesd %xmm1
95 ; UNSAFE-LABEL:      ole:
96 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
97 ; FINITE-LABEL:      ole:
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
102   ret double %d
103 }
104
105 ; CHECK-LABEL:      oge_inverse:
106 ; CHECK: cmplesd %xmm0
107 ; UNSAFE-LABEL:      oge_inverse:
108 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
109 ; UNSAFE-NEXT: ret
110 ; FINITE-LABEL:      oge_inverse:
111 ; FINITE-NEXT: minsd %xmm0, %xmm1
112 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
113 ; FINITE-NEXT: ret
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
117   ret double %d
118 }
119
120 ; CHECK-LABEL:      ole_inverse:
121 ; CHECK: cmplesd %xmm1
122 ; UNSAFE-LABEL:      ole_inverse:
123 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
124 ; UNSAFE-NEXT: ret
125 ; FINITE-LABEL:      ole_inverse:
126 ; FINITE-NEXT: maxsd %xmm0, %xmm1
127 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
128 ; FINITE-NEXT: ret
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
132   ret double %d
133 }
134
135 ; CHECK-LABEL:      ogt_x:
136 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
137 ; CHECK-NEXT: maxsd %xmm1, %xmm0
138 ; CHECK-NEXT: ret
139 ; UNSAFE-LABEL:      ogt_x:
140 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
141 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
142 ; UNSAFE-NEXT: ret
143 ; FINITE-LABEL:      ogt_x:
144 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
145 ; FINITE-NEXT: maxsd %xmm1, %xmm0
146 ; FINITE-NEXT: ret
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
150   ret double %d
151 }
152
153 ; CHECK-LABEL:      olt_x:
154 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
155 ; CHECK-NEXT: minsd %xmm1, %xmm0
156 ; CHECK-NEXT: ret
157 ; UNSAFE-LABEL:      olt_x:
158 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
159 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
160 ; UNSAFE-NEXT: ret
161 ; FINITE-LABEL:      olt_x:
162 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
163 ; FINITE-NEXT: minsd %xmm1, %xmm0
164 ; FINITE-NEXT: ret
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
168   ret double %d
169 }
170
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
175 ; CHECK-NEXT: ret
176 ; UNSAFE-LABEL:      ogt_inverse_x:
177 ; UNSAFE-NEXT: xorp{{[sd]}}  %xmm1, %xmm1
178 ; UNSAFE-NEXT: minsd  %xmm1, %xmm0
179 ; UNSAFE-NEXT: ret
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
184 ; FINITE-NEXT: ret
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
188   ret double %d
189 }
190
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
195 ; CHECK-NEXT: ret
196 ; UNSAFE-LABEL:      olt_inverse_x:
197 ; UNSAFE-NEXT: xorp{{[sd]}}  %xmm1, %xmm1
198 ; UNSAFE-NEXT: maxsd  %xmm1, %xmm0
199 ; UNSAFE-NEXT: ret
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
204 ; FINITE-NEXT: ret
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
208   ret double %d
209 }
210
211 ; CHECK-LABEL:      oge_x:
212 ; CHECK:      cmplesd %xmm
213 ; CHECK-NEXT: andpd
214 ; UNSAFE-LABEL:      oge_x:
215 ; UNSAFE-NEXT: xorp{{[sd]}}   %xmm1, %xmm1
216 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
217 ; UNSAFE-NEXT: ret
218 ; FINITE-LABEL:      oge_x:
219 ; FINITE-NEXT: xorp{{[sd]}}   %xmm1, %xmm1
220 ; FINITE-NEXT: maxsd   %xmm1, %xmm0
221 ; FINITE-NEXT: ret
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
225   ret double %d
226 }
227
228 ; CHECK-LABEL:      ole_x:
229 ; CHECK:      cmplesd %xmm
230 ; CHECK-NEXT: andpd
231 ; UNSAFE-LABEL:      ole_x:
232 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
233 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
234 ; UNSAFE-NEXT: ret
235 ; FINITE-LABEL:      ole_x:
236 ; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
237 ; FINITE-NEXT: minsd %xmm1, %xmm0
238 ; FINITE-NEXT: ret
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
242   ret double %d
243 }
244
245 ; CHECK-LABEL:      oge_inverse_x:
246 ; CHECK:      cmplesd %xmm
247 ; CHECK-NEXT: andnpd
248 ; UNSAFE-LABEL:      oge_inverse_x:
249 ; UNSAFE-NEXT: xorp{{[sd]}}   %xmm1, %xmm1
250 ; UNSAFE-NEXT: minsd   %xmm1, %xmm0
251 ; UNSAFE-NEXT: ret
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
256 ; FINITE-NEXT: ret
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
260   ret double %d
261 }
262
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
268 ; UNSAFE-NEXT: ret
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
273 ; FINITE-NEXT: ret
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
277   ret double %d
278 }
279
280 ; CHECK-LABEL:      ugt:
281 ; CHECK:      cmpnlesd %xmm1
282 ; UNSAFE-LABEL:      ugt:
283 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
284 ; UNSAFE-NEXT: ret
285 ; FINITE-LABEL:      ugt:
286 ; FINITE-NEXT: maxsd   %xmm1, %xmm0
287 ; FINITE-NEXT: ret
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
291   ret double %d
292 }
293
294 ; CHECK-LABEL:      ult:
295 ; CHECK:      cmpnlesd %xmm0
296 ; UNSAFE-LABEL:      ult:
297 ; UNSAFE-NEXT: minsd   %xmm1, %xmm0
298 ; UNSAFE-NEXT: ret
299 ; FINITE-LABEL:      ult:
300 ; FINITE-NEXT: minsd   %xmm1, %xmm0
301 ; FINITE-NEXT: ret
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
305   ret double %d
306 }
307
308 ; CHECK-LABEL:      ugt_inverse:
309 ; CHECK:      cmpnlesd %xmm1
310 ; UNSAFE-LABEL:      ugt_inverse:
311 ; UNSAFE-NEXT: minsd   %xmm1, %xmm0
312 ; UNSAFE-NEXT: ret
313 ; FINITE-LABEL:      ugt_inverse:
314 ; FINITE-NEXT: minsd   %xmm0, %xmm1
315 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
316 ; FINITE-NEXT: ret
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
320   ret double %d
321 }
322
323 ; CHECK-LABEL:      ult_inverse:
324 ; CHECK:      cmpnlesd %xmm0
325 ; UNSAFE-LABEL:      ult_inverse:
326 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
327 ; UNSAFE-NEXT: ret
328 ; FINITE-LABEL:      ult_inverse:
329 ; FINITE-NEXT: maxsd   %xmm0, %xmm1
330 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
331 ; FINITE-NEXT: ret
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
335   ret double %d
336 }
337
338 ; CHECK-LABEL:      uge:
339 ; CHECK-NEXT: maxsd   %xmm0, %xmm1
340 ; CHECK-NEXT: movap{{[sd]}}  %xmm1, %xmm0
341 ; CHECK-NEXT: ret
342 ; UNSAFE-LABEL:      uge:
343 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
344 ; UNSAFE-NEXT: ret
345 ; FINITE-LABEL:      uge:
346 ; FINITE-NEXT: maxsd   %xmm1, %xmm0
347 ; FINITE-NEXT: ret
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
351   ret double %d
352 }
353
354 ; CHECK-LABEL:      ule:
355 ; CHECK-NEXT: minsd  %xmm0, %xmm1
356 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
357 ; CHECK-NEXT: ret
358 ; UNSAFE-LABEL:      ule:
359 ; UNSAFE-NEXT: minsd   %xmm1, %xmm0
360 ; UNSAFE-NEXT: ret
361 ; FINITE-LABEL:      ule:
362 ; FINITE-NEXT: minsd   %xmm1, %xmm0
363 ; FINITE-NEXT: ret
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
367   ret double %d
368 }
369
370 ; CHECK-LABEL:      uge_inverse:
371 ; CHECK-NEXT: minsd %xmm1, %xmm0
372 ; CHECK-NEXT: ret
373 ; UNSAFE-LABEL:      uge_inverse:
374 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
375 ; UNSAFE-NEXT: ret
376 ; FINITE-LABEL:      uge_inverse:
377 ; FINITE-NEXT: minsd %xmm0, %xmm1
378 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
379 ; FINITE-NEXT: ret
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
383   ret double %d
384 }
385
386 ; CHECK-LABEL:      ule_inverse:
387 ; CHECK-NEXT: maxsd %xmm1, %xmm0
388 ; CHECK-NEXT: ret
389 ; UNSAFE-LABEL:      ule_inverse:
390 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
391 ; UNSAFE-NEXT: ret
392 ; FINITE-LABEL:      ule_inverse:
393 ; FINITE-NEXT: maxsd %xmm0, %xmm1
394 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
395 ; FINITE-NEXT: ret
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
399   ret double %d
400 }
401
402 ; CHECK-LABEL:      ugt_x:
403 ; CHECK:      cmpnlesd %xmm
404 ; CHECK-NEXT: andpd
405 ; UNSAFE-LABEL:      ugt_x:
406 ; UNSAFE-NEXT: xorp{{[sd]}}   %xmm1, %xmm1
407 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
408 ; UNSAFE-NEXT: ret
409 ; FINITE-LABEL:      ugt_x:
410 ; FINITE-NEXT: xorp{{[sd]}}   %xmm1, %xmm1
411 ; FINITE-NEXT: maxsd   %xmm1, %xmm0
412 ; FINITE-NEXT: ret
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
416   ret double %d
417 }
418
419 ; CHECK-LABEL:      ult_x:
420 ; CHECK:      cmpnlesd %xmm
421 ; CHECK-NEXT: andpd
422 ; UNSAFE-LABEL:      ult_x:
423 ; UNSAFE-NEXT: xorp{{[sd]}}   %xmm1, %xmm1
424 ; UNSAFE-NEXT: minsd   %xmm1, %xmm0
425 ; UNSAFE-NEXT: ret
426 ; FINITE-LABEL:      ult_x:
427 ; FINITE-NEXT: xorp{{[sd]}}   %xmm1, %xmm1
428 ; FINITE-NEXT: minsd   %xmm1, %xmm0
429 ; FINITE-NEXT: ret
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
433   ret double %d
434 }
435
436 ; CHECK-LABEL:      ugt_inverse_x:
437 ; CHECK:      cmpnlesd %xmm
438 ; CHECK-NEXT: andnpd
439 ; UNSAFE-LABEL:      ugt_inverse_x:
440 ; UNSAFE-NEXT: xorp{{[sd]}}   %xmm1, %xmm1
441 ; UNSAFE-NEXT: minsd   %xmm1, %xmm0
442 ; UNSAFE-NEXT: ret
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
447 ; FINITE-NEXT: ret
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
451   ret double %d
452 }
453
454 ; CHECK-LABEL:      ult_inverse_x:
455 ; CHECK:      cmpnlesd %xmm
456 ; CHECK-NEXT: andnpd
457 ; UNSAFE-LABEL:      ult_inverse_x:
458 ; UNSAFE-NEXT: xorp{{[sd]}}   %xmm1, %xmm1
459 ; UNSAFE-NEXT: maxsd   %xmm1, %xmm0
460 ; UNSAFE-NEXT: ret
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
465 ; FINITE-NEXT: ret
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
469   ret double %d
470 }
471
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
476 ; CHECK-NEXT: ret
477 ; UNSAFE-LABEL:      uge_x:
478 ; UNSAFE-NEXT: xorp{{[sd]}}  %xmm1, %xmm1
479 ; UNSAFE-NEXT: maxsd  %xmm1, %xmm0
480 ; UNSAFE-NEXT: ret
481 ; FINITE-LABEL:      uge_x:
482 ; FINITE-NEXT: xorp{{[sd]}}  %xmm1, %xmm1
483 ; FINITE-NEXT: maxsd  %xmm1, %xmm0
484 ; FINITE-NEXT: ret
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
488   ret double %d
489 }
490
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
495 ; CHECK-NEXT: ret
496 ; UNSAFE-LABEL:      ule_x:
497 ; UNSAFE-NEXT: xorp{{[sd]}}  %xmm1, %xmm1
498 ; UNSAFE-NEXT: minsd  %xmm1, %xmm0
499 ; UNSAFE-NEXT: ret
500 ; FINITE-LABEL:      ule_x:
501 ; FINITE-NEXT: xorp{{[sd]}}  %xmm1, %xmm1
502 ; FINITE-NEXT: minsd  %xmm1, %xmm0
503 ; FINITE-NEXT: ret
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
507   ret double %d
508 }
509
510 ; CHECK-LABEL:      uge_inverse_x:
511 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
512 ; CHECK-NEXT: minsd %xmm1, %xmm0
513 ; CHECK-NEXT: ret
514 ; UNSAFE-LABEL:      uge_inverse_x:
515 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
516 ; UNSAFE-NEXT: minsd %xmm1, %xmm0
517 ; UNSAFE-NEXT: ret
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
522 ; FINITE-NEXT: ret
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
526   ret double %d
527 }
528
529 ; CHECK-LABEL:      ule_inverse_x:
530 ; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
531 ; CHECK-NEXT: maxsd %xmm1, %xmm0
532 ; CHECK-NEXT: ret
533 ; UNSAFE-LABEL:      ule_inverse_x:
534 ; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
535 ; UNSAFE-NEXT: maxsd %xmm1, %xmm0
536 ; UNSAFE-NEXT: ret
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
541 ; FINITE-NEXT: ret
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
545   ret double %d
546 }
547
548 ; CHECK-LABEL:      ogt_y:
549 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
550 ; CHECK-NEXT: ret
551 ; UNSAFE-LABEL:      ogt_y:
552 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
553 ; UNSAFE-NEXT: ret
554 ; FINITE-LABEL:      ogt_y:
555 ; FINITE-NEXT: maxsd {{[^,]*}}, %xmm0
556 ; FINITE-NEXT: ret
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
560   ret double %d
561 }
562
563 ; CHECK-LABEL:      olt_y:
564 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
565 ; CHECK-NEXT: ret
566 ; UNSAFE-LABEL:      olt_y:
567 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
568 ; UNSAFE-NEXT: ret
569 ; FINITE-LABEL:      olt_y:
570 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
571 ; FINITE-NEXT: ret
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
575   ret double %d
576 }
577
578 ; CHECK-LABEL:      ogt_inverse_y:
579 ; CHECK-NEXT: movsd  {{[^,]*}}, %xmm1
580 ; CHECK-NEXT: minsd  %xmm0, %xmm1
581 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
582 ; CHECK-NEXT: ret
583 ; UNSAFE-LABEL:      ogt_inverse_y:
584 ; UNSAFE-NEXT: minsd  {{[^,]*}}, %xmm0
585 ; UNSAFE-NEXT: ret
586 ; FINITE-LABEL:      ogt_inverse_y:
587 ; FINITE-NEXT: movsd  {{[^,]*}}, %xmm1
588 ; FINITE-NEXT: minsd  %xmm0, %xmm1
589 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
590 ; FINITE-NEXT: ret
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
594   ret double %d
595 }
596
597 ; CHECK-LABEL:      olt_inverse_y:
598 ; CHECK-NEXT: movsd  {{[^,]*}}, %xmm1
599 ; CHECK-NEXT: maxsd  %xmm0, %xmm1
600 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
601 ; CHECK-NEXT: ret
602 ; UNSAFE-LABEL:      olt_inverse_y:
603 ; UNSAFE-NEXT: maxsd  {{[^,]*}}, %xmm0
604 ; UNSAFE-NEXT: ret
605 ; FINITE-LABEL:      olt_inverse_y:
606 ; FINITE-NEXT: movsd  {{[^,]*}}, %xmm1
607 ; FINITE-NEXT: maxsd  %xmm0, %xmm1
608 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
609 ; FINITE-NEXT: ret
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
613   ret double %d
614 }
615
616 ; CHECK-LABEL:      oge_y:
617 ; CHECK:      cmplesd %xmm0
618 ; UNSAFE-LABEL:      oge_y:
619 ; UNSAFE-NEXT: maxsd   {{[^,]*}}, %xmm0
620 ; UNSAFE-NEXT: ret
621 ; FINITE-LABEL:      oge_y:
622 ; FINITE-NEXT: maxsd   {{[^,]*}}, %xmm0
623 ; FINITE-NEXT: ret
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
627   ret double %d
628 }
629
630 ; CHECK-LABEL:      ole_y:
631 ; CHECK:      cmplesd %xmm
632 ; UNSAFE-LABEL:      ole_y:
633 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
634 ; UNSAFE-NEXT: ret
635 ; FINITE-LABEL:      ole_y:
636 ; FINITE-NEXT: minsd {{[^,]*}}, %xmm0
637 ; FINITE-NEXT: ret
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
641   ret double %d
642 }
643
644 ; CHECK-LABEL:      oge_inverse_y:
645 ; CHECK:      cmplesd %xmm0
646 ; UNSAFE-LABEL:      oge_inverse_y:
647 ; UNSAFE-NEXT: minsd   {{[^,]*}}, %xmm0
648 ; UNSAFE-NEXT: ret
649 ; FINITE-LABEL:      oge_inverse_y:
650 ; FINITE-NEXT: movsd   {{[^,]*}}, %xmm1
651 ; FINITE-NEXT: minsd   %xmm0, %xmm1
652 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
653 ; FINITE-NEXT: ret
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
657   ret double %d
658 }
659
660 ; CHECK-LABEL:      ole_inverse_y:
661 ; CHECK:      cmplesd %xmm
662 ; UNSAFE-LABEL:      ole_inverse_y:
663 ; UNSAFE-NEXT: maxsd   {{[^,]*}}, %xmm0
664 ; UNSAFE-NEXT: ret
665 ; FINITE-LABEL:      ole_inverse_y:
666 ; FINITE-NEXT: movsd   {{[^,]*}}, %xmm1
667 ; FINITE-NEXT: maxsd   %xmm0, %xmm1
668 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
669 ; FINITE-NEXT: ret
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
673   ret double %d
674 }
675
676 ; CHECK-LABEL:      ugt_y:
677 ; CHECK:      cmpnlesd %xmm
678 ; UNSAFE-LABEL:      ugt_y:
679 ; UNSAFE-NEXT: maxsd   {{[^,]*}}, %xmm0
680 ; UNSAFE-NEXT: ret
681 ; FINITE-LABEL:      ugt_y:
682 ; FINITE-NEXT: maxsd   {{[^,]*}}, %xmm0
683 ; FINITE-NEXT: ret
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
687   ret double %d
688 }
689
690 ; CHECK-LABEL:      ult_y:
691 ; CHECK:      cmpnlesd %xmm0
692 ; UNSAFE-LABEL:      ult_y:
693 ; UNSAFE-NEXT: minsd   {{[^,]*}}, %xmm0
694 ; UNSAFE-NEXT: ret
695 ; FINITE-LABEL:      ult_y:
696 ; FINITE-NEXT: minsd   {{[^,]*}}, %xmm0
697 ; FINITE-NEXT: ret
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
701   ret double %d
702 }
703
704 ; CHECK-LABEL:      ugt_inverse_y:
705 ; CHECK:      cmpnlesd %xmm
706 ; UNSAFE-LABEL:      ugt_inverse_y:
707 ; UNSAFE-NEXT: minsd   {{[^,]*}}, %xmm0
708 ; UNSAFE-NEXT: ret
709 ; FINITE-LABEL:      ugt_inverse_y:
710 ; FINITE-NEXT: movsd   {{[^,]*}}, %xmm1
711 ; FINITE-NEXT: minsd   %xmm0, %xmm1
712 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
713 ; FINITE-NEXT: ret
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
717   ret double %d
718 }
719
720 ; CHECK-LABEL:      ult_inverse_y:
721 ; CHECK:      cmpnlesd %xmm
722 ; UNSAFE-LABEL:      ult_inverse_y:
723 ; UNSAFE-NEXT: maxsd   {{[^,]*}}, %xmm0
724 ; UNSAFE-NEXT: ret
725 ; FINITE-LABEL:      ult_inverse_y:
726 ; FINITE-NEXT: movsd   {{[^,]*}}, %xmm1
727 ; FINITE-NEXT: maxsd   %xmm0, %xmm1
728 ; FINITE-NEXT: movap{{[sd]}}  %xmm1, %xmm0
729 ; FINITE-NEXT: ret
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
733   ret double %d
734 }
735
736 ; CHECK-LABEL:      uge_y:
737 ; CHECK-NEXT: movsd  {{[^,]*}}, %xmm1
738 ; CHECK-NEXT: maxsd  %xmm0, %xmm1
739 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
740 ; CHECK-NEXT: ret
741 ; UNSAFE-LABEL:      uge_y:
742 ; UNSAFE-NEXT: maxsd  {{[^,]*}}, %xmm0
743 ; UNSAFE-NEXT: ret
744 ; FINITE-LABEL:      uge_y:
745 ; FINITE-NEXT: maxsd  {{[^,]*}}, %xmm0
746 ; FINITE-NEXT: ret
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
750   ret double %d
751 }
752
753 ; CHECK-LABEL:      ule_y:
754 ; CHECK-NEXT: movsd  {{[^,]*}}, %xmm1
755 ; CHECK-NEXT: minsd  %xmm0, %xmm1
756 ; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
757 ; CHECK-NEXT: ret
758 ; UNSAFE-LABEL:      ule_y:
759 ; UNSAFE-NEXT: minsd  {{[^,]*}}, %xmm0
760 ; UNSAFE-NEXT: ret
761 ; FINITE-LABEL:      ule_y:
762 ; FINITE-NEXT: minsd  {{[^,]*}}, %xmm0
763 ; FINITE-NEXT: ret
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
767   ret double %d
768 }
769
770 ; CHECK-LABEL:      uge_inverse_y:
771 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
772 ; CHECK-NEXT: ret
773 ; UNSAFE-LABEL:      uge_inverse_y:
774 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
775 ; UNSAFE-NEXT: ret
776 ; FINITE-LABEL:      uge_inverse_y:
777 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
778 ; FINITE-NEXT: minsd %xmm0, %xmm1
779 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
780 ; FINITE-NEXT: ret
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
784   ret double %d
785 }
786
787 ; CHECK-LABEL:      ule_inverse_y:
788 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
789 ; CHECK-NEXT: ret
790 ; UNSAFE-LABEL:      ule_inverse_y:
791 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
792 ; UNSAFE-NEXT: ret
793 ; FINITE-LABEL:      ule_inverse_y:
794 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
795 ; FINITE-NEXT: maxsd %xmm0, %xmm1
796 ; FINITE-NEXT: movap{{[sd]}} %xmm1, %xmm0
797 ; FINITE-NEXT: ret
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
801   ret double %d
802 }
803 ; Test a few more misc. cases.
804
805 ; CHECK-LABEL: clampTo3k_a:
806 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
807 ; CHECK-NEXT: minsd %xmm0, %xmm1
808 ; CHECK-NEXT: movapd %xmm1, %xmm0
809 ; CHECK-NEXT: ret
810 ; UNSAFE-LABEL: clampTo3k_a:
811 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
812 ; UNSAFE-NEXT: ret
813 ; FINITE-LABEL: clampTo3k_a:
814 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
815 ; FINITE-NEXT: minsd %xmm0, %xmm1
816 ; FINITE-NEXT: movapd %xmm1, %xmm0
817 ; FINITE-NEXT: ret
818 define double @clampTo3k_a(double %x) nounwind readnone {
819 entry:
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]
822   ret double %x_addr.0
823 }
824
825 ; CHECK-LABEL: clampTo3k_b:
826 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
827 ; CHECK-NEXT: ret
828 ; UNSAFE-LABEL: clampTo3k_b:
829 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
830 ; UNSAFE-NEXT: ret
831 ; FINITE-LABEL: clampTo3k_b:
832 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
833 ; FINITE-NEXT: minsd %xmm0, %xmm1
834 ; FINITE-NEXT: movapd %xmm1, %xmm0
835 ; FINITE-NEXT: ret
836 define double @clampTo3k_b(double %x) nounwind readnone {
837 entry:
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]
840   ret double %x_addr.0
841 }
842
843 ; CHECK-LABEL: clampTo3k_c:
844 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
845 ; CHECK-NEXT: maxsd %xmm0, %xmm1
846 ; CHECK-NEXT: movapd %xmm1, %xmm0
847 ; CHECK-NEXT: ret
848 ; UNSAFE-LABEL: clampTo3k_c:
849 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
850 ; UNSAFE-NEXT: ret
851 ; FINITE-LABEL: clampTo3k_c:
852 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
853 ; FINITE-NEXT: maxsd %xmm0, %xmm1
854 ; FINITE-NEXT: movapd %xmm1, %xmm0
855 ; FINITE-NEXT: ret
856 define double @clampTo3k_c(double %x) nounwind readnone {
857 entry:
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]
860   ret double %x_addr.0
861 }
862
863 ; CHECK-LABEL: clampTo3k_d:
864 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
865 ; CHECK-NEXT: ret
866 ; UNSAFE-LABEL: clampTo3k_d:
867 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
868 ; UNSAFE-NEXT: ret
869 ; FINITE-LABEL: clampTo3k_d:
870 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
871 ; FINITE-NEXT: maxsd %xmm0, %xmm1
872 ; FINITE-NEXT: movapd %xmm1, %xmm0
873 ; FINITE-NEXT: ret
874 define double @clampTo3k_d(double %x) nounwind readnone {
875 entry:
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]
878   ret double %x_addr.0
879 }
880
881 ; CHECK-LABEL: clampTo3k_e:
882 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
883 ; CHECK-NEXT: maxsd %xmm0, %xmm1
884 ; CHECK-NEXT: movapd %xmm1, %xmm0
885 ; CHECK-NEXT: ret
886 ; UNSAFE-LABEL: clampTo3k_e:
887 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
888 ; UNSAFE-NEXT: ret
889 ; FINITE-LABEL: clampTo3k_e:
890 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
891 ; FINITE-NEXT: maxsd %xmm0, %xmm1
892 ; FINITE-NEXT: movapd %xmm1, %xmm0
893 ; FINITE-NEXT: ret
894 define double @clampTo3k_e(double %x) nounwind readnone {
895 entry:
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]
898   ret double %x_addr.0
899 }
900
901 ; CHECK-LABEL: clampTo3k_f:
902 ; CHECK-NEXT: maxsd {{[^,]*}}, %xmm0
903 ; CHECK-NEXT: ret
904 ; UNSAFE-LABEL: clampTo3k_f:
905 ; UNSAFE-NEXT: maxsd {{[^,]*}}, %xmm0
906 ; UNSAFE-NEXT: ret
907 ; FINITE-LABEL: clampTo3k_f:
908 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
909 ; FINITE-NEXT: maxsd %xmm0, %xmm1
910 ; FINITE-NEXT: movapd %xmm1, %xmm0
911 ; FINITE-NEXT: ret
912 define double @clampTo3k_f(double %x) nounwind readnone {
913 entry:
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]
916   ret double %x_addr.0
917 }
918
919 ; CHECK-LABEL: clampTo3k_g:
920 ; CHECK-NEXT: movsd {{[^,]*}}, %xmm1
921 ; CHECK-NEXT: minsd %xmm0, %xmm1
922 ; CHECK-NEXT: movapd %xmm1, %xmm0
923 ; CHECK-NEXT: ret
924 ; UNSAFE-LABEL: clampTo3k_g:
925 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
926 ; UNSAFE-NEXT: ret
927 ; FINITE-LABEL: clampTo3k_g:
928 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
929 ; FINITE-NEXT: minsd %xmm0, %xmm1
930 ; FINITE-NEXT: movapd %xmm1, %xmm0
931 ; FINITE-NEXT: ret
932 define double @clampTo3k_g(double %x) nounwind readnone {
933 entry:
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]
936   ret double %x_addr.0
937 }
938
939 ; CHECK-LABEL: clampTo3k_h:
940 ; CHECK-NEXT: minsd {{[^,]*}}, %xmm0
941 ; CHECK-NEXT: ret
942 ; UNSAFE-LABEL: clampTo3k_h:
943 ; UNSAFE-NEXT: minsd {{[^,]*}}, %xmm0
944 ; UNSAFE-NEXT: ret
945 ; FINITE-LABEL: clampTo3k_h:
946 ; FINITE-NEXT: movsd {{[^,]*}}, %xmm1
947 ; FINITE-NEXT: minsd %xmm0, %xmm1
948 ; FINITE-NEXT: movapd %xmm1, %xmm0
949 ; FINITE-NEXT: ret
950 define double @clampTo3k_h(double %x) nounwind readnone {
951 entry:
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]
954   ret double %x_addr.0
955 }
956
957 ; UNSAFE-LABEL: test_maxpd:
958 ; UNSAFE-NEXT: maxpd %xmm1, %xmm0
959 ; UNSAFE-NEXT: ret
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
964 }
965
966 ; UNSAFE-LABEL: test_minpd:
967 ; UNSAFE-NEXT: minpd %xmm1, %xmm0
968 ; UNSAFE-NEXT: ret
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
973 }
974
975 ; UNSAFE-LABEL: test_maxps:
976 ; UNSAFE-NEXT: maxps %xmm1, %xmm0
977 ; UNSAFE-NEXT: ret
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
981   ret <4 x float> %max
982 }
983
984 ; UNSAFE-LABEL: test_minps:
985 ; UNSAFE-NEXT: minps %xmm1, %xmm0
986 ; UNSAFE-NEXT: ret
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
990   ret <4 x float> %min
991 }
992
993 ; UNSAFE-LABEL: test_maxps_illegal_v2f32:
994 ; UNSAFE-NEXT: maxps %xmm1, %xmm0
995 ; UNSAFE-NEXT: ret
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
999   ret <2 x float> %max
1000 }
1001
1002 ; UNSAFE-LABEL: test_minps_illegal_v2f32:
1003 ; UNSAFE-NEXT: minps %xmm1, %xmm0
1004 ; UNSAFE-NEXT: ret
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
1009 }
1010
1011 ; UNSAFE-LABEL: test_maxps_illegal_v3f32:
1012 ; UNSAFE-NEXT: maxps %xmm1, %xmm0
1013 ; UNSAFE-NEXT: ret
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
1018 }
1019
1020 ; UNSAFE-LABEL: test_minps_illegal_v3f32:
1021 ; UNSAFE-NEXT: minps %xmm1, %xmm0
1022 ; UNSAFE-NEXT: ret
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
1027 }