Skip to content

Commit c650ad9

Browse files
committed
[AArch64][TargetParser] move ArchInfo into tablegen
1 parent 69e1312 commit c650ad9

File tree

3 files changed

+163
-124
lines changed

3 files changed

+163
-124
lines changed

llvm/include/llvm/TargetParser/AArch64TargetParser.h

Lines changed: 4 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ enum ArchProfile { AProfile = 'A', RProfile = 'R', InvalidProfile = '?' };
238238
struct ArchInfo {
239239
VersionTuple Version; // Architecture version, major + minor.
240240
ArchProfile Profile; // Architecuture profile
241-
StringRef Name; // Human readable name, e.g. "armv8.1-a"
242-
StringRef ArchFeature; // Command line feature flag, e.g. +v8a
241+
StringRef Name; // Name as supplied to -march e.g. "armv8.1-a"
242+
StringRef ArchFeature; // Name as supplied to -target-feature, e.g. "+v8a"
243243
AArch64::ExtensionBitset
244244
DefaultExts; // bitfield of default extensions ArchExtKind
245245

@@ -288,48 +288,8 @@ struct ArchInfo {
288288
static std::optional<ArchInfo> findBySubArch(StringRef SubArch);
289289
};
290290

291-
// clang-format off
292-
inline constexpr ArchInfo ARMV8A = { VersionTuple{8, 0}, AProfile, "armv8-a", "+v8a", (
293-
AArch64::ExtensionBitset({AArch64::AEK_FP, AArch64::AEK_SIMD})), };
294-
inline constexpr ArchInfo ARMV8_1A = { VersionTuple{8, 1}, AProfile, "armv8.1-a", "+v8.1a", (ARMV8A.DefaultExts |
295-
AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_LSE, AArch64::AEK_RDM}))};
296-
inline constexpr ArchInfo ARMV8_2A = { VersionTuple{8, 2}, AProfile, "armv8.2-a", "+v8.2a", (ARMV8_1A.DefaultExts |
297-
AArch64::ExtensionBitset({AArch64::AEK_RAS}))};
298-
inline constexpr ArchInfo ARMV8_3A = { VersionTuple{8, 3}, AProfile, "armv8.3-a", "+v8.3a", (ARMV8_2A.DefaultExts |
299-
AArch64::ExtensionBitset({AArch64::AEK_FCMA, AArch64::AEK_JSCVT, AArch64::AEK_PAUTH, AArch64::AEK_RCPC}))};
300-
inline constexpr ArchInfo ARMV8_4A = { VersionTuple{8, 4}, AProfile, "armv8.4-a", "+v8.4a", (ARMV8_3A.DefaultExts |
301-
AArch64::ExtensionBitset({AArch64::AEK_DOTPROD}))};
302-
inline constexpr ArchInfo ARMV8_5A = { VersionTuple{8, 5}, AProfile, "armv8.5-a", "+v8.5a", (ARMV8_4A.DefaultExts)};
303-
inline constexpr ArchInfo ARMV8_6A = { VersionTuple{8, 6}, AProfile, "armv8.6-a", "+v8.6a", (ARMV8_5A.DefaultExts |
304-
AArch64::ExtensionBitset({AArch64::AEK_BF16, AArch64::AEK_I8MM}))};
305-
inline constexpr ArchInfo ARMV8_7A = { VersionTuple{8, 7}, AProfile, "armv8.7-a", "+v8.7a", (ARMV8_6A.DefaultExts)};
306-
inline constexpr ArchInfo ARMV8_8A = { VersionTuple{8, 8}, AProfile, "armv8.8-a", "+v8.8a", (ARMV8_7A.DefaultExts |
307-
AArch64::ExtensionBitset({AArch64::AEK_MOPS, AArch64::AEK_HBC}))};
308-
inline constexpr ArchInfo ARMV8_9A = { VersionTuple{8, 9}, AProfile, "armv8.9-a", "+v8.9a", (ARMV8_8A.DefaultExts |
309-
AArch64::ExtensionBitset({AArch64::AEK_SPECRES2, AArch64::AEK_CSSC, AArch64::AEK_RASV2}))};
310-
inline constexpr ArchInfo ARMV9A = { VersionTuple{9, 0}, AProfile, "armv9-a", "+v9a", (ARMV8_5A.DefaultExts |
311-
AArch64::ExtensionBitset({AArch64::AEK_FP16, AArch64::AEK_SVE, AArch64::AEK_SVE2}))};
312-
inline constexpr ArchInfo ARMV9_1A = { VersionTuple{9, 1}, AProfile, "armv9.1-a", "+v9.1a", (ARMV9A.DefaultExts |
313-
AArch64::ExtensionBitset({AArch64::AEK_BF16, AArch64::AEK_I8MM}))};
314-
inline constexpr ArchInfo ARMV9_2A = { VersionTuple{9, 2}, AProfile, "armv9.2-a", "+v9.2a", (ARMV9_1A.DefaultExts)};
315-
inline constexpr ArchInfo ARMV9_3A = { VersionTuple{9, 3}, AProfile, "armv9.3-a", "+v9.3a", (ARMV9_2A.DefaultExts |
316-
AArch64::ExtensionBitset({AArch64::AEK_MOPS, AArch64::AEK_HBC}))};
317-
inline constexpr ArchInfo ARMV9_4A = { VersionTuple{9, 4}, AProfile, "armv9.4-a", "+v9.4a", (ARMV9_3A.DefaultExts |
318-
AArch64::ExtensionBitset({AArch64::AEK_SPECRES2, AArch64::AEK_CSSC, AArch64::AEK_RASV2}))};
319-
inline constexpr ArchInfo ARMV9_5A = { VersionTuple{9, 5}, AProfile, "armv9.5-a", "+v9.5a", (ARMV9_4A.DefaultExts |
320-
AArch64::ExtensionBitset({AArch64::AEK_CPA}))};
321-
// For v8-R, we do not enable crypto and align with GCC that enables a more minimal set of optional architecture extensions.
322-
inline constexpr ArchInfo ARMV8R = { VersionTuple{8, 0}, RProfile, "armv8-r", "+v8r", (ARMV8_5A.DefaultExts |
323-
AArch64::ExtensionBitset({AArch64::AEK_SSBS,
324-
AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_SB}).flip(AArch64::AEK_LSE))};
325-
// clang-format on
326-
327-
// The set of all architectures
328-
static constexpr std::array<const ArchInfo *, 17> ArchInfos = {
329-
&ARMV8A, &ARMV8_1A, &ARMV8_2A, &ARMV8_3A, &ARMV8_4A, &ARMV8_5A,
330-
&ARMV8_6A, &ARMV8_7A, &ARMV8_8A, &ARMV8_9A, &ARMV9A, &ARMV9_1A,
331-
&ARMV9_2A, &ARMV9_3A, &ARMV9_4A, &ARMV9_5A, &ARMV8R,
332-
};
291+
#define EMIT_ARCHITECTURES
292+
#include "llvm/TargetParser/AArch64TargetParserDef.inc"
333293

