diff --git a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/apple.inc b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/apple.inc index 0bb755f4b305c..941ae275c9e8e 100644 --- a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/apple.inc +++ b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/apple.inc @@ -17,55 +17,56 @@ void __init_cpu_features_resolver(void) { // ELF platforms, where IFuncs are resolved serially at load time). This // function's effect on __aarch64_cpu_features must be idempotent. - if (!__atomic_load_n(&__aarch64_cpu_features.features, __ATOMIC_RELAXED)) { - uint64_t features = 0; + if (__atomic_load_n(&__aarch64_cpu_features.features, __ATOMIC_RELAXED)) + return; - // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics - static const struct { - const char *sysctl_name; - enum CPUFeatures feature; - } feature_checks[] = { - {"hw.optional.arm.FEAT_FlagM", FEAT_FLAGM}, - {"hw.optional.arm.FEAT_FlagM2", FEAT_FLAGM2}, - {"hw.optional.arm.FEAT_FHM", FEAT_FP16FML}, - {"hw.optional.arm.FEAT_DotProd", FEAT_DOTPROD}, - {"hw.optional.arm.FEAT_RDM", FEAT_RDM}, - {"hw.optional.arm.FEAT_LSE", FEAT_LSE}, - {"hw.optional.floatingpoint", FEAT_FP}, - {"hw.optional.AdvSIMD", FEAT_SIMD}, - {"hw.optional.armv8_crc32", FEAT_CRC}, - {"hw.optional.arm.FEAT_SHA1", FEAT_SHA1}, - {"hw.optional.arm.FEAT_SHA256", FEAT_SHA2}, - {"hw.optional.arm.FEAT_SHA3", FEAT_SHA3}, - {"hw.optional.arm.FEAT_AES", FEAT_AES}, - {"hw.optional.arm.FEAT_PMULL", FEAT_PMULL}, - {"hw.optional.arm.FEAT_FP16", FEAT_FP16}, - {"hw.optional.arm.FEAT_DIT", FEAT_DIT}, - {"hw.optional.arm.FEAT_DPB", FEAT_DPB}, - {"hw.optional.arm.FEAT_DPB2", FEAT_DPB2}, - {"hw.optional.arm.FEAT_JSCVT", FEAT_JSCVT}, - {"hw.optional.arm.FEAT_FCMA", FEAT_FCMA}, - {"hw.optional.arm.FEAT_LRCPC", FEAT_RCPC}, - {"hw.optional.arm.FEAT_LRCPC2", FEAT_RCPC2}, - {"hw.optional.arm.FEAT_FRINTTS", FEAT_FRINTTS}, - {"hw.optional.arm.FEAT_I8MM", FEAT_I8MM}, - {"hw.optional.arm.FEAT_BF16", FEAT_BF16}, - {"hw.optional.arm.FEAT_SB", FEAT_SB}, - {"hw.optional.arm.FEAT_SPECRES", FEAT_PREDRES}, - {"hw.optional.arm.FEAT_SSBS", FEAT_SSBS2}, - {"hw.optional.arm.FEAT_BTI", FEAT_BTI}, - }; + uint64_t features = 0; - for (size_t I = 0, E = sizeof(feature_checks) / sizeof(feature_checks[0]); - I != E; ++I) - if (isKnownAndSupported(feature_checks[I].sysctl_name)) - features |= (1ULL << feature_checks[I].feature); + // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics + static const struct { + const char *sysctl_name; + enum CPUFeatures feature; + } feature_checks[] = { + {"hw.optional.arm.FEAT_FlagM", FEAT_FLAGM}, + {"hw.optional.arm.FEAT_FlagM2", FEAT_FLAGM2}, + {"hw.optional.arm.FEAT_FHM", FEAT_FP16FML}, + {"hw.optional.arm.FEAT_DotProd", FEAT_DOTPROD}, + {"hw.optional.arm.FEAT_RDM", FEAT_RDM}, + {"hw.optional.arm.FEAT_LSE", FEAT_LSE}, + {"hw.optional.floatingpoint", FEAT_FP}, + {"hw.optional.AdvSIMD", FEAT_SIMD}, + {"hw.optional.armv8_crc32", FEAT_CRC}, + {"hw.optional.arm.FEAT_SHA1", FEAT_SHA1}, + {"hw.optional.arm.FEAT_SHA256", FEAT_SHA2}, + {"hw.optional.arm.FEAT_SHA3", FEAT_SHA3}, + {"hw.optional.arm.FEAT_AES", FEAT_AES}, + {"hw.optional.arm.FEAT_PMULL", FEAT_PMULL}, + {"hw.optional.arm.FEAT_FP16", FEAT_FP16}, + {"hw.optional.arm.FEAT_DIT", FEAT_DIT}, + {"hw.optional.arm.FEAT_DPB", FEAT_DPB}, + {"hw.optional.arm.FEAT_DPB2", FEAT_DPB2}, + {"hw.optional.arm.FEAT_JSCVT", FEAT_JSCVT}, + {"hw.optional.arm.FEAT_FCMA", FEAT_FCMA}, + {"hw.optional.arm.FEAT_LRCPC", FEAT_RCPC}, + {"hw.optional.arm.FEAT_LRCPC2", FEAT_RCPC2}, + {"hw.optional.arm.FEAT_FRINTTS", FEAT_FRINTTS}, + {"hw.optional.arm.FEAT_I8MM", FEAT_I8MM}, + {"hw.optional.arm.FEAT_BF16", FEAT_BF16}, + {"hw.optional.arm.FEAT_SB", FEAT_SB}, + {"hw.optional.arm.FEAT_SPECRES", FEAT_PREDRES}, + {"hw.optional.arm.FEAT_SSBS", FEAT_SSBS2}, + {"hw.optional.arm.FEAT_BTI", FEAT_BTI}, + }; - features |= (1ULL << FEAT_INIT); + for (size_t I = 0, E = sizeof(feature_checks) / sizeof(feature_checks[0]); + I != E; ++I) + if (isKnownAndSupported(feature_checks[I].sysctl_name)) + features |= (1ULL << feature_checks[I].feature); - __atomic_store(&__aarch64_cpu_features.features, &features, - __ATOMIC_RELAXED); - } + features |= (1ULL << FEAT_INIT); + + __atomic_store(&__aarch64_cpu_features.features, &features, + __ATOMIC_RELAXED); } #endif // TARGET_OS_OSX || TARGET_OS_IPHONE