std_detect/detect/arch/riscv.rs
1//! Run-time feature detection on RISC-V.
2
3features! {
4 @TARGET: riscv;
5 @CFG: any(target_arch = "riscv32", target_arch = "riscv64");
6 @MACRO_NAME: is_riscv_feature_detected;
7 @MACRO_ATTRS:
8 /// Check for the presence of a CPU feature at runtime.
9 ///
10 /// When the feature is known to be enabled at compile time (e.g. via `-Ctarget-feature`)
11 /// the macro expands to `true`.
12 ///
13 /// RISC-V standard defined the base sets and the extension sets.
14 /// The base sets are RV32I, RV64I, RV32E or RV128I. Any RISC-V platform
15 /// must support one base set and/or multiple extension sets.
16 ///
17 /// Any RISC-V standard instruction sets can be in state of either ratified,
18 /// frozen or draft. The version and status of current standard instruction
19 /// sets can be checked out from preface section of the [ISA manual].
20 ///
21 /// Platform may define and support their own custom instruction sets with
22 /// ISA prefix X. These sets are highly platform specific and should be
23 /// detected with their own platform support crates.
24 ///
25 /// [ISA manual]: https://riscv.org/specifications/ratified/
26 ///
27 /// # Platform-specific/agnostic Behavior and Availability
28 ///
29 /// Runtime detection depends on the platform-specific feature detection
30 /// facility and its availability per feature is
31 /// highly platform/version-specific.
32 ///
33 /// Still, a best-effort attempt is performed to enable subset/dependent
34 /// features if a superset feature is enabled regardless of the platform.
35 /// For instance, if the A extension (`"a"`) is enabled, its subsets (the
36 /// Zalrsc and Zaamo extensions; `"zalrsc"` and `"zaamo"`) are also enabled.
37 /// Likewise, if the F extension (`"f"`) is enabled, one of its dependencies
38 /// (the Zicsr extension `"zicsr"`) is also enabled.
39 ///
40 /// # Unprivileged Specification
41 ///
42 /// The supported ratified RISC-V instruction sets are as follows (OS
43 /// columns denote runtime feature detection support with or without the
44 /// minimum supported version):
45 ///
46 /// | Literal | Base | Linux |
47 /// |:---------- |:------- |:---------- |
48 /// | `"rv32e"` | RV32E | No |
49 /// | `"rv32i"` | RV32I | Yes [^ima] |
50 /// | `"rv64i"` | RV64I | Yes [^ima] |
51 ///
52 /// | Literal | Extension | Linux |
53 /// |:--------------- |:----------- |:------------------- |
54 /// | `"a"` | A | Yes [^ima] |
55 /// | `"b"` | B | 6.5 |
56 /// | `"c"` | C | Yes |
57 /// | `"d"` | D | Yes |
58 /// | `"f"` | F | Yes |
59 /// | `"m"` | M | Yes [^ima] |
60 /// | `"q"` | Q | No |
61 /// | `"v"` | V | 6.5 |
62 /// | `"zaamo"` | Zaamo | 6.15 [^ima] [^dep] |
63 /// | `"zabha"` | Zabha | 6.16 |
64 /// | `"zacas"` | Zacas | 6.8 |
65 /// | `"zalrsc"` | Zalrsc | 6.15 [^ima] [^dep] |
66 /// | `"zawrs"` | Zawrs | 6.11 |
67 /// | `"zba"` | Zba | 6.5 |
68 /// | `"zbb"` | Zbb | 6.5 |
69 /// | `"zbc"` | Zbc | 6.8 |
70 /// | `"zbkb"` | Zbkb | 6.8 |
71 /// | `"zbkc"` | Zbkc | 6.8 |
72 /// | `"zbkx"` | Zbkx | 6.8 |
73 /// | `"zbs"` | Zbs | 6.5 |
74 /// | `"zca"` | Zca | 6.11 [^dep] |
75 /// | `"zcb"` | Zcb | 6.11 |
76 /// | `"zcd"` | Zcd | 6.11 [^dep] |
77 /// | `"zcf"` | Zcf | 6.11 [^dep] |
78 /// | `"zcmop"` | Zcmop | 6.11 |
79 /// | `"zdinx"` | Zdinx | No |
80 /// | `"zfa"` | Zfa | 6.8 |
81 /// | `"zfbfmin"` | Zfbfmin | 6.15 |
82 /// | `"zfh"` | Zfh | 6.8 |
83 /// | `"zfhmin"` | Zfhmin | 6.8 |
84 /// | `"zfinx"` | Zfinx | No |
85 /// | `"zhinx"` | Zhinx | No |
86 /// | `"zhinxmin"` | Zhinxmin | No |
87 /// | `"zicbom"` | Zicbom | 6.15 |
88 /// | `"zicboz"` | Zicboz | 6.7 |
89 /// | `"zicntr"` | Zicntr | 6.15 [^ima] [^cntr] |
90 /// | `"zicond"` | Zicond | 6.8 |
91 /// | `"zicsr"` | Zicsr | No [^ima] [^dep] |
92 /// | `"zifencei"` | Zifencei | No [^ima] |
93 /// | `"zihintntl"` | Zihintntl | 6.8 |
94 /// | `"zihintpause"` | Zihintpause | 6.10 |
95 /// | `"zihpm"` | Zihpm | 6.15 [^cntr] |
96 /// | `"zimop"` | Zimop | 6.11 |
97 /// | `"zk"` | Zk | No [^zkr] |
98 /// | `"zkn"` | Zkn | 6.8 |
99 /// | `"zknd"` | Zknd | 6.8 |
100 /// | `"zkne"` | Zkne | 6.8 |
101 /// | `"zknh"` | Zknh | 6.8 |
102 /// | `"zkr"` | Zkr | No [^zkr] |
103 /// | `"zks"` | Zks | 6.8 |
104 /// | `"zksed"` | Zksed | 6.8 |
105 /// | `"zksh"` | Zksh | 6.8 |
106 /// | `"zkt"` | Zkt | 6.8 |
107 /// | `"ztso"` | Ztso | 6.8 |
108 /// | `"zvbb"` | Zvbb | 6.8 |
109 /// | `"zvbc"` | Zvbc | 6.8 |
110 /// | `"zve32f"` | Zve32f | 6.11 [^dep] |
111 /// | `"zve32x"` | Zve32x | 6.11 [^dep] |
112 /// | `"zve64d"` | Zve64d | 6.11 [^dep] |
113 /// | `"zve64f"` | Zve64f | 6.11 [^dep] |
114 /// | `"zve64x"` | Zve64x | 6.11 [^dep] |
115 /// | `"zvfbfmin"` | Zvfbfmin | 6.15 |
116 /// | `"zvfbfwma"` | Zvfbfwma | 6.15 |
117 /// | `"zvfh"` | Zvfh | 6.8 |
118 /// | `"zvfhmin"` | Zvfhmin | 6.8 |
119 /// | `"zvkb"` | Zvkb | 6.8 |
120 /// | `"zvkg"` | Zvkg | 6.8 |
121 /// | `"zvkn"` | Zvkn | 6.8 |
122 /// | `"zvknc"` | Zvknc | 6.8 |
123 /// | `"zvkned"` | Zvkned | 6.8 |
124 /// | `"zvkng"` | Zvkng | 6.8 |
125 /// | `"zvknha"` | Zvknha | 6.8 |
126 /// | `"zvknhb"` | Zvknhb | 6.8 |
127 /// | `"zvks"` | Zvks | 6.8 |
128 /// | `"zvksc"` | Zvksc | 6.8 |
129 /// | `"zvksed"` | Zvksed | 6.8 |
130 /// | `"zvksg"` | Zvksg | 6.8 |
131 /// | `"zvksh"` | Zvksh | 6.8 |
132 /// | `"zvkt"` | Zvkt | 6.8 |
133 ///
134 /// [^ima]: Or enabled when the IMA base behavior is detected on the Linux
135 /// kernel version 6.4 or later (for bases, the only matching one -- either
136 /// `"rv32i"` or `"rv64i"` -- is enabled).
137 ///
138 /// [^cntr]: Even if this extension is available, it does not necessarily
139 /// mean all performance counters are accessible.
140 /// For example, accesses to all performance counters except `time`
141 /// (wall-clock) are blocked by default on the Linux kernel
142 /// version 6.6 or later.
143 /// Also beware that, even if performance counters like `cycle` and
144 /// `instret` are accessible, their value can be unreliable (e.g. returning
145 /// the constant value) under certain circumstances.
146 ///
147 /// [^dep]: Or enabled as a dependency of another extension (a superset)
148 /// even if runtime detection of this feature itself is not supported (as
149 /// long as the runtime detection of the superset is supported).
150 ///
151 /// [^zkr]: Linux does not report existence of this extension even if
152 /// supported by the hardware mainly because the `seed` CSR on the Zkr
153 /// extension (which provides hardware-based randomness) is normally
154 /// inaccessible from the user mode.
155 /// For the Zk extension features except this CSR, check existence of both
156 /// `"zkn"` and `"zkt"` features instead.
157 ///
158 /// There's also bases and extensions marked as standard instruction set,
159 /// but they are in frozen or draft state. These instruction sets are also
160 /// reserved by this macro and can be detected in the future platforms.
161 ///
162 /// Draft RISC-V instruction sets:
163 ///
164 /// * RV128I: `"rv128i"`
165 /// * J: `"j"`
166 /// * P: `"p"`
167 /// * Zam: `"zam"`
168 ///
169 /// # Performance Hints
170 ///
171 /// The two features below define performance hints for unaligned
172 /// scalar/vector memory accesses, respectively. If enabled, it denotes that
173 /// corresponding unaligned memory access is reasonably fast.
174 ///
175 /// * `"unaligned-scalar-mem"`
176 /// * Runtime detection requires Linux kernel version 6.4 or later.
177 /// * `"unaligned-vector-mem"`
178 /// * Runtime detection requires Linux kernel version 6.13 or later.
179 #[stable(feature = "riscv_ratified", since = "1.78.0")]
180
181 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] rv32i: "rv32i";
182 without cfg check: true;
183 /// RV32I Base Integer Instruction Set
184 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] rv32e: "rv32e";
185 without cfg check: true;
186 /// RV32E Base Integer Instruction Set
187 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] rv64i: "rv64i";
188 without cfg check: true;
189 /// RV64I Base Integer Instruction Set
190 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] rv128i: "rv128i";
191 without cfg check: true;
192 /// RV128I Base Integer Instruction Set
193
194 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] unaligned_scalar_mem: "unaligned-scalar-mem";
195 /// Has reasonably performant unaligned scalar
196 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] unaligned_vector_mem: "unaligned-vector-mem";
197 /// Has reasonably performant unaligned vector
198
199 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zicsr: "zicsr";
200 /// "Zicsr" Extension for Control and Status Register (CSR) Instructions
201 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zicntr: "zicntr";
202 /// "Zicntr" Extension for Base Counters and Timers
203 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zihpm: "zihpm";
204 /// "Zihpm" Extension for Hardware Performance Counters
205 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zifencei: "zifencei";
206 /// "Zifencei" Extension for Instruction-Fetch Fence
207
208 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zihintntl: "zihintntl";
209 /// "Zihintntl" Extension for Non-Temporal Locality Hints
210 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zihintpause: "zihintpause";
211 /// "Zihintpause" Extension for Pause Hint
212 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zimop: "zimop";
213 /// "Zimop" Extension for May-Be-Operations
214 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zicbom: "zicbom";
215 /// "Zicbom" Extension for Cache-Block Management Instructions
216 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zicboz: "zicboz";
217 /// "Zicboz" Extension for Cache-Block Zero Instruction
218 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zicond: "zicond";
219 /// "Zicond" Extension for Integer Conditional Operations
220
221 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] m: "m";
222 /// "M" Extension for Integer Multiplication and Division
223
224 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] a: "a";
225 /// "A" Extension for Atomic Instructions
226 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zalrsc: "zalrsc";
227 /// "Zalrsc" Extension for Load-Reserved/Store-Conditional Instructions
228 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zaamo: "zaamo";
229 /// "Zaamo" Extension for Atomic Memory Operations
230 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zawrs: "zawrs";
231 /// "Zawrs" Extension for Wait-on-Reservation-Set Instructions
232 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zabha: "zabha";
233 /// "Zabha" Extension for Byte and Halfword Atomic Memory Operations
234 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zacas: "zacas";
235 /// "Zacas" Extension for Atomic Compare-and-Swap (CAS) Instructions
236 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zam: "zam";
237 without cfg check: true;
238 /// "Zam" Extension for Misaligned Atomics
239 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] ztso: "ztso";
240 /// "Ztso" Extension for Total Store Ordering
241
242 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] f: "f";
243 /// "F" Extension for Single-Precision Floating-Point
244 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] d: "d";
245 /// "D" Extension for Double-Precision Floating-Point
246 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] q: "q";
247 without cfg check: true;
248 /// "Q" Extension for Quad-Precision Floating-Point
249 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zfh: "zfh";
250 /// "Zfh" Extension for Half-Precision Floating-Point
251 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zfhmin: "zfhmin";
252 /// "Zfhmin" Extension for Minimal Half-Precision Floating-Point
253 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zfa: "zfa";
254 /// "Zfa" Extension for Additional Floating-Point Instructions
255 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zfbfmin: "zfbfmin";
256 /// "Zfbfmin" Extension for Scalar BF16 Converts
257
258 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zfinx: "zfinx";
259 /// "Zfinx" Extension for Single-Precision Floating-Point in Integer Registers
260 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zdinx: "zdinx";
261 /// "Zdinx" Extension for Double-Precision Floating-Point in Integer Registers
262 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zhinx: "zhinx";
263 /// "Zhinx" Extension for Half-Precision Floating-Point in Integer Registers
264 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zhinxmin: "zhinxmin";
265 /// "Zhinxmin" Extension for Minimal Half-Precision Floating-Point in Integer Registers
266
267 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] c: "c";
268 /// "C" Extension for Compressed Instructions
269 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zca: "zca";
270 /// "Zca" Compressed Instructions excluding Floating-Point Loads/Stores
271 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zcf: "zcf";
272 without cfg check: true;
273 /// "Zcf" Compressed Instructions for Single-Precision Floating-Point Loads/Stores on RV32
274 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zcd: "zcd";
275 without cfg check: true;
276 /// "Zcd" Compressed Instructions for Double-Precision Floating-Point Loads/Stores
277 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zcb: "zcb";
278 /// "Zcb" Simple Code-size Saving Compressed Instructions
279 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zcmop: "zcmop";
280 /// "Zcmop" Extension for Compressed May-Be-Operations
281
282 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] b: "b";
283 /// "B" Extension for Bit Manipulation
284 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zba: "zba";
285 /// "Zba" Extension for Address Generation
286 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zbb: "zbb";
287 /// "Zbb" Extension for Basic Bit-Manipulation
288 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zbc: "zbc";
289 /// "Zbc" Extension for Carry-less Multiplication
290 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zbs: "zbs";
291 /// "Zbs" Extension for Single-Bit Instructions
292
293 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zbkb: "zbkb";
294 /// "Zbkb" Extension for Bit-Manipulation for Cryptography
295 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zbkc: "zbkc";
296 /// "Zbkc" Extension for Carry-less Multiplication for Cryptography
297 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zbkx: "zbkx";
298 /// "Zbkx" Extension for Crossbar Permutations
299 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zknd: "zknd";
300 /// "Zknd" Cryptography Extension for NIST Suite: AES Decryption
301 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zkne: "zkne";
302 /// "Zkne" Cryptography Extension for NIST Suite: AES Encryption
303 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zknh: "zknh";
304 /// "Zknh" Cryptography Extension for NIST Suite: Hash Function Instructions
305 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zksed: "zksed";
306 /// "Zksed" Cryptography Extension for ShangMi Suite: SM4 Block Cipher Instructions
307 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zksh: "zksh";
308 /// "Zksh" Cryptography Extension for ShangMi Suite: SM3 Hash Function Instructions
309 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zkr: "zkr";
310 /// "Zkr" Entropy Source Extension
311 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zkn: "zkn";
312 /// "Zkn" Cryptography Extension for NIST Algorithm Suite
313 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zks: "zks";
314 /// "Zks" Cryptography Extension for ShangMi Algorithm Suite
315 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zk: "zk";
316 /// "Zk" Cryptography Extension for Standard Scalar Cryptography
317 @FEATURE: #[stable(feature = "riscv_ratified", since = "1.78.0")] zkt: "zkt";
318 /// "Zkt" Cryptography Extension for Data Independent Execution Latency
319
320 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] v: "v";
321 /// "V" Extension for Vector Operations
322 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zve32x: "zve32x";
323 /// "Zve32x" Vector Extension for Embedded Processors (32-bit+; Integer)
324 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zve32f: "zve32f";
325 /// "Zve32f" Vector Extension for Embedded Processors (32-bit+; with Single-Precision Floating-Point)
326 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zve64x: "zve64x";
327 /// "Zve64x" Vector Extension for Embedded Processors (64-bit+; Integer)
328 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zve64f: "zve64f";
329 /// "Zve64f" Vector Extension for Embedded Processors (64-bit+; with Single-Precision Floating-Point)
330 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zve64d: "zve64d";
331 /// "Zve64d" Vector Extension for Embedded Processors (64-bit+; with Double-Precision Floating-Point)
332 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvfh: "zvfh";
333 /// "Zvfh" Vector Extension for Half-Precision Floating-Point
334 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvfhmin: "zvfhmin";
335 /// "Zvfhmin" Vector Extension for Minimal Half-Precision Floating-Point
336 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvfbfmin: "zvfbfmin";
337 /// "Zvfbfmin" Vector Extension for BF16 Converts
338 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvfbfwma: "zvfbfwma";
339 /// "Zvfbfwma" Vector Extension for BF16 Widening Multiply-Add
340
341 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvbb: "zvbb";
342 /// "Zvbb" Extension for Vector Basic Bit-Manipulation
343 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvbc: "zvbc";
344 /// "Zvbc" Extension for Vector Carryless Multiplication
345 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvkb: "zvkb";
346 /// "Zvkb" Extension for Vector Cryptography Bit-Manipulation
347 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvkg: "zvkg";
348 /// "Zvkg" Cryptography Extension for Vector GCM/GMAC
349 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvkned: "zvkned";
350 /// "Zvkned" Cryptography Extension for NIST Suite: Vector AES Block Cipher
351 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvknha: "zvknha";
352 /// "Zvknha" Cryptography Extension for Vector SHA-2 Secure Hash (SHA-256)
353 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvknhb: "zvknhb";
354 /// "Zvknhb" Cryptography Extension for Vector SHA-2 Secure Hash (SHA-256/512)
355 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvksed: "zvksed";
356 /// "Zvksed" Cryptography Extension for ShangMi Suite: Vector SM4 Block Cipher
357 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvksh: "zvksh";
358 /// "Zvksh" Cryptography Extension for ShangMi Suite: Vector SM3 Secure Hash
359 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvkn: "zvkn";
360 /// "Zvkn" Cryptography Extension for NIST Algorithm Suite
361 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvknc: "zvknc";
362 /// "Zvknc" Cryptography Extension for NIST Algorithm Suite with Carryless Multiply
363 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvkng: "zvkng";
364 /// "Zvkng" Cryptography Extension for NIST Algorithm Suite with GCM
365 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvks: "zvks";
366 /// "Zvks" Cryptography Extension for ShangMi Algorithm Suite
367 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvksc: "zvksc";
368 /// "Zvksc" Cryptography Extension for ShangMi Algorithm Suite with Carryless Multiply
369 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvksg: "zvksg";
370 /// "Zvksg" Cryptography Extension for ShangMi Algorithm Suite with GCM
371 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] zvkt: "zvkt";
372 /// "Zvkt" Extension for Vector Data-Independent Execution Latency
373
374 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] j: "j";
375 without cfg check: true;
376 /// "J" Extension for Dynamically Translated Languages
377 @FEATURE: #[unstable(feature = "stdarch_riscv_feature_detection", issue = "111192")] p: "p";
378 without cfg check: true;
379 /// "P" Extension for Packed-SIMD Instructions
380}