Use Align for TFL::TransientStackAlignment
[llvm-core.git] / test / CodeGen / X86 / cmov-fp.ll
blobd32ccffe4932cada4551bf71e61b0cc1c6150faf
1 ; RUN: llc -mtriple=i686-- -mcpu pentium4 < %s | FileCheck %s -check-prefix=SSE
2 ; RUN: llc -mtriple=i686-- -mcpu pentium3 < %s | FileCheck %s -check-prefix=NOSSE2
3 ; RUN: llc -mtriple=i686-- -mcpu pentium2 < %s | FileCheck %s -check-prefix=NOSSE1
4 ; RUN: llc -mtriple=i686-- -mcpu pentium < %s | FileCheck %s -check-prefix=NOCMOV
5 ; PR14035
7 define double @test1(i32 %a, i32 %b, double %x) nounwind {
8   %cmp = icmp ugt i32 %a, %b
9   %sel = select i1 %cmp, double 99.0, double %x
10   ret double %sel
12 ; SSE-LABEL: test1:
13 ; SSE: movsd
15 ; NOSSE2-LABEL: test1:
16 ; NOSSE2: fcmovnbe
18 ; NOSSE1-LABEL: test1:
19 ; NOSSE1: fcmovnbe
21 ; NOCMOV-LABEL: test1:
22 ; NOCMOV: fstp
26 define double @test2(i32 %a, i32 %b, double %x) nounwind {
27   %cmp = icmp uge i32 %a, %b
28   %sel = select i1 %cmp, double 99.0, double %x
29   ret double %sel
31 ; SSE-LABEL: test2:
32 ; SSE: movsd
34 ; NOSSE2-LABEL: test2:
35 ; NOSSE2: fcmovnb
37 ; NOSSE1-LABEL: test2:
38 ; NOSSE1: fcmovnb
40 ; NOCMOV-LABEL: test2:
41 ; NOCMOV: fstp
44 define double @test3(i32 %a, i32 %b, double %x) nounwind {
45   %cmp = icmp ult i32 %a, %b
46   %sel = select i1 %cmp, double 99.0, double %x
47   ret double %sel
49 ; SSE-LABEL: test3:
50 ; SSE: movsd
52 ; NOSSE2-LABEL: test3:
53 ; NOSSE2: fcmovb
55 ; NOSSE1-LABEL: test3:
56 ; NOSSE1: fcmovb
58 ; NOCMOV-LABEL: test3:
59 ; NOCMOV: fstp
62 define double @test4(i32 %a, i32 %b, double %x) nounwind {
63   %cmp = icmp ule i32 %a, %b
64   %sel = select i1 %cmp, double 99.0, double %x
65   ret double %sel
67 ; SSE-LABEL: test4:
68 ; SSE: movsd
70 ; NOSSE2-LABEL: test4:
71 ; NOSSE2: fcmovbe
73 ; NOSSE1-LABEL: test4:
74 ; NOSSE1: fcmovbe
76 ; NOCMOV-LABEL: test4:
77 ; NOCMOV: fstp
80 define double @test5(i32 %a, i32 %b, double %x) nounwind {
81   %cmp = icmp sgt i32 %a, %b
82   %sel = select i1 %cmp, double 99.0, double %x
83   ret double %sel
85 ; SSE-LABEL: test5:
86 ; SSE: movsd
88 ; NOSSE2-LABEL: test5:
89 ; NOSSE2: fstp
91 ; NOSSE1-LABEL: test5:
92 ; NOSSE1: fstp
94 ; NOCMOV-LABEL: test5:
95 ; NOCMOV: fstp
98 define double @test6(i32 %a, i32 %b, double %x) nounwind {
99   %cmp = icmp sge i32 %a, %b
100   %sel = select i1 %cmp, double 99.0, double %x
101   ret double %sel
103 ; SSE-LABEL: test6:
104 ; SSE: movsd
106 ; NOSSE2-LABEL: test6:
107 ; NOSSE2: fstp
109 ; NOSSE1-LABEL: test6:
110 ; NOSSE1: fstp
112 ; NOCMOV-LABEL: test6:
113 ; NOCMOV: fstp
116 define double @test7(i32 %a, i32 %b, double %x) nounwind {
117   %cmp = icmp slt i32 %a, %b
118   %sel = select i1 %cmp, double 99.0, double %x
119   ret double %sel
121 ; SSE-LABEL: test7:
122 ; SSE: movsd
124 ; NOSSE2-LABEL: test7:
125 ; NOSSE2: fstp
127 ; NOSSE1-LABEL: test7:
128 ; NOSSE1: fstp
130 ; NOCMOV-LABEL: test7:
131 ; NOCMOV: fstp
134 define double @test8(i32 %a, i32 %b, double %x) nounwind {
135   %cmp = icmp sle i32 %a, %b
136   %sel = select i1 %cmp, double 99.0, double %x
137   ret double %sel
139 ; SSE-LABEL: test8:
140 ; SSE: movsd
142 ; NOSSE2-LABEL: test8:
143 ; NOSSE2: fstp
145 ; NOSSE1-LABEL: test8:
146 ; NOSSE1: fstp
148 ; NOCMOV-LABEL: test8:
149 ; NOCMOV: fstp
152 define float @test9(i32 %a, i32 %b, float %x) nounwind {
153   %cmp = icmp ugt i32 %a, %b
154   %sel = select i1 %cmp, float 99.0, float %x
155   ret float %sel
157 ; SSE-LABEL: test9:
158 ; SSE: movss
160 ; NOSSE2-LABEL: test9:
161 ; NOSSE2: movss
163 ; NOSSE1-LABEL: test9:
164 ; NOSSE1: fcmovnbe
166 ; NOCMOV-LABEL: test9:
167 ; NOCMOV: fstp
170 define float @test10(i32 %a, i32 %b, float %x) nounwind {
171   %cmp = icmp uge i32 %a, %b
172   %sel = select i1 %cmp, float 99.0, float %x
173   ret float %sel
175 ; SSE-LABEL: test10:
176 ; SSE: movss
178 ; NOSSE2-LABEL: test10:
179 ; NOSSE2: movss
181 ; NOSSE1-LABEL: test10:
182 ; NOSSE1: fcmovnb
184 ; NOCMOV-LABEL: test10:
185 ; NOCMOV: fstp
188 define float @test11(i32 %a, i32 %b, float %x) nounwind {
189   %cmp = icmp ult i32 %a, %b
190   %sel = select i1 %cmp, float 99.0, float %x
191   ret float %sel
193 ; SSE-LABEL: test11:
194 ; SSE: movss
196 ; NOSSE2-LABEL: test11:
197 ; NOSSE2: movss
199 ; NOSSE1-LABEL: test11:
200 ; NOSSE1: fcmovb
202 ; NOCMOV-LABEL: test11:
203 ; NOCMOV: fstp
206 define float @test12(i32 %a, i32 %b, float %x) nounwind {
207   %cmp = icmp ule i32 %a, %b
208   %sel = select i1 %cmp, float 99.0, float %x
209   ret float %sel
211 ; SSE-LABEL: test12:
212 ; SSE: movss
214 ; NOSSE2-LABEL: test12:
215 ; NOSSE2: movss
217 ; NOSSE1-LABEL: test12:
218 ; NOSSE1: fcmovbe
220 ; NOCMOV-LABEL: test12:
221 ; NOCMOV: fstp
224 define float @test13(i32 %a, i32 %b, float %x) nounwind {
225   %cmp = icmp sgt i32 %a, %b
226   %sel = select i1 %cmp, float 99.0, float %x
227   ret float %sel
229 ; SSE-LABEL: test13:
230 ; SSE: movss
232 ; NOSSE2-LABEL: test13:
233 ; NOSSE2: movss
235 ; NOSSE1-LABEL: test13:
236 ; NOSSE1: fstp
238 ; NOCMOV-LABEL: test13:
239 ; NOCMOV: fstp
242 define float @test14(i32 %a, i32 %b, float %x) nounwind {
243   %cmp = icmp sge i32 %a, %b
244   %sel = select i1 %cmp, float 99.0, float %x
245   ret float %sel
247 ; SSE-LABEL: test14:
248 ; SSE: movss
250 ; NOSSE2-LABEL: test14:
251 ; NOSSE2: movss
253 ; NOSSE1-LABEL: test14:
254 ; NOSSE1: fstp
256 ; NOCMOV-LABEL: test14:
257 ; NOCMOV: fstp
260 define float @test15(i32 %a, i32 %b, float %x) nounwind {
261   %cmp = icmp slt i32 %a, %b
262   %sel = select i1 %cmp, float 99.0, float %x
263   ret float %sel
265 ; SSE-LABEL: test15:
266 ; SSE: movss
268 ; NOSSE2-LABEL: test15:
269 ; NOSSE2: movss
271 ; NOSSE1-LABEL: test15:
272 ; NOSSE1: fstp
274 ; NOCMOV-LABEL: test15:
275 ; NOCMOV: fstp
278 define float @test16(i32 %a, i32 %b, float %x) nounwind {
279   %cmp = icmp sle i32 %a, %b
280   %sel = select i1 %cmp, float 99.0, float %x
281   ret float %sel
283 ; SSE-LABEL: test16:
284 ; SSE: movss
286 ; NOSSE2-LABEL: test16:
287 ; NOSSE2: movss
289 ; NOSSE1-LABEL: test16:
290 ; NOSSE1: fstp
292 ; NOCMOV-LABEL: test16:
293 ; NOCMOV: fstp
296 define x86_fp80 @test17(i32 %a, i32 %b, x86_fp80 %x) nounwind {
297   %cmp = icmp ugt i32 %a, %b
298   %sel = select i1 %cmp, x86_fp80 0xK4005C600000000000000, x86_fp80 %x
299   ret x86_fp80 %sel
301 ; SSE-LABEL: test17:
302 ; SSE: fcmovnbe
304 ; NOSSE2-LABEL: test17:
305 ; NOSSE2: fcmovnbe
307 ; NOSSE1-LABEL: test17:
308 ; NOSSE1: fcmovnbe
310 ; NOCMOV-LABEL: test17:
311 ; NOCMOV: fstp
314 define x86_fp80 @test18(i32 %a, i32 %b, x86_fp80 %x) nounwind {
315   %cmp = icmp uge i32 %a, %b
316   %sel = select i1 %cmp, x86_fp80 0xK4005C600000000000000, x86_fp80 %x
317   ret x86_fp80 %sel
319 ; SSE-LABEL: test18:
320 ; SSE: fcmovnb
322 ; NOSSE2-LABEL: test18:
323 ; NOSSE2: fcmovnb
325 ; NOSSE1-LABEL: test18:
326 ; NOSSE1: fcmovnb
328 ; NOCMOV-LABEL: test18:
329 ; NOCMOV: fstp
332 define x86_fp80 @test19(i32 %a, i32 %b, x86_fp80 %x) nounwind {
333   %cmp = icmp ult i32 %a, %b
334   %sel = select i1 %cmp, x86_fp80 0xK4005C600000000000000, x86_fp80 %x
335   ret x86_fp80 %sel
337 ; SSE-LABEL: test19:
338 ; SSE: fcmovb
340 ; NOSSE2-LABEL: test19:
341 ; NOSSE2: fcmovb
343 ; NOSSE1-LABEL: test19:
344 ; NOSSE1: fcmovb
346 ; NOCMOV-LABEL: test19:
347 ; NOCMOV: fstp
350 define x86_fp80 @test20(i32 %a, i32 %b, x86_fp80 %x) nounwind {
351   %cmp = icmp ule i32 %a, %b
352   %sel = select i1 %cmp, x86_fp80 0xK4005C600000000000000, x86_fp80 %x
353   ret x86_fp80 %sel
355 ; SSE-LABEL: test20:
356 ; SSE: fcmovbe
358 ; NOSSE2-LABEL: test20:
359 ; NOSSE2: fcmovbe
361 ; NOSSE1-LABEL: test20:
362 ; NOSSE1: fcmovbe
364 ; NOCMOV-LABEL: test20:
365 ; NOCMOV: fstp
368 define x86_fp80 @test21(i32 %a, i32 %b, x86_fp80 %x) nounwind {
369   %cmp = icmp sgt i32 %a, %b
370   %sel = select i1 %cmp, x86_fp80 0xK4005C600000000000000, x86_fp80 %x
371   ret x86_fp80 %sel
373 ; We don't emit a branch for fp80, why?
374 ; SSE-LABEL: test21:
375 ; SSE: testb
376 ; SSE: fcmovne
378 ; NOSSE2-LABEL: test21:
379 ; NOSSE2: testb
380 ; NOSSE2: fcmovne
382 ; NOSSE1-LABEL: test21:
383 ; NOSSE1: testb
384 ; NOSSE1: fcmovne
386 ; NOCMOV-LABEL: test21:
387 ; NOCMOV: fstp
390 define x86_fp80 @test22(i32 %a, i32 %b, x86_fp80 %x) nounwind {
391   %cmp = icmp sge i32 %a, %b
392   %sel = select i1 %cmp, x86_fp80 0xK4005C600000000000000, x86_fp80 %x
393   ret x86_fp80 %sel
395 ; SSE-LABEL: test22:
396 ; SSE: testb
397 ; SSE: fcmovne
399 ; NOSSE2-LABEL: test22:
400 ; NOSSE2: testb
401 ; NOSSE2: fcmovne
403 ; NOSSE1-LABEL: test22:
404 ; NOSSE1: testb
405 ; NOSSE1: fcmovne
407 ; NOCMOV-LABEL: test22:
408 ; NOCMOV: fstp
411 define x86_fp80 @test23(i32 %a, i32 %b, x86_fp80 %x) nounwind {
412   %cmp = icmp slt i32 %a, %b
413   %sel = select i1 %cmp, x86_fp80 0xK4005C600000000000000, x86_fp80 %x
414   ret x86_fp80 %sel
416 ; SSE-LABEL: test23:
417 ; SSE: testb
418 ; SSE: fcmovne
420 ; NOSSE2-LABEL: test23:
421 ; NOSSE2: testb
422 ; NOSSE2: fcmovne
424 ; NOSSE1-LABEL: test23:
425 ; NOSSE1: testb
426 ; NOSSE1: fcmovne
428 ; NOCMOV-LABEL: test23:
429 ; NOCMOV: fstp
432 define x86_fp80 @test24(i32 %a, i32 %b, x86_fp80 %x) nounwind {
433   %cmp = icmp sle i32 %a, %b
434   %sel = select i1 %cmp, x86_fp80 0xK4005C600000000000000, x86_fp80 %x
435   ret x86_fp80 %sel
437 ; SSE-LABEL: test24:
438 ; SSE: testb
439 ; SSE: fcmovne
441 ; NOSSE2-LABEL: test24:
442 ; NOSSE2: testb
443 ; NOSSE2: fcmovne
445 ; NOSSE1-LABEL: test24:
446 ; NOSSE1: testb
447 ; NOSSE1: fcmovne
449 ; NOCMOV-LABEL: test24:
450 ; NOCMOV: fstp