1 | //! Aarch64 run-time features. |
2 | |
3 | features! { |
4 | @TARGET: aarch64; |
5 | @CFG: any(target_arch = "aarch64" , target_arch = "arm64ec" ); |
6 | @MACRO_NAME: is_aarch64_feature_detected; |
7 | @MACRO_ATTRS: |
8 | /// This macro tests, at runtime, whether an `aarch64` feature is enabled on aarch64 platforms. |
9 | /// Currently most features are only supported on linux-based platforms. |
10 | /// |
11 | /// This macro takes one argument which is a string literal of the feature being tested for. |
12 | /// The feature names are mostly taken from their FEAT_* definitions in the [ARM Architecture |
13 | /// Reference Manual][docs]. |
14 | /// |
15 | /// ## Supported arguments |
16 | /// |
17 | /// * `"aes"` - FEAT_AES & FEAT_PMULL |
18 | /// * `"asimd"` or "neon" - FEAT_AdvSIMD |
19 | /// * `"bf16"` - FEAT_BF16 |
20 | /// * `"bti"` - FEAT_BTI |
21 | /// * `"crc"` - FEAT_CRC |
22 | /// * `"cssc"` - FEAT_CSSC |
23 | /// * `"dit"` - FEAT_DIT |
24 | /// * `"dotprod"` - FEAT_DotProd |
25 | /// * `"dpb"` - FEAT_DPB |
26 | /// * `"dpb2"` - FEAT_DPB2 |
27 | /// * `"ecv"` - FEAT_ECV |
28 | /// * `"f32mm"` - FEAT_F32MM |
29 | /// * `"f64mm"` - FEAT_F64MM |
30 | /// * `"faminmax"` - FEAT_FAMINMAX |
31 | /// * `"fcma"` - FEAT_FCMA |
32 | /// * `"fhm"` - FEAT_FHM |
33 | /// * `"flagm"` - FEAT_FLAGM |
34 | /// * `"flagm2"` - FEAT_FLAGM2 |
35 | /// * `"fp"` - FEAT_FP |
36 | /// * `"fp16"` - FEAT_FP16 |
37 | /// * `"fp8"` - FEAT_FP8 |
38 | /// * `"fp8dot2"` - FEAT_FP8DOT2 |
39 | /// * `"fp8dot4"` - FEAT_FP8DOT4 |
40 | /// * `"fp8fma"` - FEAT_FP8FMA |
41 | /// * `"fpmr"` - FEAT_FPMR |
42 | /// * `"frintts"` - FEAT_FRINTTS |
43 | /// * `"hbc"` - FEAT_HBC |
44 | /// * `"i8mm"` - FEAT_I8MM |
45 | /// * `"jsconv"` - FEAT_JSCVT |
46 | /// * `"lse"` - FEAT_LSE |
47 | /// * `"lse128"` - FEAT_LSE128 |
48 | /// * `"lse2"` - FEAT_LSE2 |
49 | /// * `"lut"` - FEAT_LUT |
50 | /// * `"mops"` - FEAT_MOPS |
51 | /// * `"mte"` - FEAT_MTE & FEAT_MTE2 |
52 | /// * `"paca"` - FEAT_PAuth (address authentication) |
53 | /// * `"pacg"` - FEAT_Pauth (generic authentication) |
54 | /// * `"pauth-lr"` - FEAT_PAuth_LR |
55 | /// * `"pmull"` - FEAT_PMULL |
56 | /// * `"rand"` - FEAT_RNG |
57 | /// * `"rcpc"` - FEAT_LRCPC |
58 | /// * `"rcpc2"` - FEAT_LRCPC2 |
59 | /// * `"rcpc3"` - FEAT_LRCPC3 |
60 | /// * `"rdm"` - FEAT_RDM |
61 | /// * `"sb"` - FEAT_SB |
62 | /// * `"sha2"` - FEAT_SHA1 & FEAT_SHA256 |
63 | /// * `"sha3"` - FEAT_SHA512 & FEAT_SHA3 |
64 | /// * `"sm4"` - FEAT_SM3 & FEAT_SM4 |
65 | /// * `"sme"` - FEAT_SME |
66 | /// * `"sme-b16b16"` - FEAT_SME_B16B16 |
67 | /// * `"sme-f16f16"` - FEAT_SME_F16F16 |
68 | /// * `"sme-f64f64"` - FEAT_SME_F64F64 |
69 | /// * `"sme-f8f16"` - FEAT_SME_F8F16 |
70 | /// * `"sme-f8f32"` - FEAT_SME_F8F32 |
71 | /// * `"sme-fa64"` - FEAT_SME_FA64 |
72 | /// * `"sme-i16i64"` - FEAT_SME_I16I64 |
73 | /// * `"sme-lutv2"` - FEAT_SME_LUTv2 |
74 | /// * `"sme2"` - FEAT_SME2 |
75 | /// * `"sme2p1"` - FEAT_SME2p1 |
76 | /// * `"ssbs"` - FEAT_SSBS & FEAT_SSBS2 |
77 | /// * `"ssve-fp8dot2"` - FEAT_SSVE_FP8DOT2 |
78 | /// * `"ssve-fp8dot4"` - FEAT_SSVE_FP8DOT4 |
79 | /// * `"ssve-fp8fma"` - FEAT_SSVE_FP8FMA |
80 | /// * `"sve"` - FEAT_SVE |
81 | /// * `"sve-b16b16"` - FEAT_SVE_B16B16 (SVE or SME Z-targeting instructions) |
82 | /// * `"sve2"` - FEAT_SVE2 |
83 | /// * `"sve2-aes"` - FEAT_SVE_AES & FEAT_SVE_PMULL128 (SVE2 AES crypto) |
84 | /// * `"sve2-bitperm"` - FEAT_SVE2_BitPerm |
85 | /// * `"sve2-sha3"` - FEAT_SVE2_SHA3 |
86 | /// * `"sve2-sm4"` - FEAT_SVE2_SM4 |
87 | /// * `"sve2p1"` - FEAT_SVE2p1 |
88 | /// * `"tme"` - FEAT_TME |
89 | /// * `"wfxt"` - FEAT_WFxT |
90 | /// |
91 | /// [docs]: https://developer.arm.com/documentation/ddi0487/latest |
92 | #[stable (feature = "simd_aarch64" , since = "1.60.0" )] |
93 | @BIND_FEATURE_NAME: "asimd" ; "neon" ; |
94 | @NO_RUNTIME_DETECTION: "ras" ; |
95 | @NO_RUNTIME_DETECTION: "v8.1a" ; |
96 | @NO_RUNTIME_DETECTION: "v8.2a" ; |
97 | @NO_RUNTIME_DETECTION: "v8.3a" ; |
98 | @NO_RUNTIME_DETECTION: "v8.4a" ; |
99 | @NO_RUNTIME_DETECTION: "v8.5a" ; |
100 | @NO_RUNTIME_DETECTION: "v8.6a" ; |
101 | @NO_RUNTIME_DETECTION: "v8.7a" ; |
102 | @NO_RUNTIME_DETECTION: "v8.8a" ; |
103 | @NO_RUNTIME_DETECTION: "v8.9a" ; |
104 | @NO_RUNTIME_DETECTION: "v9.1a" ; |
105 | @NO_RUNTIME_DETECTION: "v9.2a" ; |
106 | @NO_RUNTIME_DETECTION: "v9.3a" ; |
107 | @NO_RUNTIME_DETECTION: "v9.4a" ; |
108 | @NO_RUNTIME_DETECTION: "v9.5a" ; |
109 | @NO_RUNTIME_DETECTION: "v9a" ; |
110 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] asimd: "neon" ; |
111 | /// FEAT_AdvSIMD (Advanced SIMD/NEON) |
112 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] pmull: "pmull" ; |
113 | implied by target_features: ["aes" ]; |
114 | /// FEAT_PMULL (Polynomial Multiply) - Implied by `aes` target_feature |
115 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] fp: "fp" ; |
116 | implied by target_features: ["neon" ]; |
117 | /// FEAT_FP (Floating point support) - Implied by `neon` target_feature |
118 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] aes: "aes" ; |
119 | /// FEAT_AES (AES SIMD instructions) & FEAT_PMULL (PMULL{2}, 64-bit operand variants) |
120 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] bf16: "bf16" ; |
121 | /// FEAT_BF16 (BFloat16 type, plus MM instructions, plus ASIMD support) |
122 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] bti: "bti" ; |
123 | /// FEAT_BTI (Branch Target Identification) |
124 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] crc: "crc" ; |
125 | /// FEAT_CRC32 (Cyclic Redundancy Check) |
126 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] cssc: "cssc" ; |
127 | /// FEAT_CSSC (Common Short Sequence Compression instructions) |
128 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] dit: "dit" ; |
129 | /// FEAT_DIT (Data Independent Timing instructions) |
130 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] dpb: "dpb" ; |
131 | /// FEAT_DPB (aka dcpop - data cache clean to point of persistence) |
132 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] dpb2: "dpb2" ; |
133 | /// FEAT_DPB2 (aka dcpodp - data cache clean to point of deep persistence) |
134 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] dotprod: "dotprod" ; |
135 | /// FEAT_DotProd (Vector Dot-Product - ASIMDDP) |
136 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] ecv: "ecv" ; |
137 | /// FEAT_ECV (Enhanced Counter Virtualization) |
138 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] f32mm: "f32mm" ; |
139 | /// FEAT_F32MM (single-precision matrix multiplication) |
140 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] f64mm: "f64mm" ; |
141 | /// FEAT_F64MM (double-precision matrix multiplication) |
142 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] faminmax: "faminmax" ; |
143 | /// FEAT_FAMINMAX (FAMIN and FAMAX SIMD/SVE/SME instructions) |
144 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] fcma: "fcma" ; |
145 | /// FEAT_FCMA (float complex number operations) |
146 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] fhm: "fhm" ; |
147 | /// FEAT_FHM (fp16 multiplication instructions) |
148 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] flagm: "flagm" ; |
149 | /// FEAT_FLAGM (flag manipulation instructions) |
150 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] flagm2: "flagm2" ; |
151 | /// FEAT_FLAGM2 (flag manipulation instructions) |
152 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] fp16: "fp16" ; |
153 | /// FEAT_FP16 (Half-float support) |
154 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] fp8: "fp8" ; |
155 | /// FEAT_FP8 (F8CVT Instructions) |
156 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] fp8dot2: "fp8dot2" ; |
157 | /// FEAT_FP8DOT2 (F8DP2 Instructions) |
158 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] fp8dot4: "fp8dot4" ; |
159 | /// FEAT_FP8DOT4 (F8DP4 Instructions) |
160 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] fp8fma: "fp8fma" ; |
161 | /// FEAT_FP8FMA (F8FMA Instructions) |
162 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] fpmr: "fpmr" ; |
163 | without cfg check: true; |
164 | /// FEAT_FPMR (Special-purpose AArch64-FPMR register) |
165 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] frintts: "frintts" ; |
166 | /// FEAT_FRINTTS (float to integer rounding instructions) |
167 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] hbc: "hbc" ; |
168 | /// FEAT_HBC (Hinted conditional branches) |
169 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] i8mm: "i8mm" ; |
170 | /// FEAT_I8MM (integer matrix multiplication, plus ASIMD support) |
171 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] jsconv: "jsconv" ; |
172 | /// FEAT_JSCVT (JavaScript float conversion instructions) |
173 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] lse: "lse" ; |
174 | /// FEAT_LSE (Large System Extension - atomics) |
175 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] lse128: "lse128" ; |
176 | /// FEAT_LSE128 (128-bit atomics) |
177 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] lse2: "lse2" ; |
178 | /// FEAT_LSE2 (unaligned and register-pair atomics) |
179 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] lut: "lut" ; |
180 | /// FEAT_LUT (Lookup Table Instructions) |
181 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] mops: "mops" ; |
182 | /// FEAT_MOPS (Standardization of memory operations) |
183 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] mte: "mte" ; |
184 | /// FEAT_MTE & FEAT_MTE2 (Memory Tagging Extension) |
185 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] paca: "paca" ; |
186 | /// FEAT_PAuth (address authentication) |
187 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] pacg: "pacg" ; |
188 | /// FEAT_PAuth (generic authentication) |
189 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] pauth_lr: "pauth-lr" ; |
190 | /// FEAT_PAuth_LR |
191 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] rand: "rand" ; |
192 | /// FEAT_RNG (Random Number Generator) |
193 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] rcpc: "rcpc" ; |
194 | /// FEAT_LRCPC (Release consistent Processor consistent) |
195 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] rcpc2: "rcpc2" ; |
196 | /// FEAT_LRCPC2 (RCPC with immediate offsets) |
197 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] rcpc3: "rcpc3" ; |
198 | /// FEAT_LRCPC3 (RCPC Instructions v3) |
199 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] rdm: "rdm" ; |
200 | /// FEAT_RDM (Rounding Doubling Multiply - ASIMDRDM) |
201 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sb: "sb" ; |
202 | /// FEAT_SB (speculation barrier) |
203 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sha2: "sha2" ; |
204 | /// FEAT_SHA1 & FEAT_SHA256 (SHA1 & SHA2-256 instructions) |
205 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sha3: "sha3" ; |
206 | /// FEAT_SHA512 & FEAT_SHA3 (SHA2-512 & SHA3 instructions) |
207 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sm4: "sm4" ; |
208 | /// FEAT_SM3 & FEAT_SM4 (SM3 & SM4 instructions) |
209 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme: "sme" ; |
210 | /// FEAT_SME (Scalable Matrix Extension) |
211 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme2: "sme2" ; |
212 | /// FEAT_SME2 (SME Version 2) |
213 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme2p1: "sme2p1" ; |
214 | /// FEAT_SME2p1 (SME Version 2.1) |
215 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme_b16b16: "sme-b16b16" ; |
216 | /// FEAT_SME_B16B16 |
217 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme_f16f16: "sme-f16f16" ; |
218 | /// FEAT_SME_F16F16 (Non-widening half-precision FP16 to FP16 arithmetic for SME2) |
219 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme_f64f64: "sme-f64f64" ; |
220 | /// FEAT_SME_F64F64 (Double-precision floating-point outer product instructions) |
221 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme_f8f16: "sme-f8f16" ; |
222 | /// FEAT_SME_F8F16 |
223 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme_f8f32: "sme-f8f32" ; |
224 | /// FEAT_SME_F8F32 |
225 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme_fa64: "sme-fa64" ; |
226 | /// FEAT_SME_FA64 (Full A64 instruction set support in Streaming SVE mode) |
227 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme_i16i64: "sme-i16i64" ; |
228 | /// FEAT_SME_I16I64 (16-bit to 64-bit integer widening outer product instructions) |
229 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sme_lutv2: "sme-lutv2" ; |
230 | /// FEAT_SME_LUTv2 (LUTI4 Instruction) |
231 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] ssbs: "ssbs" ; |
232 | /// FEAT_SSBS & FEAT_SSBS2 (speculative store bypass safe) |
233 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] ssve_fp8dot2: "ssve-fp8dot2" ; |
234 | /// FEAT_SSVE_FP8DOT2 |
235 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] ssve_fp8dot4: "ssve-fp8dot4" ; |
236 | /// FEAT_SSVE_FP8DOT4 |
237 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] ssve_fp8fma: "ssve-fp8fma" ; |
238 | /// FEAT_SSVE_FP8FMA |
239 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sve: "sve" ; |
240 | /// FEAT_SVE (Scalable Vector Extension) |
241 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sve2: "sve2" ; |
242 | /// FEAT_SVE2 (Scalable Vector Extension 2) |
243 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sve2p1: "sve2p1" ; |
244 | /// FEAT_SVE2p1 (Scalable Vector Extension 2.1) |
245 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sve2_aes: "sve2-aes" ; |
246 | /// FEAT_SVE_AES & FEAT_SVE_PMULL128 (SVE2 AES crypto) |
247 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] sve_b16b16: "sve-b16b16" ; |
248 | /// FEAT_SVE_B16B16 (SVE or SME Z-targeting instructions) |
249 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sve2_bitperm: "sve2-bitperm" ; |
250 | /// FEAT_SVE_BitPerm (SVE2 bit permutation instructions) |
251 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sve2_sha3: "sve2-sha3" ; |
252 | /// FEAT_SVE_SHA3 (SVE2 SHA3 crypto) |
253 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] sve2_sm4: "sve2-sm4" ; |
254 | /// FEAT_SVE_SM4 (SVE2 SM4 crypto) |
255 | @FEATURE: #[stable (feature = "simd_aarch64" , since = "1.60.0" )] tme: "tme" ; |
256 | /// FEAT_TME (Transactional Memory Extensions) |
257 | @FEATURE: #[unstable (feature = "stdarch_aarch64_feature_detection" , issue = "127764" )] wfxt: "wfxt" ; |
258 | /// FEAT_WFxT (WFET and WFIT Instructions) |
259 | } |
260 | |