Skip to content

Commit 22620a9

Browse files
committed
[RISCV][GISel] Do libcall for G_FPTOSI, G_FPTOUI when d or f extensions are not supported
1 parent c5c530f commit 22620a9

File tree

2 files changed

+196
-1
lines changed

2 files changed

+196
-1
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
409409
getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI})
410410
.legalIf(all(typeInSet(0, {s32, sXLen}), typeIsScalarFPArith(1, ST)))
411411
.widenScalarToNextPow2(0)
412-
.clampScalar(0, s32, sXLen);
412+
.clampScalar(0, s32, sXLen)
413+
.libcallFor({s32, s32});
413414

414415
getActionDefinitionsBuilder({G_SITOFP, G_UITOFP})
415416
.legalIf(all(typeIsScalarFPArith(0, ST), typeInSet(1, {s32, sXLen})))
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -mattr=-d -mattr=-f -run-pass=legalizer %s -o - \
3+
# RUN: | FileCheck %s
4+
5+
---
6+
name: fptosi_s1_s32
7+
body: |
8+
bb.1:
9+
liveins: $f10_f
10+
11+
; CHECK-LABEL: name: fptosi_s1_s32
12+
; CHECK: liveins: $f10_f
13+
; CHECK-NEXT: {{ $}}
14+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
15+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
16+
; CHECK-NEXT: $x10 = COPY [[COPY]](s32)
17+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &__fixsfsi, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit-def $x10
18+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
19+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
20+
; CHECK-NEXT: $x10 = COPY [[COPY1]](s32)
21+
; CHECK-NEXT: PseudoRET implicit $x10
22+
%0:_(s32) = COPY $f10_f
23+
%1:_(s1) = G_FPTOSI %0(s32)
24+
%2:_(s32) = G_ANYEXT %1(s1)
25+
$x10 = COPY %2(s32)
26+
PseudoRET implicit $x10
27+
28+
...
29+
---
30+
name: fptoui_s1_s32
31+
body: |
32+
bb.1:
33+
liveins: $f10_f
34+
35+
; CHECK-LABEL: name: fptoui_s1_s32
36+
; CHECK: liveins: $f10_f
37+
; CHECK-NEXT: {{ $}}
38+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
39+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
40+
; CHECK-NEXT: $x10 = COPY [[COPY]](s32)
41+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &__fixunssfsi, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit-def $x10
42+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
43+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
44+
; CHECK-NEXT: $x10 = COPY [[COPY1]](s32)
45+
; CHECK-NEXT: PseudoRET implicit $x10
46+
%0:_(s32) = COPY $f10_f
47+
%1:_(s1) = G_FPTOUI %0(s32)
48+
%2:_(s32) = G_ANYEXT %1(s1)
49+
$x10 = COPY %2(s32)
50+
PseudoRET implicit $x10
51+
52+
...
53+
---
54+
name: fptosi_s8_s32
55+
body: |
56+
bb.1:
57+
liveins: $f10_f
58+
59+
; CHECK-LABEL: name: fptosi_s8_s32
60+
; CHECK: liveins: $f10_f
61+
; CHECK-NEXT: {{ $}}
62+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
63+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
64+
; CHECK-NEXT: $x10 = COPY [[COPY]](s32)
65+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &__fixsfsi, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit-def $x10
66+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
67+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
68+
; CHECK-NEXT: $x10 = COPY [[COPY1]](s32)
69+
; CHECK-NEXT: PseudoRET implicit $x10
70+
%0:_(s32) = COPY $f10_f
71+
%1:_(s8) = G_FPTOSI %0(s32)
72+
%2:_(s32) = G_ANYEXT %1(s8)
73+
$x10 = COPY %2(s32)
74+
PseudoRET implicit $x10
75+
76+
...
77+
---
78+
name: fptoui_s8_s32
79+
body: |
80+
bb.1:
81+
liveins: $f10_f
82+
83+
; CHECK-LABEL: name: fptoui_s8_s32
84+
; CHECK: liveins: $f10_f
85+
; CHECK-NEXT: {{ $}}
86+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
87+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
88+
; CHECK-NEXT: $x10 = COPY [[COPY]](s32)
89+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &__fixunssfsi, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit-def $x10
90+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
91+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
92+
; CHECK-NEXT: $x10 = COPY [[COPY1]](s32)
93+
; CHECK-NEXT: PseudoRET implicit $x10
94+
%0:_(s32) = COPY $f10_f
95+
%1:_(s8) = G_FPTOUI %0(s32)
96+
%2:_(s32) = G_ANYEXT %1(s8)
97+
$x10 = COPY %2(s32)
98+
PseudoRET implicit $x10
99+
100+
...
101+
---
102+
name: fptosi_s16_s32
103+
body: |
104+
bb.1:
105+
liveins: $f10_f
106+
107+
; CHECK-LABEL: name: fptosi_s16_s32
108+
; CHECK: liveins: $f10_f
109+
; CHECK-NEXT: {{ $}}
110+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
111+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
112+
; CHECK-NEXT: $x10 = COPY [[COPY]](s32)
113+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &__fixsfsi, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit-def $x10
114+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
115+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
116+
; CHECK-NEXT: $x10 = COPY [[COPY1]](s32)
117+
; CHECK-NEXT: PseudoRET implicit $x10
118+
%0:_(s32) = COPY $f10_f
119+
%1:_(s16) = G_FPTOSI %0(s32)
120+
%2:_(s32) = G_ANYEXT %1(s16)
121+
$x10 = COPY %2(s32)
122+
PseudoRET implicit $x10
123+
124+
...
125+
---
126+
name: fptoui_s16_s32
127+
body: |
128+
bb.1:
129+
liveins: $f10_f
130+
131+
; CHECK-LABEL: name: fptoui_s16_s32
132+
; CHECK: liveins: $f10_f
133+
; CHECK-NEXT: {{ $}}
134+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
135+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
136+
; CHECK-NEXT: $x10 = COPY [[COPY]](s32)
137+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &__fixunssfsi, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit-def $x10
138+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
139+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
140+
; CHECK-NEXT: $x10 = COPY [[COPY1]](s32)
141+
; CHECK-NEXT: PseudoRET implicit $x10
142+
%0:_(s32) = COPY $f10_f
143+
%1:_(s16) = G_FPTOUI %0(s32)
144+
%2:_(s32) = G_ANYEXT %1(s16)
145+
$x10 = COPY %2(s32)
146+
PseudoRET implicit $x10
147+
148+
...
149+
---
150+
name: fptosi_s32_s32
151+
body: |
152+
bb.1:
153+
liveins: $f10_f
154+
155+
; CHECK-LABEL: name: fptosi_s32_s32
156+
; CHECK: liveins: $f10_f
157+
; CHECK-NEXT: {{ $}}
158+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
159+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
160+
; CHECK-NEXT: $x10 = COPY [[COPY]](s32)
161+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &__fixsfsi, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit-def $x10
162+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
163+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
164+
; CHECK-NEXT: $x10 = COPY [[COPY1]](s32)
165+
; CHECK-NEXT: PseudoRET implicit $x10
166+
%0:_(s32) = COPY $f10_f
167+
%1:_(s32) = G_FPTOSI %0(s32)
168+
$x10 = COPY %1(s32)
169+
PseudoRET implicit $x10
170+
171+
...
172+
---
173+
name: fptoui_s32_s32
174+
body: |
175+
bb.1:
176+
liveins: $f10_f
177+
178+
; CHECK-LABEL: name: fptoui_s32_s32
179+
; CHECK: liveins: $f10_f
180+
; CHECK-NEXT: {{ $}}
181+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
182+
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2
183+
; CHECK-NEXT: $x10 = COPY [[COPY]](s32)
184+
; CHECK-NEXT: PseudoCALL target-flags(riscv-call) &__fixunssfsi, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit-def $x10
185+
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2
186+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $x10
187+
; CHECK-NEXT: $x10 = COPY [[COPY1]](s32)
188+
; CHECK-NEXT: PseudoRET implicit $x10
189+
%0:_(s32) = COPY $f10_f
190+
%1:_(s32) = G_FPTOUI %0(s32)
191+
$x10 = COPY %1(s32)
192+
PseudoRET implicit $x10
193+
194+
...

0 commit comments

Comments
 (0)