forked from OSchip/llvm-project
[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
This commit is contained in:
parent
d9806334d1
commit
d20a2376d8
|
@ -1198,6 +1198,10 @@ class SwapSysRegImm<SysReg SR, list<Register> Regs>
|
|||
let Defs = Regs;
|
||||
}
|
||||
|
||||
def ReadFRM : ReadSysReg<SysRegFRM, [FRM]>;
|
||||
def WriteFRM : WriteSysReg<SysRegFRM, [FRM]>;
|
||||
def WriteFRMImm : WriteSysRegImm<SysRegFRM, [FRM]>;
|
||||
|
||||
/// Other pseudo-instructions
|
||||
|
||||
// Pessimistically assume the stack pointer will be clobbered
|
||||
|
|
|
@ -251,27 +251,27 @@ def : InstAlias<"fge.s $rd, $rs, $rt",
|
|||
// The following csr instructions actually alias instructions from the base ISA.
|
||||
// However, it only makes sense to support them when the F extension is enabled.
|
||||
// NOTE: "frcsr", "frrm", and "frflags" are more specialized version of "csrr".
|
||||
def : InstAlias<"frcsr $rd", (CSRRS GPR:$rd, FCSR.Encoding, X0), 2>;
|
||||
def : InstAlias<"fscsr $rd, $rs", (CSRRW GPR:$rd, FCSR.Encoding, GPR:$rs)>;
|
||||
def : InstAlias<"fscsr $rs", (CSRRW X0, FCSR.Encoding, GPR:$rs), 2>;
|
||||
def : InstAlias<"frcsr $rd", (CSRRS GPR:$rd, SysRegFCSR.Encoding, X0), 2>;
|
||||
def : InstAlias<"fscsr $rd, $rs", (CSRRW GPR:$rd, SysRegFCSR.Encoding, GPR:$rs)>;
|
||||
def : InstAlias<"fscsr $rs", (CSRRW X0, SysRegFCSR.Encoding, GPR:$rs), 2>;
|
||||
|
||||
// frsr, fssr are obsolete aliases replaced by frcsr, fscsr, so give them
|
||||
// zero weight.
|
||||
def : InstAlias<"frsr $rd", (CSRRS GPR:$rd, FCSR.Encoding, X0), 0>;
|
||||
def : InstAlias<"fssr $rd, $rs", (CSRRW GPR:$rd, FCSR.Encoding, GPR:$rs), 0>;
|
||||
def : InstAlias<"fssr $rs", (CSRRW X0, FCSR.Encoding, GPR:$rs), 0>;
|
||||
def : InstAlias<"frsr $rd", (CSRRS GPR:$rd, SysRegFCSR.Encoding, X0), 0>;
|
||||
def : InstAlias<"fssr $rd, $rs", (CSRRW GPR:$rd, SysRegFCSR.Encoding, GPR:$rs), 0>;
|
||||
def : InstAlias<"fssr $rs", (CSRRW X0, SysRegFCSR.Encoding, GPR:$rs), 0>;
|
||||
|
||||
def : InstAlias<"frrm $rd", (CSRRS GPR:$rd, FRM.Encoding, X0), 2>;
|
||||
def : InstAlias<"fsrm $rd, $rs", (CSRRW GPR:$rd, FRM.Encoding, GPR:$rs)>;
|
||||
def : InstAlias<"fsrm $rs", (CSRRW X0, FRM.Encoding, GPR:$rs), 2>;
|
||||
def : InstAlias<"fsrmi $rd, $imm", (CSRRWI GPR:$rd, FRM.Encoding, uimm5:$imm)>;
|
||||
def : InstAlias<"fsrmi $imm", (CSRRWI X0, FRM.Encoding, uimm5:$imm), 2>;
|
||||
def : InstAlias<"frrm $rd", (CSRRS GPR:$rd, SysRegFRM.Encoding, X0), 2>;
|
||||
def : InstAlias<"fsrm $rd, $rs", (CSRRW GPR:$rd, SysRegFRM.Encoding, GPR:$rs)>;
|
||||
def : InstAlias<"fsrm $rs", (CSRRW X0, SysRegFRM.Encoding, GPR:$rs), 2>;
|
||||
def : InstAlias<"fsrmi $rd, $imm", (CSRRWI GPR:$rd, SysRegFRM.Encoding, uimm5:$imm)>;
|
||||
def : InstAlias<"fsrmi $imm", (CSRRWI X0, SysRegFRM.Encoding, uimm5:$imm), 2>;
|
||||
|
||||
def : InstAlias<"frflags $rd", (CSRRS GPR:$rd, FFLAGS.Encoding, X0), 2>;
|
||||
def : InstAlias<"fsflags $rd, $rs", (CSRRW GPR:$rd, FFLAGS.Encoding, GPR:$rs)>;
|
||||
def : InstAlias<"fsflags $rs", (CSRRW X0, FFLAGS.Encoding, GPR:$rs), 2>;
|
||||
def : InstAlias<"fsflagsi $rd, $imm", (CSRRWI GPR:$rd, FFLAGS.Encoding, uimm5:$imm)>;
|
||||
def : InstAlias<"fsflagsi $imm", (CSRRWI X0, FFLAGS.Encoding, uimm5:$imm), 2>;
|
||||
def : InstAlias<"frflags $rd", (CSRRS GPR:$rd, SysRegFFLAGS.Encoding, X0), 2>;
|
||||
def : InstAlias<"fsflags $rd, $rs", (CSRRW GPR:$rd, SysRegFFLAGS.Encoding, GPR:$rs)>;
|
||||
def : InstAlias<"fsflags $rs", (CSRRW X0, SysRegFFLAGS.Encoding, GPR:$rs), 2>;
|
||||
def : InstAlias<"fsflagsi $rd, $imm", (CSRRWI GPR:$rd, SysRegFFLAGS.Encoding, uimm5:$imm)>;
|
||||
def : InstAlias<"fsflagsi $imm", (CSRRWI X0, SysRegFFLAGS.Encoding, uimm5:$imm), 2>;
|
||||
|
||||
// fmv.w.x and fmv.x.w were previously known as fmv.s.x and fmv.x.s. Both
|
||||
// spellings should be supported by standard tools.
|
||||
|
|
|
@ -101,6 +101,11 @@ BitVector RISCVRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
|||
markSuperRegs(Reserved, RISCV::VXSAT);
|
||||
markSuperRegs(Reserved, RISCV::VXRM);
|
||||
|
||||
// Floating point environment registers.
|
||||
markSuperRegs(Reserved, RISCV::FRM);
|
||||
markSuperRegs(Reserved, RISCV::FFLAGS);
|
||||
markSuperRegs(Reserved, RISCV::FCSR);
|
||||
|
||||
assert(checkAllSuperRegsMarked(Reserved));
|
||||
return Reserved;
|
||||
}
|
||||
|
|
|
@ -538,3 +538,8 @@ foreach m = LMULList.m in {
|
|||
!mul(nf, m)>;
|
||||
}
|
||||
}
|
||||
|
||||
// Special registers
|
||||
def FFLAGS : RISCVReg<0, "fflags">;
|
||||
def FRM : RISCVReg<0, "frm">;
|
||||
def FCSR : RISCVReg<0, "fcsr">;
|
||||
|
|
|
@ -78,9 +78,9 @@ def : SysReg<"uip", 0x044>;
|
|||
// User Floating-Point CSRs
|
||||
//===--------------------------
|
||||
|
||||
def FFLAGS : SysReg<"fflags", 0x001>;
|
||||
def FRM : SysReg<"frm", 0x002>;
|
||||
def FCSR : SysReg<"fcsr", 0x003>;
|
||||
def SysRegFFLAGS : SysReg<"fflags", 0x001>;
|
||||
def SysRegFRM : SysReg<"frm", 0x002>;
|
||||
def SysRegFCSR : SysReg<"fcsr", 0x003>;
|
||||
|
||||
//===--------------------------
|
||||
// User Counter/Timers
|
||||
|
|
Loading…
Reference in New Issue