• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:    li 4, 1
70; PPC64-NEXT:    lfs 0, .LCPI2_0@toc@l(3)
71; PPC64-NEXT:    sldi 4, 4, 63
72; PPC64-NEXT:    fsubs 2, 1, 0
73; PPC64-NEXT:    fcmpu 0, 1, 0
74; PPC64-NEXT:    fctidz 2, 2
75; PPC64-NEXT:    stfd 2, -8(1)
76; PPC64-NEXT:    fctidz 2, 1
77; PPC64-NEXT:    stfd 2, -16(1)
78; PPC64-NEXT:    ld 3, -8(1)
79; PPC64-NEXT:    ld 5, -16(1)
80; PPC64-NEXT:    xor 3, 3, 4
81; PPC64-NEXT:    bc 12, 0, .LBB2_1
82; PPC64-NEXT:    b .LBB2_2
83; PPC64-NEXT:  .LBB2_1: # %entry
84; PPC64-NEXT:    addi 3, 5, 0
85; PPC64-NEXT:  .LBB2_2: # %entry
86; PPC64-NEXT:    sradi 4, 3, 53
87; PPC64-NEXT:    clrldi 5, 3, 63
88; PPC64-NEXT:    addi 4, 4, 1
89; PPC64-NEXT:    cmpldi 4, 1
90; PPC64-NEXT:    rldicl 4, 3, 63, 1
91; PPC64-NEXT:    or 5, 5, 4
92; PPC64-NEXT:    rldicl 6, 5, 11, 53
93; PPC64-NEXT:    addi 6, 6, 1
94; PPC64-NEXT:    clrldi 7, 5, 53
95; PPC64-NEXT:    cmpldi 1, 6, 1
96; PPC64-NEXT:    clrldi 6, 3, 53
97; PPC64-NEXT:    addi 7, 7, 2047
98; PPC64-NEXT:    addi 6, 6, 2047
99; PPC64-NEXT:    or 4, 7, 4
100; PPC64-NEXT:    or 6, 6, 3
101; PPC64-NEXT:    rldicl 4, 4, 53, 11
102; PPC64-NEXT:    rldicr 6, 6, 0, 52
103; PPC64-NEXT:    bc 12, 1, .LBB2_4
104; PPC64-NEXT:  # %bb.3: # %entry
105; PPC64-NEXT:    ori 6, 3, 0
106; PPC64-NEXT:    b .LBB2_4
107; PPC64-NEXT:  .LBB2_4: # %entry
108; PPC64-NEXT:    rldicl 4, 4, 11, 1
109; PPC64-NEXT:    cmpdi 3, 0
110; PPC64-NEXT:    std 6, -32(1)
111; PPC64-NEXT:    bc 12, 5, .LBB2_6
112; PPC64-NEXT:  # %bb.5: # %entry
113; PPC64-NEXT:    ori 4, 5, 0
114; PPC64-NEXT:    b .LBB2_6
115; PPC64-NEXT:  .LBB2_6: # %entry
116; PPC64-NEXT:    std 4, -24(1)
117; PPC64-NEXT:    bc 12, 0, .LBB2_8
118; PPC64-NEXT:  # %bb.7: # %entry
119; PPC64-NEXT:    lfd 0, -32(1)
120; PPC64-NEXT:    fcfid 0, 0
121; PPC64-NEXT:    frsp 1, 0
122; PPC64-NEXT:    blr
123; PPC64-NEXT:  .LBB2_8:
124; PPC64-NEXT:    lfd 0, -24(1)
125; PPC64-NEXT:    fcfid 0, 0
126; PPC64-NEXT:    frsp 0, 0
127; PPC64-NEXT:    fadds 1, 0, 0
128; PPC64-NEXT:    blr
129;
130; PWR9-LABEL: fooul:
131; PWR9:       # %bb.0: # %entry
132; PWR9-NEXT:    xsrdpiz 1, 1
133; PWR9-NEXT:    blr
134entry:
135  %conv = fptoui float %X to i64
136  %conv1 = uitofp i64 %conv to float
137  ret float %conv1
138
139}
140
141; Function Attrs: nounwind readnone
142define double @fooudl(double %X) #0 {
143; FPCVT-LABEL: fooudl:
144; FPCVT:       # %bb.0: # %entry
145; FPCVT-NEXT:    friz 1, 1
146; FPCVT-NEXT:    blr
147;
148; PPC64-LABEL: fooudl:
149; PPC64:       # %bb.0: # %entry
150; PPC64-NEXT:    addis 3, 2, .LCPI3_0@toc@ha
151; PPC64-NEXT:    li 4, 1
152; PPC64-NEXT:    lfs 0, .LCPI3_0@toc@l(3)
153; PPC64-NEXT:    sldi 4, 4, 63
154; PPC64-NEXT:    fsub 2, 1, 0
155; PPC64-NEXT:    fcmpu 0, 1, 0
156; PPC64-NEXT:    fctidz 2, 2
157; PPC64-NEXT:    stfd 2, -8(1)
158; PPC64-NEXT:    fctidz 2, 1
159; PPC64-NEXT:    stfd 2, -16(1)
160; PPC64-NEXT:    ld 3, -8(1)
161; PPC64-NEXT:    ld 5, -16(1)
162; PPC64-NEXT:    xor 3, 3, 4
163; PPC64-NEXT:    li 4, 1107
164; PPC64-NEXT:    sldi 4, 4, 52
165; PPC64-NEXT:    bc 12, 0, .LBB3_1
166; PPC64-NEXT:    b .LBB3_2
167; PPC64-NEXT:  .LBB3_1: # %entry
168; PPC64-NEXT:    addi 3, 5, 0
169; PPC64-NEXT:  .LBB3_2: # %entry
170; PPC64-NEXT:    rldicl 5, 3, 32, 32
171; PPC64-NEXT:    clrldi 3, 3, 32
172; PPC64-NEXT:    or 4, 5, 4
173; PPC64-NEXT:    addis 5, 2, .LCPI3_1@toc@ha
174; PPC64-NEXT:    std 4, -24(1)
175; PPC64-NEXT:    li 4, 1075
176; PPC64-NEXT:    sldi 4, 4, 52
177; PPC64-NEXT:    or 3, 3, 4
178; PPC64-NEXT:    lfd 0, .LCPI3_1@toc@l(5)
179; PPC64-NEXT:    std 3, -32(1)
180; PPC64-NEXT:    lfd 1, -24(1)
181; PPC64-NEXT:    lfd 2, -32(1)
182; PPC64-NEXT:    fsub 0, 1, 0
183; PPC64-NEXT:    fadd 1, 2, 0
184; PPC64-NEXT:    blr
185;
186; PWR9-LABEL: fooudl:
187; PWR9:       # %bb.0: # %entry
188; PWR9-NEXT:    xsrdpiz 1, 1
189; PWR9-NEXT:    blr
190entry:
191  %conv = fptoui double %X to i64
192  %conv1 = uitofp i64 %conv to double
193  ret double %conv1
194
195}
196
197; Function Attrs: nounwind readnone
198define i1 @f64_to_si1(double %X) #0 {
199; FPCVT-LABEL: f64_to_si1:
200; FPCVT:       # %bb.0: # %entry
201; FPCVT-NEXT:    fctiwz 0, 1
202; FPCVT-NEXT:    addi 3, 1, -4
203; FPCVT-NEXT:    stfiwx 0, 0, 3
204; FPCVT-NEXT:    lwz 3, -4(1)
205; FPCVT-NEXT:    blr
206;
207; PPC64-LABEL: f64_to_si1:
208; PPC64:       # %bb.0: # %entry
209; PPC64-NEXT:    addi 3, 1, -4
210; PPC64-NEXT:    fctiwz 0, 1
211; PPC64-NEXT:    stfiwx 0, 0, 3
212; PPC64-NEXT:    lwz 3, -4(1)
213; PPC64-NEXT:    blr
214;
215; PWR9-LABEL: f64_to_si1:
216; PWR9:       # %bb.0: # %entry
217; PWR9-NEXT:    xscvdpsxws 0, 1
218; PWR9-NEXT:    mffprwz 3, 0
219; PWR9-NEXT:    blr
220entry:
221  %conv = fptosi double %X to i1
222  ret i1 %conv
223
224}
225
226; Function Attrs: nounwind readnone
227define i1 @f64_to_ui1(double %X) #0 {
228; FPCVT-LABEL: f64_to_ui1:
229; FPCVT:       # %bb.0: # %entry
230; FPCVT-NEXT:    fctiwz 0, 1
231; FPCVT-NEXT:    addi 3, 1, -4
232; FPCVT-NEXT:    stfiwx 0, 0, 3
233; FPCVT-NEXT:    lwz 3, -4(1)
234; FPCVT-NEXT:    blr
235;
236; PPC64-LABEL: f64_to_ui1:
237; PPC64:       # %bb.0: # %entry
238; PPC64-NEXT:    addi 3, 1, -4
239; PPC64-NEXT:    fctiwz 0, 1
240; PPC64-NEXT:    stfiwx 0, 0, 3
241; PPC64-NEXT:    lwz 3, -4(1)
242; PPC64-NEXT:    blr
243;
244; PWR9-LABEL: f64_to_ui1:
245; PWR9:       # %bb.0: # %entry
246; PWR9-NEXT:    xscvdpsxws 0, 1
247; PWR9-NEXT:    mffprwz 3, 0
248; PWR9-NEXT:    blr
249entry:
250  %conv = fptoui double %X to i1
251  ret i1 %conv
252
253}
254
255; Function Attrs: nounwind readnone
256define double @si1_to_f64(i1 %X) #0 {
257; FPCVT-LABEL: si1_to_f64:
258; FPCVT:       # %bb.0: # %entry
259; FPCVT-NEXT:    andi. 3, 3, 1
260; FPCVT-NEXT:    li 4, 0
261; FPCVT-NEXT:    li 3, -1
262; FPCVT-NEXT:    iselgt 3, 3, 4
263; FPCVT-NEXT:    addi 4, 1, -4
264; FPCVT-NEXT:    stw 3, -4(1)
265; FPCVT-NEXT:    lfiwax 0, 0, 4
266; FPCVT-NEXT:    fcfid 1, 0
267; FPCVT-NEXT:    blr
268;
269; PPC64-LABEL: si1_to_f64:
270; PPC64:       # %bb.0: # %entry
271; PPC64-NEXT:    andi. 3, 3, 1
272; PPC64-NEXT:    li 4, -1
273; PPC64-NEXT:    li 3, 0
274; PPC64-NEXT:    bc 12, 1, .LBB6_1
275; PPC64-NEXT:    b .LBB6_2
276; PPC64-NEXT:  .LBB6_1: # %entry
277; PPC64-NEXT:    addi 3, 4, 0
278; PPC64-NEXT:  .LBB6_2: # %entry
279; PPC64-NEXT:    std 3, -8(1)
280; PPC64-NEXT:    lfd 0, -8(1)
281; PPC64-NEXT:    fcfid 1, 0
282; PPC64-NEXT:    blr
283;
284; PWR9-LABEL: si1_to_f64:
285; PWR9:       # %bb.0: # %entry
286; PWR9-NEXT:    andi. 3, 3, 1
287; PWR9-NEXT:    li 3, 0
288; PWR9-NEXT:    li 4, -1
289; PWR9-NEXT:    iselgt 3, 4, 3
290; PWR9-NEXT:    mtfprwa 0, 3
291; PWR9-NEXT:    xscvsxddp 1, 0
292; PWR9-NEXT:    blr
293entry:
294  %conv = sitofp i1 %X to double
295  ret double %conv
296
297}
298
299; Function Attrs: nounwind readnone
300define double @ui1_to_f64(i1 %X) #0 {
301; FPCVT-LABEL: ui1_to_f64:
302; FPCVT:       # %bb.0: # %entry
303; FPCVT-NEXT:    clrlwi 3, 3, 31
304; FPCVT-NEXT:    addi 4, 1, -4
305; FPCVT-NEXT:    stw 3, -4(1)
306; FPCVT-NEXT:    lfiwax 0, 0, 4
307; FPCVT-NEXT:    fcfid 1, 0
308; FPCVT-NEXT:    blr
309;
310; PPC64-LABEL: ui1_to_f64:
311; PPC64:       # %bb.0: # %entry
312; PPC64-NEXT:    clrldi 3, 3, 63
313; PPC64-NEXT:    std 3, -8(1)
314; PPC64-NEXT:    lfd 0, -8(1)
315; PPC64-NEXT:    fcfid 1, 0
316; PPC64-NEXT:    blr
317;
318; PWR9-LABEL: ui1_to_f64:
319; PWR9:       # %bb.0: # %entry
320; PWR9-NEXT:    clrlwi 3, 3, 31
321; PWR9-NEXT:    mtfprwa 0, 3
322; PWR9-NEXT:    xscvsxddp 1, 0
323; PWR9-NEXT:    blr
324entry:
325  %conv = uitofp i1 %X to double
326  ret double %conv
327
328}
329attributes #0 = { nounwind readnone "no-signed-zeros-fp-math"="true" }
330
331