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