Skip to content

Commit 5b6fb0b

Browse files
Expand feature detection on AArch64 Darwin
This reflects the currently available set of sysctl values as of macOS 15, on 2024-12-21. Features not (yet) exposed by `is_aarch64_feature_detected` have been left in comments to document their existence for the future.
1 parent 2b77252 commit 5b6fb0b

File tree

1 file changed

+84
-38
lines changed

1 file changed

+84
-38
lines changed

crates/std_detect/src/detect/os/darwin/aarch64.rs

Lines changed: 84 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -39,63 +39,109 @@ pub(crate) fn detect_features() -> cache::Initializer {
3939
}
4040
};
4141

42-
let asimd = _sysctlbyname(c"hw.optional.AdvSIMD");
43-
let pmull = _sysctlbyname(c"hw.optional.arm.FEAT_PMULL");
42+
// Armv8.0 features not using the standard identifiers
4443
let fp = _sysctlbyname(c"hw.optional.floatingpoint");
45-
let fp16 = _sysctlbyname(c"hw.optional.arm.FEAT_FP16");
44+
let asimd = _sysctlbyname(c"hw.optional.AdvSIMD");
4645
let crc = _sysctlbyname(c"hw.optional.armv8_crc32");
47-
let lse = _sysctlbyname(c"hw.optional.arm.FEAT_LSE");
48-
let lse2 = _sysctlbyname(c"hw.optional.arm.FEAT_LSE2");
49-
let rdm = _sysctlbyname(c"hw.optional.arm.FEAT_RDM");
50-
let rcpc = _sysctlbyname(c"hw.optional.arm.FEAT_LRCPC");
51-
let rcpc2 = _sysctlbyname(c"hw.optional.arm.FEAT_LRCPC2");
52-
let dotprod = _sysctlbyname(c"hw.optional.arm.FEAT_DotProd");
53-
let fhm = _sysctlbyname(c"hw.optional.arm.FEAT_FHM");
54-
let flagm = _sysctlbyname(c"hw.optional.arm.FEAT_FlagM");
55-
let ssbs = _sysctlbyname(c"hw.optional.arm.FEAT_SSBS");
56-
let sb = _sysctlbyname(c"hw.optional.arm.FEAT_SB");
57-
let paca = _sysctlbyname(c"hw.optional.arm.FEAT_PAuth");
46+
47+
// Armv8 and Armv9 features using the standard identifiers
48+
let aes = _sysctlbyname(c"hw.optional.arm.FEAT_AES");
49+
let bf16 = _sysctlbyname(c"hw.optional.arm.FEAT_BF16");
50+
let bti = _sysctlbyname(c"hw.optional.arm.FEAT_BTI");
51+
let dit = _sysctlbyname(c"hw.optional.arm.FEAT_DIT");
5852
let dpb = _sysctlbyname(c"hw.optional.arm.FEAT_DPB");
5953
let dpb2 = _sysctlbyname(c"hw.optional.arm.FEAT_DPB2");
54+
let dotprod = _sysctlbyname(c"hw.optional.arm.FEAT_DotProd");
55+
let ecv = _sysctlbyname(c"hw.optional.arm.FEAT_ECV");
56+
let fcma = _sysctlbyname(c"hw.optional.arm.FEAT_FCMA");
57+
let fhm = _sysctlbyname(c"hw.optional.arm.FEAT_FHM");
58+
let fp16 = _sysctlbyname(c"hw.optional.arm.FEAT_FP16");
6059
let frintts = _sysctlbyname(c"hw.optional.arm.FEAT_FRINTTS");
60+
let flagm = _sysctlbyname(c"hw.optional.arm.FEAT_FlagM");
61+
let flagm2 = _sysctlbyname(c"hw.optional.arm.FEAT_FlagM2");
6162
let i8mm = _sysctlbyname(c"hw.optional.arm.FEAT_I8MM");
62-
let bf16 = _sysctlbyname(c"hw.optional.arm.FEAT_BF16");
63-
let bti = _sysctlbyname(c"hw.optional.arm.FEAT_BTI");
64-
let fcma = _sysctlbyname(c"hw.optional.arm.FEAT_FCMA");
65-
let aes = _sysctlbyname(c"hw.optional.arm.FEAT_AES");
63+
let jsconv = _sysctlbyname(c"hw.optional.arm.FEAT_JSCVT");
64+
let rcpc = _sysctlbyname(c"hw.optional.arm.FEAT_LRCPC");
65+
let rcpc2 = _sysctlbyname(c"hw.optional.arm.FEAT_LRCPC2");
66+
let lse = _sysctlbyname(c"hw.optional.arm.FEAT_LSE");
67+
let lse2 = _sysctlbyname(c"hw.optional.arm.FEAT_LSE2");
68+
let pauth = _sysctlbyname(c"hw.optional.arm.FEAT_PAuth");
69+
let pmull = _sysctlbyname(c"hw.optional.arm.FEAT_PMULL");
70+
let rdm = _sysctlbyname(c"hw.optional.arm.FEAT_RDM");
71+
let sb = _sysctlbyname(c"hw.optional.arm.FEAT_SB");
6672
let sha1 = _sysctlbyname(c"hw.optional.arm.FEAT_SHA1");
67-
let sha2 = _sysctlbyname(c"hw.optional.arm.FEAT_SHA256");
73+
let sha256 = _sysctlbyname(c"hw.optional.arm.FEAT_SHA256");
6874
let sha3 = _sysctlbyname(c"hw.optional.arm.FEAT_SHA3");
6975
let sha512 = _sysctlbyname(c"hw.optional.arm.FEAT_SHA512");
70-
let jsconv = _sysctlbyname(c"hw.optional.arm.FEAT_JSCVT");
76+
let sme = _sysctlbyname(c"hw.optional.arm.FEAT_SME");
77+
let sme2 = _sysctlbyname(c"hw.optional.arm.FEAT_SME2");
78+
let sme_f64f64 = _sysctlbyname(c"hw.optional.arm.FEAT_SME_F64F64");
79+
let sme_i16i64 = _sysctlbyname(c"hw.optional.arm.FEAT_SME_I16I64");
80+
let ssbs = _sysctlbyname(c"hw.optional.arm.FEAT_SSBS");
81+
let wfxt = _sysctlbyname(c"hw.optional.arm.FEAT_WFxT");
82+
83+
// The following features are not exposed by `is_aarch64_feature_detected`,
84+
// but *are* reported by `sysctl`. They are here as documentation that they
85+
// exist, and may potentially be exposed later.
86+
/*
87+
let afp = _sysctlbyname(c"hw.optional.arm.FEAT_AFP");
88+
let csv2 = _sysctlbyname(c"hw.optional.arm.FEAT_CSV2");
89+
let csv3 = _sysctlbyname(c"hw.optional.arm.FEAT_CSV3");
90+
let fpac = _sysctlbyname(c"hw.optional.arm.FEAT_FPAC");
91+
let pauth2 = _sysctlbyname(c"hw.optional.arm.FEAT_PAuth2");
92+
let rpres = _sysctlbyname(c"hw.optional.arm.FEAT_RPRES");
93+
let specres = _sysctlbyname(c"hw.optional.arm.FEAT_SPECRES");
94+
*/
7195

