Skip to content

Commit cfca977

Browse files
committed
[AArch64][TargetParser] autogen ArchExtKind enum (#90314)
Re-land 61b2a0e. Some Windows builds were failing because AArch64TargetParserDef.inc is a generated header which is included transitively into some clang components, but this information is not available to the build system and therefore there is a missing edge in the dependency graph. This patch incorporates the fixes described in ac1ffd3/D142403. Thanks to ExtensionSet::toLLVMFeatureList, all values of ArchExtKind should correspond to a particular -target-feature. The valid values of -target-feature are in turn defined by SubtargetFeature defs. Therefore we can generate ArchExtKind from the tablegen data. This is done by adding an Extension class which derives from SubtargetFeature. Because the Has* FieldNames do not always correspond to the AEK_ names ("extensions", as defined in TargetParser), and AEK_ names do not always correspond to -march strings, some additional enum entries have been added to remap the names. I have renamed these to make the naming consistent, but split them into a separate PR to keep the diff reasonable (#90320)
1 parent 167b506 commit cfca977

File tree

5 files changed

+177
-196
lines changed

5 files changed

+177
-196
lines changed

llvm/cmake/modules/LLVMConfig.cmake.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,12 @@ endif()
162162
if(NOT TARGET acc_gen)
163163
add_custom_target(acc_gen)
164164
endif()
165+
if(NOT TARGET ARMTargetParserTableGen)
166+
add_custom_target(ARMTargetParserTableGen)
167+
endif()
168+
if(NOT TARGET AArch64TargetParserTableGen)
169+
add_custom_target(AArch64TargetParserTableGen)
170+
endif()
165171
if(NOT TARGET RISCVTargetParserTableGen)
166172
add_custom_target(RISCVTargetParserTableGen)
167173
endif()

llvm/include/llvm/TargetParser/AArch64TargetParser.h

Lines changed: 22 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -103,90 +103,31 @@ enum CPUFeatures {
103103
static_assert(FEAT_MAX < 62,
104104
"Number of features in CPUFeatures are limited to 62 entries");
105105

106-
// Arch extension modifiers for CPUs. These are labelled with their Arm ARM
107-
// feature name (though the canonical reference for those is AArch64.td)
108-
// clang-format off
106+
// Each ArchExtKind correponds directly to a possible -target-feature.
109107
enum ArchExtKind : unsigned {
110-
AEK_NONE = 1,
111-
AEK_CRC = 2, // FEAT_CRC32
112-
AEK_CRYPTO = 3,
113-
AEK_FP = 4, // FEAT_FP
114-
AEK_SIMD = 5, // FEAT_AdvSIMD
115-
AEK_FP16 = 6, // FEAT_FP16
116-
AEK_PROFILE = 7, // FEAT_SPE
117-
AEK_RAS = 8, // FEAT_RAS, FEAT_RASv1p1
118-
AEK_LSE = 9, // FEAT_LSE
119-
AEK_SVE = 10, // FEAT_SVE
120-
AEK_DOTPROD = 11, // FEAT_DotProd
121-
AEK_RCPC = 12, // FEAT_LRCPC
122-
AEK_RDM = 13, // FEAT_RDM
123-
AEK_SM4 = 14, // FEAT_SM4, FEAT_SM3
124-
AEK_SHA3 = 15, // FEAT_SHA3, FEAT_SHA512
125-
AEK_SHA2 = 16, // FEAT_SHA1, FEAT_SHA256
126-
AEK_AES = 17, // FEAT_AES, FEAT_PMULL
127-
AEK_FP16FML = 18, // FEAT_FHM
128-
AEK_RAND = 19, // FEAT_RNG
129-
AEK_MTE = 20, // FEAT_MTE, FEAT_MTE2
130-
AEK_SSBS = 21, // FEAT_SSBS, FEAT_SSBS2
131-
AEK_SB = 22, // FEAT_SB
132-
AEK_PREDRES = 23, // FEAT_SPECRES
133-
AEK_SVE2 = 24, // FEAT_SVE2
134-
AEK_SVE2AES = 25, // FEAT_SVE_AES, FEAT_SVE_PMULL128
135-
AEK_SVE2SM4 = 26, // FEAT_SVE_SM4
136-
AEK_SVE2SHA3 = 27, // FEAT_SVE_SHA3
137-
AEK_SVE2BITPERM = 28, // FEAT_SVE_BitPerm
138-
AEK_TME = 29, // FEAT_TME
139-
AEK_BF16 = 30, // FEAT_BF16
140-
AEK_I8MM = 31, // FEAT_I8MM
141-
AEK_F32MM = 32, // FEAT_F32MM
142-
AEK_F64MM = 33, // FEAT_F64MM
143-
AEK_LS64 = 34, // FEAT_LS64, FEAT_LS64_V, FEAT_LS64_ACCDATA
144-
AEK_BRBE = 35, // FEAT_BRBE
145-
AEK_PAUTH = 36, // FEAT_PAuth
146-
AEK_FLAGM = 37, // FEAT_FlagM
147-
AEK_SME = 38, // FEAT_SME
148-
AEK_SMEF64F64 = 39, // FEAT_SME_F64F64
149-
AEK_SMEI16I64 = 40, // FEAT_SME_I16I64
150-
AEK_HBC = 41, // FEAT_HBC
151-
AEK_MOPS = 42, // FEAT_MOPS
152-
AEK_PERFMON = 43, // FEAT_PMUv3
153-
AEK_SME2 = 44, // FEAT_SME2
154-
AEK_SVE2p1 = 45, // FEAT_SVE2p1
155-
AEK_SME2p1 = 46, // FEAT_SME2p1
156-
AEK_B16B16 = 47, // FEAT_B16B16
157-
AEK_SMEF16F16 = 48, // FEAT_SMEF16F16
158-
AEK_CSSC = 49, // FEAT_CSSC
159-
AEK_RCPC3 = 50, // FEAT_LRCPC3
160-
AEK_THE = 51, // FEAT_THE
161-
AEK_D128 = 52, // FEAT_D128
162-
AEK_LSE128 = 53, // FEAT_LSE128
163-
AEK_SPECRES2 = 54, // FEAT_SPECRES2
164-
AEK_RASv2 = 55, // FEAT_RASv2
165-
AEK_ITE = 56, // FEAT_ITE
166-
AEK_GCS = 57, // FEAT_GCS
167-
AEK_FPMR = 58, // FEAT_FPMR
168-
AEK_FP8 = 59, // FEAT_FP8
169-
AEK_FAMINMAX = 60, // FEAT_FAMINMAX
170-
AEK_FP8FMA = 61, // FEAT_FP8FMA
171-
AEK_SSVE_FP8FMA = 62, // FEAT_SSVE_FP8FMA
172-
AEK_FP8DOT2 = 63, // FEAT_FP8DOT2
173-
AEK_SSVE_FP8DOT2 = 64, // FEAT_SSVE_FP8DOT2
174-
AEK_FP8DOT4 = 65, // FEAT_FP8DOT4
175-
AEK_SSVE_FP8DOT4 = 66, // FEAT_SSVE_FP8DOT4
176-
AEK_LUT = 67, // FEAT_LUT
177-
AEK_SME_LUTv2 = 68, // FEAT_SME_LUTv2
178-
AEK_SMEF8F16 = 69, // FEAT_SME_F8F16
179-
AEK_SMEF8F32 = 70, // FEAT_SME_F8F32
180-
AEK_SMEFA64 = 71, // FEAT_SME_FA64
181-
AEK_CPA = 72, // FEAT_CPA
182-
AEK_PAUTHLR = 73, // FEAT_PAuth_LR
183-
AEK_TLBIW = 74, // FEAT_TLBIW
184-
AEK_JSCVT = 75, // FEAT_JSCVT
185-
AEK_FCMA = 76, // FEAT_FCMA
186-
AEK_NUM_EXTENSIONS
108+
AEK_NONE = 1,
109+
#define ARM_EXTENSION(NAME, ENUM) ENUM,
110+
#include "llvm/TargetParser/AArch64TargetParserDef.inc"
111+
AEK_NUM_EXTENSIONS,
112+
113+
// FIXME temporary fixes for inconsistent naming.
114+
AEK_F32MM = AEK_MATMULFP32,
115+
AEK_F64MM = AEK_MATMULFP64,
116+
AEK_FCMA = AEK_COMPLXNUM,
117+
AEK_FP = AEK_FPARMV8,
118+
AEK_FP16 = AEK_FULLFP16,
119+
AEK_I8MM = AEK_MATMULINT8,
120+
AEK_JSCVT = AEK_JS,
121+
AEK_PROFILE = AEK_SPE,
122+
AEK_RASv2 = AEK_RASV2,
123+
AEK_RAND = AEK_RANDGEN,
124+
AEK_SIMD = AEK_NEON,
125+
AEK_SME2p1 = AEK_SME2P1,
126+
AEK_SVE2p1 = AEK_SVE2P1,
127+
AEK_SME_LUTv2 = AEK_SME_LUTV2,
128+
187129
};
188130
using ExtensionBitset = Bitset<AEK_NUM_EXTENSIONS>;
189-
// clang-format on
190131

191132
// Represents an extension that can be enabled with -march=<arch>+<extension>.
192133
// Typically these correspond to Arm Architecture extensions, unlike

0 commit comments

Comments
 (0)