Skip to content

Commit 0628446

Browse files
[RISCV] Enable framework to resolve encoding conflicts among vendor-specific CSRs (llvm#97287)
This PR is a follow-up of PR llvm#96174 which added the framework to resolve encoding conflicts among vendor specific CSRs. This PR explicitly enables this only for the RISCV target.
1 parent 4f1de83 commit 0628446

File tree

3 files changed

+21
-10
lines changed

3 files changed

+21
-10
lines changed

llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1890,11 +1890,18 @@ ParseStatus RISCVAsmParser::parseCSRSystemRegister(OperandVector &Operands) {
18901890
if (CE) {
18911891
int64_t Imm = CE->getValue();
18921892
if (isUInt<12>(Imm)) {
1893-
auto SysReg = RISCVSysReg::lookupSysRegByEncoding(Imm);
1894-
// Accept an immediate representing a named or un-named Sys Reg
1895-
// if the range is valid, regardless of the required features.
1896-
Operands.push_back(
1897-
RISCVOperand::createSysReg(SysReg ? SysReg->Name : "", S, Imm));
1893+
auto Range = RISCVSysReg::lookupSysRegByEncoding(Imm);
1894+
// Accept an immediate representing a named Sys Reg if it satisfies the
1895+
// the required features.
1896+
for (auto &Reg : Range) {
1897+
if (Reg.haveRequiredFeatures(STI->getFeatureBits())) {
1898+
Operands.push_back(RISCVOperand::createSysReg(Reg.Name, S, Imm));
1899+
return ParseStatus::Success;
1900+
}
1901+
}
1902+
// Accept an immediate representing an un-named Sys Reg if the range is
1903+
// valid, regardless of the required features.
1904+
Operands.push_back(RISCVOperand::createSysReg("", S, Imm));
18981905
return ParseStatus::Success;
18991906
}
19001907
}

llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,14 @@ void RISCVInstPrinter::printCSRSystemRegister(const MCInst *MI, unsigned OpNo,
121121
const MCSubtargetInfo &STI,
122122
raw_ostream &O) {
123123
unsigned Imm = MI->getOperand(OpNo).getImm();
124-
auto SysReg = RISCVSysReg::lookupSysRegByEncoding(Imm);
125-
if (SysReg && SysReg->haveRequiredFeatures(STI.getFeatureBits()))
126-
markup(O, Markup::Register) << SysReg->Name;
127-
else
128-
markup(O, Markup::Register) << formatImm(Imm);
124+
auto Range = RISCVSysReg::lookupSysRegByEncoding(Imm);
125+
for (auto &Reg : Range) {
126+
if (Reg.haveRequiredFeatures(STI.getFeatureBits())) {
127+
markup(O, Markup::Register) << Reg.Name;
128+
return;
129+
}
130+
}
131+
markup(O, Markup::Register) << formatImm(Imm);
129132
}
130133

131134
void RISCVInstPrinter::printFenceArg(const MCInst *MI, unsigned OpNo,

llvm/lib/Target/RISCV/RISCVSystemOperands.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ def SysRegsList : GenericTable {
4949

5050
let PrimaryKey = [ "Encoding" ];
5151
let PrimaryKeyName = "lookupSysRegByEncoding";
52+
let PrimaryKeyReturnRange = true;
5253
}
5354

5455
def lookupSysRegByName : SearchIndex {

0 commit comments

Comments
 (0)