334294
// Details of a specific CPU.
335295
struct CpuInfo {

llvm/lib/Target/AArch64/AArch64Features.td

Lines changed: 94 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -787,90 +787,104 @@ def FeatureTLBIW : Extension<"tlbiw", "TLBIW",
787787
//===----------------------------------------------------------------------===//
788788
// Architectures.
789789
//
790-
def HasV8_0aOps : SubtargetFeature<"v8a", "HasV8_0aOps", "true",
791-
"Support ARM v8.0a instructions", [FeatureEL2VMSA, FeatureEL3]>;
792-
793-
def HasV8_1aOps : SubtargetFeature<"v8.1a", "HasV8_1aOps", "true",
794-
"Support ARM v8.1a instructions", [HasV8_0aOps, FeatureCRC, FeatureLSE,
795-
FeatureRDM, FeaturePAN, FeatureLOR, FeatureVH]>;
796-
797-
def HasV8_2aOps : SubtargetFeature<"v8.2a", "HasV8_2aOps", "true",
798-
"Support ARM v8.2a instructions", [HasV8_1aOps, FeaturePsUAO,
799-
FeaturePAN_RWV, FeatureRAS, FeatureCCPP]>;
800-
801-
def HasV8_3aOps : SubtargetFeature<"v8.3a", "HasV8_3aOps", "true",
802-
"Support ARM v8.3a instructions", [HasV8_2aOps, FeatureRCPC, FeaturePAuth,
803-
FeatureJS, FeatureCCIDX, FeatureComplxNum]>;
804-
805-
def HasV8_4aOps : SubtargetFeature<"v8.4a", "HasV8_4aOps", "true",
806-
"Support ARM v8.4a instructions", [HasV8_3aOps, FeatureDotProd,
807-
FeatureNV, FeatureMPAM, FeatureDIT,
808-
FeatureTRACEV8_4, FeatureAM, FeatureSEL2, FeatureTLB_RMI,
809-
FeatureFlagM, FeatureRCPC_IMMO, FeatureLSE2]>;
790+
class Architecture64<
791+
int major, int minor, string profile,
792+
string target_feature_name,
793+
list<SubtargetFeature> implied_features,
794+
list<Extension> default_extensions
795+
> : SubtargetFeature<target_feature_name,
796+
"HasV" # major # "_" # minor # profile # "Ops", "true",
797+
"Support ARM " # target_feature_name # " architecture",
798+
implied_features
799+
> {
800+
int Major = major;
801+
int Minor = minor;
802+
string Profile = profile;
803+
804+
// Extensions enabled by default. Not the same as implied SubtargetFeatures.
805+
list<Extension> DefaultExts = default_extensions;
806+
}
810807

811-
def HasV8_5aOps : SubtargetFeature<
812-
"v8.5a", "HasV8_5aOps", "true", "Support ARM v8.5a instructions",
808+
def HasV8_0aOps : Architecture64<8, 0, "a", "v8a",
809+
[FeatureEL2VMSA, FeatureEL3],
810+
[FeatureFPARMv8, FeatureNEON]>;
811+
def HasV8_1aOps : Architecture64<8, 1, "a", "v8.1a",
812+
[HasV8_0aOps, FeatureCRC, FeatureLSE, FeatureRDM, FeaturePAN, FeatureLOR,
813+
FeatureVH],
814+
!listconcat(HasV8_0aOps.DefaultExts, [FeatureCRC, FeatureLSE, FeatureRDM])>;
815+
def HasV8_2aOps : Architecture64<8, 2, "a", "v8.2a",
816+
[HasV8_1aOps, FeaturePsUAO, FeaturePAN_RWV, FeatureRAS, FeatureCCPP],
817+
!listconcat(HasV8_1aOps.DefaultExts, [FeatureRAS])>;
818+
def HasV8_3aOps : Architecture64<8, 3, "a", "v8.3a",
819+
[HasV8_2aOps, FeatureRCPC, FeaturePAuth, FeatureJS, FeatureCCIDX,
820+
FeatureComplxNum],
821+
!listconcat(HasV8_2aOps.DefaultExts, [FeatureComplxNum, FeatureJS,
822+
FeaturePAuth, FeatureRCPC])>;
823+
def HasV8_4aOps : Architecture64<8, 4, "a", "v8.4a",
824+
[HasV8_3aOps, FeatureDotProd, FeatureNV, FeatureMPAM, FeatureDIT,
825+
FeatureTRACEV8_4, FeatureAM, FeatureSEL2, FeatureTLB_RMI, FeatureFlagM,
826+
FeatureRCPC_IMMO, FeatureLSE2],
827+
!listconcat(HasV8_3aOps.DefaultExts, [FeatureDotProd])>;
828+
def HasV8_5aOps : Architecture64<8, 5, "a", "v8.5a",
813829
[HasV8_4aOps, FeatureAltFPCmp, FeatureFRInt3264, FeatureSpecRestrict,
814-
FeatureSSBS, FeatureSB, FeaturePredRes, FeatureCacheDeepPersist,
815-
FeatureBranchTargetId]>;
816-
817-
def HasV8_6aOps : SubtargetFeature<
818-
"v8.6a", "HasV8_6aOps", "true", "Support ARM v8.6a instructions",
830+
FeatureSSBS, FeatureSB, FeaturePredRes, FeatureCacheDeepPersist,
831+
FeatureBranchTargetId],
832+
!listconcat(HasV8_4aOps.DefaultExts, [])>;
833+
def HasV8_6aOps : Architecture64<8, 6, "a", "v8.6a",
819834
[HasV8_5aOps, FeatureAMVS, FeatureBF16, FeatureFineGrainedTraps,
820-
FeatureEnhancedCounterVirtualization, FeatureMatMulInt8]>;
821-
822-
def HasV8_7aOps : SubtargetFeature<
823-
"v8.7a", "HasV8_7aOps", "true", "Support ARM v8.7a instructions",
824-
[HasV8_6aOps, FeatureXS, FeatureWFxT, FeatureHCX]>;
825-
826-
def HasV8_8aOps : SubtargetFeature<
827-
"v8.8a", "HasV8_8aOps", "true", "Support ARM v8.8a instructions",
828-
[HasV8_7aOps, FeatureHBC, FeatureMOPS, FeatureNMI]>;
829-
830-
def HasV8_9aOps : SubtargetFeature<
831-
"v8.9a", "HasV8_9aOps", "true", "Support ARM v8.9a instructions",
835+
FeatureEnhancedCounterVirtualization, FeatureMatMulInt8],
836+
!listconcat(HasV8_5aOps.DefaultExts, [FeatureBF16, FeatureMatMulInt8])>;
837+
def HasV8_7aOps : Architecture64<8, 7, "a", "v8.7a",
838+
[HasV8_6aOps, FeatureXS, FeatureWFxT, FeatureHCX],
839+
!listconcat(HasV8_6aOps.DefaultExts, [])>;
840+
def HasV8_8aOps : Architecture64<8, 8, "a", "v8.8a",
841+
[HasV8_7aOps, FeatureHBC, FeatureMOPS, FeatureNMI],
842+
!listconcat(HasV8_7aOps.DefaultExts, [FeatureMOPS, FeatureHBC])>;
843+
def HasV8_9aOps : Architecture64<8, 9, "a", "v8.9a",
832844
[HasV8_8aOps, FeatureCLRBHB, FeaturePRFM_SLC, FeatureSPECRES2,
833-
FeatureCSSC, FeatureRASv2, FeatureCHK]>;
834-
835-
def HasV9_0aOps : SubtargetFeature<
836-
"v9a", "HasV9_0aOps", "true", "Support ARM v9a instructions",
837-
[HasV8_5aOps, FeatureMEC, FeatureSVE2]>;
838-
839-
def HasV9_1aOps : SubtargetFeature<
840-
"v9.1a", "HasV9_1aOps", "true", "Support ARM v9.1a instructions",
841-
[HasV8_6aOps, HasV9_0aOps]>;
842-
843-
def HasV9_2aOps : SubtargetFeature<
844-
"v9.2a", "HasV9_2aOps", "true", "Support ARM v9.2a instructions",
845-
[HasV8_7aOps, HasV9_1aOps]>;
846-
847-
def HasV9_3aOps : SubtargetFeature<
848-
"v9.3a", "HasV9_3aOps", "true", "Support ARM v9.3a instructions",
849-
[HasV8_8aOps, HasV9_2aOps]>;
850-
851-
def HasV9_4aOps : SubtargetFeature<
852-
"v9.4a", "HasV9_4aOps", "true", "Support ARM v9.4a instructions",
853-
[HasV8_9aOps, HasV9_3aOps]>;
854-
855-
def HasV9_5aOps : SubtargetFeature<
856-
"v9.5a", "HasV9_5aOps", "true", "Support ARM v9.5a instructions",
857-
[HasV9_4aOps, FeatureCPA]>;
858-
859-
def HasV8_0rOps : SubtargetFeature<
860-
"v8r", "HasV8_0rOps", "true", "Support ARM v8r instructions",
861-
[//v8.1
862-
FeatureCRC, FeaturePAN, FeatureLSE, FeatureCONTEXTIDREL2,
863-
//v8.2
864-
FeatureRAS, FeaturePsUAO, FeatureCCPP, FeaturePAN_RWV,
865-
//v8.3
866-
FeatureCCIDX, FeaturePAuth, FeatureRCPC,
867-
//v8.4
868-
FeatureTRACEV8_4, FeatureTLB_RMI, FeatureFlagM, FeatureDIT, FeatureSEL2,
869-
FeatureRCPC_IMMO,
870-
// Not mandatory in v8.0-R, but included here on the grounds that it
871-
// only enables names of system registers
872-
FeatureSpecRestrict
873-
]>;
845+
FeatureCSSC, FeatureRASv2, FeatureCHK],
846+
!listconcat(HasV8_8aOps.DefaultExts, [FeatureSPECRES2, FeatureCSSC,
847+
FeatureRASv2])>;
848+
def HasV9_0aOps : Architecture64<9, 0, "a", "v9a",
849+
[HasV8_5aOps, FeatureMEC, FeatureSVE2],
850+
!listconcat(HasV8_5aOps.DefaultExts, [FeatureFullFP16, FeatureSVE,
851+
FeatureSVE2])>;
852+
def HasV9_1aOps : Architecture64<9, 1, "a", "v9.1a",
853+
[HasV8_6aOps, HasV9_0aOps],
854+
!listconcat(HasV9_0aOps.DefaultExts, [FeatureBF16, FeatureMatMulInt8])>;
855+
def HasV9_2aOps : Architecture64<9, 2, "a", "v9.2a",
856+
[HasV8_7aOps, HasV9_1aOps],
857+
!listconcat(HasV9_1aOps.DefaultExts, [])>;
858+
def HasV9_3aOps : Architecture64<9, 3, "a", "v9.3a",
859+
[HasV8_8aOps, HasV9_2aOps],
860+
!listconcat(HasV9_2aOps.DefaultExts, [FeatureMOPS, FeatureHBC])>;
861+
def HasV9_4aOps : Architecture64<9, 4, "a", "v9.4a",
862+
[HasV8_9aOps, HasV9_3aOps],
863+
!listconcat(HasV9_3aOps.DefaultExts, [FeatureSPECRES2, FeatureCSSC,
864+
FeatureRASv2])>;
865+
def HasV9_5aOps : Architecture64<9, 5, "a", "v9.5a",
866+
[HasV9_4aOps, FeatureCPA],
867+
!listconcat(HasV9_4aOps.DefaultExts, [FeatureCPA])>;
868+
def HasV8_0rOps : Architecture64<8, 0, "r", "v8r",
869+
[ //v8.1
870+
FeatureCRC, FeaturePAN, FeatureLSE, FeatureCONTEXTIDREL2,
871+
//v8.2
872+
FeatureRAS, FeaturePsUAO, FeatureCCPP, FeaturePAN_RWV,
873+
//v8.3
874+
FeatureCCIDX, FeaturePAuth, FeatureRCPC,
875+
//v8.4
876+
FeatureTRACEV8_4, FeatureTLB_RMI, FeatureFlagM, FeatureDIT, FeatureSEL2,
877+
FeatureRCPC_IMMO,
878+
// Not mandatory in v8.0-R, but included here on the grounds that it
879+
// only enables names of system registers
880+
FeatureSpecRestrict
881+
],
882+
// For v8-R, we do not enable crypto and align with GCC that enables a more
883+
// minimal set of optional architecture extensions.
884+
!listconcat(
885+
!listremove(HasV8_5aOps.DefaultExts, [FeatureLSE]),
886+
[FeatureSSBS, FeatureFullFP16, FeatureFP16FML, FeatureSB]
887+
)>;
874888

