@@ -17,55 +17,56 @@ void __init_cpu_features_resolver(void) {
17
17
// ELF platforms, where IFuncs are resolved serially at load time). This
18
18
// function's effect on __aarch64_cpu_features must be idempotent.
19
19
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 ;
22
22
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 ;
58
24
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
+ };
63
60
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 );
65
65
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);
69
70
}
70
71
71
72
#endif // TARGET_OS_OSX || TARGET_OS_IPHONE
0 commit comments