Add a triple to switch.ll test.
[oota-llvm.git] / test / CodeGen / X86 / cmov-fp.ll
1 ; RUN: llc -march x86 -mcpu pentium4 < %s | FileCheck %s -check-prefix=SSE
2 ; RUN: llc -march x86 -mcpu pentium3 < %s | FileCheck %s -check-prefix=NOSSE2
3 ; RUN: llc -march x86 -mcpu pentium2 < %s | FileCheck %s -check-prefix=NOSSE1
4 ; RUN: llc -march x86 -mcpu pentium < %s | FileCheck %s -check-prefix=NOCMOV
5 ; PR14035
6
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
11
12 ; SSE-LABEL: test1:
13 ; SSE: movsd
14
15 ; NOSSE2-LABEL: test1:
16 ; NOSSE2: fcmovnbe
17
18 ; NOSSE1-LABEL: test1:
19 ; NOSSE1: fcmovnbe
20
21 ; NOCMOV-LABEL: test1:
22 ; NOCMOV: fstp
23
24 }
25
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
30
31 ; SSE-LABEL: test2:
32 ; SSE: movsd
33
34 ; NOSSE2-LABEL: test2:
35 ; NOSSE2: fcmovnb
36
37 ; NOSSE1-LABEL: test2:
38 ; NOSSE1: fcmovnb
39
40 ; NOCMOV-LABEL: test2:
41 ; NOCMOV: fstp
42 }
43
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
48
49 ; SSE-LABEL: test3:
50 ; SSE: movsd
51
52 ; NOSSE2-LABEL: test3:
53 ; NOSSE2: fcmovb
54
55 ; NOSSE1-LABEL: test3:
56 ; NOSSE1: fcmovb
57
58 ; NOCMOV-LABEL: test3:
59 ; NOCMOV: fstp
60 }
61
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
66
67 ; SSE-LABEL: test4:
68 ; SSE: movsd
69
70 ; NOSSE2-LABEL: test4:
71 ; NOSSE2: fcmovbe
72
73 ; NOSSE1-LABEL: test4:
74 ; NOSSE1: fcmovbe
75
76 ; NOCMOV-LABEL: test4:
77 ; NOCMOV: fstp
78 }
79
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
84
85 ; SSE-LABEL: test5:
86 ; SSE: movsd
87
88 ; NOSSE2-LABEL: test5:
89 ; NOSSE2: fstp
90
91 ; NOSSE1-LABEL: test5:
92 ; NOSSE1: fstp
93
94 ; NOCMOV-LABEL: test5:
95 ; NOCMOV: fstp
96 }
97
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
102
103 ; SSE-LABEL: test6:
104 ; SSE: movsd
105
106 ; NOSSE2-LABEL: test6:
107 ; NOSSE2: fstp
108
109 ; NOSSE1-LABEL: test6:
110 ; NOSSE1: fstp
111
112 ; NOCMOV-LABEL: test6:
113 ; NOCMOV: fstp
114 }
115
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
120
121 ; SSE-LABEL: test7:
122 ; SSE: movsd
123
124 ; NOSSE2-LABEL: test7:
125 ; NOSSE2: fstp
126
127 ; NOSSE1-LABEL: test7:
128 ; NOSSE1: fstp
129
130 ; NOCMOV-LABEL: test7:
131 ; NOCMOV: fstp
132 }
133
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
138
139 ; SSE-LABEL: test8:
140 ; SSE: movsd
141
142 ; NOSSE2-LABEL: test8:
143 ; NOSSE2: fstp
144
145 ; NOSSE1-LABEL: test8:
146 ; NOSSE1: fstp
147
148 ; NOCMOV-LABEL: test8:
149 ; NOCMOV: fstp
150 }
151
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
156
157 ; SSE-LABEL: test9:
158 ; SSE: movss
159
160 ; NOSSE2-LABEL: test9:
161 ; NOSSE2: movss
162
163 ; NOSSE1-LABEL: test9:
164 ; NOSSE1: fcmovnbe
165
166 ; NOCMOV-LABEL: test9:
167 ; NOCMOV: fstp
168 }
169
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
174
175 ; SSE-LABEL: test10:
176 ; SSE: movss
177
178 ; NOSSE2-LABEL: test10:
179 ; NOSSE2: movss
180
181 ; NOSSE1-LABEL: test10:
182 ; NOSSE1: fcmovnb
183
184 ; NOCMOV-LABEL: test10:
185 ; NOCMOV: fstp
186 }
187
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
192
193 ; SSE-LABEL: test11:
194 ; SSE: movss
195
196 ; NOSSE2-LABEL: test11:
197 ; NOSSE2: movss
198
199 ; NOSSE1-LABEL: test11:
200 ; NOSSE1: fcmovb
201
202 ; NOCMOV-LABEL: test11:
203 ; NOCMOV: fstp
204 }
205
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
210
211 ; SSE-LABEL: test12:
212 ; SSE: movss
213
214 ; NOSSE2-LABEL: test12:
215 ; NOSSE2: movss
216
217 ; NOSSE1-LABEL: test12:
218 ; NOSSE1: fcmovbe
219
220 ; NOCMOV-LABEL: test12:
221 ; NOCMOV: fstp
222 }
223
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
228
229 ; SSE-LABEL: test13:
230 ; SSE: movss
231
232 ; NOSSE2-LABEL: test13:
233 ; NOSSE2: movss
234
235 ; NOSSE1-LABEL: test13:
236 ; NOSSE1: fstp
237
238 ; NOCMOV-LABEL: test13:
239 ; NOCMOV: fstp
240 }
241
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
246
247 ; SSE-LABEL: test14:
248 ; SSE: movss
249
250 ; NOSSE2-LABEL: test14:
251 ; NOSSE2: movss
252
253 ; NOSSE1-LABEL: test14:
254 ; NOSSE1: fstp
255
256 ; NOCMOV-LABEL: test14:
257 ; NOCMOV: fstp
258 }
259
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
264
265 ; SSE-LABEL: test15:
266 ; SSE: movss
267
268 ; NOSSE2-LABEL: test15:
269 ; NOSSE2: movss
270
271 ; NOSSE1-LABEL: test15:
272 ; NOSSE1: fstp
273
274 ; NOCMOV-LABEL: test15:
275 ; NOCMOV: fstp
276 }
277
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
282
283 ; SSE-LABEL: test16:
284 ; SSE: movss
285
286 ; NOSSE2-LABEL: test16:
287 ; NOSSE2: movss
288
289 ; NOSSE1-LABEL: test16:
290 ; NOSSE1: fstp
291
292 ; NOCMOV-LABEL: test16:
293 ; NOCMOV: fstp
294 }
295
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
300
301 ; SSE-LABEL: test17:
302 ; SSE: fcmovnbe
303
304 ; NOSSE2-LABEL: test17:
305 ; NOSSE2: fcmovnbe
306
307 ; NOSSE1-LABEL: test17:
308 ; NOSSE1: fcmovnbe
309
310 ; NOCMOV-LABEL: test17:
311 ; NOCMOV: fstp
312 }
313
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
318
319 ; SSE-LABEL: test18:
320 ; SSE: fcmovnb
321
322 ; NOSSE2-LABEL: test18:
323 ; NOSSE2: fcmovnb
324
325 ; NOSSE1-LABEL: test18:
326 ; NOSSE1: fcmovnb
327
328 ; NOCMOV-LABEL: test18:
329 ; NOCMOV: fstp
330 }
331
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
336
337 ; SSE-LABEL: test19:
338 ; SSE: fcmovb
339
340 ; NOSSE2-LABEL: test19:
341 ; NOSSE2: fcmovb
342
343 ; NOSSE1-LABEL: test19:
344 ; NOSSE1: fcmovb
345
346 ; NOCMOV-LABEL: test19:
347 ; NOCMOV: fstp
348 }
349
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
354
355 ; SSE-LABEL: test20:
356 ; SSE: fcmovbe
357
358 ; NOSSE2-LABEL: test20:
359 ; NOSSE2: fcmovbe
360
361 ; NOSSE1-LABEL: test20:
362 ; NOSSE1: fcmovbe
363
364 ; NOCMOV-LABEL: test20:
365 ; NOCMOV: fstp
366 }
367
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
372
373 ; We don't emit a branch for fp80, why?
374 ; SSE-LABEL: test21:
375 ; SSE: testb
376 ; SSE: fcmovne
377
378 ; NOSSE2-LABEL: test21:
379 ; NOSSE2: testb
380 ; NOSSE2: fcmovne
381
382 ; NOSSE1-LABEL: test21:
383 ; NOSSE1: testb
384 ; NOSSE1: fcmovne
385
386 ; NOCMOV-LABEL: test21:
387 ; NOCMOV: fstp
388 }
389
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
394
395 ; SSE-LABEL: test22:
396 ; SSE: testb
397 ; SSE: fcmovne
398
399 ; NOSSE2-LABEL: test22:
400 ; NOSSE2: testb
401 ; NOSSE2: fcmovne
402
403 ; NOSSE1-LABEL: test22:
404 ; NOSSE1: testb
405 ; NOSSE1: fcmovne
406
407 ; NOCMOV-LABEL: test22:
408 ; NOCMOV: fstp
409 }
410
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
415
416 ; SSE-LABEL: test23:
417 ; SSE: testb
418 ; SSE: fcmovne
419
420 ; NOSSE2-LABEL: test23:
421 ; NOSSE2: testb
422 ; NOSSE2: fcmovne
423
424 ; NOSSE1-LABEL: test23:
425 ; NOSSE1: testb
426 ; NOSSE1: fcmovne
427
428 ; NOCMOV-LABEL: test23:
429 ; NOCMOV: fstp
430 }
431
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
436
437 ; SSE-LABEL: test24:
438 ; SSE: testb
439 ; SSE: fcmovne
440
441 ; NOSSE2-LABEL: test24:
442 ; NOSSE2: testb
443 ; NOSSE2: fcmovne
444
445 ; NOSSE1-LABEL: test24:
446 ; NOSSE1: testb
447 ; NOSSE1: fcmovne
448
449 ; NOCMOV-LABEL: test24:
450 ; NOCMOV: fstp
451 }