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