Skip to content

Commit 0af8996

Browse files
committed
[RISCV] Save vector registers in interrupt handler.
The generated code is pretty awful.
1 parent d75e284 commit 0af8996

File tree

4 files changed

+7364
-2
lines changed

4 files changed

+7364
-2
lines changed

llvm/lib/Target/RISCV/RISCVCallingConv.td

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,44 @@ def CSR_XLEN_F32_Interrupt: CalleeSavedRegs<(add CSR_Interrupt,
5656
def CSR_XLEN_F64_Interrupt: CalleeSavedRegs<(add CSR_Interrupt,
5757
(sequence "F%u_D", 0, 31))>;
5858

59+
// Same as CSR_Interrupt, but including all vector registers.
60+
def CSR_XLEN_V_Interrupt: CalleeSavedRegs<(add CSR_Interrupt,
61+
(sequence "V%u", 0, 31))>;
62+
63+
// Same as CSR_Interrupt, but including all 32-bit FP registers and all vector
64+
// registers.
65+
def CSR_XLEN_F32_V_Interrupt: CalleeSavedRegs<(add CSR_Interrupt,
66+
(sequence "F%u_F", 0, 31),
67+
(sequence "V%u", 0, 31))>;
68+
69+
// Same as CSR_Interrupt, but including all 64-bit FP registers and all vector
70+
// registers.
71+
def CSR_XLEN_F64_V_Interrupt: CalleeSavedRegs<(add CSR_Interrupt,
72+
(sequence "F%u_D", 0, 31),
73+
(sequence "V%u", 0, 31))>;
74+
5975
// Same as CSR_Interrupt, but excluding X16-X31.
6076
def CSR_Interrupt_RVE : CalleeSavedRegs<(sub CSR_Interrupt,
6177
(sequence "X%u", 16, 31))>;
6278

6379
// Same as CSR_XLEN_F32_Interrupt, but excluding X16-X31.
6480
def CSR_XLEN_F32_Interrupt_RVE: CalleeSavedRegs<(sub CSR_XLEN_F32_Interrupt,
65-
(sequence "X%u", 16, 31))>;
81+
(sequence "X%u", 16, 31))>;
6682

6783
// Same as CSR_XLEN_F64_Interrupt, but excluding X16-X31.
6884
def CSR_XLEN_F64_Interrupt_RVE: CalleeSavedRegs<(sub CSR_XLEN_F64_Interrupt,
69-
(sequence "X%u", 16, 31))>;
85+
(sequence "X%u", 16, 31))>;
86+
87+
// Same as CSR_XLEN_V_Interrupt, but excluding X16-X31.
88+
def CSR_XLEN_V_Interrupt_RVE: CalleeSavedRegs<(add CSR_Interrupt,
89+
(sequence "V%u", 0, 31))>;
90+
91+
// Same as CSR_XLEN_F32_V_Interrupt, but excluding X16-X31.
92+
def CSR_XLEN_F32_V_Interrupt_RVE: CalleeSavedRegs<(add CSR_Interrupt,
93+
(sequence "F%u_F", 0, 31),
94+
(sequence "V%u", 0, 31))>;
95+
96+
// Same as CSR_XLEN_F64_V_Interrupt, but excluding X16-X31.
97+
def CSR_XLEN_F64_V_Interrupt_RVE: CalleeSavedRegs<(add CSR_Interrupt,
98+
(sequence "F%u_D", 0, 31),
99+
(sequence "V%u", 0, 31))>;

llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ RISCVRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
6969
if (MF->getFunction().getCallingConv() == CallingConv::GHC)
7070
return CSR_NoRegs_SaveList;
7171
if (MF->getFunction().hasFnAttribute("interrupt")) {
72+
if (Subtarget.hasVInstructions()) {
73+
if (Subtarget.hasStdExtD())
74+
return Subtarget.hasStdExtE() ? CSR_XLEN_F64_V_Interrupt_RVE_SaveList
75+
: CSR_XLEN_F64_V_Interrupt_SaveList;
76+
if (Subtarget.hasStdExtF())
77+
return Subtarget.hasStdExtE() ? CSR_XLEN_F32_V_Interrupt_RVE_SaveList
78+
: CSR_XLEN_F32_V_Interrupt_SaveList;
79+
return Subtarget.hasStdExtE() ? CSR_XLEN_V_Interrupt_RVE_SaveList
80+
: CSR_XLEN_V_Interrupt_SaveList;
81+
}
7282
if (Subtarget.hasStdExtD())
7383
return Subtarget.hasStdExtE() ? CSR_XLEN_F64_Interrupt_RVE_SaveList
7484
: CSR_XLEN_F64_Interrupt_SaveList;

0 commit comments

Comments
 (0)