xref: /llvm-project/llvm/test/CodeGen/PowerPC/fp-to-int-to-fp.ll (revision d1924f0474b65fe3189ffd658a12f452e4696c28)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mcpu=a2 < %s | FileCheck %s -check-prefix=FPCVT
3; RUN: llc -verify-machineinstrs -mcpu=ppc64 < %s | FileCheck %s -check-prefix=PPC64
4; RUN: llc -verify-machineinstrs -mcpu=pwr9 < %s | FileCheck %s -check-prefix=PWR9
5target datalayout = "E-m:e-i64:64-n32:64"
6target triple = "powerpc64-unknown-linux-gnu"
7
8; Function Attrs: nounwind readnone
9define float @fool(float %X) #0 {
10; FPCVT-LABEL: fool:
11; FPCVT:       # %bb.0: # %entry
12; FPCVT-NEXT:    friz 1, 1
13; FPCVT-NEXT:    blr
14;
15; PPC64-LABEL: fool:
16; PPC64:       # %bb.0: # %entry
17; PPC64-NEXT:    fctidz 0, 1
18; PPC64-NEXT:    fcfid 0, 0
19; PPC64-NEXT:    frsp 1, 0
20; PPC64-NEXT:    blr
21;
22; PWR9-LABEL: fool:
23; PWR9:       # %bb.0: # %entry
24; PWR9-NEXT:    xsrdpiz 1, 1
25; PWR9-NEXT:    blr
26entry:
27  %conv = fptosi float %X to i64
28  %conv1 = sitofp i64 %conv to float
29  ret float %conv1
30
31
32}
33
34; Function Attrs: nounwind readnone
35define double @foodl(double %X) #0 {
36; FPCVT-LABEL: foodl:
37; FPCVT:       # %bb.0: # %entry
38; FPCVT-NEXT:    friz 1, 1
39; FPCVT-NEXT:    blr
40;
41; PPC64-LABEL: foodl:
42; PPC64:       # %bb.0: # %entry
43; PPC64-NEXT:    fctidz 0, 1
44; PPC64-NEXT:    fcfid 1, 0
45; PPC64-NEXT:    blr
46;
47; PWR9-LABEL: foodl:
48; PWR9:       # %bb.0: # %entry
49; PWR9-NEXT:    xsrdpiz 1, 1
50; PWR9-NEXT:    blr
51entry:
52  %conv = fptosi double %X to i64
53  %conv1 = sitofp i64 %conv to double
54  ret double %conv1
55
56
57}
58
59; Function Attrs: nounwind readnone
60define float @fooul(float %X) #0 {
61; FPCVT-LABEL: fooul:
62; FPCVT:       # %bb.0: # %entry
63; FPCVT-NEXT:    friz 1, 1
64; FPCVT-NEXT:    blr
65;
66; PPC64-LABEL: fooul:
67; PPC64:       # %bb.0: # %entry
68; PPC64-NEXT:    addis 3, 2, .LCPI2_0@toc@ha
69; PPC64-NEXT:    lfs 0, .LCPI2_0@toc@l(3)
70; PPC64-NEXT:    fsubs 2, 1, 0
71; PPC64-NEXT:    fcmpu 0, 1, 0
72; PPC64-NEXT:    fctidz 2, 2
73; PPC64-NEXT:    stfd 2, -8(1)
74; PPC64-NEXT:    fctidz 2, 1
75; PPC64-NEXT:    stfd 2, -16(1)
76; PPC64-NEXT:    blt 0, .LBB2_2
77; PPC64-NEXT:  # %bb.1: # %entry
78; PPC64-NEXT:    ld 3, -8(1)
79; PPC64-NEXT:    li 4, 1
80; PPC64-NEXT:    rldic 4, 4, 63, 0
81; PPC64-NEXT:    xor 3, 3, 4
82; PPC64-NEXT:    b .LBB2_3
83; PPC64-NEXT:  .LBB2_2:
84; PPC64-NEXT:    ld 3, -16(1)
85; PPC64-NEXT:  .LBB2_3: # %entry
86; PPC64-NEXT:    sradi 4, 3, 53
87; PPC64-NEXT:    addi 4, 4, 1
88; PPC64-NEXT:    cmpldi 4, 1
89; PPC64-NEXT:    bgt 0, .LBB2_5
90; PPC64-NEXT:  # %bb.4: # %entry
91; PPC64-NEXT:    mr 4, 3
92; PPC64-NEXT:    b .LBB2_6
93; PPC64-NEXT:  .LBB2_5:
94; PPC64-NEXT:    clrldi 4, 3, 53
95; PPC64-NEXT:    addi 4, 4, 2047
96; PPC64-NEXT:    or 4, 4, 3
97; PPC64-NEXT:    rldicr 4, 4, 0, 52
98; PPC64-NEXT:  .LBB2_6: # %entry
99; PPC64-NEXT:    rldicl 5, 3, 10, 54
100; PPC64-NEXT:    clrldi 6, 3, 63
101; PPC64-NEXT:    std 4, -32(1)
102; PPC64-NEXT:    addi 5, 5, 1
103; PPC64-NEXT:    cmpldi 5, 1
104; PPC64-NEXT:    rldicl 5, 3, 63, 1
105; PPC64-NEXT:    or 4, 6, 5
106; PPC64-NEXT:    ble 0, .LBB2_8
107; PPC64-NEXT:  # %bb.7:
108; PPC64-NEXT:    clrldi 4, 4, 53
109; PPC64-NEXT:    addi 4, 4, 2047
110; PPC64-NEXT:    or 4, 4, 5
111; PPC64-NEXT:    rldicl 4, 4, 53, 11
112; PPC64-NEXT:    rldicl 4, 4, 11, 1
113; PPC64-NEXT:  .LBB2_8: # %entry
114; PPC64-NEXT:    cmpdi 3, 0
115; PPC64-NEXT:    std 4, -24(1)
116; PPC64-NEXT:    bc 12, 0, .LBB2_10
117; PPC64-NEXT:  # %bb.9: # %entry
118; PPC64-NEXT:    lfd 0, -32(1)
119; PPC64-NEXT:    fcfid 0, 0
120; PPC64-NEXT:    frsp 1, 0
121; PPC64-NEXT:    blr
122; PPC64-NEXT:  .LBB2_10:
123; PPC64-NEXT:    lfd 0, -24(1)
124; PPC64-NEXT:    fcfid 0, 0
125; PPC64-NEXT:    frsp 0, 0
126; PPC64-NEXT:    fadds 1, 0, 0
127; PPC64-NEXT:    blr
128;
129; PWR9-LABEL: fooul:
130; PWR9:       # %bb.0: # %entry
131; PWR9-NEXT:    xsrdpiz 1, 1
132; PWR9-NEXT:    blr
133entry:
134  %conv = fptoui float %X to i64
135  %conv1 = uitofp i64 %conv to float
136  ret float %conv1
137
138}
139
140; Function Attrs: nounwind readnone
141define double @fooudl(double %X) #0 {
142; FPCVT-LABEL: fooudl:
143; FPCVT:       # %bb.0: # %entry
144; FPCVT-NEXT:    friz 1, 1
145; FPCVT-NEXT:    blr
146;
147; PPC64-LABEL: fooudl:
148; PPC64:       # %bb.0: # %entry
149; PPC64-NEXT:    addis 3, 2, .LCPI3_0@toc@ha
150; PPC64-NEXT:    lfs 0, .LCPI3_0@toc@l(3)
151; PPC64-NEXT:    fsub 2, 1, 0
152; PPC64-NEXT:    fcmpu 0, 1, 0
153; PPC64-NEXT:    fctidz 2, 2
154; PPC64-NEXT:    stfd 2, -8(1)
155; PPC64-NEXT:    fctidz 2, 1
156; PPC64-NEXT:    stfd 2, -16(1)
157; PPC64-NEXT:    blt 0, .LBB3_2
158; PPC64-NEXT:  # %bb.1: # %entry
159; PPC64-NEXT:    ld 3, -8(1)
160; PPC64-NEXT:    li 4, 1
161; PPC64-NEXT:    rldic 4, 4, 63, 0
162; PPC64-NEXT:    xor 3, 3, 4
163; PPC64-NEXT:    b .LBB3_3
164; PPC64-NEXT:  .LBB3_2:
165; PPC64-NEXT:    ld 3, -16(1)
166; PPC64-NEXT:  .LBB3_3: # %entry
167; PPC64-NEXT:    li 5, 1107
168; PPC64-NEXT:    rldicl 4, 3, 32, 32
169; PPC64-NEXT:    rldic 5, 5, 52, 1
170; PPC64-NEXT:    clrldi 3, 3, 32
171; PPC64-NEXT:    or 4, 4, 5
172; PPC64-NEXT:    li 5, 1075
173; PPC64-NEXT:    std 4, -24(1)
174; PPC64-NEXT:    addis 4, 2, .LCPI3_1@toc@ha
175; PPC64-NEXT:    lfd 0, .LCPI3_1@toc@l(4)
176; PPC64-NEXT:    rldic 4, 5, 52, 1
177; PPC64-NEXT:    or 3, 3, 4
178; PPC64-NEXT:    std 3, -32(1)
179; PPC64-NEXT:    lfd 1, -24(1)
180; PPC64-NEXT:    lfd 2, -32(1)
181; PPC64-NEXT:    fsub 0, 1, 0
182; PPC64-NEXT:    fadd 1, 2, 0
183; PPC64-NEXT:    blr
184;
185; PWR9-LABEL: fooudl:
186; PWR9:       # %bb.0: # %entry
187; PWR9-NEXT:    xsrdpiz 1, 1
188; PWR9-NEXT:    blr
189entry:
190  %conv = fptoui double %X to i64
191  %conv1 = uitofp i64 %conv to double
192  ret double %conv1
193
194}
195
196; Function Attrs: nounwind readnone
197define i1 @f64_to_si1(double %X) #0 {
198; FPCVT-LABEL: f64_to_si1:
199; FPCVT:       # %bb.0: # %entry
200; FPCVT-NEXT:    fctiwz 0, 1
201; FPCVT-NEXT:    addi 3, 1, -4
202; FPCVT-NEXT:    stfiwx 0, 0, 3
203; FPCVT-NEXT:    lwz 3, -4(1)
204; FPCVT-NEXT:    blr
205;
206; PPC64-LABEL: f64_to_si1:
207; PPC64:       # %bb.0: # %entry
208; PPC64-NEXT:    addi 3, 1, -4
209; PPC64-NEXT:    fctiwz 0, 1
210; PPC64-NEXT:    stfiwx 0, 0, 3
211; PPC64-NEXT:    lwz 3, -4(1)
212; PPC64-NEXT:    blr
213;
214; PWR9-LABEL: f64_to_si1:
215; PWR9:       # %bb.0: # %entry
216; PWR9-NEXT:    xscvdpsxws 0, 1
217; PWR9-NEXT:    mffprwz 3, 0
218; PWR9-NEXT:    blr
219entry:
220  %conv = fptosi double %X to i1
221  ret i1 %conv
222
223}
224
225; Function Attrs: nounwind readnone
226define i1 @f64_to_ui1(double %X) #0 {
227; FPCVT-LABEL: f64_to_ui1:
228; FPCVT:       # %bb.0: # %entry
229; FPCVT-NEXT:    fctiwz 0, 1
230; FPCVT-NEXT:    addi 3, 1, -4
231; FPCVT-NEXT:    stfiwx 0, 0, 3
232; FPCVT-NEXT:    lwz 3, -4(1)
233; FPCVT-NEXT:    blr
234;
235; PPC64-LABEL: f64_to_ui1:
236; PPC64:       # %bb.0: # %entry
237; PPC64-NEXT:    addi 3, 1, -4
238; PPC64-NEXT:    fctiwz 0, 1
239; PPC64-NEXT:    stfiwx 0, 0, 3
240; PPC64-NEXT:    lwz 3, -4(1)
241; PPC64-NEXT:    blr
242;
243; PWR9-LABEL: f64_to_ui1:
244; PWR9:       # %bb.0: # %entry
245; PWR9-NEXT:    xscvdpsxws 0, 1
246; PWR9-NEXT:    mffprwz 3, 0
247; PWR9-NEXT:    blr
248entry:
249  %conv = fptoui double %X to i1
250  ret i1 %conv
251
252}
253
254; Function Attrs: nounwind readnone
255define double @si1_to_f64(i1 %X) #0 {
256; FPCVT-LABEL: si1_to_f64:
257; FPCVT:       # %bb.0: # %entry
258; FPCVT-NEXT:    andi. 3, 3, 1
259; FPCVT-NEXT:    li 4, 0
260; FPCVT-NEXT:    li 3, -1
261; FPCVT-NEXT:    iselgt 3, 3, 4
262; FPCVT-NEXT:    addi 4, 1, -4
263; FPCVT-NEXT:    stw 3, -4(1)
264; FPCVT-NEXT:    lfiwax 0, 0, 4
265; FPCVT-NEXT:    fcfid 1, 0
266; FPCVT-NEXT:    blr
267;
268; PPC64-LABEL: si1_to_f64:
269; PPC64:       # %bb.0: # %entry
270; PPC64-NEXT:    andi. 3, 3, 1
271; PPC64-NEXT:    li 3, -1
272; PPC64-NEXT:    bc 12, 1, .LBB6_2
273; PPC64-NEXT:  # %bb.1: # %entry
274; PPC64-NEXT:    li 3, 0
275; PPC64-NEXT:  .LBB6_2: # %entry
276; PPC64-NEXT:    std 3, -8(1)
277; PPC64-NEXT:    lfd 0, -8(1)
278; PPC64-NEXT:    fcfid 1, 0
279; PPC64-NEXT:    blr
280;
281; PWR9-LABEL: si1_to_f64:
282; PWR9:       # %bb.0: # %entry
283; PWR9-NEXT:    andi. 3, 3, 1
284; PWR9-NEXT:    li 3, 0
285; PWR9-NEXT:    li 4, -1
286; PWR9-NEXT:    iselgt 3, 4, 3
287; PWR9-NEXT:    mtfprwa 0, 3
288; PWR9-NEXT:    xscvsxddp 1, 0
289; PWR9-NEXT:    blr
290entry:
291  %conv = sitofp i1 %X to double
292  ret double %conv
293
294}
295
296; Function Attrs: nounwind readnone
297define double @ui1_to_f64(i1 %X) #0 {
298; FPCVT-LABEL: ui1_to_f64:
299; FPCVT:       # %bb.0: # %entry
300; FPCVT-NEXT:    clrlwi 3, 3, 31
301; FPCVT-NEXT:    addi 4, 1, -4
302; FPCVT-NEXT:    stw 3, -4(1)
303; FPCVT-NEXT:    lfiwax 0, 0, 4
304; FPCVT-NEXT:    fcfid 1, 0
305; FPCVT-NEXT:    blr
306;
307; PPC64-LABEL: ui1_to_f64:
308; PPC64:       # %bb.0: # %entry
309; PPC64-NEXT:    clrldi 3, 3, 63
310; PPC64-NEXT:    std 3, -8(1)
311; PPC64-NEXT:    lfd 0, -8(1)
312; PPC64-NEXT:    fcfid 1, 0
313; PPC64-NEXT:    blr
314;
315; PWR9-LABEL: ui1_to_f64:
316; PWR9:       # %bb.0: # %entry
317; PWR9-NEXT:    clrlwi 3, 3, 31
318; PWR9-NEXT:    mtfprwa 0, 3
319; PWR9-NEXT:    xscvsxddp 1, 0
320; PWR9-NEXT:    blr
321entry:
322  %conv = uitofp i1 %X to double
323  ret double %conv
324
325}
326attributes #0 = { nounwind readnone "no-signed-zeros-fp-math"="true" }
327
328