1 ; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s --check-prefix=ELF64
2 ; RUN: llc < %s -O0 -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=970 | FileCheck %s --check-prefix=PPC970
4 ;; Tests for 970 don't use -fast-isel-abort because we intentionally punt
5 ;; to SelectionDAG in some cases.
9 define void @sitofp_single_i64(i64 %a, float %b) nounwind ssp {
11 ; ELF64: sitofp_single_i64
12 ; PPC970: sitofp_single_i64
13 %b.addr = alloca float, align 4
14 %conv = sitofp i64 %a to float
22 store float %conv, float* %b.addr, align 4
26 define void @sitofp_single_i32(i32 %a, float %b) nounwind ssp {
28 ; ELF64: sitofp_single_i32
29 ; PPC970: sitofp_single_i32
30 %b.addr = alloca float, align 4
31 %conv = sitofp i32 %a to float
39 store float %conv, float* %b.addr, align 4
43 define void @sitofp_single_i16(i16 %a, float %b) nounwind ssp {
45 ; ELF64: sitofp_single_i16
46 ; PPC970: sitofp_single_i16
47 %b.addr = alloca float, align 4
48 %conv = sitofp i16 %a to float
58 store float %conv, float* %b.addr, align 4
62 define void @sitofp_single_i8(i8 %a) nounwind ssp {
64 ; ELF64: sitofp_single_i8
65 ; PPC970: sitofp_single_i8
66 %b.addr = alloca float, align 4
67 %conv = sitofp i8 %a to float
77 store float %conv, float* %b.addr, align 4
81 define void @sitofp_double_i32(i32 %a, double %b) nounwind ssp {
83 ; ELF64: sitofp_double_i32
84 ; PPC970: sitofp_double_i32
85 %b.addr = alloca double, align 8
86 %conv = sitofp i32 %a to double
93 store double %conv, double* %b.addr, align 8
97 define void @sitofp_double_i64(i64 %a, double %b) nounwind ssp {
99 ; ELF64: sitofp_double_i64
100 ; PPC970: sitofp_double_i64
101 %b.addr = alloca double, align 8
102 %conv = sitofp i64 %a to double
109 store double %conv, double* %b.addr, align 8
113 define void @sitofp_double_i16(i16 %a, double %b) nounwind ssp {
115 ; ELF64: sitofp_double_i16
116 ; PPC970: sitofp_double_i16
117 %b.addr = alloca double, align 8
118 %conv = sitofp i16 %a to double
127 store double %conv, double* %b.addr, align 8
131 define void @sitofp_double_i8(i8 %a, double %b) nounwind ssp {
133 ; ELF64: sitofp_double_i8
134 ; PPC970: sitofp_double_i8
135 %b.addr = alloca double, align 8
136 %conv = sitofp i8 %a to double
145 store double %conv, double* %b.addr, align 8
151 define void @uitofp_single_i64(i64 %a, float %b) nounwind ssp {
153 ; ELF64: uitofp_single_i64
154 ; PPC970: uitofp_single_i64
155 %b.addr = alloca float, align 4
156 %conv = uitofp i64 %a to float
160 ; PPC970-NOT: fcfidus
161 store float %conv, float* %b.addr, align 4
165 define void @uitofp_single_i32(i32 %a, float %b) nounwind ssp {
167 ; ELF64: uitofp_single_i32
168 ; PPC970: uitofp_single_i32
169 %b.addr = alloca float, align 4
170 %conv = uitofp i32 %a to float
175 ; PPC970-NOT: fcfidus
176 store float %conv, float* %b.addr, align 4
180 define void @uitofp_single_i16(i16 %a, float %b) nounwind ssp {
182 ; ELF64: uitofp_single_i16
183 ; PPC970: uitofp_single_i16
184 %b.addr = alloca float, align 4
185 %conv = uitofp i16 %a to float
186 ; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 48
190 ; PPC970: rlwinm {{[0-9]+}}, {{[0-9]+}}, 0, 16, 31
195 store float %conv, float* %b.addr, align 4
199 define void @uitofp_single_i8(i8 %a) nounwind ssp {
201 ; ELF64: uitofp_single_i8
202 ; PPC970: uitofp_single_i8
203 %b.addr = alloca float, align 4
204 %conv = uitofp i8 %a to float
205 ; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 56
209 ; PPC970: rlwinm {{[0-9]+}}, {{[0-9]+}}, 0, 24, 31
214 store float %conv, float* %b.addr, align 4
218 define void @uitofp_double_i64(i64 %a, double %b) nounwind ssp {
220 ; ELF64: uitofp_double_i64
221 ; PPC970: uitofp_double_i64
222 %b.addr = alloca double, align 8
223 %conv = uitofp i64 %a to double
228 store double %conv, double* %b.addr, align 8
232 define void @uitofp_double_i32(i32 %a, double %b) nounwind ssp {
234 ; ELF64: uitofp_double_i32
235 ; PPC970: uitofp_double_i32
236 %b.addr = alloca double, align 8
237 %conv = uitofp i32 %a to double
243 store double %conv, double* %b.addr, align 8
247 define void @uitofp_double_i16(i16 %a, double %b) nounwind ssp {
249 ; ELF64: uitofp_double_i16
250 ; PPC970: uitofp_double_i16
251 %b.addr = alloca double, align 8
252 %conv = uitofp i16 %a to double
253 ; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 48
257 ; PPC970: rlwinm {{[0-9]+}}, {{[0-9]+}}, 0, 16, 31
261 store double %conv, double* %b.addr, align 8
265 define void @uitofp_double_i8(i8 %a, double %b) nounwind ssp {
267 ; ELF64: uitofp_double_i8
268 ; PPC970: uitofp_double_i8
269 %b.addr = alloca double, align 8
270 %conv = uitofp i8 %a to double
271 ; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 56
275 ; PPC970: rlwinm {{[0-9]+}}, {{[0-9]+}}, 0, 24, 31
279 store double %conv, double* %b.addr, align 8
285 define void @fptosi_float_i32(float %a) nounwind ssp {
287 ; ELF64: fptosi_float_i32
288 ; PPC970: fptosi_float_i32
289 %b.addr = alloca i32, align 4
290 %conv = fptosi float %a to i32
297 store i32 %conv, i32* %b.addr, align 4
301 define void @fptosi_float_i64(float %a) nounwind ssp {
303 ; ELF64: fptosi_float_i64
304 ; PPC970: fptosi_float_i64
305 %b.addr = alloca i64, align 4
306 %conv = fptosi float %a to i64
313 store i64 %conv, i64* %b.addr, align 4
317 define void @fptosi_double_i32(double %a) nounwind ssp {
319 ; ELF64: fptosi_double_i32
320 ; PPC970: fptosi_double_i32
321 %b.addr = alloca i32, align 8
322 %conv = fptosi double %a to i32
329 store i32 %conv, i32* %b.addr, align 8
333 define void @fptosi_double_i64(double %a) nounwind ssp {
335 ; ELF64: fptosi_double_i64
336 ; PPC970: fptosi_double_i64
337 %b.addr = alloca i64, align 8
338 %conv = fptosi double %a to i64
345 store i64 %conv, i64* %b.addr, align 8
351 define void @fptoui_float_i32(float %a) nounwind ssp {
353 ; ELF64: fptoui_float_i32
354 ; PPC970: fptoui_float_i32
355 %b.addr = alloca i32, align 4
356 %conv = fptoui float %a to i32
363 store i32 %conv, i32* %b.addr, align 4
367 define void @fptoui_float_i64(float %a) nounwind ssp {
369 ; ELF64: fptoui_float_i64
370 ; PPC970: fptoui_float_i64
371 %b.addr = alloca i64, align 4
372 %conv = fptoui float %a to i64
376 ; PPC970-NOT: fctiduz
377 store i64 %conv, i64* %b.addr, align 4
381 define void @fptoui_double_i32(double %a) nounwind ssp {
383 ; ELF64: fptoui_double_i32
384 ; PPC970: fptoui_double_i32
385 %b.addr = alloca i32, align 8
386 %conv = fptoui double %a to i32
393 store i32 %conv, i32* %b.addr, align 8
397 define void @fptoui_double_i64(double %a) nounwind ssp {
399 ; ELF64: fptoui_double_i64
400 ; PPC970: fptoui_double_i64
401 %b.addr = alloca i64, align 8
402 %conv = fptoui double %a to i64
406 ; PPC970-NOT: fctiduz
407 store i64 %conv, i64* %b.addr, align 8