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.
14 define void @sitofp_single_i64(i64 %a, float %b) nounwind {
16 ; CHECK: sitofp_single_i64
17 ; PPC970: sitofp_single_i64
18 %b.addr = alloca float, align 4
19 %conv = sitofp i64 %a to float
27 store float %conv, float* %b.addr, align 4
31 define void @sitofp_single_i32(i32 %a, float %b) nounwind {
33 ; CHECK: sitofp_single_i32
34 ; PPC970: sitofp_single_i32
35 %b.addr = alloca float, align 4
36 %conv = sitofp i32 %a to float
45 store float %conv, float* %b.addr, align 4
49 define void @sitofp_single_i16(i16 %a, float %b) nounwind {
51 ; CHECK: sitofp_single_i16
52 ; PPC970: sitofp_single_i16
53 %b.addr = alloca float, align 4
54 %conv = sitofp i16 %a to float
64 store float %conv, float* %b.addr, align 4
68 define void @sitofp_single_i8(i8 %a) nounwind {
70 ; CHECK: sitofp_single_i8
71 ; PPC970: sitofp_single_i8
72 %b.addr = alloca float, align 4
73 %conv = sitofp i8 %a to float
83 store float %conv, float* %b.addr, align 4
87 define void @sitofp_double_i32(i32 %a, double %b) nounwind {
89 ; CHECK: sitofp_double_i32
90 ; PPC970: sitofp_double_i32
91 %b.addr = alloca double, align 8
92 %conv = sitofp i32 %a to double
102 store double %conv, double* %b.addr, align 8
106 define void @sitofp_double_i64(i64 %a, double %b) nounwind {
108 ; CHECK: sitofp_double_i64
109 ; PPC970: sitofp_double_i64
110 %b.addr = alloca double, align 8
111 %conv = sitofp i64 %a to double
118 store double %conv, double* %b.addr, align 8
122 define void @sitofp_double_i16(i16 %a, double %b) nounwind {
124 ; CHECK: sitofp_double_i16
125 ; PPC970: sitofp_double_i16
126 %b.addr = alloca double, align 8
127 %conv = sitofp i16 %a to double
136 store double %conv, double* %b.addr, align 8
140 define void @sitofp_double_i8(i8 %a, double %b) nounwind {
142 ; CHECK: sitofp_double_i8
143 ; PPC970: sitofp_double_i8
144 %b.addr = alloca double, align 8
145 %conv = sitofp i8 %a to double
154 store double %conv, double* %b.addr, align 8
160 define void @uitofp_single_i64(i64 %a, float %b) nounwind {
162 ; CHECK: uitofp_single_i64
163 ; PPC970: uitofp_single_i64
164 %b.addr = alloca float, align 4
165 %conv = uitofp i64 %a to float
169 ; PPC970-NOT: fcfidus
170 store float %conv, float* %b.addr, align 4
174 define void @uitofp_single_i32(i32 %a, float %b) nounwind {
176 ; CHECK: uitofp_single_i32
177 ; PPC970: uitofp_single_i32
178 %b.addr = alloca float, align 4
179 %conv = uitofp i32 %a to float
187 ; PPC970-NOT: fcfidus
188 store float %conv, float* %b.addr, align 4
192 define void @uitofp_single_i16(i16 %a, float %b) nounwind {
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
202 ; PPC970: clrlwi {{[0-9]+}}, {{[0-9]+}}, 16
207 store float %conv, float* %b.addr, align 4
211 define void @uitofp_single_i8(i8 %a) nounwind {
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
221 ; PPC970: clrlwi {{[0-9]+}}, {{[0-9]+}}, 24
226 store float %conv, float* %b.addr, align 4
230 define void @uitofp_double_i64(i64 %a, double %b) nounwind {
232 ; CHECK: uitofp_double_i64
233 ; PPC970: uitofp_double_i64
234 %b.addr = alloca double, align 8
235 %conv = uitofp i64 %a to double
240 store double %conv, double* %b.addr, align 8
244 define void @uitofp_double_i32(i32 %a, double %b) nounwind {
246 ; CHECK: uitofp_double_i32
247 ; PPC970: uitofp_double_i32
248 %b.addr = alloca double, align 8
249 %conv = uitofp i32 %a to double
257 store double %conv, double* %b.addr, align 8
261 define void @uitofp_double_i16(i16 %a, double %b) nounwind {
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
271 ; PPC970: clrlwi {{[0-9]+}}, {{[0-9]+}}, 16
275 store double %conv, double* %b.addr, align 8
279 define void @uitofp_double_i8(i8 %a, double %b) nounwind {
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
289 ; PPC970: clrlwi {{[0-9]+}}, {{[0-9]+}}, 24
293 store double %conv, double* %b.addr, align 8
299 define void @fptosi_float_i32(float %a) nounwind {
301 ; CHECK: fptosi_float_i32
302 ; PPC970: fptosi_float_i32
303 %b.addr = alloca i32, align 4
304 %conv = fptosi float %a to i32
311 store i32 %conv, i32* %b.addr, align 4
315 define void @fptosi_float_i64(float %a) nounwind {
317 ; CHECK: fptosi_float_i64
318 ; PPC970: fptosi_float_i64
319 %b.addr = alloca i64, align 4
320 %conv = fptosi float %a to i64
327 store i64 %conv, i64* %b.addr, align 4
331 define void @fptosi_double_i32(double %a) nounwind {
333 ; CHECK: fptosi_double_i32
334 ; PPC970: fptosi_double_i32
335 %b.addr = alloca i32, align 8
336 %conv = fptosi double %a to i32
343 store i32 %conv, i32* %b.addr, align 8
347 define void @fptosi_double_i64(double %a) nounwind {
349 ; CHECK: fptosi_double_i64
350 ; PPC970: fptosi_double_i64
351 %b.addr = alloca i64, align 8
352 %conv = fptosi double %a to i64
359 store i64 %conv, i64* %b.addr, align 8
365 define void @fptoui_float_i32(float %a) nounwind {
367 ; CHECK: fptoui_float_i32
368 ; PPC970: fptoui_float_i32
369 %b.addr = alloca i32, align 4
370 %conv = fptoui float %a to i32
377 store i32 %conv, i32* %b.addr, align 4
381 define void @fptoui_float_i64(float %a) nounwind {
383 ; CHECK: fptoui_float_i64
384 ; PPC970: fptoui_float_i64
385 %b.addr = alloca i64, align 4
386 %conv = fptoui float %a to i64
390 ; PPC970-NOT: fctiduz
391 store i64 %conv, i64* %b.addr, align 4
395 define void @fptoui_double_i32(double %a) nounwind {
397 ; CHECK: fptoui_double_i32
398 ; PPC970: fptoui_double_i32
399 %b.addr = alloca i32, align 8
400 %conv = fptoui double %a to i32
407 store i32 %conv, i32* %b.addr, align 8
411 define void @fptoui_double_i64(double %a) nounwind {
413 ; CHECK: fptoui_double_i64
414 ; PPC970: fptoui_double_i64
415 %b.addr = alloca i64, align 8
416 %conv = fptoui double %a to i64
420 ; PPC970-NOT: fctiduz
421 store i64 %conv, i64* %b.addr, align 8