[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / PowerPC / fast-isel-conversion.ll
blob3dd53e7f8176041c4099a73191a7ccf35498e3e4
1 ; FIXME: FastISel currently returns false if it hits code that uses VSX
2 ; registers and with -fast-isel-abort=1 turned on the test case will then fail.
3 ; When fastisel better supports VSX fix up this test case.
5 ; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort=1 -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=-vsx | FileCheck %s
6 ; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort=1 -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 -mattr=-vsx | FileCheck %s
7 ; RUN: llc < %s -O0 -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=970 -mattr=-vsx | FileCheck %s --check-prefix=PPC970
9 ;; Tests for 970 don't use -fast-isel-abort=1 because we intentionally punt
10 ;; to SelectionDAG in some cases.
12 ; Test sitofp
14 define void @sitofp_single_i64(i64 %a, float %b) nounwind {
15 entry:
16 ; CHECK: sitofp_single_i64
17 ; PPC970: sitofp_single_i64
18   %b.addr = alloca float, align 4
19   %conv = sitofp i64 %a to float
20 ; CHECK: std
21 ; CHECK: lfd
22 ; CHECK: fcfids
23 ; PPC970: std
24 ; PPC970: lfd
25 ; PPC970: fcfid
26 ; PPC970: frsp
27   store float %conv, float* %b.addr, align 4
28   ret void
31 define void @sitofp_single_i32(i32 %a, float %b) nounwind {
32 entry:
33 ; CHECK: sitofp_single_i32
34 ; PPC970: sitofp_single_i32
35   %b.addr = alloca float, align 4
36   %conv = sitofp i32 %a to float
37 ; CHECK: std
38 ; CHECK-NEXT: li
39 ; CHECK-NEXT: lfiwax
40 ; CHECK-NEXT: fcfids
41 ; PPC970: std
42 ; PPC970: lfd
43 ; PPC970: fcfid
44 ; PPC970: frsp
45   store float %conv, float* %b.addr, align 4
46   ret void
49 define void @sitofp_single_i16(i16 %a, float %b) nounwind {
50 entry:
51 ; CHECK: sitofp_single_i16
52 ; PPC970: sitofp_single_i16
53   %b.addr = alloca float, align 4
54   %conv = sitofp i16 %a to float
55 ; CHECK: extsh
56 ; CHECK: std
57 ; CHECK: lfd
58 ; CHECK: fcfids
59 ; PPC970: extsh
60 ; PPC970: std
61 ; PPC970: lfd
62 ; PPC970: fcfid
63 ; PPC970: frsp
64   store float %conv, float* %b.addr, align 4
65   ret void
68 define void @sitofp_single_i8(i8 %a) nounwind {
69 entry:
70 ; CHECK: sitofp_single_i8
71 ; PPC970: sitofp_single_i8
72   %b.addr = alloca float, align 4
73   %conv = sitofp i8 %a to float
74 ; CHECK: extsb
75 ; CHECK: std
76 ; CHECK: lfd
77 ; CHECK: fcfids
78 ; PPC970: extsb
79 ; PPC970: std
80 ; PPC970: lfd
81 ; PPC970: fcfid
82 ; PPC970: frsp
83   store float %conv, float* %b.addr, align 4
84   ret void
87 define void @sitofp_double_i32(i32 %a, double %b) nounwind {
88 entry:
89 ; CHECK: sitofp_double_i32
90 ; PPC970: sitofp_double_i32
91   %b.addr = alloca double, align 8
92   %conv = sitofp i32 %a to double
93 ; CHECK: std
94 ; CHECK-NOT: ori
95 ; CHECK: li
96 ; CHECK-NOT: ori
97 ; CHECK: lfiwax
98 ; CHECK: fcfid
99 ; PPC970: std
100 ; PPC970: lfd
101 ; PPC970: fcfid
102   store double %conv, double* %b.addr, align 8
103   ret void
106 define void @sitofp_double_i64(i64 %a, double %b) nounwind {
107 entry:
108 ; CHECK: sitofp_double_i64
109 ; PPC970: sitofp_double_i64
110   %b.addr = alloca double, align 8
111   %conv = sitofp i64 %a to double
112 ; CHECK: std
113 ; CHECK: lfd
114 ; CHECK: fcfid
115 ; PPC970: std
116 ; PPC970: lfd
117 ; PPC970: fcfid
118   store double %conv, double* %b.addr, align 8
119   ret void
122 define void @sitofp_double_i16(i16 %a, double %b) nounwind {
123 entry:
124 ; CHECK: sitofp_double_i16
125 ; PPC970: sitofp_double_i16
126   %b.addr = alloca double, align 8
127   %conv = sitofp i16 %a to double
128 ; CHECK: extsh
129 ; CHECK: std
130 ; CHECK: lfd
131 ; CHECK: fcfid
132 ; PPC970: extsh
133 ; PPC970: std
134 ; PPC970: lfd
135 ; PPC970: fcfid
136   store double %conv, double* %b.addr, align 8
137   ret void
140 define void @sitofp_double_i8(i8 %a, double %b) nounwind {
141 entry:
142 ; CHECK: sitofp_double_i8
143 ; PPC970: sitofp_double_i8
144   %b.addr = alloca double, align 8
145   %conv = sitofp i8 %a to double
146 ; CHECK: extsb
147 ; CHECK: std
148 ; CHECK: lfd
149 ; CHECK: fcfid
150 ; PPC970: extsb
151 ; PPC970: std
152 ; PPC970: lfd
153 ; PPC970: fcfid
154   store double %conv, double* %b.addr, align 8
155   ret void
158 ; Test uitofp
160 define void @uitofp_single_i64(i64 %a, float %b) nounwind {
161 entry:
162 ; CHECK: uitofp_single_i64
163 ; PPC970: uitofp_single_i64
164   %b.addr = alloca float, align 4
165   %conv = uitofp i64 %a to float
166 ; CHECK: std
167 ; CHECK: lfd
168 ; CHECK: fcfidus
169 ; PPC970-NOT: fcfidus
170   store float %conv, float* %b.addr, align 4
171   ret void
174 define void @uitofp_single_i32(i32 %a, float %b) nounwind {
175 entry:
176 ; CHECK: uitofp_single_i32
177 ; PPC970: uitofp_single_i32
178   %b.addr = alloca float, align 4
179   %conv = uitofp i32 %a to float
180 ; CHECK: std
181 ; CHECK-NOT: ori
182 ; CHECK: li
183 ; CHECK-NOT: ori
184 ; CHECK: lfiwzx
185 ; CHECK: fcfidus
186 ; PPC970-NOT: lfiwzx
187 ; PPC970-NOT: fcfidus
188   store float %conv, float* %b.addr, align 4
189   ret void
192 define void @uitofp_single_i16(i16 %a, float %b) nounwind {
193 entry:
194 ; CHECK: uitofp_single_i16
195 ; PPC970: uitofp_single_i16
196   %b.addr = alloca float, align 4
197   %conv = uitofp i16 %a to float
198 ; CHECK: clrldi {{[0-9]+}}, {{[0-9]+}}, 48
199 ; CHECK: std
200 ; CHECK: lfd
201 ; CHECK: fcfidus
202 ; PPC970: clrlwi {{[0-9]+}}, {{[0-9]+}}, 16
203 ; PPC970: std
204 ; PPC970: lfd
205 ; PPC970: fcfid
206 ; PPC970: frsp
207   store float %conv, float* %b.addr, align 4
208   ret void
211 define void @uitofp_single_i8(i8 %a) nounwind {
212 entry:
213 ; CHECK: uitofp_single_i8
214 ; PPC970: uitofp_single_i8
215   %b.addr = alloca float, align 4
216   %conv = uitofp i8 %a to float
217 ; CHECK: clrldi {{[0-9]+}}, {{[0-9]+}}, 56
218 ; CHECK: std
219 ; CHECK: lfd
220 ; CHECK: fcfidus
221 ; PPC970: clrlwi {{[0-9]+}}, {{[0-9]+}}, 24
222 ; PPC970: std
223 ; PPC970: lfd
224 ; PPC970: fcfid
225 ; PPC970: frsp
226   store float %conv, float* %b.addr, align 4
227   ret void
230 define void @uitofp_double_i64(i64 %a, double %b) nounwind {
231 entry:
232 ; CHECK: uitofp_double_i64
233 ; PPC970: uitofp_double_i64
234   %b.addr = alloca double, align 8
235   %conv = uitofp i64 %a to double
236 ; CHECK: std
237 ; CHECK: lfd
238 ; CHECK: fcfidu
239 ; PPC970-NOT: fcfidu
240   store double %conv, double* %b.addr, align 8
241   ret void
244 define void @uitofp_double_i32(i32 %a, double %b) nounwind {
245 entry:
246 ; CHECK: uitofp_double_i32
247 ; PPC970: uitofp_double_i32
248   %b.addr = alloca double, align 8
249   %conv = uitofp i32 %a to double
250 ; CHECK: std
251 ; CHECK-NEXT: li
252 ; CHECK-NEXT: lfiwzx
253 ; CHECK-NEXT: fcfidu
254 ; CHECKLE: fcfidu
255 ; PPC970-NOT: lfiwzx
256 ; PPC970-NOT: fcfidu
257   store double %conv, double* %b.addr, align 8
258   ret void
261 define void @uitofp_double_i16(i16 %a, double %b) nounwind {
262 entry:
263 ; CHECK: uitofp_double_i16
264 ; PPC970: uitofp_double_i16
265   %b.addr = alloca double, align 8
266   %conv = uitofp i16 %a to double
267 ; CHECK: clrldi {{[0-9]+}}, {{[0-9]+}}, 48
268 ; CHECK: std
269 ; CHECK: lfd
270 ; CHECK: fcfidu
271 ; PPC970: clrlwi {{[0-9]+}}, {{[0-9]+}}, 16
272 ; PPC970: std
273 ; PPC970: lfd
274 ; PPC970: fcfid
275   store double %conv, double* %b.addr, align 8
276   ret void
279 define void @uitofp_double_i8(i8 %a, double %b) nounwind {
280 entry:
281 ; CHECK: uitofp_double_i8
282 ; PPC970: uitofp_double_i8
283   %b.addr = alloca double, align 8
284   %conv = uitofp i8 %a to double
285 ; CHECK: clrldi {{[0-9]+}}, {{[0-9]+}}, 56
286 ; CHECK: std
287 ; CHECK: lfd
288 ; CHECK: fcfidu
289 ; PPC970: clrlwi {{[0-9]+}}, {{[0-9]+}}, 24
290 ; PPC970: std
291 ; PPC970: lfd
292 ; PPC970: fcfid
293   store double %conv, double* %b.addr, align 8
294   ret void
297 ; Test fptosi
299 define void @fptosi_float_i32(float %a) nounwind {
300 entry:
301 ; CHECK: fptosi_float_i32
302 ; PPC970: fptosi_float_i32
303   %b.addr = alloca i32, align 4
304   %conv = fptosi float %a to i32
305 ; CHECK: fctiwz
306 ; CHECK: stfd
307 ; CHECK: lwa
308 ; PPC970: fctiwz
309 ; PPC970: stfd
310 ; PPC970: lwa
311   store i32 %conv, i32* %b.addr, align 4
312   ret void
315 define void @fptosi_float_i64(float %a) nounwind {
316 entry:
317 ; CHECK: fptosi_float_i64
318 ; PPC970: fptosi_float_i64
319   %b.addr = alloca i64, align 4
320   %conv = fptosi float %a to i64
321 ; CHECK: fctidz
322 ; CHECK: stfd
323 ; CHECK: ld
324 ; PPC970: fctidz
325 ; PPC970: stfd
326 ; PPC970: ld
327   store i64 %conv, i64* %b.addr, align 4
328   ret void
331 define void @fptosi_double_i32(double %a) nounwind {
332 entry:
333 ; CHECK: fptosi_double_i32
334 ; PPC970: fptosi_double_i32
335   %b.addr = alloca i32, align 8
336   %conv = fptosi double %a to i32
337 ; CHECK: fctiwz
338 ; CHECK: stfd
339 ; CHECK: lwa
340 ; PPC970: fctiwz
341 ; PPC970: stfd
342 ; PPC970: lwa
343   store i32 %conv, i32* %b.addr, align 8
344   ret void
347 define void @fptosi_double_i64(double %a) nounwind {
348 entry:
349 ; CHECK: fptosi_double_i64
350 ; PPC970: fptosi_double_i64
351   %b.addr = alloca i64, align 8
352   %conv = fptosi double %a to i64
353 ; CHECK: fctidz
354 ; CHECK: stfd
355 ; CHECK: ld
356 ; PPC970: fctidz
357 ; PPC970: stfd
358 ; PPC970: ld
359   store i64 %conv, i64* %b.addr, align 8
360   ret void
363 ; Test fptoui
365 define void @fptoui_float_i32(float %a) nounwind {
366 entry:
367 ; CHECK: fptoui_float_i32
368 ; PPC970: fptoui_float_i32
369   %b.addr = alloca i32, align 4
370   %conv = fptoui float %a to i32
371 ; CHECK: fctiwuz
372 ; CHECK: stfd
373 ; CHECK: lwz
374 ; PPC970: fctidz
375 ; PPC970: stfd
376 ; PPC970: lwz
377   store i32 %conv, i32* %b.addr, align 4
378   ret void
381 define void @fptoui_float_i64(float %a) nounwind {
382 entry:
383 ; CHECK: fptoui_float_i64
384 ; PPC970: fptoui_float_i64
385   %b.addr = alloca i64, align 4
386   %conv = fptoui float %a to i64
387 ; CHECK: fctiduz
388 ; CHECK: stfd
389 ; CHECK: ld
390 ; PPC970-NOT: fctiduz
391   store i64 %conv, i64* %b.addr, align 4
392   ret void
395 define void @fptoui_double_i32(double %a) nounwind {
396 entry:
397 ; CHECK: fptoui_double_i32
398 ; PPC970: fptoui_double_i32
399   %b.addr = alloca i32, align 8
400   %conv = fptoui double %a to i32
401 ; CHECK: fctiwuz
402 ; CHECK: stfd
403 ; CHECK: lwz
404 ; PPC970: fctidz
405 ; PPC970: stfd
406 ; PPC970: lwz
407   store i32 %conv, i32* %b.addr, align 8
408   ret void
411 define void @fptoui_double_i64(double %a) nounwind {
412 entry:
413 ; CHECK: fptoui_double_i64
414 ; PPC970: fptoui_double_i64
415   %b.addr = alloca i64, align 8
416   %conv = fptoui double %a to i64
417 ; CHECK: fctiduz
418 ; CHECK: stfd
419 ; CHECK: ld
420 ; PPC970-NOT: fctiduz
421   store i64 %conv, i64* %b.addr, align 8
422   ret void