Skip to content

Commit 775148f

Browse files
authored
[RISCV] Add mvendorid/marchid/mimpid to CPU definitions (#116202)
We can get these information via `sys_riscv_hwprobe`. This can be used to implement `__builtin_cpu_is`.
1 parent dde9477 commit 775148f

File tree

5 files changed

+57
-20
lines changed

5 files changed

+57
-20
lines changed

llvm/include/llvm/TargetParser/RISCVTargetParser.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@ struct RISCVExtensionBitmask {
3232
};
3333
} // namespace RISCVExtensionBitmaskTable
3434

35+
struct CPUModel {
36+
uint32_t MVendorID;
37+
uint64_t MArchID;
38+
uint64_t MImpID;
39+
};
40+
41+
struct CPUInfo {
42+
StringLiteral Name;
43+
StringLiteral DefaultMarch;
44+
bool FastScalarUnalignedAccess;
45+
bool FastVectorUnalignedAccess;
46+
CPUModel CPUModel;
47+
bool is64Bit() const { return DefaultMarch.starts_with("rv64"); }
48+
};
49+
3550
// We use 64 bits as the known part in the scalable vector types.
3651
static constexpr unsigned RVVBitsPerBlock = 64;
3752

llvm/lib/Target/RISCV/RISCVProcessors.td

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ class RISCVProcessorModel<string n,
4949
string default_march = "">
5050
: ProcessorModel<n, m, f, tunef> {
5151
string DefaultMarch = default_march;
52+
int MVendorID = 0;
53+
int MArchID = 0;
54+
int MImpID = 0;
5255
}
5356

5457
class RISCVTuneProcessorModel<string n,
@@ -457,7 +460,11 @@ def VENTANA_VEYRON_V1 : RISCVProcessorModel<"veyron-v1",
457460
TuneZExtHFusion,
458461
TuneZExtWFusion,
459462
TuneShiftedZExtWFusion,
460-
TuneLDADDFusion]>;
463+
TuneLDADDFusion]> {
464+
let MVendorID = 0x61f;
465+
let MArchID = 0x8000000000010000;
466+
let MImpID = 0x111;
467+
}
461468

462469
def XIANGSHAN_NANHU : RISCVProcessorModel<"xiangshan-nanhu",
463470
XiangShanNanHuModel,
@@ -503,7 +510,11 @@ def SPACEMIT_X60 : RISCVProcessorModel<"spacemit-x60",
503510
[TuneDLenFactor2,
504511
TuneOptimizedNF2SegmentLoadStore,
505512
TuneOptimizedNF3SegmentLoadStore,
506-
TuneOptimizedNF4SegmentLoadStore]>;
513+
TuneOptimizedNF4SegmentLoadStore]> {
514+
let MVendorID = 0x710;
515+
let MArchID = 0x8000000058000001;
516+
let MImpID = 0x1000000049772200;
517+
}
507518

508519
def RP2350_HAZARD3 : RISCVProcessorModel<"rp2350-hazard3",
509520
NoSchedModel,

llvm/lib/TargetParser/RISCVTargetParser.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,22 @@ namespace RISCV {
2121

2222
enum CPUKind : unsigned {
2323
#define PROC(ENUM, NAME, DEFAULT_MARCH, FAST_SCALAR_UNALIGN, \
24-
FAST_VECTOR_UNALIGN) \
24+
FAST_VECTOR_UNALIGN, MVENDORID, MARCHID, MIMPID) \
2525
CK_##ENUM,
2626
#define TUNE_PROC(ENUM, NAME) CK_##ENUM,
2727
#include "llvm/TargetParser/RISCVTargetParserDef.inc"
2828
};
2929

30-
struct CPUInfo {
31-
StringLiteral Name;
32-
StringLiteral DefaultMarch;
33-
bool FastScalarUnalignedAccess;
34-
bool FastVectorUnalignedAccess;
35-
bool is64Bit() const { return DefaultMarch.starts_with("rv64"); }
36-
};
37-
3830
constexpr CPUInfo RISCVCPUInfo[] = {
3931
#define PROC(ENUM, NAME, DEFAULT_MARCH, FAST_SCALAR_UNALIGN, \
40-
FAST_VECTOR_UNALIGN) \
41-
{NAME, DEFAULT_MARCH, FAST_SCALAR_UNALIGN, FAST_VECTOR_UNALIGN},
32+
FAST_VECTOR_UNALIGN, MVENDORID, MARCHID, MIMPID) \
33+
{ \
34+
NAME, \
35+
DEFAULT_MARCH, \
36+
FAST_SCALAR_UNALIGN, \
37+
FAST_VECTOR_UNALIGN, \
38+
{MVENDORID, MARCHID, MIMPID}, \
39+
},
4240
#include "llvm/TargetParser/RISCVTargetParserDef.inc"
4341
};
4442

