Skip to content

Commit 4ac3042

Browse files
committed
[RISCV][GISel] Support G_FPEXT/G_FPTRUNC for F and D extension.
1 parent 49ae2ef commit 4ac3042

File tree

5 files changed

+179
-0
lines changed

5 files changed

+179
-0
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,17 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) {
197197
(ST.hasStdExtD() && typeIs(0, s64)(Query));
198198
});
199199

200+
getActionDefinitionsBuilder(G_FPTRUNC).legalIf(
201+
[=, &ST](const LegalityQuery &Query) -> bool {
202+
return (ST.hasStdExtD() && typeIs(0, s32)(Query) &&
203+
typeIs(1, s64)(Query));
204+
});
205+
getActionDefinitionsBuilder(G_FPEXT).legalIf(
206+
[=, &ST](const LegalityQuery &Query) -> bool {
207+
return (ST.hasStdExtD() && typeIs(0, s64)(Query) &&
208+
typeIs(1, s32)(Query));
209+
});
210+
200211
getLegacyLegalizerInfo().computeTables();
201212
}
202213

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,30 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
204204
&RISCV::ValueMappings[RISCV::FPR32Idx]});
205205
break;
206206
}
207+
case TargetOpcode::G_FPEXT: {
208+
LLT ToTy = MRI.getType(MI.getOperand(0).getReg());
209+
(void)ToTy;
210+
LLT FromTy = MRI.getType(MI.getOperand(1).getReg());
211+
(void)FromTy;
212+
assert(ToTy.getSizeInBits() == 64 && FromTy.getSizeInBits() == 32 &&
213+
"Unsupported size for G_FPEXT");
214+
OperandsMapping =
215+
getOperandsMapping({&RISCV::ValueMappings[RISCV::FPR64Idx],
216+
&RISCV::ValueMappings[RISCV::FPR32Idx]});
217+
break;
218+
}
219+
case TargetOpcode::G_FPTRUNC: {
220+
LLT ToTy = MRI.getType(MI.getOperand(0).getReg());
221+
(void)ToTy;
222+
LLT FromTy = MRI.getType(MI.getOperand(1).getReg());
223+
(void)FromTy;
224+
assert(ToTy.getSizeInBits() == 32 && FromTy.getSizeInBits() == 64 &&
225+
"Unsupported size for G_FPTRUNC");
226+
OperandsMapping =
227+
getOperandsMapping({&RISCV::ValueMappings[RISCV::FPR32Idx],
228+
&RISCV::ValueMappings[RISCV::FPR64Idx]});
229+
break;
230+
}
207231
default:
208232
return getInvalidInstructionMapping();
209233
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -mattr=+d -run-pass=instruction-select \
3+
# RUN: -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s
4+
# RUN: llc -mtriple=riscv64 -mattr=+d -run-pass=instruction-select \
5+
# RUN: -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s
6+
7+
---
8+
name: fpext
9+
legalized: true
10+
regBankSelected: true
11+
tracksRegLiveness: true
12+
body: |
13+
bb.1:
14+
liveins: $f10_f
15+
16+
; CHECK-LABEL: name: fpext
17+
; CHECK: liveins: $f10_f
18+
; CHECK-NEXT: {{ $}}
19+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY $f10_f
20+
; CHECK-NEXT: [[FCVT_D_S:%[0-9]+]]:fpr64 = nofpexcept FCVT_D_S [[COPY]], 0
21+
; CHECK-NEXT: $f10_d = COPY [[FCVT_D_S]]
22+
; CHECK-NEXT: PseudoRET implicit $f10_d
23+
%0:fprb(s32) = COPY $f10_f
24+
%1:fprb(s64) = G_FPEXT %0(s32)
25+
$f10_d = COPY %1(s64)
26+
PseudoRET implicit $f10_d
27+
28+
...
29+
---
30+
name: fptrunc
31+
legalized: true
32+
regBankSelected: true
33+
tracksRegLiveness: true
34+
body: |
35+
bb.1:
36+
liveins: $f10_d
37+
38+
; CHECK-LABEL: name: fptrunc
39+
; CHECK: liveins: $f10_d
40+
; CHECK-NEXT: {{ $}}
41+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f10_d
42+
; CHECK-NEXT: [[FCVT_S_D:%[0-9]+]]:fpr32 = nofpexcept FCVT_S_D [[COPY]], 7
43+
; CHECK-NEXT: $f10_f = COPY [[FCVT_S_D]]
44+
; CHECK-NEXT: PseudoRET implicit $f10_f
45+
%0:fprb(s64) = COPY $f10_d
46+
%1:fprb(s32) = G_FPTRUNC %0(s64)
47+
$f10_f = COPY %1(s32)
48+
PseudoRET implicit $f10_f
49+
50+
...
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
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: fpext
9+
body: |
10+
bb.1:
11+
liveins: $f10_f
12+
13+
; CHECK-LABEL: name: fpext
14+
; CHECK: liveins: $f10_f
15+
; CHECK-NEXT: {{ $}}
16+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
17+
; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(s64) = G_FPEXT [[COPY]](s32)
18+
; CHECK-NEXT: $f10_d = COPY [[FPEXT]](s64)
19+
; CHECK-NEXT: PseudoRET implicit $f10_d
20+
%0:_(s32) = COPY $f10_f
21+
%1:_(s64) = G_FPEXT %0(s32)
22+
$f10_d = COPY %1(s64)
23+
PseudoRET implicit $f10_d
24+
25+
...
26+
---
27+
name: fptrunc
28+
body: |
29+
bb.1:
30+
liveins: $f10_d
31+
32+
; CHECK-LABEL: name: fptrunc
33+
; CHECK: liveins: $f10_d
34+
; CHECK-NEXT: {{ $}}
35+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
36+
; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:_(s32) = G_FPTRUNC [[COPY]](s64)
37+
; CHECK-NEXT: $f10_f = COPY [[FPTRUNC]](s32)
38+
; CHECK-NEXT: PseudoRET implicit $f10_f
39+
%0:_(s64) = COPY $f10_d
40+
%1:_(s32) = G_FPTRUNC %0(s64)
41+
$f10_f = COPY %1(s32)
42+
PseudoRET implicit $f10_f
43+
44+
...
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -mattr=+d -run-pass=regbankselect \
3+
# RUN: -simplify-mir -verify-machineinstrs %s \
4+
# RUN: -o - | FileCheck %s
5+
# RUN: llc -mtriple=riscv64 -mattr=+d -run-pass=regbankselect \
6+
# RUN: -simplify-mir -verify-machineinstrs %s \
7+
# RUN: -o - | FileCheck %s
8+
9+
---
10+
name: fpext
11+
legalized: true
12+
tracksRegLiveness: true
13+
body: |
14+
bb.1:
15+
liveins: $f10_f
16+
17+
; CHECK-LABEL: name: fpext
18+
; CHECK: liveins: $f10_f
19+
; CHECK-NEXT: {{ $}}
20+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fprb(s32) = COPY $f10_f
21+
; CHECK-NEXT: [[FPEXT:%[0-9]+]]:fprb(s64) = G_FPEXT [[COPY]](s32)
22+
; CHECK-NEXT: $f10_d = COPY [[FPEXT]](s64)
23+
; CHECK-NEXT: PseudoRET implicit $f10_d
24+
%0:_(s32) = COPY $f10_f
25+
%1:_(s64) = G_FPEXT %0(s32)
26+
$f10_d = COPY %1(s64)
27+
PseudoRET implicit $f10_d
28+
29+
...
30+
---
31+
name: fptrunc
32+
legalized: true
33+
tracksRegLiveness: true
34+
body: |
35+
bb.1:
36+
liveins: $f10_d
37+
38+
; CHECK-LABEL: name: fptrunc
39+
; CHECK: liveins: $f10_d
40+
; CHECK-NEXT: {{ $}}
41+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fprb(s64) = COPY $f10_d
42+
; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:fprb(s32) = G_FPTRUNC [[COPY]](s64)
43+
; CHECK-NEXT: $f10_f = COPY [[FPTRUNC]](s32)
44+
; CHECK-NEXT: PseudoRET implicit $f10_f
45+
%0:_(s64) = COPY $f10_d
46+
%1:_(s32) = G_FPTRUNC %0(s64)
47+
$f10_f = COPY %1(s32)
48+
PseudoRET implicit $f10_f
49+
50+
...

0 commit comments

Comments
 (0)