blob: f8590fdb28850cb31ab0397c8cbfb7b41e7739fa [file] [log] [blame]
Dan Gohman670e5392009-09-21 18:03:22 +00001; RUN: llc < %s -march=x86-64 -asm-verbose=false | FileCheck %s
Dan Gohmanfc90d4c2010-02-22 18:53:26 +00002; RUN: llc < %s -march=x86-64 -asm-verbose=false -enable-unsafe-fp-math | FileCheck -check-prefix=UNSAFE %s
Dan Gohman670e5392009-09-21 18:03:22 +00003
4; Some of these patterns can be matched as SSE min or max. Some of
5; then can be matched provided that the operands are swapped.
6; Some of them can't be matched at all and require a comparison
7; and a conditional branch.
8
9; The naming convention is {,x_}{o,u}{gt,lt,ge,le}{,_inverse}
10; x_ : use 0.0 instead of %y
11; _inverse : swap the arms of the select.
12
13; CHECK: ogt:
14; CHECK-NEXT: maxsd %xmm1, %xmm0
15; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +000016; UNSAFE: ogt:
17; UNSAFE-NEXT: maxsd %xmm1, %xmm0
18; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +000019define double @ogt(double %x, double %y) nounwind {
20 %c = fcmp ogt double %x, %y
21 %d = select i1 %c, double %x, double %y
22 ret double %d
23}
24
25; CHECK: olt:
26; CHECK-NEXT: minsd %xmm1, %xmm0
27; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +000028; UNSAFE: olt:
29; UNSAFE-NEXT: minsd %xmm1, %xmm0
30; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +000031define double @olt(double %x, double %y) nounwind {
32 %c = fcmp olt double %x, %y
33 %d = select i1 %c, double %x, double %y
34 ret double %d
35}
36
37; CHECK: ogt_inverse:
38; CHECK-NEXT: minsd %xmm0, %xmm1
39; CHECK-NEXT: movapd %xmm1, %xmm0
40; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +000041; UNSAFE: ogt_inverse:
42; UNSAFE-NEXT: minsd %xmm0, %xmm1
43; UNSAFE-NEXT: movapd %xmm1, %xmm0
44; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +000045define double @ogt_inverse(double %x, double %y) nounwind {
46 %c = fcmp ogt double %x, %y
47 %d = select i1 %c, double %y, double %x
48 ret double %d
49}
50
51; CHECK: olt_inverse:
52; CHECK-NEXT: maxsd %xmm0, %xmm1
53; CHECK-NEXT: movapd %xmm1, %xmm0
54; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +000055; UNSAFE: olt_inverse:
56; UNSAFE-NEXT: maxsd %xmm0, %xmm1
57; UNSAFE-NEXT: movapd %xmm1, %xmm0
58; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +000059define double @olt_inverse(double %x, double %y) nounwind {
60 %c = fcmp olt double %x, %y
61 %d = select i1 %c, double %y, double %x
62 ret double %d
63}
64
65; CHECK: oge:
66; CHECK-NEXT: ucomisd %xmm1, %xmm0
Dan Gohmanfc90d4c2010-02-22 18:53:26 +000067; UNSAFE: oge:
68; UNSAFE-NEXT: maxsd %xmm1, %xmm0
69; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +000070define double @oge(double %x, double %y) nounwind {
71 %c = fcmp oge double %x, %y
72 %d = select i1 %c, double %x, double %y
73 ret double %d
74}
75
76; CHECK: ole:
77; CHECK-NEXT: ucomisd %xmm0, %xmm1
Dan Gohmanfc90d4c2010-02-22 18:53:26 +000078; UNSAFE: ole:
79; UNSAFE-NEXT: minsd %xmm1, %xmm0
Dan Gohman670e5392009-09-21 18:03:22 +000080define double @ole(double %x, double %y) nounwind {
81 %c = fcmp ole double %x, %y
82 %d = select i1 %c, double %x, double %y
83 ret double %d
84}
85
86; CHECK: oge_inverse:
87; CHECK-NEXT: ucomisd %xmm1, %xmm0
Dan Gohmanfc90d4c2010-02-22 18:53:26 +000088; UNSAFE: oge_inverse:
89; UNSAFE-NEXT: minsd %xmm0, %xmm1
90; UNSAFE-NEXT: movapd %xmm1, %xmm0
91; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +000092define double @oge_inverse(double %x, double %y) nounwind {
93 %c = fcmp oge double %x, %y
94 %d = select i1 %c, double %y, double %x
95 ret double %d
96}
97
98; CHECK: ole_inverse:
99; CHECK-NEXT: ucomisd %xmm0, %xmm1
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000100; UNSAFE: ole_inverse:
101; UNSAFE-NEXT: maxsd %xmm0, %xmm1
102; UNSAFE-NEXT: movapd %xmm1, %xmm0
103; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000104define double @ole_inverse(double %x, double %y) nounwind {
105 %c = fcmp ole double %x, %y
106 %d = select i1 %c, double %y, double %x
107 ret double %d
108}
109
110; CHECK: x_ogt:
111; CHECK-NEXT: pxor %xmm1, %xmm1
112; CHECK-NEXT: maxsd %xmm1, %xmm0
113; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000114; UNSAFE: x_ogt:
115; UNSAFE-NEXT: pxor %xmm1, %xmm1
116; UNSAFE-NEXT: maxsd %xmm1, %xmm0
117; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000118define double @x_ogt(double %x) nounwind {
119 %c = fcmp ogt double %x, 0.000000e+00
120 %d = select i1 %c, double %x, double 0.000000e+00
121 ret double %d
122}
123
124; CHECK: x_olt:
125; CHECK-NEXT: pxor %xmm1, %xmm1
126; CHECK-NEXT: minsd %xmm1, %xmm0
127; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000128; UNSAFE: x_olt:
129; UNSAFE-NEXT: pxor %xmm1, %xmm1
130; UNSAFE-NEXT: minsd %xmm1, %xmm0
131; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000132define double @x_olt(double %x) nounwind {
133 %c = fcmp olt double %x, 0.000000e+00
134 %d = select i1 %c, double %x, double 0.000000e+00
135 ret double %d
136}
137
138; CHECK: x_ogt_inverse:
139; CHECK-NEXT: pxor %xmm1, %xmm1
140; CHECK-NEXT: minsd %xmm0, %xmm1
141; CHECK-NEXT: movapd %xmm1, %xmm0
142; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000143; UNSAFE: x_ogt_inverse:
144; UNSAFE-NEXT: pxor %xmm1, %xmm1
145; UNSAFE-NEXT: minsd %xmm0, %xmm1
146; UNSAFE-NEXT: movapd %xmm1, %xmm0
147; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000148define double @x_ogt_inverse(double %x) nounwind {
149 %c = fcmp ogt double %x, 0.000000e+00
150 %d = select i1 %c, double 0.000000e+00, double %x
151 ret double %d
152}
153
154; CHECK: x_olt_inverse:
155; CHECK-NEXT: pxor %xmm1, %xmm1
156; CHECK-NEXT: maxsd %xmm0, %xmm1
157; CHECK-NEXT: movapd %xmm1, %xmm0
158; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000159; UNSAFE: x_olt_inverse:
160; UNSAFE-NEXT: pxor %xmm1, %xmm1
161; UNSAFE-NEXT: maxsd %xmm0, %xmm1
162; UNSAFE-NEXT: movapd %xmm1, %xmm0
163; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000164define double @x_olt_inverse(double %x) nounwind {
165 %c = fcmp olt double %x, 0.000000e+00
166 %d = select i1 %c, double 0.000000e+00, double %x
167 ret double %d
168}
169
170; CHECK: x_oge:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000171; CHECK: ucomisd %xmm1, %xmm0
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000172; UNSAFE: x_oge:
173; UNSAFE-NEXT: pxor %xmm1, %xmm1
174; UNSAFE-NEXT: maxsd %xmm1, %xmm0
175; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000176define double @x_oge(double %x) nounwind {
177 %c = fcmp oge double %x, 0.000000e+00
178 %d = select i1 %c, double %x, double 0.000000e+00
179 ret double %d
180}
181
182; CHECK: x_ole:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000183; CHECK: ucomisd %xmm0, %xmm1
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000184; UNSAFE: x_ole:
185; UNSAFE-NEXT: pxor %xmm1, %xmm1
186; UNSAFE-NEXT: minsd %xmm1, %xmm0
187; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000188define double @x_ole(double %x) nounwind {
189 %c = fcmp ole double %x, 0.000000e+00
190 %d = select i1 %c, double %x, double 0.000000e+00
191 ret double %d
192}
193
194; CHECK: x_oge_inverse:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000195; CHECK: ucomisd %xmm1, %xmm0
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000196; UNSAFE: x_oge_inverse:
197; UNSAFE-NEXT: pxor %xmm1, %xmm1
198; UNSAFE-NEXT: minsd %xmm0, %xmm1
199; UNSAFE-NEXT: movapd %xmm1, %xmm0
200; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000201define double @x_oge_inverse(double %x) nounwind {
202 %c = fcmp oge double %x, 0.000000e+00
203 %d = select i1 %c, double 0.000000e+00, double %x
204 ret double %d
205}
206
207; CHECK: x_ole_inverse:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000208; CHECK: ucomisd %xmm0, %xmm1
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000209; UNSAFE: x_ole_inverse:
210; UNSAFE-NEXT: pxor %xmm1, %xmm1
211; UNSAFE-NEXT: maxsd %xmm0, %xmm1
212; UNSAFE-NEXT: movapd %xmm1, %xmm0
213; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000214define double @x_ole_inverse(double %x) nounwind {
215 %c = fcmp ole double %x, 0.000000e+00
216 %d = select i1 %c, double 0.000000e+00, double %x
217 ret double %d
218}
219
220; CHECK: ugt:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000221; CHECK: ucomisd %xmm0, %xmm1
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000222; UNSAFE: ugt:
223; UNSAFE-NEXT: maxsd %xmm1, %xmm0
224; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000225define double @ugt(double %x, double %y) nounwind {
226 %c = fcmp ugt double %x, %y
227 %d = select i1 %c, double %x, double %y
228 ret double %d
229}
230
231; CHECK: ult:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000232; CHECK: ucomisd %xmm1, %xmm0
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000233; UNSAFE: ult:
234; UNSAFE-NEXT: minsd %xmm1, %xmm0
235; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000236define double @ult(double %x, double %y) nounwind {
237 %c = fcmp ult double %x, %y
238 %d = select i1 %c, double %x, double %y
239 ret double %d
240}
241
242; CHECK: ugt_inverse:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000243; CHECK: ucomisd %xmm0, %xmm1
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000244; UNSAFE: ugt_inverse:
245; UNSAFE-NEXT: minsd %xmm0, %xmm1
246; UNSAFE-NEXT: movapd %xmm1, %xmm0
247; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000248define double @ugt_inverse(double %x, double %y) nounwind {
249 %c = fcmp ugt double %x, %y
250 %d = select i1 %c, double %y, double %x
251 ret double %d
252}
253
254; CHECK: ult_inverse:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000255; CHECK: ucomisd %xmm1, %xmm0
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000256; UNSAFE: ult_inverse:
257; UNSAFE-NEXT: maxsd %xmm0, %xmm1
258; UNSAFE-NEXT: movapd %xmm1, %xmm0
259; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000260define double @ult_inverse(double %x, double %y) nounwind {
261 %c = fcmp ult double %x, %y
262 %d = select i1 %c, double %y, double %x
263 ret double %d
264}
265
266; CHECK: uge:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000267; CHECK-NEXT: maxsd %xmm1, %xmm0
Dan Gohman670e5392009-09-21 18:03:22 +0000268; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000269; UNSAFE: uge:
270; UNSAFE-NEXT: maxsd %xmm1, %xmm0
271; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000272define double @uge(double %x, double %y) nounwind {
273 %c = fcmp uge double %x, %y
274 %d = select i1 %c, double %x, double %y
275 ret double %d
276}
277
278; CHECK: ule:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000279; CHECK-NEXT: minsd %xmm1, %xmm0
Dan Gohman670e5392009-09-21 18:03:22 +0000280; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000281; UNSAFE: ule:
282; UNSAFE-NEXT: minsd %xmm1, %xmm0
283; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000284define double @ule(double %x, double %y) nounwind {
285 %c = fcmp ule double %x, %y
286 %d = select i1 %c, double %x, double %y
287 ret double %d
288}
289
290; CHECK: uge_inverse:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000291; CHECK-NEXT: minsd %xmm0, %xmm1
292; CHECK-NEXT: movapd %xmm1, %xmm0
Dan Gohman670e5392009-09-21 18:03:22 +0000293; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000294; UNSAFE: uge_inverse:
295; UNSAFE-NEXT: minsd %xmm0, %xmm1
296; UNSAFE-NEXT: movapd %xmm1, %xmm0
297; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000298define double @uge_inverse(double %x, double %y) nounwind {
299 %c = fcmp uge double %x, %y
300 %d = select i1 %c, double %y, double %x
301 ret double %d
302}
303
304; CHECK: ule_inverse:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000305; CHECK-NEXT: maxsd %xmm0, %xmm1
306; CHECK-NEXT: movapd %xmm1, %xmm0
Dan Gohman670e5392009-09-21 18:03:22 +0000307; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000308; UNSAFE: ule_inverse:
309; UNSAFE-NEXT: maxsd %xmm0, %xmm1
310; UNSAFE-NEXT: movapd %xmm1, %xmm0
311; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000312define double @ule_inverse(double %x, double %y) nounwind {
313 %c = fcmp ule double %x, %y
314 %d = select i1 %c, double %y, double %x
315 ret double %d
316}
317
318; CHECK: x_ugt:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000319; CHECK: ucomisd %xmm0, %xmm1
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000320; UNSAFE: x_ugt:
321; UNSAFE-NEXT: pxor %xmm1, %xmm1
322; UNSAFE-NEXT: maxsd %xmm1, %xmm0
323; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000324define double @x_ugt(double %x) nounwind {
325 %c = fcmp ugt double %x, 0.000000e+00
326 %d = select i1 %c, double %x, double 0.000000e+00
327 ret double %d
328}
329
330; CHECK: x_ult:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000331; CHECK: ucomisd %xmm1, %xmm0
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000332; UNSAFE: x_ult:
333; UNSAFE-NEXT: pxor %xmm1, %xmm1
334; UNSAFE-NEXT: minsd %xmm1, %xmm0
335; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000336define double @x_ult(double %x) nounwind {
337 %c = fcmp ult double %x, 0.000000e+00
338 %d = select i1 %c, double %x, double 0.000000e+00
339 ret double %d
340}
341
342; CHECK: x_ugt_inverse:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000343; CHECK: ucomisd %xmm0, %xmm1
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000344; UNSAFE: x_ugt_inverse:
345; UNSAFE-NEXT: pxor %xmm1, %xmm1
346; UNSAFE-NEXT: minsd %xmm0, %xmm1
347; UNSAFE-NEXT: movapd %xmm1, %xmm0
348; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000349define double @x_ugt_inverse(double %x) nounwind {
350 %c = fcmp ugt double %x, 0.000000e+00
351 %d = select i1 %c, double 0.000000e+00, double %x
352 ret double %d
353}
354
355; CHECK: x_ult_inverse:
Dan Gohman8ce05da2010-02-22 04:03:39 +0000356; CHECK: ucomisd %xmm1, %xmm0
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000357; UNSAFE: x_ult_inverse:
358; UNSAFE-NEXT: pxor %xmm1, %xmm1
359; UNSAFE-NEXT: maxsd %xmm0, %xmm1
360; UNSAFE-NEXT: movapd %xmm1, %xmm0
361; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000362define double @x_ult_inverse(double %x) nounwind {
363 %c = fcmp ult double %x, 0.000000e+00
364 %d = select i1 %c, double 0.000000e+00, double %x
365 ret double %d
366}
367
368; CHECK: x_uge:
369; CHECK-NEXT: pxor %xmm1, %xmm1
Dan Gohman8ce05da2010-02-22 04:03:39 +0000370; CHECK-NEXT: maxsd %xmm1, %xmm0
Dan Gohman670e5392009-09-21 18:03:22 +0000371; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000372; UNSAFE: x_uge:
373; UNSAFE-NEXT: pxor %xmm1, %xmm1
374; UNSAFE-NEXT: maxsd %xmm1, %xmm0
375; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000376define double @x_uge(double %x) nounwind {
377 %c = fcmp uge double %x, 0.000000e+00
378 %d = select i1 %c, double %x, double 0.000000e+00
379 ret double %d
380}
381
382; CHECK: x_ule:
383; CHECK-NEXT: pxor %xmm1, %xmm1
Dan Gohman8ce05da2010-02-22 04:03:39 +0000384; CHECK-NEXT: minsd %xmm1, %xmm0
Dan Gohman670e5392009-09-21 18:03:22 +0000385; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000386; UNSAFE: x_ule:
387; UNSAFE-NEXT: pxor %xmm1, %xmm1
388; UNSAFE-NEXT: minsd %xmm1, %xmm0
389; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000390define double @x_ule(double %x) nounwind {
391 %c = fcmp ule double %x, 0.000000e+00
392 %d = select i1 %c, double %x, double 0.000000e+00
393 ret double %d
394}
395
396; CHECK: x_uge_inverse:
397; CHECK-NEXT: pxor %xmm1, %xmm1
Dan Gohman8ce05da2010-02-22 04:03:39 +0000398; CHECK-NEXT: minsd %xmm0, %xmm1
399; CHECK-NEXT: movapd %xmm1, %xmm0
Dan Gohman670e5392009-09-21 18:03:22 +0000400; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000401; UNSAFE: x_uge_inverse:
402; UNSAFE-NEXT: pxor %xmm1, %xmm1
403; UNSAFE-NEXT: minsd %xmm0, %xmm1
404; UNSAFE-NEXT: movapd %xmm1, %xmm0
405; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000406define double @x_uge_inverse(double %x) nounwind {
407 %c = fcmp uge double %x, 0.000000e+00
408 %d = select i1 %c, double 0.000000e+00, double %x
409 ret double %d
410}
411
412; CHECK: x_ule_inverse:
413; CHECK-NEXT: pxor %xmm1, %xmm1
Dan Gohman8ce05da2010-02-22 04:03:39 +0000414; CHECK-NEXT: maxsd %xmm0, %xmm1
415; CHECK-NEXT: movapd %xmm1, %xmm0
Dan Gohman670e5392009-09-21 18:03:22 +0000416; CHECK-NEXT: ret
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000417; UNSAFE: x_ule_inverse:
418; UNSAFE-NEXT: pxor %xmm1, %xmm1
419; UNSAFE-NEXT: maxsd %xmm0, %xmm1
420; UNSAFE-NEXT: movapd %xmm1, %xmm0
421; UNSAFE-NEXT: ret
Dan Gohman670e5392009-09-21 18:03:22 +0000422define double @x_ule_inverse(double %x) nounwind {
423 %c = fcmp ule double %x, 0.000000e+00
424 %d = select i1 %c, double 0.000000e+00, double %x
425 ret double %d
426}
427
428; Test a few more misc. cases.
Dan Gohman8d44b282009-09-03 20:34:31 +0000429
430; CHECK: clampTo3k_a:
431; CHECK: minsd
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000432; UNSAFE: clampTo3k_a:
433; UNSAFE: minsd
Dan Gohman8d44b282009-09-03 20:34:31 +0000434define double @clampTo3k_a(double %x) nounwind readnone {
435entry:
436 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
437 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
438 ret double %x_addr.0
439}
440
441; CHECK: clampTo3k_b:
442; CHECK: minsd
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000443; UNSAFE: clampTo3k_b:
444; UNSAFE: minsd
Dan Gohman8d44b282009-09-03 20:34:31 +0000445define double @clampTo3k_b(double %x) nounwind readnone {
446entry:
447 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
448 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
449 ret double %x_addr.0
450}
451
452; CHECK: clampTo3k_c:
453; CHECK: maxsd
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000454; UNSAFE: clampTo3k_c:
455; UNSAFE: maxsd
Dan Gohman8d44b282009-09-03 20:34:31 +0000456define double @clampTo3k_c(double %x) nounwind readnone {
457entry:
458 %0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
459 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
460 ret double %x_addr.0
461}
462
463; CHECK: clampTo3k_d:
464; CHECK: maxsd
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000465; UNSAFE: clampTo3k_d:
466; UNSAFE: maxsd
Dan Gohman8d44b282009-09-03 20:34:31 +0000467define double @clampTo3k_d(double %x) nounwind readnone {
468entry:
469 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
470 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
471 ret double %x_addr.0
472}
473
474; CHECK: clampTo3k_e:
475; CHECK: maxsd
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000476; UNSAFE: clampTo3k_e:
477; UNSAFE: maxsd
Dan Gohman8d44b282009-09-03 20:34:31 +0000478define double @clampTo3k_e(double %x) nounwind readnone {
479entry:
480 %0 = fcmp olt double %x, 3.000000e+03 ; <i1> [#uses=1]
481 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
482 ret double %x_addr.0
483}
484
485; CHECK: clampTo3k_f:
486; CHECK: maxsd
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000487; UNSAFE: clampTo3k_f:
488; UNSAFE: maxsd
Dan Gohman8d44b282009-09-03 20:34:31 +0000489define double @clampTo3k_f(double %x) nounwind readnone {
490entry:
491 %0 = fcmp ule double %x, 3.000000e+03 ; <i1> [#uses=1]
492 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
493 ret double %x_addr.0
494}
495
496; CHECK: clampTo3k_g:
497; CHECK: minsd
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000498; UNSAFE: clampTo3k_g:
499; UNSAFE: minsd
Dan Gohman8d44b282009-09-03 20:34:31 +0000500define double @clampTo3k_g(double %x) nounwind readnone {
501entry:
502 %0 = fcmp ogt double %x, 3.000000e+03 ; <i1> [#uses=1]
503 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
504 ret double %x_addr.0
505}
506
507; CHECK: clampTo3k_h:
508; CHECK: minsd
Dan Gohmanfc90d4c2010-02-22 18:53:26 +0000509; UNSAFE: clampTo3k_h:
510; UNSAFE: minsd
Dan Gohman8d44b282009-09-03 20:34:31 +0000511define double @clampTo3k_h(double %x) nounwind readnone {
512entry:
513 %0 = fcmp uge double %x, 3.000000e+03 ; <i1> [#uses=1]
514 %x_addr.0 = select i1 %0, double 3.000000e+03, double %x ; <double> [#uses=1]
515 ret double %x_addr.0
516}