875889
//===----------------------------------------------------------------------===//
876890
// Access to privileged registers

llvm/utils/TableGen/ARMTargetDefEmitter.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#include "llvm/ADT/StringSet.h"
16+
#include "llvm/Support/Format.h"
17+
#include "llvm/TableGen/Error.h"
1618
#include "llvm/TableGen/Record.h"
1719
#include "llvm/TableGen/TableGenBackend.h"
1820
#include <cstdint>
21+
#include <string>
1922

2023
using namespace llvm;
2124

@@ -108,6 +111,68 @@ static void EmitARMTargetDef(RecordKeeper &RK, raw_ostream &OS) {
108111
<< "#undef EMIT_EXTENSIONS\n"
109112
<< "#endif // EMIT_EXTENSIONS\n"
110113
<< "\n";
114+
115+
// Emit architecture information
116+
OS << "#ifdef EMIT_ARCHITECTURES\n";
117+
118+
auto Architectures = RK.getAllDerivedDefinitionsIfDefined("Architecture64");
119+
std::vector<std::string> CppSpellings;
120+
for (const Record *Rec : Architectures) {
121+
const int Major = Rec->getValueAsInt("Major");
122+
const int Minor = Rec->getValueAsInt("Minor");
123+
const std::string ProfileLower = Rec->getValueAsString("Profile").str();
124+
const std::string ProfileUpper = Rec->getValueAsString("Profile").upper();
125+
126+
if (ProfileLower != "a" && ProfileLower != "r")
127+
PrintFatalError(Rec->getLoc(),
128+
"error: Profile must be one of 'a' or 'r', got '" +
129+
ProfileLower + "'");
130+
131+
// Name of the object in C++
132+
const std::string CppSpelling =
133+
Minor == 0 ? "ARMV" + std::to_string(Major) + ProfileUpper.c_str()
134+
: "ARMV" + std::to_string(Major) + "_" +
135+
std::to_string(Minor) + ProfileUpper.c_str();
136+
OS << "inline constexpr ArchInfo " << CppSpelling << " = {\n";
137+
CppSpellings.push_back(CppSpelling);
138+
139+
OS << llvm::format(" VersionTuple{%d, %d},\n", Major, Minor);
140+
OS << llvm::format(" %sProfile,\n", ProfileUpper.c_str());
141+
142+
// Name as spelled for -march.
143+
if (Minor == 0)
144+
OS << llvm::format(" \"armv%d-%s\",\n", Major, ProfileLower.c_str());
145+
else
146+
OS << llvm::format(" \"armv%d.%d-%s\",\n", Major, Minor,
147+
ProfileLower.c_str());
148+
149+
// SubtargetFeature::Name, used for -target-feature. Here the "+" is added.
150+
const auto TargetFeatureName = Rec->getValueAsString("Name");
151+
OS << " \"+" << TargetFeatureName << "\",\n";
152+
153+
// Construct the list of default extensions
154+
OS << " (AArch64::ExtensionBitset({";
155+
for (auto *E : Rec->getValueAsListOfDefs("DefaultExts")) {
156+
// Only process subclasses of Extension
157+
OS << "AArch64::" << E->getValueAsString("ArchExtKindSpelling").upper()
158+
<< ", ";
159+
}
160+
OS << "}))\n";
161+
162+
OS << "};\n";
163+
}
164+
165+
OS << "\n"
166+
<< "/// The set of all architectures\n"
167+
<< "static constexpr std::array<const ArchInfo *, " << CppSpellings.size()
168+
<< "> ArchInfos = {\n";
169+
for (auto CppSpelling : CppSpellings)
170+
OS << " &" << CppSpelling << ",\n";
171+
OS << "};\n";
172+
173+
OS << "#undef EMIT_ARCHITECTURES\n"
174+
<< "#endif // EMIT_ARCHITECTURES\n"
175+
<< "\n";
111176
}
112177

113178
static TableGen::Emitter::Opt

0 commit comments

Comments
 (0)