llvm/test/TableGen/riscv-target-def.td

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ class RISCVProcessorModel<string n,
8181
string default_march = "">
8282
: ProcessorModel<n, m, f, tunef> {
8383
string DefaultMarch = default_march;
84+
int MVendorID = 0;
85+
int MArchID = 0;
86+
int MImpID = 0;
8487
}
8588

8689
class RISCVTuneProcessorModel<string n,
@@ -160,13 +163,13 @@ def ROCKET : RISCVTuneProcessorModel<"rocket",
160163
// CHECK: #endif // GET_SUPPORTED_PROFILES
161164

162165
// CHECK: #ifndef PROC
163-
// CHECK-NEXT: #define PROC(ENUM, NAME, DEFAULT_MARCH, FAST_SCALAR_UNALIGN, FAST_VECTOR_UNALIGN)
166+
// CHECK-NEXT: #define PROC(ENUM, NAME, DEFAULT_MARCH, FAST_SCALAR_UNALIGN, FAST_VECTOR_UNALIGN, MVENDORID, MARCHID, MIMPID)
164167
// CHECK-NEXT: #endif
165168

166-
// CHECK: PROC(GENERIC_RV32, {"generic-rv32"}, {"rv32i2p1"}, 0, 0)
167-
// CHECK-NEXT: PROC(GENERIC_RV64, {"generic-rv64"}, {"rv64i2p1"}, 0, 0)
168-
// CHECK-NEXT: PROC(ROCKET_RV32, {"rocket-rv32"}, {"rv32i2p1_zicsr2p0_zidummy0p1_zifencei2p0"}, 0, 0)
169-
// CHECK-NEXT: PROC(ROCKET_RV64, {"rocket-rv64"}, {"rv64i2p1_zicsr2p0_zidummy0p1_zifencei2p0"}, 0, 0)
169+
// CHECK: PROC(GENERIC_RV32, {"generic-rv32"}, {"rv32i2p1"}, 0, 0, 0x00000000, 0x0000000000000000, 0x0000000000000000)
170+
// CHECK-NEXT: PROC(GENERIC_RV64, {"generic-rv64"}, {"rv64i2p1"}, 0, 0, 0x00000000, 0x0000000000000000, 0x0000000000000000)
171+
// CHECK-NEXT: PROC(ROCKET_RV32, {"rocket-rv32"}, {"rv32i2p1_zicsr2p0_zidummy0p1_zifencei2p0"}, 0, 0, 0x00000000, 0x0000000000000000, 0x0000000000000000)
172+
// CHECK-NEXT: PROC(ROCKET_RV64, {"rocket-rv64"}, {"rv64i2p1_zicsr2p0_zidummy0p1_zifencei2p0"}, 0, 0, 0x00000000, 0x0000000000000000, 0x0000000000000000)
170173

171174
// CHECK: #undef PROC
172175

llvm/utils/TableGen/RISCVTargetDefEmitter.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
//===----------------------------------------------------------------------===//
1313

1414
#include "llvm/ADT/DenseSet.h"
15+
#include "llvm/Support/Format.h"
1516
#include "llvm/Support/RISCVISAUtils.h"
1617
#include "llvm/TableGen/Record.h"
1718
#include "llvm/TableGen/TableGenBackend.h"
@@ -166,7 +167,7 @@ static void emitRISCVProfiles(const RecordKeeper &Records, raw_ostream &OS) {
166167
static void emitRISCVProcs(const RecordKeeper &RK, raw_ostream &OS) {
167168
OS << "#ifndef PROC\n"
168169
<< "#define PROC(ENUM, NAME, DEFAULT_MARCH, FAST_SCALAR_UNALIGN"
169-
<< ", FAST_VECTOR_UNALIGN)\n"
170+
<< ", FAST_VECTOR_UNALIGN, MVENDORID, MARCHID, MIMPID)\n"
170171
<< "#endif\n\n";
171172

172173
// Iterate on all definition records.
@@ -192,8 +193,17 @@ static void emitRISCVProcs(const RecordKeeper &RK, raw_ostream &OS) {
192193
printMArch(OS, Features);
193194
else
194195
OS << MArch;
196+
197+
uint32_t MVendorID = Rec->getValueAsInt("MVendorID");
198+
uint64_t MArchID = Rec->getValueAsInt("MArchID");
199+
uint64_t MImpID = Rec->getValueAsInt("MImpID");
200+
195201
OS << "\"}, " << FastScalarUnalignedAccess << ", "
196-
<< FastVectorUnalignedAccess << ")\n";
202+
<< FastVectorUnalignedAccess;
203+
OS << ", " << format_hex(MVendorID, 10);
204+
OS << ", " << format_hex(MArchID, 18);
205+
OS << ", " << format_hex(MImpID, 18);
206+
OS << ")\n";
197207
}
198208
OS << "\n#undef PROC\n";
199209
OS << "\n";

0 commit comments

Comments
 (0)