@@ -89,11 +89,14 @@ enum CPUFeatures {
89
89
FEAT_SME_F64,
90
90
FEAT_SME_I64,
91
91
FEAT_SME2,
92
- FEAT_MAX
92
+ FEAT_RCPC3,
93
+ FEAT_MAX,
94
+ FEAT_EXT = 62 ,
95
+ FEAT_INIT
93
96
};
94
97
95
- static_assert (FEAT_MAX <= 64 ,
96
- " CPUFeatures enum must not have more than 64 entries" );
98
+ static_assert (FEAT_MAX < 62 ,
99
+ " Number of features in CPUFeatures are limited to 62 entries" );
97
100
98
101
// Arch extension modifiers for CPUs. These are labelled with their Arm ARM
99
102
// feature name (though the canonical reference for those is AArch64.td)
@@ -185,14 +188,14 @@ struct ExtensionInfo {
185
188
// clang-format off
186
189
inline constexpr ExtensionInfo Extensions[] = {
187
190
{" aes" , AArch64::AEK_AES, " +aes" , " -aes" , FEAT_AES, " +fp-armv8,+neon" , 150 },
188
- {" b16b16" , AArch64::AEK_B16B16, " +b16b16" , " -b16b16" , FEAT_MAX , " " , 0 },
191
+ {" b16b16" , AArch64::AEK_B16B16, " +b16b16" , " -b16b16" , FEAT_INIT , " " , 0 },
189
192
{" bf16" , AArch64::AEK_BF16, " +bf16" , " -bf16" , FEAT_BF16, " +bf16" , 280 },
190
- {" brbe" , AArch64::AEK_BRBE, " +brbe" , " -brbe" , FEAT_MAX , " " , 0 },
193
+ {" brbe" , AArch64::AEK_BRBE, " +brbe" , " -brbe" , FEAT_INIT , " " , 0 },
191
194
{" bti" , AArch64::AEK_NONE, {}, {}, FEAT_BTI, " +bti" , 510 },
192
195
{" crc" , AArch64::AEK_CRC, " +crc" , " -crc" , FEAT_CRC, " +crc" , 110 },
193
- {" crypto" , AArch64::AEK_CRYPTO, " +crypto" , " -crypto" , FEAT_MAX , " +aes,+sha2" , 0 },
194
- {" cssc" , AArch64::AEK_CSSC, " +cssc" , " -cssc" , FEAT_MAX , " " , 0 },
195
- {" d128" , AArch64::AEK_D128, " +d128" , " -d128" , FEAT_MAX , " " , 0 },
196
+ {" crypto" , AArch64::AEK_CRYPTO, " +crypto" , " -crypto" , FEAT_INIT , " +aes,+sha2" , 0 },
197
+ {" cssc" , AArch64::AEK_CSSC, " +cssc" , " -cssc" , FEAT_INIT , " " , 0 },
198
+ {" d128" , AArch64::AEK_D128, " +d128" , " -d128" , FEAT_INIT , " " , 0 },
196
199
{" dgh" , AArch64::AEK_NONE, {}, {}, FEAT_DGH, " " , 260 },
197
200
{" dit" , AArch64::AEK_NONE, {}, {}, FEAT_DIT, " +dit" , 180 },
198
201
{" dotprod" , AArch64::AEK_DOTPROD, " +dotprod" , " -dotprod" , FEAT_DOTPROD, " +dotprod,+fp-armv8,+neon" , 50 },
@@ -208,30 +211,30 @@ inline constexpr ExtensionInfo Extensions[] = {
208
211
{" fp16" , AArch64::AEK_FP16, " +fullfp16" , " -fullfp16" , FEAT_FP16, " +fullfp16,+fp-armv8,+neon" , 170 },
209
212
{" fp16fml" , AArch64::AEK_FP16FML, " +fp16fml" , " -fp16fml" , FEAT_FP16FML, " +fp16fml,+fullfp16,+fp-armv8,+neon" , 40 },
210
213
{" frintts" , AArch64::AEK_NONE, {}, {}, FEAT_FRINTTS, " +fptoint" , 250 },
211
- {" hbc" , AArch64::AEK_HBC, " +hbc" , " -hbc" , FEAT_MAX , " " , 0 },
214
+ {" hbc" , AArch64::AEK_HBC, " +hbc" , " -hbc" , FEAT_INIT , " " , 0 },
212
215
{" i8mm" , AArch64::AEK_I8MM, " +i8mm" , " -i8mm" , FEAT_I8MM, " +i8mm" , 270 },
213
- {" ite" , AArch64::AEK_ITE, " +ite" , " -ite" , FEAT_MAX , " " , 0 },
216
+ {" ite" , AArch64::AEK_ITE, " +ite" , " -ite" , FEAT_INIT , " " , 0 },
214
217
{" jscvt" , AArch64::AEK_NONE, {}, {}, FEAT_JSCVT, " +fp-armv8,+neon,+jsconv" , 210 },
215
218
{" ls64_accdata" , AArch64::AEK_NONE, {}, {}, FEAT_LS64_ACCDATA, " +ls64" , 540 },
216
219
{" ls64_v" , AArch64::AEK_NONE, {}, {}, FEAT_LS64_V, " " , 530 },
217
220
{" ls64" , AArch64::AEK_LS64, " +ls64" , " -ls64" , FEAT_LS64, " " , 520 },
218
221
{" lse" , AArch64::AEK_LSE, " +lse" , " -lse" , FEAT_LSE, " +lse" , 80 },
219
- {" lse128" , AArch64::AEK_LSE128, " +lse128" , " -lse128" , FEAT_MAX , " " , 0 },
222
+ {" lse128" , AArch64::AEK_LSE128, " +lse128" , " -lse128" , FEAT_INIT , " " , 0 },
220
223
{" memtag" , AArch64::AEK_MTE, " +mte" , " -mte" , FEAT_MEMTAG, " " , 440 },
221
224
{" memtag2" , AArch64::AEK_NONE, {}, {}, FEAT_MEMTAG2, " +mte" , 450 },
222
225
{" memtag3" , AArch64::AEK_NONE, {}, {}, FEAT_MEMTAG3, " +mte" , 460 },
223
- {" mops" , AArch64::AEK_MOPS, " +mops" , " -mops" , FEAT_MAX , " " , 0 },
224
- {" pauth" , AArch64::AEK_PAUTH, " +pauth" , " -pauth" , FEAT_MAX , " " , 0 },
226
+ {" mops" , AArch64::AEK_MOPS, " +mops" , " -mops" , FEAT_INIT , " " , 0 },
227
+ {" pauth" , AArch64::AEK_PAUTH, " +pauth" , " -pauth" , FEAT_INIT , " " , 0 },
225
228
{" pmull" , AArch64::AEK_NONE, {}, {}, FEAT_PMULL, " +aes,+fp-armv8,+neon" , 160 },
226
- {" pmuv3" , AArch64::AEK_PERFMON, " +perfmon" , " -perfmon" , FEAT_MAX , " " , 0 },
229
+ {" pmuv3" , AArch64::AEK_PERFMON, " +perfmon" , " -perfmon" , FEAT_INIT , " " , 0 },
227
230
{" predres" , AArch64::AEK_PREDRES, " +predres" , " -predres" , FEAT_PREDRES, " +predres" , 480 },
228
- {" predres2" , AArch64::AEK_SPECRES2, " +specres2" , " -specres2" , FEAT_MAX , " " , 0 },
229
- {" profile" , AArch64::AEK_PROFILE, " +spe" , " -spe" , FEAT_MAX , " " , 0 },
230
- {" ras" , AArch64::AEK_RAS, " +ras" , " -ras" , FEAT_MAX , " " , 0 },
231
- {" rasv2" , AArch64::AEK_RASv2, " +rasv2" , " -rasv2" , FEAT_MAX , " " , 0 },
231
+ {" predres2" , AArch64::AEK_SPECRES2, " +specres2" , " -specres2" , FEAT_INIT , " " , 0 },
232
+ {" profile" , AArch64::AEK_PROFILE, " +spe" , " -spe" , FEAT_INIT , " " , 0 },
233
+ {" ras" , AArch64::AEK_RAS, " +ras" , " -ras" , FEAT_INIT , " " , 0 },
234
+ {" rasv2" , AArch64::AEK_RASv2, " +rasv2" , " -rasv2" , FEAT_INIT , " " , 0 },
232
235
{" rcpc" , AArch64::AEK_RCPC, " +rcpc" , " -rcpc" , FEAT_RCPC, " +rcpc" , 230 },
233
236
{" rcpc2" , AArch64::AEK_NONE, {}, {}, FEAT_RCPC2, " +rcpc" , 240 },
234
- {" rcpc3" , AArch64::AEK_RCPC3, " +rcpc3" , " -rcpc3" , FEAT_MAX , " " , 0 },
237
+ {" rcpc3" , AArch64::AEK_RCPC3, " +rcpc3" , " -rcpc3" , FEAT_RCPC3 , " +rcpc,+rcpc3 " , 241 },
235
238
{" rdm" , AArch64::AEK_RDM, " +rdm" , " -rdm" , FEAT_RDM, " +rdm,+fp-armv8,+neon" , 70 },
236
239
{" rng" , AArch64::AEK_RAND, " +rand" , " -rand" , FEAT_RNG, " +rand" , 10 },
237
240
{" rpres" , AArch64::AEK_NONE, {}, {}, FEAT_RPRES, " " , 300 },
@@ -241,12 +244,12 @@ inline constexpr ExtensionInfo Extensions[] = {
241
244
{" sha3" , AArch64::AEK_SHA3, " +sha3" , " -sha3" , FEAT_SHA3, " +sha3,+sha2,+fp-armv8,+neon" , 140 },
242
245
{" simd" , AArch64::AEK_SIMD, " +neon" , " -neon" , FEAT_SIMD, " +fp-armv8,+neon" , 100 },
243
246
{" sm4" , AArch64::AEK_SM4, " +sm4" , " -sm4" , FEAT_SM4, " +sm4,+fp-armv8,+neon" , 60 },
244
- {" sme-f16f16" , AArch64::AEK_SMEF16F16, " +sme-f16f16" , " -sme-f16f16" , FEAT_MAX , " " , 0 },
247
+ {" sme-f16f16" , AArch64::AEK_SMEF16F16, " +sme-f16f16" , " -sme-f16f16" , FEAT_INIT , " " , 0 },
245
248
{" sme-f64f64" , AArch64::AEK_SMEF64F64, " +sme-f64f64" , " -sme-f64f64" , FEAT_SME_F64, " +sme,+sme-f64f64,+bf16" , 560 },
246
249
{" sme-i16i64" , AArch64::AEK_SMEI16I64, " +sme-i16i64" , " -sme-i16i64" , FEAT_SME_I64, " +sme,+sme-i16i64,+bf16" , 570 },
247
250
{" sme" , AArch64::AEK_SME, " +sme" , " -sme" , FEAT_SME, " +sme,+bf16" , 430 },
248
251
{" sme2" , AArch64::AEK_SME2, " +sme2" , " -sme2" , FEAT_SME2, " +sme2,+sme,+bf16" , 580 },
249
- {" sme2p1" , AArch64::AEK_SME2p1, " +sme2p1" , " -sme2p1" , FEAT_MAX , " " , 0 },
252
+ {" sme2p1" , AArch64::AEK_SME2p1, " +sme2p1" , " -sme2p1" , FEAT_INIT , " " , 0 },
250
253
{" ssbs" , AArch64::AEK_SSBS, " +ssbs" , " -ssbs" , FEAT_SSBS, " " , 490 },
251
254
{" ssbs2" , AArch64::AEK_NONE, {}, {}, FEAT_SSBS2, " +ssbs" , 500 },
252
255
{" sve-bf16" , AArch64::AEK_NONE, {}, {}, FEAT_SVE_BF16, " +sve,+bf16,+fullfp16,+fp-armv8,+neon" , 320 },
@@ -259,13 +262,13 @@ inline constexpr ExtensionInfo Extensions[] = {
259
262
{" sve2-sha3" , AArch64::AEK_SVE2SHA3, " +sve2-sha3" , " -sve2-sha3" , FEAT_SVE_SHA3, " +sve2,+sve,+sve2-sha3,+fullfp16,+fp-armv8,+neon" , 410 },
260
263
{" sve2-sm4" , AArch64::AEK_SVE2SM4, " +sve2-sm4" , " -sve2-sm4" , FEAT_SVE_SM4, " +sve2,+sve,+sve2-sm4,+fullfp16,+fp-armv8,+neon" , 420 },
261
264
{" sve2" , AArch64::AEK_SVE2, " +sve2" , " -sve2" , FEAT_SVE2, " +sve2,+sve,+fullfp16,+fp-armv8,+neon" , 370 },
262
- {" sve2p1" , AArch64::AEK_SVE2p1, " +sve2p1" , " -sve2p1" , FEAT_MAX , " +sve2p1,+sve2,+sve,+fullfp16,+fp-armv8,+neon" , 0 },
263
- {" the" , AArch64::AEK_THE, " +the" , " -the" , FEAT_MAX , " " , 0 },
264
- {" tme" , AArch64::AEK_TME, " +tme" , " -tme" , FEAT_MAX , " " , 0 },
265
+ {" sve2p1" , AArch64::AEK_SVE2p1, " +sve2p1" , " -sve2p1" , FEAT_INIT , " +sve2p1,+sve2,+sve,+fullfp16,+fp-armv8,+neon" , 0 },
266
+ {" the" , AArch64::AEK_THE, " +the" , " -the" , FEAT_INIT , " " , 0 },
267
+ {" tme" , AArch64::AEK_TME, " +tme" , " -tme" , FEAT_INIT , " " , 0 },
265
268
{" wfxt" , AArch64::AEK_NONE, {}, {}, FEAT_WFXT, " +wfxt" , 550 },
266
- {" gcs" , AArch64::AEK_GCS, " +gcs" , " -gcs" , FEAT_MAX , " " , 0 },
269
+ {" gcs" , AArch64::AEK_GCS, " +gcs" , " -gcs" , FEAT_INIT , " " , 0 },
267
270
// Special cases
268
- {" none" , AArch64::AEK_NONE, {}, {}, FEAT_MAX , " " , ExtensionInfo::MaxFMVPriority},
271
+ {" none" , AArch64::AEK_NONE, {}, {}, FEAT_INIT , " " , ExtensionInfo::MaxFMVPriority},
269
272
};
270
273
// clang-format on
271
274
0 commit comments