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; 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.
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
24define 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
39define 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
56define 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
73define 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
87define 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
99define 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
114define 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
129define 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
147define 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
165define 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
185define 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
205define 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
222define 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
239define 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
257define 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
274define 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
288define 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
302define 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
317define 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
332define 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
348define 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
364define 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
380define 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
396define 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
413define 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
430define 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
448define 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
466define 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
485define 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
504define 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
523define 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
542define 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
557define 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
572define 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
591define 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
610define 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
624define 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
638define 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
654define 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
670define 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
684define 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
698define 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
714define 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
730define 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
747define 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
764define 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
781define 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
798define 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: movaps %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: movaps %xmm1, %xmm0
817; FINITE-NEXT: ret
818define double @clampTo3k_a(double %x) nounwind readnone {
819entry:
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: movaps %xmm1, %xmm0
835; FINITE-NEXT: ret
836define double @clampTo3k_b(double %x) nounwind readnone {
837entry:
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: movaps %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: movaps %xmm1, %xmm0
855; FINITE-NEXT: ret
856define double @clampTo3k_c(double %x) nounwind readnone {
857entry:
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: movaps %xmm1, %xmm0
873; FINITE-NEXT: ret
874define double @clampTo3k_d(double %x) nounwind readnone {
875entry:
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: movaps %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: movaps %xmm1, %xmm0
893; FINITE-NEXT: ret
894define double @clampTo3k_e(double %x) nounwind readnone {
895entry:
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: movaps %xmm1, %xmm0
911; FINITE-NEXT: ret
912define double @clampTo3k_f(double %x) nounwind readnone {
913entry:
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: movaps %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: movaps %xmm1, %xmm0
931; FINITE-NEXT: ret
932define double @clampTo3k_g(double %x) nounwind readnone {
933entry:
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: movaps %xmm1, %xmm0
949; FINITE-NEXT: ret
950define double @clampTo3k_h(double %x) nounwind readnone {
951entry:
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
960define <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
969define <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
978define <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
987define <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
996define <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
1005define <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
1014define <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
1023define <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}
1028