Skip to content

Commit d20a237

Browse files
committed
[RISCV] Introduce floating point control and state registers
New registers FRM, FFLAGS and FCSR was defined. They represent corresponding system registers. The new registers are necessary to properly order floating point instructions in non-default modes. Differential Revision: https://reviews.llvm.org/D99083
1 parent d980633 commit d20a237

File tree

5 files changed

+35
-21
lines changed

5 files changed

+35
-21
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,6 +1198,10 @@ class SwapSysRegImm<SysReg SR, list<Register> Regs>
11981198
let Defs = Regs;
11991199
}
12001200

1201+
def ReadFRM : ReadSysReg<SysRegFRM, [FRM]>;
1202+
def WriteFRM : WriteSysReg<SysRegFRM, [FRM]>;
1203+
def WriteFRMImm : WriteSysRegImm<SysRegFRM, [FRM]>;
1204+
12011205
/// Other pseudo-instructions
12021206

12031207
// Pessimistically assume the stack pointer will be clobbered

llvm/lib/Target/RISCV/RISCVInstrInfoF.td

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -251,27 +251,27 @@ def : InstAlias<"fge.s $rd, $rs, $rt",
251251
// The following csr instructions actually alias instructions from the base ISA.
252252
// However, it only makes sense to support them when the F extension is enabled.
253253
// NOTE: "frcsr", "frrm", and "frflags" are more specialized version of "csrr".
254-
def : InstAlias<"frcsr $rd", (CSRRS GPR:$rd, FCSR.Encoding, X0), 2>;
255-
def : InstAlias<"fscsr $rd, $rs", (CSRRW GPR:$rd, FCSR.Encoding, GPR:$rs)>;
256-
def : InstAlias<"fscsr $rs", (CSRRW X0, FCSR.Encoding, GPR:$rs), 2>;
254+
def : InstAlias<"frcsr $rd", (CSRRS GPR:$rd, SysRegFCSR.Encoding, X0), 2>;
255+
def : InstAlias<"fscsr $rd, $rs", (CSRRW GPR:$rd, SysRegFCSR.Encoding, GPR:$rs)>;
256+
def : InstAlias<"fscsr $rs", (CSRRW X0, SysRegFCSR.Encoding, GPR:$rs), 2>;
257257

