@@ -17,55 +17,56 @@ void __init_cpu_features_resolver(void) {
1717 // ELF platforms, where IFuncs are resolved serially at load time). This
1818 // function's effect on __aarch64_cpu_features must be idempotent.
1919
20- if (! __atomic_load_n (&__aarch64_cpu_features.features , __ATOMIC_RELAXED)) {
21- uint64_t features = 0 ;
20+ if (__atomic_load_n (&__aarch64_cpu_features.features , __ATOMIC_RELAXED))
21+ return ;
2222
23- // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics
24- static const struct {
25- const char *sysctl_name;
26- enum CPUFeatures feature;
27- } feature_checks[] = {
28- {" hw.optional.arm.FEAT_FlagM" , FEAT_FLAGM},
29- {" hw.optional.arm.FEAT_FlagM2" , FEAT_FLAGM2},
30- {" hw.optional.arm.FEAT_FHM" , FEAT_FP16FML},
31- {" hw.optional.arm.FEAT_DotProd" , FEAT_DOTPROD},
32- {" hw.optional.arm.FEAT_RDM" , FEAT_RDM},
33- {" hw.optional.arm.FEAT_LSE" , FEAT_LSE},
34- {" hw.optional.floatingpoint" , FEAT_FP},
35- {" hw.optional.AdvSIMD" , FEAT_SIMD},
36- {" hw.optional.armv8_crc32" , FEAT_CRC},
37- {" hw.optional.arm.FEAT_SHA1" , FEAT_SHA1},
38- {" hw.optional.arm.FEAT_SHA256" , FEAT_SHA2},
39- {" hw.optional.arm.FEAT_SHA3" , FEAT_SHA3},
40- {" hw.optional.arm.FEAT_AES" , FEAT_AES},
41- {" hw.optional.arm.FEAT_PMULL" , FEAT_PMULL},
42- {" hw.optional.arm.FEAT_FP16" , FEAT_FP16},
43- {" hw.optional.arm.FEAT_DIT" , FEAT_DIT},
44- {" hw.optional.arm.FEAT_DPB" , FEAT_DPB},
45- {" hw.optional.arm.FEAT_DPB2" , FEAT_DPB2},
46- {" hw.optional.arm.FEAT_JSCVT" , FEAT_JSCVT},
47- {" hw.optional.arm.FEAT_FCMA" , FEAT_FCMA},
48- {" hw.optional.arm.FEAT_LRCPC" , FEAT_RCPC},
49- {" hw.optional.arm.FEAT_LRCPC2" , FEAT_RCPC2},
50- {" hw.optional.arm.FEAT_FRINTTS" , FEAT_FRINTTS},
51- {" hw.optional.arm.FEAT_I8MM" , FEAT_I8MM},
52- {" hw.optional.arm.FEAT_BF16" , FEAT_BF16},
53- {" hw.optional.arm.FEAT_SB" , FEAT_SB},
54- {" hw.optional.arm.FEAT_SPECRES" , FEAT_PREDRES},
55- {" hw.optional.arm.FEAT_SSBS" , FEAT_SSBS2},
56- {" hw.optional.arm.FEAT_BTI" , FEAT_BTI},
57- };
23+ uint64_t features = 0 ;
5824
59- for (size_t I = 0 , E = sizeof (feature_checks) / sizeof (feature_checks[0 ]);
60- I != E; ++I)
61- if (isKnownAndSupported (feature_checks[I].sysctl_name ))
62- features |= (1ULL << feature_checks[I].feature );
25+ // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics
26+ static const struct {
27+ const char *sysctl_name;
28+ enum CPUFeatures feature;
29+ } feature_checks[] = {
30+ {" hw.optional.arm.FEAT_FlagM" , FEAT_FLAGM},
31+ {" hw.optional.arm.FEAT_FlagM2" , FEAT_FLAGM2},
32+ {" hw.optional.arm.FEAT_FHM" , FEAT_FP16FML},
33+ {" hw.optional.arm.FEAT_DotProd" , FEAT_DOTPROD},
34+ {" hw.optional.arm.FEAT_RDM" , FEAT_RDM},
35+ {" hw.optional.arm.FEAT_LSE" , FEAT_LSE},
36+ {" hw.optional.floatingpoint" , FEAT_FP},
37+ {" hw.optional.AdvSIMD" , FEAT_SIMD},
38+ {" hw.optional.armv8_crc32" , FEAT_CRC},
39+ {" hw.optional.arm.FEAT_SHA1" , FEAT_SHA1},
40+ {" hw.optional.arm.FEAT_SHA256" , FEAT_SHA2},
41+ {" hw.optional.arm.FEAT_SHA3" , FEAT_SHA3},
42+ {" hw.optional.arm.FEAT_AES" , FEAT_AES},
43+ {" hw.optional.arm.FEAT_PMULL" , FEAT_PMULL},
44+ {" hw.optional.arm.FEAT_FP16" , FEAT_FP16},
45+ {" hw.optional.arm.FEAT_DIT" , FEAT_DIT},
46+ {" hw.optional.arm.FEAT_DPB" , FEAT_DPB},
47+ {" hw.optional.arm.FEAT_DPB2" , FEAT_DPB2},
48+ {" hw.optional.arm.FEAT_JSCVT" , FEAT_JSCVT},
49+ {" hw.optional.arm.FEAT_FCMA" , FEAT_FCMA},
50+ {" hw.optional.arm.FEAT_LRCPC" , FEAT_RCPC},
51+ {" hw.optional.arm.FEAT_LRCPC2" , FEAT_RCPC2},
52+ {" hw.optional.arm.FEAT_FRINTTS" , FEAT_FRINTTS},
53+ {" hw.optional.arm.FEAT_I8MM" , FEAT_I8MM},
54+ {" hw.optional.arm.FEAT_BF16" , FEAT_BF16},
55+ {" hw.optional.arm.FEAT_SB" , FEAT_SB},
56+ {" hw.optional.arm.FEAT_SPECRES" , FEAT_PREDRES},
57+ {" hw.optional.arm.FEAT_SSBS" , FEAT_SSBS2},
58+ {" hw.optional.arm.FEAT_BTI" , FEAT_BTI},
59+ };
6360
64- features |= (1ULL << FEAT_INIT);
61+ for (size_t I = 0 , E = sizeof (feature_checks) / sizeof (feature_checks[0 ]);
62+ I != E; ++I)
63+ if (isKnownAndSupported (feature_checks[I].sysctl_name ))
64+ features |= (1ULL << feature_checks[I].feature );
6565
66- __atomic_store (&__aarch64_cpu_features.features , &features,
67- __ATOMIC_RELAXED);
68- }
66+ features |= (1ULL << FEAT_INIT);
67+
68+ __atomic_store (&__aarch64_cpu_features.features , &features,
69+ __ATOMIC_RELAXED);
6970}
7071
7172#endif // TARGET_OS_OSX || TARGET_OS_IPHONE
0 commit comments