Skip to content

Commit 0d3eee3

Browse files
quic-garvgupttopperc
authored andcommitted
[RISCV] Add support for custom CSRs for Sifive S76.
Support for below CSRs is addeed - 1. Branch Prediction Mode CSR 2. Feature Disable CSR 3. Power Dial CSR 4. RNMI CSRs spec:https://sifive.cdn.prismic.io/sifive/767804da-53b2-4893-97d5-b7c030ae0a94_s76mc_core_complex_manual_21G3.pdf This patch removes AltName field from SysReg class because we are now using separate class for custom vendor CSRs. Also, all use of AltName have been changed to DeprecatedName because both were interchangeably used for old names which are not in use in latest RISCV spec. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D153499
1 parent f6db55e commit 0d3eee3

File tree

8 files changed

+218
-17
lines changed

8 files changed

+218
-17
lines changed

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

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,18 +1803,57 @@ ParseStatus RISCVAsmParser::parseCSRSystemRegister(OperandVector &Operands) {
18031803
if (getParser().parseIdentifier(Identifier))
18041804
return ParseStatus::Failure;
18051805

1806+
// Check for CSR names conflicts.
1807+
// Custom CSR names might conflict with CSR names in privileged spec.
1808+
// E.g. - SiFive mnscratch(0x350) and privileged spec mnscratch(0x740).
1809+
auto CheckCSRNameConflict = [&]() {
1810+
if (!(RISCVSysReg::lookupSysRegByName(Identifier))) {
1811+
Error(S, "system register use requires an option to be enabled");
1812+
return true;
1813+
}
1814+
return false;
1815+
};
1816+
1817+
// First check for vendor specific CSRs.
1818+
auto SiFiveReg = RISCVSysReg::lookupSiFiveRegByName(Identifier);
1819+
if (SiFiveReg) {
1820+
if (SiFiveReg->haveVendorRequiredFeatures(getSTI().getFeatureBits())) {
1821+
Operands.push_back(
1822+
RISCVOperand::createSysReg(Identifier, S, SiFiveReg->Encoding));
1823+
return ParseStatus::Success;
1824+
}
1825+
if (CheckCSRNameConflict())
1826+
return ParseStatus::Failure;
1827+
}
1828+
18061829
auto SysReg = RISCVSysReg::lookupSysRegByName(Identifier);
1807-
if (!SysReg)
1808-
SysReg = RISCVSysReg::lookupSysRegByAltName(Identifier);
18091830
if (!SysReg)
18101831
if ((SysReg = RISCVSysReg::lookupSysRegByDeprecatedName(Identifier)))
18111832
Warning(S, "'" + Identifier + "' is a deprecated alias for '" +
18121833
SysReg->Name + "'");
18131834

1814-
// Accept a named Sys Reg if the required features are present.
1835+
// Check for CSR encoding conflicts.
1836+
// Custom CSR encoding might conflict with CSR encoding in privileged spec.
1837+
// E.g. - SiFive mnscratch(0x350) and privileged spec miselect(0x350).
1838+
auto CheckCSREncodingConflict = [&]() {
1839+
auto Reg = RISCVSysReg::lookupSiFiveRegByEncoding(SysReg->Encoding);
1840+
if (Reg && Reg->haveVendorRequiredFeatures(getSTI().getFeatureBits())) {
1841+
Warning(S, "'" + Identifier + "' CSR is not available on the current " +
1842+
"subtarget. Instead '" + Reg->Name +
1843+
"' CSR will be used.");
1844+
Operands.push_back(
1845+
RISCVOperand::createSysReg(Reg->Name, S, Reg->Encoding));
1846+
return true;
1847+
}
1848+
return false;
1849+
};
1850+
1851+
// Accept a named SysReg if the required features are present.
18151852
if (SysReg) {
18161853
if (!SysReg->haveRequiredFeatures(getSTI().getFeatureBits()))
18171854
return Error(S, "system register use requires an option to be enabled");
1855+
if (CheckCSREncodingConflict())
1856+
return ParseStatus::Success;
18181857
Operands.push_back(
18191858
RISCVOperand::createSysReg(Identifier, S, SysReg->Encoding));
18201859
return ParseStatus::Success;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ extern const SubtargetFeatureKV RISCVFeatureKV[RISCV::NumSubtargetFeatures];
2727

2828
namespace RISCVSysReg {
2929
#define GET_SysRegsList_IMPL
30+
#define GET_SiFiveRegsList_IMPL
3031
#include "RISCVGenSearchableTables.inc"
3132
} // namespace RISCVSysReg
3233

llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,6 @@ int getLoadFPImm(APFloat FPImm);
363363
namespace RISCVSysReg {
364364
struct SysReg {
365365
const char *Name;
366-
const char *AltName;
367366
const char *DeprecatedName;
368367
unsigned Encoding;
369368
// FIXME: add these additional fields when needed.
@@ -387,9 +386,22 @@ struct SysReg {
387386
return true;
388387
return (FeaturesRequired & ActiveFeatures) == FeaturesRequired;
389388
}
389+
390+
bool haveVendorRequiredFeatures(const FeatureBitset &ActiveFeatures) const {
391+
// Not in 32-bit mode.
392+
if (isRV32Only && ActiveFeatures[RISCV::Feature64Bit])
393+
return false;
394+
// No required feature associated with the system register.
395+
if (FeaturesRequired.none())
396+
return false;
397+
return (FeaturesRequired & ActiveFeatures) == FeaturesRequired;
398+
}
390399
};
391400

401+
struct SiFiveReg : SysReg {};
402+
392403
#define GET_SysRegsList_DECL
404+
#define GET_SiFiveRegsList_DECL
393405
#include "RISCVGenSearchableTables.inc"
394406
} // end namespace RISCVSysReg
395407

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,11 @@ void RISCVInstPrinter::printCSRSystemRegister(const MCInst *MI, unsigned OpNo,
120120
const MCSubtargetInfo &STI,
121121
raw_ostream &O) {
122122
unsigned Imm = MI->getOperand(OpNo).getImm();
123+
auto SiFiveReg = RISCVSysReg::lookupSiFiveRegByEncoding(Imm);
123124
auto SysReg = RISCVSysReg::lookupSysRegByEncoding(Imm);
124-
if (SysReg && SysReg->haveRequiredFeatures(STI.getFeatureBits()))
125+
if (SiFiveReg && SiFiveReg->haveVendorRequiredFeatures(STI.getFeatureBits()))
126+
O << SiFiveReg->Name;
127+
else if (SysReg && SysReg->haveRequiredFeatures(STI.getFeatureBits()))
125128
O << SysReg->Name;
126129
else
127130
O << Imm;

llvm/lib/Target/RISCV/RISCVSystemOperands.td

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,9 @@ include "llvm/TableGen/SearchableTable.td"
1919

2020
class SysReg<string name, bits<12> op> {
2121
string Name = name;
22-
// A maximum of one alias is supported right now.
23-
string AltName = name;
24-
// A maximum of one deprecated name is supported right now. Unlike the
25-
// `AltName` alias, a `DeprecatedName` generates a diagnostic when the name is
26-
// used to encourage software to migrate away from the name.
22+
// A maximum of one deprecated name is supported right now. It generates a
23+
// diagnostic when the name is used to encourage software to migrate away from
24+
// the name.
2725
string DeprecatedName = "";
2826
bits<12> Encoding = op;
2927
// FIXME: add these additional fields when needed.
@@ -43,7 +41,7 @@ def SysRegsList : GenericTable {
4341
let FilterClass = "SysReg";
4442
// FIXME: add "ReadWrite", "Mode", "Extra", "Number" fields when needed.
4543
let Fields = [
46-
"Name", "AltName", "DeprecatedName", "Encoding", "FeaturesRequired",
44+
"Name", "DeprecatedName", "Encoding", "FeaturesRequired",
4745
"isRV32Only",
4846
];
4947

@@ -56,13 +54,32 @@ def lookupSysRegByName : SearchIndex {
5654
let Key = [ "Name" ];
5755
}
5856

59-
def lookupSysRegByAltName : SearchIndex {
57+
def lookupSysRegByDeprecatedName : SearchIndex {
6058
let Table = SysRegsList;
61-
let Key = [ "AltName" ];
59+
let Key = [ "DeprecatedName" ];
6260
}
6361

64-
def lookupSysRegByDeprecatedName : SearchIndex {
65-
let Table = SysRegsList;
62+
class SiFiveReg<string name, bits<12> op> : SysReg<name, op>;
63+
64+
def SiFiveRegsList : GenericTable {
65+
let FilterClass = "SiFiveReg";
66+
// FIXME: add "ReadWrite", "Mode", "Extra", "Number" fields when needed.
67+
let Fields = [
68+
"Name", "DeprecatedName", "Encoding", "FeaturesRequired",
69+
"isRV32Only",
70+
];
71+
72+
let PrimaryKey = [ "Encoding" ];
73+
let PrimaryKeyName = "lookupSiFiveRegByEncoding";
74+
}
75+
76+
def lookupSiFiveRegByName : SearchIndex {
77+
let Table = SiFiveRegsList;
78+
let Key = [ "Name" ];
79+
}
80+
81+
def lookupSiFiveRegByDeprecatedName : SearchIndex {
82+
let Table = SiFiveRegsList;
6683
let Key = [ "DeprecatedName" ];
6784
}
6885

@@ -292,7 +309,7 @@ foreach i = 3...31 in
292309
//===----------------------------------------------------------------------===//
293310
// Machine Counter Setup
294311
//===----------------------------------------------------------------------===//
295-
let AltName = "mucounteren" in // Privileged spec v1.9.1 Name
312+
let DeprecatedName = "mucounteren" in // Privileged spec v1.9.1 Name
296313
def : SysReg<"mcountinhibit", 0x320>;
297314

298315
// mhpmevent3-mhpmevent31 at 0x323-0x33F.
@@ -305,6 +322,20 @@ foreach i = 3...31 in {
305322
def : SysReg<"mhpmevent"#i#"h", !add(0x723, !sub(i, 3))>;
306323
}
307324

325+
//===----------------------------------------------------------------------===//
326+
// SiFive Custom Machine Mode Registers
327+
//===----------------------------------------------------------------------===//
328+
329+
let FeaturesRequired = [{ {RISCV::FeatureVendorXSfcie} }] in {
330+
def : SiFiveReg<"mnscratch", 0x350>;
331+
def : SiFiveReg<"mnepc", 0x351>;
332+
def : SiFiveReg<"mncause", 0x352>;
333+
def : SiFiveReg<"mnstatus", 0x353>;
334+
def : SiFiveReg<"mbpm", 0x7C0>;
335+
def : SiFiveReg<"mfd", 0x7C1>;
336+
def : SiFiveReg<"mpd", 0x7C8>;
337+
}
338+
308339
//===----------------------------------------------------------------------===//
309340
// Debug/ Trace Registers (shared with Debug Mode)
310341
//===----------------------------------------------------------------------===//
@@ -322,7 +353,7 @@ def : SysReg<"dpc", 0x7B1>;
322353

323354
// "dscratch" is an alternative name for "dscratch0" which appeared in earlier
324355
// drafts of the RISC-V debug spec
325-
let AltName = "dscratch" in
356+
let DeprecatedName = "dscratch" in
326357
def : SysReg<"dscratch0", 0x7B2>;
327358
def : SysReg<"dscratch1", 0x7B3>;
328359

llvm/test/MC/RISCV/machine-csr-names.s

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
# RUN: llvm-mc -filetype=obj -triple riscv64 < %s \
1010
# RUN: | llvm-objdump -d - \
1111
# RUN: | FileCheck -check-prefix=CHECK-INST-ALIAS %s
12+
#
13+
# RUN: llvm-mc -triple riscv32 %s 2>&1 | FileCheck -check-prefix CHECK-WARN %s
14+
# RUN: llvm-mc -triple riscv64 %s 2>&1 | FileCheck -check-prefix CHECK-WARN %s
1215

1316
##################################
1417
# Machine Information Registers
@@ -1492,6 +1495,8 @@ csrrs t1, dscratch, zero
14921495
# uimm12
14931496
csrrs t2, 0x7B2, zero
14941497

1498+
# CHECK-WARN: warning: 'dscratch' is a deprecated alias for 'dscratch0'
1499+
14951500
# dscratch1
14961501
# name
14971502
# CHECK-INST: csrrs t1, dscratch1, zero
@@ -1944,6 +1949,8 @@ csrrs t1, mucounteren, zero
19441949
# uimm12
19451950
csrrs t2, 0x320, zero
19461951

1952+
# CHECK-WARN: warning: 'mucounteren' is a deprecated alias for 'mcountinhibit'
1953+
19471954
# mhpmevent3
19481955
# name
19491956
# CHECK-INST: csrrs t1, mhpmevent3, zero

llvm/test/MC/RISCV/xsfcie-invalid.s

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,17 @@ cease x1 # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
2323
cease 0x10 # CHECK: :[[@LINE]]:7: error: invalid operand for instruction
2424

2525
cease # CHECK: :[[@LINE]]:1: error: instruction requires the following: 'XSfcie' (SiFive Custom Instruction Extension SCIE.)
26+
27+
csrr t1, mbpm # CHECK: :[[@LINE]]:10: error: system register use requires an option to be enabled
28+
29+
csrr t1, mfd # CHECK: :[[@LINE]]:10: error: system register use requires an option to be enabled
30+
31+
csrr t1, mpd # CHECK: :[[@LINE]]:10: error: system register use requires an option to be enabled
32+
33+
csrr t1, mnscratch # CHECK: :[[@LINE]]:10: error: system register use requires an option to be enabled
34+
35+
csrr t1, mnepc # CHECK: :[[@LINE]]:10: error: system register use requires an option to be enabled
36+
37+
csrr t1, mncause # CHECK: :[[@LINE]]:10: error: system register use requires an option to be enabled
38+
39+
csrr t1, mnstatus # CHECK: :[[@LINE]]:10: error: system register use requires an option to be enabled

llvm/test/MC/RISCV/xsfcie-valid.s

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
# RUN: | FileCheck -check-prefixes=CHECK-ENC,CHECK-INST %s
44
# RUN: llvm-mc %s -triple=riscv64 -mattr=+xsfcie -riscv-no-aliases -show-encoding \
55
# RUN: | FileCheck -check-prefixes=CHECK-ENC,CHECK-INST %s
6+
# RUN: llvm-mc %s -triple=riscv32 -mattr=+xsfcie -riscv-no-aliases -show-encoding 2>&1 \
7+
# RUN: | FileCheck -check-prefixes=CHECK-WARN %s
8+
# RUN: llvm-mc %s -triple=riscv64 -mattr=+xsfcie -riscv-no-aliases -show-encoding 2>&1 \
9+
# RUN: | FileCheck -check-prefixes=CHECK-WARN %s
610
# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+xsfcie < %s \
711
# RUN: | llvm-objdump --mattr=+xsfcie -M no-aliases -d - \
812
# RUN: | FileCheck -check-prefix=CHECK-INST %s
@@ -11,6 +15,8 @@
1115
# RUN: | FileCheck -check-prefix=CHECK-INST %s
1216
# RUN: llvm-mc %s -triple=riscv64 -mcpu=sifive-s76 -riscv-no-aliases -show-encoding \
1317
# RUN: | FileCheck -check-prefixes=CHECK-ENC,CHECK-INST %s
18+
# RUN: llvm-mc %s -triple=riscv64 -mcpu=sifive-s76 -riscv-no-aliases -show-encoding 2>&1 \
19+
# RUN: | FileCheck -check-prefixes=CHECK-WARN %s
1420
# RUN: llvm-mc -filetype=obj -triple riscv64 -mcpu=sifive-s76 < %s \
1521
# RUN: | llvm-objdump --mcpu=sifive-s76 -M no-aliases -d - \
1622
# RUN: | FileCheck -check-prefix=CHECK-INST %s
@@ -40,3 +46,91 @@ cdiscard.d.l1 x7
4046
# CHECK-INST: cease
4147
# CHECK-ENC: encoding: [0x73,0x00,0x50,0x30]
4248
cease
49+
50+
# mbpm
51+
# name
52+
# CHECK-INST: csrrs t2, mbpm, zero
53+
# CHECK-ENC: encoding: [0xf3,0x23,0x00,0x7c]
54+
# uimm12
55+
# CHECK-INST: csrrs t2, mbpm, zero
56+
# CHECK-ENC: encoding: [0xf3,0x23,0x00,0x7c]
57+
# name
58+
csrrs t2, mbpm, zero
59+
# uimm12
60+
csrrs t2, 0x7C0, zero
61+
62+
# mfd
63+
# name
64+
# CHECK-INST: csrrs t2, mfd, zero
65+
# CHECK-ENC: encoding: [0xf3,0x23,0x10,0x7c]
66+
# uimm12
67+
# CHECK-INST: csrrs t2, mfd, zero
68+
# CHECK-ENC: encoding: [0xf3,0x23,0x10,0x7c]
69+
# name
70+
csrrs t2, mfd, zero
71+
# uimm12
72+
csrrs t2, 0x7C1, zero
73+
74+
# mpd
75+
# name
76+
# CHECK-INST: csrrs t2, mpd, zero
77+
# CHECK-ENC: encoding: [0xf3,0x23,0x80,0x7c]
78+
# uimm12
79+
# CHECK-INST: csrrs t2, mpd, zero
80+
# CHECK-ENC: encoding: [0xf3,0x23,0x80,0x7c]
81+
# name
82+
csrrs t2, mpd, zero
83+
# uimm12
84+
csrrs t2, 0x7C8, zero
85+
86+
# mnscratch
87+
# name
88+
# CHECK-INST: csrrs t1, mnscratch, zero
89+
# CHECK-ENC: encoding: [0x73,0x23,0x00,0x35]
90+
# CHECK-WARN: warning: 'miselect' CSR is not available on the current subtarget. Instead 'mnscratch' CSR will be used.
91+
# uimm12
92+
# CHECK-INST: csrrs t2, mnscratch, zero
93+
# CHECK-ENC: encoding: [0xf3,0x23,0x00,0x35]
94+
# name
95+
csrrs t1, mnscratch, zero
96+
csrrs t1, miselect, zero
97+
# uimm12
98+
csrrs t2, 0x350, zero
99+
100+
# mnepc
101+
# name
102+
# CHECK-INST: csrrs t1, mnepc, zero
103+
# CHECK-ENC: encoding: [0x73,0x23,0x10,0x35]
104+
# CHECK-WARN: warning: 'mireg' CSR is not available on the current subtarget. Instead 'mnepc' CSR will be used.
105+
# uimm12
106+
# CHECK-INST: csrrs t2, mnepc, zero
107+
# CHECK-ENC: encoding: [0xf3,0x23,0x10,0x35]
108+
# name
109+
csrrs t1, mnepc, zero
110+
csrrs t1, mireg, zero
111+
# uimm12
112+
csrrs t2, 0x351, zero
113+
114+
# mncause
115+
# name
116+
# CHECK-INST: csrrs t1, mncause, zero
117+
# CHECK-ENC: encoding: [0x73,0x23,0x20,0x35]
118+
# uimm12
119+
# CHECK-INST: csrrs t2, mncause, zero
120+
# CHECK-ENC: encoding: [0xf3,0x23,0x20,0x35]
121+
# name
122+
csrrs t1, mncause, zero
123+
# uimm12
124+
csrrs t2, 0x352, zero
125+
126+
# mnstatus
127+
# name
128+
# CHECK-INST: csrrs t1, mnstatus, zero
129+
# CHECK-ENC: encoding: [0x73,0x23,0x30,0x35]
130+
# uimm12
131+
# CHECK-INST: csrrs t2, mnstatus, zero
132+
# CHECK-ENC: encoding: [0xf3,0x23,0x30,0x35]
133+
# name
134+
csrrs t1, mnstatus, zero
135+
# uimm12
136+
csrrs t2, 0x353, zero

0 commit comments

Comments
 (0)