96+
// The following "features" are reported by `sysctl` but are mandatory parts
97+
// of SME or SME2, and so are not exposed separately by
98+
// `is_aarch64_feature_detected`. They are here to document their
99+
// existence, in case they're needed in the future.
100+
/*
101+
let sme_b16f32 = _sysctlbyname(c"hw.optional.arm.SME_B16F32");
102+
let sme_bi32i32 = _sysctlbyname(c"hw.optional.arm.SME_BI32I32");
103+
let sme_f16f32 = _sysctlbyname(c"hw.optional.arm.SME_F16F32");
104+
let sme_f32f32 = _sysctlbyname(c"hw.optional.arm.SME_F32F32");
105+
let sme_i16i32 = _sysctlbyname(c"hw.optional.arm.SME_I16I32");
106+
let sme_i8i32 = _sysctlbyname(c"hw.optional.arm.SME_I8I32");
107+
*/
108+
109+
enable_feature(Feature::aes, aes && pmull);
72110
enable_feature(Feature::asimd, asimd);
73-
enable_feature(Feature::pmull, pmull);
74-
enable_feature(Feature::fp, fp);
75-
enable_feature(Feature::fp16, fp16);
111+
enable_feature(Feature::bf16, bf16);
112+
enable_feature(Feature::bti, bti);
76113
enable_feature(Feature::crc, crc);
77-
enable_feature(Feature::lse, lse);
78-
enable_feature(Feature::lse2, lse2);
79-
enable_feature(Feature::rdm, rdm);
80-
enable_feature(Feature::rcpc, rcpc);
81-
enable_feature(Feature::rcpc2, rcpc2);
114+
enable_feature(Feature::dit, dit);
82115
enable_feature(Feature::dotprod, dotprod);
83-
enable_feature(Feature::fhm, fhm);
84-
enable_feature(Feature::flagm, flagm);
85-
enable_feature(Feature::ssbs, ssbs);
86-
enable_feature(Feature::sb, sb);
87-
enable_feature(Feature::paca, paca);
88116
enable_feature(Feature::dpb, dpb);
89117
enable_feature(Feature::dpb2, dpb2);
118+
enable_feature(Feature::ecv, ecv);
119+
enable_feature(Feature::fcma, fcma);
120+
enable_feature(Feature::fhm, fhm);
121+
enable_feature(Feature::flagm, flagm);
122+
enable_feature(Feature::flagm2, flagm2);
123+
enable_feature(Feature::fp, fp);
124+
enable_feature(Feature::fp16, fp16);
90125
enable_feature(Feature::frintts, frintts);
91126
enable_feature(Feature::i8mm, i8mm);
92-
enable_feature(Feature::bf16, bf16);
93-
enable_feature(Feature::bti, bti);
94-
enable_feature(Feature::fcma, fcma);
95-
enable_feature(Feature::aes, aes && pmull);
96127
enable_feature(Feature::jsconv, jsconv);
97-
enable_feature(Feature::sha2, sha1 && sha2 && asimd);
128+
enable_feature(Feature::lse, lse);
129+
enable_feature(Feature::lse2, lse2);
130+
enable_feature(Feature::paca, pauth);
131+
enable_feature(Feature::pacg, pauth);
132+
enable_feature(Feature::pmull, aes && pmull);
133+
enable_feature(Feature::rcpc, rcpc);
134+
enable_feature(Feature::rcpc2, rcpc2);
135+
enable_feature(Feature::rdm, rdm);
136+
enable_feature(Feature::sb, sb);
137+
enable_feature(Feature::sha2, sha1 && sha256 && asimd);
98138
enable_feature(Feature::sha3, sha512 && sha3 && asimd);
139+
enable_feature(Feature::sme, sme);
140+
enable_feature(Feature::sme2, sme2);
141+
enable_feature(Feature::sme_f64f64, sme_f64f64);
142+
enable_feature(Feature::sme_i16i64, sme_i16i64);
143+
enable_feature(Feature::ssbs, ssbs);
144+
enable_feature(Feature::wfxt, wfxt);
99145

100146
value
101147
}

0 commit comments

Comments
 (0)