Skip to content

Commit da1736e

Browse files
authored
[RISCV][GISel] Add legalizer support for G_FADD/G_FSUB/G_FMUL/G_FDIV with F/D extensions. (#69804)
This a simple patch to get initial FP support started.
1 parent da27c25 commit da1736e

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
2828
const LLT s8 = LLT::scalar(8);
2929
const LLT s16 = LLT::scalar(16);
3030
const LLT s32 = LLT::scalar(32);
31+
const LLT s64 = LLT::scalar(64);
3132

3233
using namespace TargetOpcode;
3334

@@ -203,6 +204,14 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
203204

204205
getActionDefinitionsBuilder(G_FRAME_INDEX).legalFor({p0});
205206

207+
// FP Operations
208+
209+
getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV})
210+
.legalIf([=, &ST](const LegalityQuery &Query) -> bool {
211+
return (ST.hasStdExtF() && typeIs(0, s32)(Query)) ||
212+
(ST.hasStdExtD() && typeIs(0, s64)(Query));
213+
});
214+
206215
getLegacyLegalizerInfo().computeTables();
207216
}
208217

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
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: fadd_f32
9+
body: |
10+
bb.0:
11+
liveins: $f10_f, $f11_f
12+
13+
; CHECK-LABEL: name: fadd_f32
14+
; CHECK: liveins: $f10_f, $f11_f
15+
; CHECK-NEXT: {{ $}}
16+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
17+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f11_f
18+
; CHECK-NEXT: [[FADD:%[0-9]+]]:_(s32) = G_FADD [[COPY]], [[COPY1]]
19+
; CHECK-NEXT: $f10_f = COPY [[FADD]](s32)
20+
; CHECK-NEXT: PseudoRET implicit $f10_f
21+
%0:_(s32) = COPY $f10_f
22+
%1:_(s32) = COPY $f11_f
23+
%2:_(s32) = G_FADD %0, %1
24+
$f10_f = COPY %2(s32)
25+
PseudoRET implicit $f10_f
26+
27+
...
28+
---
29+
name: fsub_f32
30+
body: |
31+
bb.0:
32+
liveins: $f10_f, $f11_f
33+
34+
; CHECK-LABEL: name: fsub_f32
35+
; CHECK: liveins: $f10_f, $f11_f
36+
; CHECK-NEXT: {{ $}}
37+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
38+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f11_f
39+
; CHECK-NEXT: [[FSUB:%[0-9]+]]:_(s32) = G_FSUB [[COPY]], [[COPY1]]
40+
; CHECK-NEXT: $f10_f = COPY [[FSUB]](s32)
41+
; CHECK-NEXT: PseudoRET implicit $f10_f
42+
%0:_(s32) = COPY $f10_f
43+
%1:_(s32) = COPY $f11_f
44+
%2:_(s32) = G_FSUB %0, %1
45+
$f10_f = COPY %2(s32)
46+
PseudoRET implicit $f10_f
47+
48+
...
49+
---
50+
name: fmul_f32
51+
body: |
52+
bb.0:
53+
liveins: $f10_f, $f11_f
54+
55+
; CHECK-LABEL: name: fmul_f32
56+
; CHECK: liveins: $f10_f, $f11_f
57+
; CHECK-NEXT: {{ $}}
58+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
59+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f11_f
60+
; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(s32) = G_FMUL [[COPY]], [[COPY1]]
61+
; CHECK-NEXT: $f10_f = COPY [[FMUL]](s32)
62+
; CHECK-NEXT: PseudoRET implicit $f10_f
63+
%0:_(s32) = COPY $f10_f
64+
%1:_(s32) = COPY $f11_f
65+
%2:_(s32) = G_FMUL %0, %1
66+
$f10_f = COPY %2(s32)
67+
PseudoRET implicit $f10_f
68+
69+
...
70+
---
71+
name: fdiv_f32
72+
body: |
73+
bb.0:
74+
liveins: $f10_f, $f11_f
75+
76+
; CHECK-LABEL: name: fdiv_f32
77+
; CHECK: liveins: $f10_f, $f11_f
78+
; CHECK-NEXT: {{ $}}
79+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
80+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f11_f
81+
; CHECK-NEXT: [[FDIV:%[0-9]+]]:_(s32) = G_FDIV [[COPY]], [[COPY1]]
82+
; CHECK-NEXT: $f10_f = COPY [[FDIV]](s32)
83+
; CHECK-NEXT: PseudoRET implicit $f10_f
84+
%0:_(s32) = COPY $f10_f
85+
%1:_(s32) = COPY $f11_f
86+
%2:_(s32) = G_FDIV %0, %1
87+
$f10_f = COPY %2(s32)
88+
PseudoRET implicit $f10_f
89+
90+
...
91+
---
92+
name: fadd_f64
93+
body: |
94+
bb.0:
95+
liveins: $f10_d, $f11_d
96+
97+
; CHECK-LABEL: name: fadd_f64
98+
; CHECK: liveins: $f10_d, $f11_d
99+
; CHECK-NEXT: {{ $}}
100+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
101+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f11_d
102+
; CHECK-NEXT: [[FADD:%[0-9]+]]:_(s64) = G_FADD [[COPY]], [[COPY1]]
103+
; CHECK-NEXT: $f10_d = COPY [[FADD]](s64)
104+
; CHECK-NEXT: PseudoRET implicit $f10_d
105+
%0:_(s64) = COPY $f10_d
106+
%1:_(s64) = COPY $f11_d
107+
%2:_(s64) = G_FADD %0, %1
108+
$f10_d = COPY %2(s64)
109+
PseudoRET implicit $f10_d
110+
111+
...
112+
---
113+
name: fsub_f64
114+
body: |
115+
bb.0:
116+
liveins: $f10_d, $f11_d
117+
118+
; CHECK-LABEL: name: fsub_f64
119+
; CHECK: liveins: $f10_d, $f11_d
120+
; CHECK-NEXT: {{ $}}
121+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
122+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f11_d
123+
; CHECK-NEXT: [[FSUB:%[0-9]+]]:_(s64) = G_FSUB [[COPY]], [[COPY1]]
124+
; CHECK-NEXT: $f10_d = COPY [[FSUB]](s64)
125+
; CHECK-NEXT: PseudoRET implicit $f10_d
126+
%0:_(s64) = COPY $f10_d
127+
%1:_(s64) = COPY $f11_d
128+
%2:_(s64) = G_FSUB %0, %1
129+
$f10_d = COPY %2(s64)
130+
PseudoRET implicit $f10_d
131+
132+
...
133+
---
134+
name: fmul_f64
135+
body: |
136+
bb.0:
137+
liveins: $f10_d, $f11_d
138+
139+
; CHECK-LABEL: name: fmul_f64
140+
; CHECK: liveins: $f10_d, $f11_d
141+
; CHECK-NEXT: {{ $}}
142+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
143+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f11_d
144+
; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(s64) = G_FMUL [[COPY]], [[COPY1]]
145+
; CHECK-NEXT: $f10_d = COPY [[FMUL]](s64)
146+
; CHECK-NEXT: PseudoRET implicit $f10_d
147+
%0:_(s64) = COPY $f10_d
148+
%1:_(s64) = COPY $f11_d
149+
%2:_(s64) = G_FMUL %0, %1
150+
$f10_d = COPY %2(s64)
151+
PseudoRET implicit $f10_d
152+
153+
...
154+
---
155+
name: fdiv_f64
156+
body: |
157+
bb.0:
158+
liveins: $f10_d, $f11_d
159+
160+
; CHECK-LABEL: name: fdiv_f64
161+
; CHECK: liveins: $f10_d, $f11_d
162+
; CHECK-NEXT: {{ $}}
163+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
164+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f11_d
165+
; CHECK-NEXT: [[FDIV:%[0-9]+]]:_(s64) = G_FDIV [[COPY]], [[COPY1]]
166+
; CHECK-NEXT: $f10_d = COPY [[FDIV]](s64)
167+
; CHECK-NEXT: PseudoRET implicit $f10_d
168+
%0:_(s64) = COPY $f10_d
169+
%1:_(s64) = COPY $f11_d
170+
%2:_(s64) = G_FDIV %0, %1
171+
$f10_d = COPY %2(s64)
172+
PseudoRET implicit $f10_d
173+
174+
...

0 commit comments

Comments
 (0)