258258
// frsr, fssr are obsolete aliases replaced by frcsr, fscsr, so give them
259259
// zero weight.
260-
def : InstAlias<"frsr $rd", (CSRRS GPR:$rd, FCSR.Encoding, X0), 0>;
261-
def : InstAlias<"fssr $rd, $rs", (CSRRW GPR:$rd, FCSR.Encoding, GPR:$rs), 0>;
262-
def : InstAlias<"fssr $rs", (CSRRW X0, FCSR.Encoding, GPR:$rs), 0>;
263-
264-
def : InstAlias<"frrm $rd", (CSRRS GPR:$rd, FRM.Encoding, X0), 2>;
265-
def : InstAlias<"fsrm $rd, $rs", (CSRRW GPR:$rd, FRM.Encoding, GPR:$rs)>;
266-
def : InstAlias<"fsrm $rs", (CSRRW X0, FRM.Encoding, GPR:$rs), 2>;
267-
def : InstAlias<"fsrmi $rd, $imm", (CSRRWI GPR:$rd, FRM.Encoding, uimm5:$imm)>;
268-
def : InstAlias<"fsrmi $imm", (CSRRWI X0, FRM.Encoding, uimm5:$imm), 2>;
269-
270-
def : InstAlias<"frflags $rd", (CSRRS GPR:$rd, FFLAGS.Encoding, X0), 2>;
271-
def : InstAlias<"fsflags $rd, $rs", (CSRRW GPR:$rd, FFLAGS.Encoding, GPR:$rs)>;
272-
def : InstAlias<"fsflags $rs", (CSRRW X0, FFLAGS.Encoding, GPR:$rs), 2>;
273-
def : InstAlias<"fsflagsi $rd, $imm", (CSRRWI GPR:$rd, FFLAGS.Encoding, uimm5:$imm)>;
274-
def : InstAlias<"fsflagsi $imm", (CSRRWI X0, FFLAGS.Encoding, uimm5:$imm), 2>;
260+
def : InstAlias<"frsr $rd", (CSRRS GPR:$rd, SysRegFCSR.Encoding, X0), 0>;
261+
def : InstAlias<"fssr $rd, $rs", (CSRRW GPR:$rd, SysRegFCSR.Encoding, GPR:$rs), 0>;
262+
def : InstAlias<"fssr $rs", (CSRRW X0, SysRegFCSR.Encoding, GPR:$rs), 0>;
263+
264+
def : InstAlias<"frrm $rd", (CSRRS GPR:$rd, SysRegFRM.Encoding, X0), 2>;
265+
def : InstAlias<"fsrm $rd, $rs", (CSRRW GPR:$rd, SysRegFRM.Encoding, GPR:$rs)>;
266+
def : InstAlias<"fsrm $rs", (CSRRW X0, SysRegFRM.Encoding, GPR:$rs), 2>;
267+
def : InstAlias<"fsrmi $rd, $imm", (CSRRWI GPR:$rd, SysRegFRM.Encoding, uimm5:$imm)>;
268+
def : InstAlias<"fsrmi $imm", (CSRRWI X0, SysRegFRM.Encoding, uimm5:$imm), 2>;
269+
270+
def : InstAlias<"frflags $rd", (CSRRS GPR:$rd, SysRegFFLAGS.Encoding, X0), 2>;
271+
def : InstAlias<"fsflags $rd, $rs", (CSRRW GPR:$rd, SysRegFFLAGS.Encoding, GPR:$rs)>;
272+
def : InstAlias<"fsflags $rs", (CSRRW X0, SysRegFFLAGS.Encoding, GPR:$rs), 2>;
273+
def : InstAlias<"fsflagsi $rd, $imm", (CSRRWI GPR:$rd, SysRegFFLAGS.Encoding, uimm5:$imm)>;
274+
def : InstAlias<"fsflagsi $imm", (CSRRWI X0, SysRegFFLAGS.Encoding, uimm5:$imm), 2>;
275275

276276
// fmv.w.x and fmv.x.w were previously known as fmv.s.x and fmv.x.s. Both
277277
// spellings should be supported by standard tools.

llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ BitVector RISCVRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
101101
markSuperRegs(Reserved, RISCV::VXSAT);
102102
markSuperRegs(Reserved, RISCV::VXRM);
103103

104+
// Floating point environment registers.
105+
markSuperRegs(Reserved, RISCV::FRM);
106+
markSuperRegs(Reserved, RISCV::FFLAGS);
107+
markSuperRegs(Reserved, RISCV::FCSR);
108+
104109
assert(checkAllSuperRegsMarked(Reserved));
105110
return Reserved;
106111
}

llvm/lib/Target/RISCV/RISCVRegisterInfo.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,3 +538,8 @@ foreach m = LMULList.m in {
538538
!mul(nf, m)>;
539539
}
540540
}
541+
542+
// Special registers
543+
def FFLAGS : RISCVReg<0, "fflags">;
544+
def FRM : RISCVReg<0, "frm">;
545+
def FCSR : RISCVReg<0, "fcsr">;

llvm/lib/Target/RISCV/RISCVSystemOperands.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ def : SysReg<"uip", 0x044>;
7878
// User Floating-Point CSRs
7979
//===--------------------------
8080

81-
def FFLAGS : SysReg<"fflags", 0x001>;
82-
def FRM : SysReg<"frm", 0x002>;
83-
def FCSR : SysReg<"fcsr", 0x003>;
81+
def SysRegFFLAGS : SysReg<"fflags", 0x001>;
82+
def SysRegFRM : SysReg<"frm", 0x002>;
83+
def SysRegFCSR : SysReg<"fcsr", 0x003>;
8484

8585
//===--------------------------
8686
// User Counter/Timers

0 commit comments

Comments
 (0)