Skip to content

Commit 8b98d5b

Browse files
committed
[RISCV][GISel] Enable libcall expansion for G_FCEIL and G_FFLOOR.
1 parent 180b99c commit 8b98d5b

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,11 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
237237
.widenScalarToNextPow2(1)
238238
.clampScalar(1, s32, sXLen);
239239

240+
// FIXME: We can do custom inline expansion like SelectionDAG.
241+
// FIXME: Legal with Zfa.
242+
getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR})
243+
.libcallFor({s32, s64});
244+
240245
getLegacyLegalizerInfo().computeTables();
241246
}
242247

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -mattr=+d -run-pass=legalizer %s -o - \
3+
# RUN: | FileCheck %s
4+
# RUN: llc -mtriple=riscv64 -mattr=+d -run-pass=legalizer %s -o - \
5+
# RUN: | FileCheck %s
6+
7+
---
8+
name: ceil_f32
9+
body: |
10+
bb.1:
11+
liveins: $f10_f
12+
13+
; CHECK-LABEL: name: ceil_f32
14+
; CHECK: liveins: $f10_f
15+
; CHECK-NEXT: {{ $}}
16+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
17+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
18+
; CHECK-NEXT: $f10_f = COPY [[COPY]](s32)
19+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &ceilf, csr_ilp32d_lp64d, implicit-def $x1, implicit $f10_f, implicit-def $f10_f
20+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
21+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f10_f
22+
; CHECK-NEXT: $f10_f = COPY [[COPY1]](s32)
23+
; CHECK-NEXT: PseudoRET implicit $f10_f
24+
%0:_(s32) = COPY $f10_f
25+
%1:_(s32) = G_FCEIL %0
26+
$f10_f = COPY %1(s32)
27+
PseudoRET implicit $f10_f
28+
29+
...
30+
---
31+
name: floor_f32
32+
body: |
33+
bb.1:
34+
liveins: $f10_f
35+
36+
; CHECK-LABEL: name: floor_f32
37+
; CHECK: liveins: $f10_f
38+
; CHECK-NEXT: {{ $}}
39+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
40+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
41+
; CHECK-NEXT: $f10_f = COPY [[COPY]](s32)
42+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &floorf, csr_ilp32d_lp64d, implicit-def $x1, implicit $f10_f, implicit-def $f10_f
43+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
44+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f10_f
45+
; CHECK-NEXT: $f10_f = COPY [[COPY1]](s32)
46+
; CHECK-NEXT: PseudoRET implicit $f10_f
47+
%0:_(s32) = COPY $f10_f
48+
%1:_(s32) = G_FFLOOR %0
49+
$f10_f = COPY %1(s32)
50+
PseudoRET implicit $f10_f
51+
52+
...
53+
---
54+
name: ceil_f64
55+
body: |
56+
bb.1:
57+
liveins: $f10_d
58+
59+
; CHECK-LABEL: name: ceil_f64
60+
; CHECK: liveins: $f10_d
61+
; CHECK-NEXT: {{ $}}
62+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
63+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
64+
; CHECK-NEXT: $f10_d = COPY [[COPY]](s64)
65+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &ceil, csr_ilp32d_lp64d, implicit-def $x1, implicit $f10_d, implicit-def $f10_d
66+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
67+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f10_d
68+
; CHECK-NEXT: $f10_d = COPY [[COPY1]](s64)
69+
; CHECK-NEXT: PseudoRET implicit $f10_d
70+
%0:_(s64) = COPY $f10_d
71+
%1:_(s64) = G_FCEIL %0
72+
$f10_d = COPY %1(s64)
73+
PseudoRET implicit $f10_d
74+
75+
...
76+
---
77+
name: floor_f64
78+
body: |
79+
bb.1:
80+
liveins: $f10_d
81+
82+
; CHECK-LABEL: name: floor_f64
83+
; CHECK: liveins: $f10_d
84+
; CHECK-NEXT: {{ $}}
85+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
86+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
87+
; CHECK-NEXT: $f10_d = COPY [[COPY]](s64)
88+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &floor, csr_ilp32d_lp64d, implicit-def $x1, implicit $f10_d, implicit-def $f10_d
89+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
90+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f10_d
91+
; CHECK-NEXT: $f10_d = COPY [[COPY1]](s64)
92+
; CHECK-NEXT: PseudoRET implicit $f10_d
93+
%0:_(s64) = COPY $f10_d
94+
%1:_(s64) = G_FFLOOR %0
95+
$f10_d = COPY %1(s64)
96+
PseudoRET implicit $f10_d
97+
98+
...

0 commit comments

Comments
 (0)