asmkit/riscv/emitter.rs
1//! Typed RISC-V emitter traits generated by `meta/riscv.py`.
2//!
3//! Invalid operand categories fail at compile time:
4//!
5//! ```compile_fail
6//! use asmkit::riscv::{Assembler, FaddSEmitter, Gp};
7//! fn require<T: FaddSEmitter<Gp, Gp, Gp, Gp>>() {}
8//! require::<Assembler<'static>>();
9//! ```
10//!
11//! ```compile_fail
12//! use asmkit::riscv::{Assembler, VaddVvEmitter, Vp};
13//! fn require<T: VaddVvEmitter<Vp, Vp, Vp, Vp>>() {}
14//! require::<Assembler<'static>>();
15//! ```
16//!
17//! ```compile_fail
18//! use asmkit::Sym;
19//! use asmkit::riscv::{Assembler, Gp, JalEmitter};
20//! fn require<T: JalEmitter<Gp, Sym>>() {}
21//! require::<Assembler<'static>>();
22//! ```
23//!
24//! ```
25//! use asmkit::Imm;
26//! use asmkit::riscv::{Assembler, FcvtmodWDEmitter, FmvWXEmitter, FmvXWEmitter, Fp, Gp, VfaddVfEmitter, Vp};
27//! fn require<T: FcvtmodWDEmitter<Gp, Fp> + FmvWXEmitter<Fp, Gp> + FmvXWEmitter<Gp, Fp> + VfaddVfEmitter<Vp, Vp, Fp, Imm>>() {}
28//! require::<Assembler<'static>>();
29//! ```
30//!
31//! ```compile_fail
32//! use asmkit::Imm;
33//! use asmkit::riscv::{Assembler, Gp, VfaddVfEmitter, Vp};
34//! fn require<T: VfaddVfEmitter<Vp, Vp, Gp, Imm>>() {}
35//! require::<Assembler<'static>>();
36//! ```
37//!
38//! ```compile_fail
39//! use asmkit::Label;
40//! use asmkit::riscv::{Assembler, Gp, JalrEmitter, LbEmitter};
41//! fn require<T: JalrEmitter<Gp, Gp, Label> + LbEmitter<Gp, Gp, Label>>() {}
42//! require::<Assembler<'static>>();
43//! ```
44use super::{assembler::*, opcodes::*, operands::*};
45use crate::core::operand::*;
46
47/* Automatically generated by parse_opcodes (meta/riscv.py). Do not edit by hand.
48 * Derived from riscv-opcodes (BSD-3-Clause) and riscv-unified-db
49 * (BSD-3-Clause-Clear); see meta/README.md for the input pins. */
50
51/// Integer add
52///
53/// Add the value in rs1 to rs2, and store the result in rd.
54/// Any overflow is thrown away.
55///
56/// # Forms
57/// Assembly: `add xd, xs1, xs2`
58/// Rust: `add(rd, rs1, rs2)`
59///
60/// # Arguments
61/// - `rd` — Destination register.
62/// - `rs1` — Source register.
63/// - `rs2` — Source register.
64pub trait AddEmitter<T0, T1, T2> {
65 fn add(&mut self, rd: T0, rs1: T1, rs2: T2);
66}
67
68/// Add unsigned word
69///
70/// This instruction performs an XLEN-wide addition between rs2 and the
71/// zero-extended least-significant word of rs1.
72///
73/// # Forms
74/// Assembly: `add.uw xd, xs1, xs2`
75/// Rust: `add_uw(rd, rs1, rs2)`
76///
77/// # Arguments
78/// - `rd` — Destination register.
79/// - `rs1` — Source register.
80/// - `rs2` — Source register.
81pub trait AddUwEmitter<T0, T1, T2> {
82 fn add_uw(&mut self, rd: T0, rs1: T1, rs2: T2);
83}
84
85/// Add immediate
86///
87/// Add an immediate to the value in rs1, and store the result in rd
88///
89/// # Forms
90/// Assembly: `addi xd, xs1, imm`
91/// Rust: `addi(rd, rs1, imm)`
92///
93/// # Arguments
94/// - `rd` — Destination register.
95/// - `rs1` — Source register.
96/// - `imm` — Immediate encoding value.
97pub trait AddiEmitter<T0, T1, T2> {
98 fn addi(&mut self, rd: T0, rs1: T1, imm: T2);
99}
100
101/// Add immediate word
102///
103/// Add an immediate to the 32-bit value in rs1, and store the sign extended result in rd
104///
105/// # Forms
106/// Assembly: `addiw xd, xs1, imm`
107/// Rust: `addiw(rd, rs1, imm)`
108///
109/// # Arguments
110/// - `rd` — Destination register.
111/// - `rs1` — Source register.
112/// - `imm` — Immediate encoding value.
113pub trait AddiwEmitter<T0, T1, T2> {
114 fn addiw(&mut self, rd: T0, rs1: T1, imm: T2);
115}
116
117/// Add word
118///
119/// Add the 32-bit values in rs1 to rs2, and store the sign-extended result in rd.
120/// Any overflow is thrown away.
121///
122/// # Forms
123/// Assembly: `addw xd, xs1, xs2`
124/// Rust: `addw(rd, rs1, rs2)`
125///
126/// # Arguments
127/// - `rd` — Destination register.
128/// - `rs1` — Source register.
129/// - `rs2` — Source register.
130pub trait AddwEmitter<T0, T1, T2> {
131 fn addw(&mut self, rd: T0, rs1: T1, rs2: T2);
132}
133
134/// RISC-V `aes32dsi` instruction.
135///
136/// # Forms
137/// Assembly: `aes32dsi xd, xs1, xs2, bs`
138/// Rust: `aes32dsi(rd, rs1, rs2, bs)`
139///
140/// # Arguments
141/// - `rd` — Destination register.
142/// - `rs1` — Source register.
143/// - `rs2` — Source register.
144/// - `bs` — Immediate encoding value.
145pub trait Aes32DsiEmitter<T0, T1, T2, T3> {
146 fn aes32dsi(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3);
147}
148
149/// RISC-V `aes32dsmi` instruction.
150///
151/// # Forms
152/// Assembly: `aes32dsmi xd, xs1, xs2, bs`
153/// Rust: `aes32dsmi(rd, rs1, rs2, bs)`
154///
155/// # Arguments
156/// - `rd` — Destination register.
157/// - `rs1` — Source register.
158/// - `rs2` — Source register.
159/// - `bs` — Immediate encoding value.
160pub trait Aes32DsmiEmitter<T0, T1, T2, T3> {
161 fn aes32dsmi(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3);
162}
163
164/// RISC-V `aes32esi` instruction.
165///
166/// # Forms
167/// Assembly: `aes32esi xd, xs1, xs2, bs`
168/// Rust: `aes32esi(rd, rs1, rs2, bs)`
169///
170/// # Arguments
171/// - `rd` — Destination register.
172/// - `rs1` — Source register.
173/// - `rs2` — Source register.
174/// - `bs` — Immediate encoding value.
175pub trait Aes32EsiEmitter<T0, T1, T2, T3> {
176 fn aes32esi(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3);
177}
178
179/// RISC-V `aes32esmi` instruction.
180///
181/// # Forms
182/// Assembly: `aes32esmi xd, xs1, xs2, bs`
183/// Rust: `aes32esmi(rd, rs1, rs2, bs)`
184///
185/// # Arguments
186/// - `rd` — Destination register.
187/// - `rs1` — Source register.
188/// - `rs2` — Source register.
189/// - `bs` — Immediate encoding value.
190pub trait Aes32EsmiEmitter<T0, T1, T2, T3> {
191 fn aes32esmi(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3);
192}
193
194/// RISC-V `aes64ds` instruction.
195///
196/// # Forms
197/// Assembly: `aes64ds xd, xs1, xs2`
198/// Rust: `aes64ds(rd, rs1, rs2)`
199///
200/// # Arguments
201/// - `rd` — Destination register.
202/// - `rs1` — Source register.
203/// - `rs2` — Source register.
204pub trait Aes64DsEmitter<T0, T1, T2> {
205 fn aes64ds(&mut self, rd: T0, rs1: T1, rs2: T2);
206}
207
208/// RISC-V `aes64dsm` instruction.
209///
210/// # Forms
211/// Assembly: `aes64dsm xd, xs1, xs2`
212/// Rust: `aes64dsm(rd, rs1, rs2)`
213///
214/// # Arguments
215/// - `rd` — Destination register.
216/// - `rs1` — Source register.
217/// - `rs2` — Source register.
218pub trait Aes64DsmEmitter<T0, T1, T2> {
219 fn aes64dsm(&mut self, rd: T0, rs1: T1, rs2: T2);
220}
221
222/// RISC-V `aes64es` instruction.
223///
224/// # Forms
225/// Assembly: `aes64es xd, xs1, xs2`
226/// Rust: `aes64es(rd, rs1, rs2)`
227///
228/// # Arguments
229/// - `rd` — Destination register.
230/// - `rs1` — Source register.
231/// - `rs2` — Source register.
232pub trait Aes64EsEmitter<T0, T1, T2> {
233 fn aes64es(&mut self, rd: T0, rs1: T1, rs2: T2);
234}
235
236/// RISC-V `aes64esm` instruction.
237///
238/// # Forms
239/// Assembly: `aes64esm xd, xs1, xs2`
240/// Rust: `aes64esm(rd, rs1, rs2)`
241///
242/// # Arguments
243/// - `rd` — Destination register.
244/// - `rs1` — Source register.
245/// - `rs2` — Source register.
246pub trait Aes64EsmEmitter<T0, T1, T2> {
247 fn aes64esm(&mut self, rd: T0, rs1: T1, rs2: T2);
248}
249
250/// RISC-V `aes64im` instruction.
251///
252/// # Forms
253/// Assembly: `aes64im xd, xs1`
254/// Rust: `aes64im(rd, rs1)`
255///
256/// # Arguments
257/// - `rd` — Destination register.
258/// - `rs1` — Source register.
259pub trait Aes64ImEmitter<T0, T1> {
260 fn aes64im(&mut self, rd: T0, rs1: T1);
261}
262
263/// RISC-V `aes64ks1i` instruction.
264///
265/// # Forms
266/// Assembly: `aes64ks1i xd, xs1, rnum`
267/// Rust: `aes64ks1i(rd, rs1, rnum)`
268///
269/// # Arguments
270/// - `rd` — Destination register.
271/// - `rs1` — Source register.
272/// - `rnum` — Immediate encoding value.
273pub trait Aes64Ks1IEmitter<T0, T1, T2> {
274 fn aes64ks1i(&mut self, rd: T0, rs1: T1, rnum: T2);
275}
276
277/// RISC-V `aes64ks2` instruction.
278///
279/// # Forms
280/// Assembly: `aes64ks2 xd, xs1, xs2`
281/// Rust: `aes64ks2(rd, rs1, rs2)`
282///
283/// # Arguments
284/// - `rd` — Destination register.
285/// - `rs1` — Source register.
286/// - `rs2` — Source register.
287pub trait Aes64Ks2Emitter<T0, T1, T2> {
288 fn aes64ks2(&mut self, rd: T0, rs1: T1, rs2: T2);
289}
290
291/// RISC-V `amoadd.b` instruction.
292///
293/// # Forms
294/// Assembly: `amoadd.b xd, xs1, xs2, aq, rl`
295/// Rust: `amoadd_b(rd, rs1, rs2, aq, rl)`
296///
297/// # Arguments
298/// - `rd` — Destination register.
299/// - `rs1` — Memory base register.
300/// - `rs2` — Source register.
301/// - `aq` — Acquire-order bit.
302/// - `rl` — Release-order bit; retained for the existing emitter API.
303pub trait AmoaddBEmitter<T0, T1, T2, T3, T4> {
304 fn amoadd_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
305}
306
307/// Atomic fetch-and-add doubleword
308///
309/// Atomically:
310///
311/// * Load the doubleword at address _rs1_
312/// * Write the loaded value into _rd_
313/// * Add the value of register _rs2_ to the loaded value
314/// * Write the sum to the address in _rs1_
315///
316/// # Forms
317/// Assembly: `amoadd.d xd, xs2, (xs1)`
318/// Rust: `amoadd_d(rd, rs1, rs2, aq, rl)`
319///
320/// # Arguments
321/// - `rd` — Destination register.
322/// - `rs1` — Memory base register.
323/// - `rs2` — Source register.
324/// - `aq` — Acquire-order bit.
325/// - `rl` — Release-order bit; retained for the existing emitter API.
326pub trait AmoaddDEmitter<T0, T1, T2, T3, T4> {
327 fn amoadd_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
328}
329
330/// RISC-V `amoadd.h` instruction.
331///
332/// # Forms
333/// Assembly: `amoadd.h xd, xs1, xs2, aq, rl`
334/// Rust: `amoadd_h(rd, rs1, rs2, aq, rl)`
335///
336/// # Arguments
337/// - `rd` — Destination register.
338/// - `rs1` — Memory base register.
339/// - `rs2` — Source register.
340/// - `aq` — Acquire-order bit.
341/// - `rl` — Release-order bit; retained for the existing emitter API.
342pub trait AmoaddHEmitter<T0, T1, T2, T3, T4> {
343 fn amoadd_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
344}
345
346/// Atomic fetch-and-add word
347///
348/// Atomically:
349///
350/// * Load the word at address _rs1_
351/// * Write the sign-extended value into _rd_
352/// * Add the least-significant word of register _rs2_ to the loaded value
353/// * Write the sum to the address in _rs1_
354///
355/// # Forms
356/// Assembly: `amoadd.w xd, xs2, (xrs1)`
357/// Rust: `amoadd_w(rd, rs1, rs2, aq, rl)`
358///
359/// # Arguments
360/// - `rd` — Destination register.
361/// - `rs1` — Memory base register.
362/// - `rs2` — Source register.
363/// - `aq` — Acquire-order bit.
364/// - `rl` — Release-order bit; retained for the existing emitter API.
365pub trait AmoaddWEmitter<T0, T1, T2, T3, T4> {
366 fn amoadd_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
367}
368
369/// RISC-V `amoand.b` instruction.
370///
371/// # Forms
372/// Assembly: `amoand.b xd, xs1, xs2, aq, rl`
373/// Rust: `amoand_b(rd, rs1, rs2, aq, rl)`
374///
375/// # Arguments
376/// - `rd` — Destination register.
377/// - `rs1` — Memory base register.
378/// - `rs2` — Source register.
379/// - `aq` — Acquire-order bit.
380/// - `rl` — Release-order bit; retained for the existing emitter API.
381pub trait AmoandBEmitter<T0, T1, T2, T3, T4> {
382 fn amoand_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
383}
384
385/// Atomic fetch-and-and doubleword
386///
387/// Atomically:
388///
389/// * Load the doubleword at address _rs1_
390/// * Write the loaded value into _rd_
391/// * AND the value of register _rs2_ to the loaded value
392/// * Write the result to the address in _rs1_
393///
394/// # Forms
395/// Assembly: `amoand.d xd, xs2, (xrs1)`
396/// Rust: `amoand_d(rd, rs1, rs2, aq, rl)`
397///
398/// # Arguments
399/// - `rd` — Destination register.
400/// - `rs1` — Memory base register.
401/// - `rs2` — Source register.
402/// - `aq` — Acquire-order bit.
403/// - `rl` — Release-order bit; retained for the existing emitter API.
404pub trait AmoandDEmitter<T0, T1, T2, T3, T4> {
405 fn amoand_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
406}
407
408/// RISC-V `amoand.h` instruction.
409///
410/// # Forms
411/// Assembly: `amoand.h xd, xs1, xs2, aq, rl`
412/// Rust: `amoand_h(rd, rs1, rs2, aq, rl)`
413///
414/// # Arguments
415/// - `rd` — Destination register.
416/// - `rs1` — Memory base register.
417/// - `rs2` — Source register.
418/// - `aq` — Acquire-order bit.
419/// - `rl` — Release-order bit; retained for the existing emitter API.
420pub trait AmoandHEmitter<T0, T1, T2, T3, T4> {
421 fn amoand_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
422}
423
424/// Atomic fetch-and-and word
425///
426/// Atomically:
427///
428/// * Load the word at address _rs1_
429/// * Write the sign-extended value into _rd_
430/// * AND the least-significant word of register _rs2_ to the loaded value
431/// * Write the result to the address in _rs1_
432///
433/// # Forms
434/// Assembly: `amoand.w xd, xs2, (xrs1)`
435/// Rust: `amoand_w(rd, rs1, rs2, aq, rl)`
436///
437/// # Arguments
438/// - `rd` — Destination register.
439/// - `rs1` — Memory base register.
440/// - `rs2` — Source register.
441/// - `aq` — Acquire-order bit.
442/// - `rl` — Release-order bit; retained for the existing emitter API.
443pub trait AmoandWEmitter<T0, T1, T2, T3, T4> {
444 fn amoand_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
445}
446
447/// RISC-V `amocas.b` instruction.
448///
449/// # Forms
450/// Assembly: `amocas.b xd, xs1, xs2, aq, rl`
451/// Rust: `amocas_b(rd, rs1, rs2, aq, rl)`
452///
453/// # Arguments
454/// - `rd` — Destination register.
455/// - `rs1` — Memory base register.
456/// - `rs2` — Source register.
457/// - `aq` — Acquire-order bit.
458/// - `rl` — Release-order bit; retained for the existing emitter API.
459pub trait AmocasBEmitter<T0, T1, T2, T3, T4> {
460 fn amocas_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
461}
462
463/// RISC-V `amocas.d` instruction.
464///
465/// # Forms
466/// Assembly: `amocas.d xd, xs1, xs2, aq, rl`
467/// Rust: `amocas_d(rd, rs1, rs2, aq, rl)`
468///
469/// # Arguments
470/// - `rd` — Destination register.
471/// - `rs1` — Memory base register.
472/// - `rs2` — Source register.
473/// - `aq` — Acquire-order bit.
474/// - `rl` — Release-order bit; retained for the existing emitter API.
475pub trait AmocasDEmitter<T0, T1, T2, T3, T4> {
476 fn amocas_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
477}
478
479/// RISC-V `amocas.h` instruction.
480///
481/// # Forms
482/// Assembly: `amocas.h xd, xs1, xs2, aq, rl`
483/// Rust: `amocas_h(rd, rs1, rs2, aq, rl)`
484///
485/// # Arguments
486/// - `rd` — Destination register.
487/// - `rs1` — Memory base register.
488/// - `rs2` — Source register.
489/// - `aq` — Acquire-order bit.
490/// - `rl` — Release-order bit; retained for the existing emitter API.
491pub trait AmocasHEmitter<T0, T1, T2, T3, T4> {
492 fn amocas_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
493}
494
495/// RISC-V `amocas.q` instruction.
496///
497/// # Forms
498/// Assembly: `amocas.q xd, xs1, xs2, aq, rl`
499/// Rust: `amocas_q(rd, rs1, rs2, aq, rl)`
500///
501/// # Arguments
502/// - `rd` — Destination register.
503/// - `rs1` — Memory base register.
504/// - `rs2` — Source register.
505/// - `aq` — Acquire-order bit.
506/// - `rl` — Release-order bit; retained for the existing emitter API.
507pub trait AmocasQEmitter<T0, T1, T2, T3, T4> {
508 fn amocas_q(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
509}
510
511/// RISC-V `amocas.w` instruction.
512///
513/// # Forms
514/// Assembly: `amocas.w xd, xs1, xs2, aq, rl`
515/// Rust: `amocas_w(rd, rs1, rs2, aq, rl)`
516///
517/// # Arguments
518/// - `rd` — Destination register.
519/// - `rs1` — Memory base register.
520/// - `rs2` — Source register.
521/// - `aq` — Acquire-order bit.
522/// - `rl` — Release-order bit; retained for the existing emitter API.
523pub trait AmocasWEmitter<T0, T1, T2, T3, T4> {
524 fn amocas_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
525}
526
527/// RISC-V `amomax.b` instruction.
528///
529/// # Forms
530/// Assembly: `amomax.b xd, xs1, xs2, aq, rl`
531/// Rust: `amomax_b(rd, rs1, rs2, aq, rl)`
532///
533/// # Arguments
534/// - `rd` — Destination register.
535/// - `rs1` — Memory base register.
536/// - `rs2` — Source register.
537/// - `aq` — Acquire-order bit.
538/// - `rl` — Release-order bit; retained for the existing emitter API.
539pub trait AmomaxBEmitter<T0, T1, T2, T3, T4> {
540 fn amomax_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
541}
542
543/// Atomic MAX doubleword
544///
545/// Atomically:
546///
547/// * Load the doubleword at address _rs1_
548/// * Write the loaded value into _rd_
549/// * Signed compare the value of register _rs2_ to the loaded value, and select the maximum value
550/// * Write the maximum to the address in _rs1_
551///
552/// # Forms
553/// Assembly: `amomax.d xd, xs2, (xrs1)`
554/// Rust: `amomax_d(rd, rs1, rs2, aq, rl)`
555///
556/// # Arguments
557/// - `rd` — Destination register.
558/// - `rs1` — Memory base register.
559/// - `rs2` — Source register.
560/// - `aq` — Acquire-order bit.
561/// - `rl` — Release-order bit; retained for the existing emitter API.
562pub trait AmomaxDEmitter<T0, T1, T2, T3, T4> {
563 fn amomax_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
564}
565
566/// RISC-V `amomax.h` instruction.
567///
568/// # Forms
569/// Assembly: `amomax.h xd, xs1, xs2, aq, rl`
570/// Rust: `amomax_h(rd, rs1, rs2, aq, rl)`
571///
572/// # Arguments
573/// - `rd` — Destination register.
574/// - `rs1` — Memory base register.
575/// - `rs2` — Source register.
576/// - `aq` — Acquire-order bit.
577/// - `rl` — Release-order bit; retained for the existing emitter API.
578pub trait AmomaxHEmitter<T0, T1, T2, T3, T4> {
579 fn amomax_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
580}
581
582/// Atomic MAX word
583///
584/// Atomically:
585///
586/// * Load the word at address _rs1_
587/// * Write the sign-extended value into _rd_
588/// * Signed compare the least-significant word of register _rs2_ to the loaded value, and select the maximum value
589/// * Write the maximum to the address in _rs1_
590///
591/// # Forms
592/// Assembly: `amomax.w xd, xs2, (xrs1)`
593/// Rust: `amomax_w(rd, rs1, rs2, aq, rl)`
594///
595/// # Arguments
596/// - `rd` — Destination register.
597/// - `rs1` — Memory base register.
598/// - `rs2` — Source register.
599/// - `aq` — Acquire-order bit.
600/// - `rl` — Release-order bit; retained for the existing emitter API.
601pub trait AmomaxWEmitter<T0, T1, T2, T3, T4> {
602 fn amomax_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
603}
604
605/// RISC-V `amomaxu.b` instruction.
606///
607/// # Forms
608/// Assembly: `amomaxu.b xd, xs1, xs2, aq, rl`
609/// Rust: `amomaxu_b(rd, rs1, rs2, aq, rl)`
610///
611/// # Arguments
612/// - `rd` — Destination register.
613/// - `rs1` — Memory base register.
614/// - `rs2` — Source register.
615/// - `aq` — Acquire-order bit.
616/// - `rl` — Release-order bit; retained for the existing emitter API.
617pub trait AmomaxuBEmitter<T0, T1, T2, T3, T4> {
618 fn amomaxu_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
619}
620
621/// Atomic MAX unsigned doubleword
622///
623/// Atomically:
624///
625/// * Load the doubleword at address _rs1_
626/// * Write the loaded value into _rd_
627/// * Unsigned compare the value of register _rs2_ to the loaded value, and select the maximum value
628/// * Write the maximum to the address in _rs1_
629///
630/// # Forms
631/// Assembly: `amomaxu.d xd, xs2, (xrs1)`
632/// Rust: `amomaxu_d(rd, rs1, rs2, aq, rl)`
633///
634/// # Arguments
635/// - `rd` — Destination register.
636/// - `rs1` — Memory base register.
637/// - `rs2` — Source register.
638/// - `aq` — Acquire-order bit.
639/// - `rl` — Release-order bit; retained for the existing emitter API.
640pub trait AmomaxuDEmitter<T0, T1, T2, T3, T4> {
641 fn amomaxu_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
642}
643
644/// RISC-V `amomaxu.h` instruction.
645///
646/// # Forms
647/// Assembly: `amomaxu.h xd, xs1, xs2, aq, rl`
648/// Rust: `amomaxu_h(rd, rs1, rs2, aq, rl)`
649///
650/// # Arguments
651/// - `rd` — Destination register.
652/// - `rs1` — Memory base register.
653/// - `rs2` — Source register.
654/// - `aq` — Acquire-order bit.
655/// - `rl` — Release-order bit; retained for the existing emitter API.
656pub trait AmomaxuHEmitter<T0, T1, T2, T3, T4> {
657 fn amomaxu_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
658}
659
660/// Atomic MAX unsigned word
661///
662/// Atomically:
663///
664/// * Load the word at address _rs1_
665/// * Write the sign-extended value into _rd_
666/// * Unsigned compare the least-significant word of register _rs2_ to the loaded value, and select the maximum value
667/// * Write the maximum to the address in _rs1_
668///
669/// # Forms
670/// Assembly: `amomaxu.w xd, xs2, (xrs1)`
671/// Rust: `amomaxu_w(rd, rs1, rs2, aq, rl)`
672///
673/// # Arguments
674/// - `rd` — Destination register.
675/// - `rs1` — Memory base register.
676/// - `rs2` — Source register.
677/// - `aq` — Acquire-order bit.
678/// - `rl` — Release-order bit; retained for the existing emitter API.
679pub trait AmomaxuWEmitter<T0, T1, T2, T3, T4> {
680 fn amomaxu_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
681}
682
683/// RISC-V `amomin.b` instruction.
684///
685/// # Forms
686/// Assembly: `amomin.b xd, xs1, xs2, aq, rl`
687/// Rust: `amomin_b(rd, rs1, rs2, aq, rl)`
688///
689/// # Arguments
690/// - `rd` — Destination register.
691/// - `rs1` — Memory base register.
692/// - `rs2` — Source register.
693/// - `aq` — Acquire-order bit.
694/// - `rl` — Release-order bit; retained for the existing emitter API.
695pub trait AmominBEmitter<T0, T1, T2, T3, T4> {
696 fn amomin_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
697}
698
699/// Atomic MIN doubleword
700///
701/// Atomically:
702///
703/// * Load the doubleword at address _rs1_
704/// * Write the loaded value into _rd_
705/// * Signed compare the value of register _rs2_ to the loaded value, and select the minimum value
706/// * Write the minimum to the address in _rs1_
707///
708/// # Forms
709/// Assembly: `amomin.d xd, xs2, (xrs1)`
710/// Rust: `amomin_d(rd, rs1, rs2, aq, rl)`
711///
712/// # Arguments
713/// - `rd` — Destination register.
714/// - `rs1` — Memory base register.
715/// - `rs2` — Source register.
716/// - `aq` — Acquire-order bit.
717/// - `rl` — Release-order bit; retained for the existing emitter API.
718pub trait AmominDEmitter<T0, T1, T2, T3, T4> {
719 fn amomin_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
720}
721
722/// RISC-V `amomin.h` instruction.
723///
724/// # Forms
725/// Assembly: `amomin.h xd, xs1, xs2, aq, rl`
726/// Rust: `amomin_h(rd, rs1, rs2, aq, rl)`
727///
728/// # Arguments
729/// - `rd` — Destination register.
730/// - `rs1` — Memory base register.
731/// - `rs2` — Source register.
732/// - `aq` — Acquire-order bit.
733/// - `rl` — Release-order bit; retained for the existing emitter API.
734pub trait AmominHEmitter<T0, T1, T2, T3, T4> {
735 fn amomin_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
736}
737
738/// Atomic MIN word
739///
740/// Atomically:
741///
742/// * Load the word at address _rs1_
743/// * Write the sign-extended value into _rd_
744/// * Signed compare the least-significant word of register _rs2_ to the loaded value, and select the minimum value
745/// * Write the result to the address in _rs1_
746///
747/// # Forms
748/// Assembly: `amomin.w xd, xs2, (xrs1)`
749/// Rust: `amomin_w(rd, rs1, rs2, aq, rl)`
750///
751/// # Arguments
752/// - `rd` — Destination register.
753/// - `rs1` — Memory base register.
754/// - `rs2` — Source register.
755/// - `aq` — Acquire-order bit.
756/// - `rl` — Release-order bit; retained for the existing emitter API.
757pub trait AmominWEmitter<T0, T1, T2, T3, T4> {
758 fn amomin_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
759}
760
761/// RISC-V `amominu.b` instruction.
762///
763/// # Forms
764/// Assembly: `amominu.b xd, xs1, xs2, aq, rl`
765/// Rust: `amominu_b(rd, rs1, rs2, aq, rl)`
766///
767/// # Arguments
768/// - `rd` — Destination register.
769/// - `rs1` — Memory base register.
770/// - `rs2` — Source register.
771/// - `aq` — Acquire-order bit.
772/// - `rl` — Release-order bit; retained for the existing emitter API.
773pub trait AmominuBEmitter<T0, T1, T2, T3, T4> {
774 fn amominu_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
775}
776
777/// Atomic MIN unsigned doubleword
778///
779/// Atomically:
780///
781/// * Load the doubleword at address _rs1_
782/// * Write the loaded value into _rd_
783/// * Unsigned compare the value of register _rs2_ to the loaded value, and select the minimum value
784/// * Write the minimum to the address in _rs1_
785///
786/// # Forms
787/// Assembly: `amominu.d xd, xs2, (xrs1)`
788/// Rust: `amominu_d(rd, rs1, rs2, aq, rl)`
789///
790/// # Arguments
791/// - `rd` — Destination register.
792/// - `rs1` — Memory base register.
793/// - `rs2` — Source register.
794/// - `aq` — Acquire-order bit.
795/// - `rl` — Release-order bit; retained for the existing emitter API.
796pub trait AmominuDEmitter<T0, T1, T2, T3, T4> {
797 fn amominu_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
798}
799
800/// RISC-V `amominu.h` instruction.
801///
802/// # Forms
803/// Assembly: `amominu.h xd, xs1, xs2, aq, rl`
804/// Rust: `amominu_h(rd, rs1, rs2, aq, rl)`
805///
806/// # Arguments
807/// - `rd` — Destination register.
808/// - `rs1` — Memory base register.
809/// - `rs2` — Source register.
810/// - `aq` — Acquire-order bit.
811/// - `rl` — Release-order bit; retained for the existing emitter API.
812pub trait AmominuHEmitter<T0, T1, T2, T3, T4> {
813 fn amominu_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
814}
815
816/// Atomic MIN unsigned word
817///
818/// Atomically:
819///
820/// * Load the word at address _rs1_
821/// * Write the sign-extended value into _rd_
822/// * Unsigned compare the least-significant word of register _rs2_ to the loaded word, and select the minimum value
823/// * Write the result to the address in _rs1_
824///
825/// # Forms
826/// Assembly: `amominu.w xd, xs2, (xrs1)`
827/// Rust: `amominu_w(rd, rs1, rs2, aq, rl)`
828///
829/// # Arguments
830/// - `rd` — Destination register.
831/// - `rs1` — Memory base register.
832/// - `rs2` — Source register.
833/// - `aq` — Acquire-order bit.
834/// - `rl` — Release-order bit; retained for the existing emitter API.
835pub trait AmominuWEmitter<T0, T1, T2, T3, T4> {
836 fn amominu_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
837}
838
839/// RISC-V `amoor.b` instruction.
840///
841/// # Forms
842/// Assembly: `amoor.b xd, xs1, xs2, aq, rl`
843/// Rust: `amoor_b(rd, rs1, rs2, aq, rl)`
844///
845/// # Arguments
846/// - `rd` — Destination register.
847/// - `rs1` — Memory base register.
848/// - `rs2` — Source register.
849/// - `aq` — Acquire-order bit.
850/// - `rl` — Release-order bit; retained for the existing emitter API.
851pub trait AmoorBEmitter<T0, T1, T2, T3, T4> {
852 fn amoor_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
853}
854
855/// Atomic fetch-and-or doubleword
856///
857/// Atomically:
858///
859/// * Load the doubleword at address _rs1_
860/// * Write the loaded value into _rd_
861/// * OR the value of register _rs2_ to the loaded value
862/// * Write the result to the address in _rs1_
863///
864/// # Forms
865/// Assembly: `amoor.d xd, xs2, (xrs1)`
866/// Rust: `amoor_d(rd, rs1, rs2, aq, rl)`
867///
868/// # Arguments
869/// - `rd` — Destination register.
870/// - `rs1` — Memory base register.
871/// - `rs2` — Source register.
872/// - `aq` — Acquire-order bit.
873/// - `rl` — Release-order bit; retained for the existing emitter API.
874pub trait AmoorDEmitter<T0, T1, T2, T3, T4> {
875 fn amoor_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
876}
877
878/// RISC-V `amoor.h` instruction.
879///
880/// # Forms
881/// Assembly: `amoor.h xd, xs1, xs2, aq, rl`
882/// Rust: `amoor_h(rd, rs1, rs2, aq, rl)`
883///
884/// # Arguments
885/// - `rd` — Destination register.
886/// - `rs1` — Memory base register.
887/// - `rs2` — Source register.
888/// - `aq` — Acquire-order bit.
889/// - `rl` — Release-order bit; retained for the existing emitter API.
890pub trait AmoorHEmitter<T0, T1, T2, T3, T4> {
891 fn amoor_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
892}
893
894/// Atomic fetch-and-or word
895///
896/// Atomically:
897///
898/// * Load the word at address _rs1_
899/// * Write the sign-extended value into _rd_
900/// * OR the least-significant word of register _rs2_ to the loaded value
901/// * Write the result to the address in _rs1_
902///
903/// # Forms
904/// Assembly: `amoor.w xd, xs2, (xrs1)`
905/// Rust: `amoor_w(rd, rs1, rs2, aq, rl)`
906///
907/// # Arguments
908/// - `rd` — Destination register.
909/// - `rs1` — Memory base register.
910/// - `rs2` — Source register.
911/// - `aq` — Acquire-order bit.
912/// - `rl` — Release-order bit; retained for the existing emitter API.
913pub trait AmoorWEmitter<T0, T1, T2, T3, T4> {
914 fn amoor_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
915}
916
917/// RISC-V `amoswap.b` instruction.
918///
919/// # Forms
920/// Assembly: `amoswap.b xd, xs1, xs2, aq, rl`
921/// Rust: `amoswap_b(rd, rs1, rs2, aq, rl)`
922///
923/// # Arguments
924/// - `rd` — Destination register.
925/// - `rs1` — Memory base register.
926/// - `rs2` — Source register.
927/// - `aq` — Acquire-order bit.
928/// - `rl` — Release-order bit; retained for the existing emitter API.
929pub trait AmoswapBEmitter<T0, T1, T2, T3, T4> {
930 fn amoswap_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
931}
932
933/// Atomic SWAP doubleword
934///
935/// Atomically:
936///
937/// * Load the doubleword at address _rs1_
938/// * Write the value into _rd_
939/// * Store the value of register _rs2_ to the address in _rs1_
940///
941/// # Forms
942/// Assembly: `amoswap.d xd, xs2, (xrs1)`
943/// Rust: `amoswap_d(rd, rs1, rs2, aq, rl)`
944///
945/// # Arguments
946/// - `rd` — Destination register.
947/// - `rs1` — Memory base register.
948/// - `rs2` — Source register.
949/// - `aq` — Acquire-order bit.
950/// - `rl` — Release-order bit; retained for the existing emitter API.
951pub trait AmoswapDEmitter<T0, T1, T2, T3, T4> {
952 fn amoswap_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
953}
954
955/// RISC-V `amoswap.h` instruction.
956///
957/// # Forms
958/// Assembly: `amoswap.h xd, xs1, xs2, aq, rl`
959/// Rust: `amoswap_h(rd, rs1, rs2, aq, rl)`
960///
961/// # Arguments
962/// - `rd` — Destination register.
963/// - `rs1` — Memory base register.
964/// - `rs2` — Source register.
965/// - `aq` — Acquire-order bit.
966/// - `rl` — Release-order bit; retained for the existing emitter API.
967pub trait AmoswapHEmitter<T0, T1, T2, T3, T4> {
968 fn amoswap_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
969}
970
971/// Atomic SWAP word
972///
973/// Atomically:
974///
975/// * Load the word at address _rs1_
976/// * Write the sign-extended value into _rd_
977/// * Store the least-significant word of register _rs2_ to the address in _rs1_
978///
979/// # Forms
980/// Assembly: `amoswap.w xd, xs2, (xrs1)`
981/// Rust: `amoswap_w(rd, rs1, rs2, aq, rl)`
982///
983/// # Arguments
984/// - `rd` — Destination register.
985/// - `rs1` — Memory base register.
986/// - `rs2` — Source register.
987/// - `aq` — Acquire-order bit.
988/// - `rl` — Release-order bit; retained for the existing emitter API.
989pub trait AmoswapWEmitter<T0, T1, T2, T3, T4> {
990 fn amoswap_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
991}
992
993/// RISC-V `amoxor.b` instruction.
994///
995/// # Forms
996/// Assembly: `amoxor.b xd, xs1, xs2, aq, rl`
997/// Rust: `amoxor_b(rd, rs1, rs2, aq, rl)`
998///
999/// # Arguments
1000/// - `rd` — Destination register.
1001/// - `rs1` — Memory base register.
1002/// - `rs2` — Source register.
1003/// - `aq` — Acquire-order bit.
1004/// - `rl` — Release-order bit; retained for the existing emitter API.
1005pub trait AmoxorBEmitter<T0, T1, T2, T3, T4> {
1006 fn amoxor_b(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
1007}
1008
1009/// Atomic fetch-and-xor doubleword
1010///
1011/// Atomically:
1012///
1013/// * Load the doubleword at address _rs1_
1014/// * Write the loaded value into _rd_
1015/// * XOR the value of register _rs2_ to the loaded value
1016/// * Write the result to the address in _rs1_
1017///
1018/// # Forms
1019/// Assembly: `amoxor.d xd, xs2, (xrs1)`
1020/// Rust: `amoxor_d(rd, rs1, rs2, aq, rl)`
1021///
1022/// # Arguments
1023/// - `rd` — Destination register.
1024/// - `rs1` — Memory base register.
1025/// - `rs2` — Source register.
1026/// - `aq` — Acquire-order bit.
1027/// - `rl` — Release-order bit; retained for the existing emitter API.
1028pub trait AmoxorDEmitter<T0, T1, T2, T3, T4> {
1029 fn amoxor_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
1030}
1031
1032/// RISC-V `amoxor.h` instruction.
1033///
1034/// # Forms
1035/// Assembly: `amoxor.h xd, xs1, xs2, aq, rl`
1036/// Rust: `amoxor_h(rd, rs1, rs2, aq, rl)`
1037///
1038/// # Arguments
1039/// - `rd` — Destination register.
1040/// - `rs1` — Memory base register.
1041/// - `rs2` — Source register.
1042/// - `aq` — Acquire-order bit.
1043/// - `rl` — Release-order bit; retained for the existing emitter API.
1044pub trait AmoxorHEmitter<T0, T1, T2, T3, T4> {
1045 fn amoxor_h(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
1046}
1047
1048/// Atomic fetch-and-xor word
1049///
1050/// Atomically:
1051///
1052/// * Load the word at address _rs1_
1053/// * Write the sign-extended value into _rd_
1054/// * XOR the least-significant word of register _rs2_ to the loaded value
1055/// * Write the result to the address in _rs1_
1056///
1057/// # Forms
1058/// Assembly: `amoxor.w xd, xs2, (xrs1)`
1059/// Rust: `amoxor_w(rd, rs1, rs2, aq, rl)`
1060///
1061/// # Arguments
1062/// - `rd` — Destination register.
1063/// - `rs1` — Memory base register.
1064/// - `rs2` — Source register.
1065/// - `aq` — Acquire-order bit.
1066/// - `rl` — Release-order bit; retained for the existing emitter API.
1067pub trait AmoxorWEmitter<T0, T1, T2, T3, T4> {
1068 fn amoxor_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
1069}
1070
1071/// And
1072///
1073/// And rs1 with rs2, and store the result in rd
1074///
1075/// # Forms
1076/// Assembly: `and xd, xs1, xs2`
1077/// Rust: `and(rd, rs1, rs2)`
1078///
1079/// # Arguments
1080/// - `rd` — Destination register.
1081/// - `rs1` — Source register.
1082/// - `rs2` — Source register.
1083pub trait AndEmitter<T0, T1, T2> {
1084 fn and(&mut self, rd: T0, rs1: T1, rs2: T2);
1085}
1086
1087/// And immediate
1088///
1089/// And an immediate to the value in rs1, and store the result in rd
1090///
1091/// # Forms
1092/// Assembly: `andi xd, xs1, imm`
1093/// Rust: `andi(rd, rs1, imm)`
1094///
1095/// # Arguments
1096/// - `rd` — Destination register.
1097/// - `rs1` — Source register.
1098/// - `imm` — Immediate encoding value.
1099pub trait AndiEmitter<T0, T1, T2> {
1100 fn andi(&mut self, rd: T0, rs1: T1, imm: T2);
1101}
1102
1103/// AND with inverted operand
1104///
1105/// This instruction performs the bitwise logical AND operation between `rs1` and the
1106/// bitwise inversion of `rs2`.
1107///
1108/// # Forms
1109/// Assembly: `andn xd, xs1, xs2`
1110/// Rust: `andn(rd, rs1, rs2)`
1111///
1112/// # Arguments
1113/// - `rd` — Destination register.
1114/// - `rs1` — Source register.
1115/// - `rs2` — Source register.
1116pub trait AndnEmitter<T0, T1, T2> {
1117 fn andn(&mut self, rd: T0, rs1: T1, rs2: T2);
1118}
1119
1120/// Add upper immediate to pc
1121///
1122/// Add an immediate to the current PC.
1123///
1124/// # Forms
1125/// Assembly: `auipc xd, imm`
1126/// Rust: `auipc(rd, imm)`
1127///
1128/// # Arguments
1129/// - `rd` — Destination register.
1130/// - `imm` — Immediate encoding value.
1131pub trait AuipcEmitter<T0, T1> {
1132 fn auipc(&mut self, rd: T0, imm: T1);
1133}
1134
1135/// Single-Bit clear (Register)
1136///
1137/// This instruction returns rs1 with a single bit cleared at the index specified in rs2.
1138/// The index is read from the lower log2(XLEN) bits of rs2.
1139///
1140/// # Forms
1141/// Assembly: `bclr xd, xs1, xs2`
1142/// Rust: `bclr(rd, rs1, rs2)`
1143///
1144/// # Arguments
1145/// - `rd` — Destination register.
1146/// - `rs1` — Source register.
1147/// - `rs2` — Source register.
1148pub trait BclrEmitter<T0, T1, T2> {
1149 fn bclr(&mut self, rd: T0, rs1: T1, rs2: T2);
1150}
1151
1152/// Single-Bit clear (Immediate)
1153///
1154/// This instruction returns rs1 with a single bit cleared at the index specified in shamt. The
1155/// index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings corresponding
1156/// to shamt\[5\]=1 are reserved.
1157///
1158/// # Forms
1159/// Assembly: `bclri xd, xs1, shamt`
1160/// Rust: `bclri(rd, rs1, shamtd)`
1161///
1162/// # Arguments
1163/// - `rd` — Destination register.
1164/// - `rs1` — Source register.
1165/// - `shamtd` — Immediate encoding value.
1166pub trait BclriEmitter<T0, T1, T2> {
1167 fn bclri(&mut self, rd: T0, rs1: T1, shamtd: T2);
1168}
1169
1170/// Single-Bit clear (Immediate)
1171///
1172/// This instruction returns rs1 with a single bit cleared at the index specified in shamt. The
1173/// index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings corresponding
1174/// to shamt\[5\]=1 are reserved.
1175///
1176/// # Forms
1177/// Assembly: `bclri.rv32 xd, xs1, shamt`
1178/// Rust: `bclri_rv32(rd, rs1, shamtw)`
1179///
1180/// # Arguments
1181/// - `rd` — Destination register.
1182/// - `rs1` — Source register.
1183/// - `shamtw` — Immediate encoding value.
1184pub trait BclriRv32Emitter<T0, T1, T2> {
1185 fn bclri_rv32(&mut self, rd: T0, rs1: T1, shamtw: T2);
1186}
1187
1188/// Branch if equal
1189///
1190/// Branch to PC + imm if
1191/// the value in register rs1 is equal to the value in register rs2.
1192///
1193/// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
1194///
1195/// # Forms
1196/// Assembly: `beq xs1, xs2, imm`
1197/// Rust: `beq(rs1, rs2, imm)`
1198///
1199/// # Arguments
1200/// - `rs1` — Source register.
1201/// - `rs2` — Source register.
1202/// - `imm` — Immediate encoding value.
1203pub trait BeqEmitter<T0, T1, T2> {
1204 fn beq(&mut self, rs1: T0, rs2: T1, imm: T2);
1205}
1206
1207/// RISC-V `beqz` instruction.
1208///
1209/// # Forms
1210/// Assembly: `beqz rs1 bimm12lohi`
1211/// Rust: `beqz(rs1, imm)`
1212///
1213/// # Arguments
1214/// - `rs1` — Source register.
1215/// - `imm` — Immediate encoding value.
1216pub trait BeqzEmitter<T0, T1> {
1217 fn beqz(&mut self, rs1: T0, imm: T1);
1218}
1219
1220/// Single-Bit extract (Register)
1221///
1222/// This instruction returns a single bit extracted from rs1 at the index specified in rs2.
1223/// The index is read from the lower log2(XLEN) bits of rs2.
1224///
1225/// # Forms
1226/// Assembly: `bext xd, xs1, xs2`
1227/// Rust: `bext(rd, rs1, rs2)`
1228///
1229/// # Arguments
1230/// - `rd` — Destination register.
1231/// - `rs1` — Source register.
1232/// - `rs2` — Source register.
1233pub trait BextEmitter<T0, T1, T2> {
1234 fn bext(&mut self, rd: T0, rs1: T1, rs2: T2);
1235}
1236
1237/// Single-Bit extract (Immediate)
1238///
1239/// This instruction returns a single bit extracted from rs1 at the index specified in rs2.
1240/// The index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings
1241/// corresponding to shamt\[5\]=1 are reserved.
1242///
1243/// # Forms
1244/// Assembly: `bexti xd, xs1, shamt`
1245/// Rust: `bexti(rd, rs1, shamtd)`
1246///
1247/// # Arguments
1248/// - `rd` — Destination register.
1249/// - `rs1` — Source register.
1250/// - `shamtd` — Immediate encoding value.
1251pub trait BextiEmitter<T0, T1, T2> {
1252 fn bexti(&mut self, rd: T0, rs1: T1, shamtd: T2);
1253}
1254
1255/// Single-Bit extract (Immediate)
1256///
1257/// This instruction returns a single bit extracted from rs1 at the index specified in rs2.
1258/// The index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings
1259/// corresponding to shamt\[5\]=1 are reserved.
1260///
1261/// # Forms
1262/// Assembly: `bexti.rv32 xd, xs1, shamt`
1263/// Rust: `bexti_rv32(rd, rs1, shamtw)`
1264///
1265/// # Arguments
1266/// - `rd` — Destination register.
1267/// - `rs1` — Source register.
1268/// - `shamtw` — Immediate encoding value.
1269pub trait BextiRv32Emitter<T0, T1, T2> {
1270 fn bexti_rv32(&mut self, rd: T0, rs1: T1, shamtw: T2);
1271}
1272
1273/// Branch if greater than or equal
1274///
1275/// Branch to PC + imm if
1276/// the signed value in register rs1 is greater than or equal to the signed value in register rs2.
1277///
1278/// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
1279///
1280/// # Forms
1281/// Assembly: `bge xs1, xs2, imm`
1282/// Rust: `bge(rs1, rs2, imm)`
1283///
1284/// # Arguments
1285/// - `rs1` — Source register.
1286/// - `rs2` — Source register.
1287/// - `imm` — Immediate encoding value.
1288pub trait BgeEmitter<T0, T1, T2> {
1289 fn bge(&mut self, rs1: T0, rs2: T1, imm: T2);
1290}
1291
1292/// Branch if greater than or equal unsigned
1293///
1294/// Branch to PC + imm if
1295/// the unsigned value in register rs1 is greater than or equal to the unsigned value in register rs2.
1296///
1297/// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
1298///
1299/// # Forms
1300/// Assembly: `bgeu xs1, xs2, imm`
1301/// Rust: `bgeu(rs1, rs2, imm)`
1302///
1303/// # Arguments
1304/// - `rs1` — Source register.
1305/// - `rs2` — Source register.
1306/// - `imm` — Immediate encoding value.
1307pub trait BgeuEmitter<T0, T1, T2> {
1308 fn bgeu(&mut self, rs1: T0, rs2: T1, imm: T2);
1309}
1310
1311/// RISC-V `bgez` instruction.
1312///
1313/// # Forms
1314/// Assembly: `bgez rs1 bimm12lohi`
1315/// Rust: `bgez(rs1, imm)`
1316///
1317/// # Arguments
1318/// - `rs1` — Source register.
1319/// - `imm` — Immediate encoding value.
1320pub trait BgezEmitter<T0, T1> {
1321 fn bgez(&mut self, rs1: T0, imm: T1);
1322}
1323
1324/// RISC-V `bgt` instruction.
1325///
1326/// # Forms
1327/// Assembly: `bgt rs1 rs2 bimm12lohi`
1328/// Rust: `bgt(rs1, rs2, imm)`
1329///
1330/// # Arguments
1331/// - `rs1` — Source register.
1332/// - `rs2` — Source register.
1333/// - `imm` — Immediate encoding value.
1334pub trait BgtEmitter<T0, T1, T2> {
1335 fn bgt(&mut self, rs1: T0, rs2: T1, imm: T2);
1336}
1337
1338/// RISC-V `bgtu` instruction.
1339///
1340/// # Forms
1341/// Assembly: `bgtu rs1 rs2 bimm12lohi`
1342/// Rust: `bgtu(rs1, rs2, imm)`
1343///
1344/// # Arguments
1345/// - `rs1` — Source register.
1346/// - `rs2` — Source register.
1347/// - `imm` — Immediate encoding value.
1348pub trait BgtuEmitter<T0, T1, T2> {
1349 fn bgtu(&mut self, rs1: T0, rs2: T1, imm: T2);
1350}
1351
1352/// RISC-V `bgtz` instruction.
1353///
1354/// # Forms
1355/// Assembly: `bgtz rs2 bimm12lohi`
1356/// Rust: `bgtz(rs2, imm)`
1357///
1358/// # Arguments
1359/// - `rs2` — Source register.
1360/// - `imm` — Immediate encoding value.
1361pub trait BgtzEmitter<T0, T1> {
1362 fn bgtz(&mut self, rs2: T0, imm: T1);
1363}
1364
1365/// Single-Bit invert (Register)
1366///
1367/// This instruction returns rs1 with a single bit inverted at the index specified in rs2.
1368/// The index is read from the lower log2(XLEN) bits of rs2.
1369///
1370/// # Forms
1371/// Assembly: `binv xd, xs1, xs2`
1372/// Rust: `binv(rd, rs1, rs2)`
1373///
1374/// # Arguments
1375/// - `rd` — Destination register.
1376/// - `rs1` — Source register.
1377/// - `rs2` — Source register.
1378pub trait BinvEmitter<T0, T1, T2> {
1379 fn binv(&mut self, rd: T0, rs1: T1, rs2: T2);
1380}
1381
1382/// Single-Bit invert (Immediate)
1383///
1384/// This instruction returns rs1 with a single bit inverted at the index specified in shamt.
1385/// The index is read from the lower log2(XLEN) bits of shamt.
1386/// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
1387///
1388/// # Forms
1389/// Assembly: `binvi xd, xs1, shamt`
1390/// Rust: `binvi(rd, rs1, shamtd)`
1391///
1392/// # Arguments
1393/// - `rd` — Destination register.
1394/// - `rs1` — Source register.
1395/// - `shamtd` — Immediate encoding value.
1396pub trait BinviEmitter<T0, T1, T2> {
1397 fn binvi(&mut self, rd: T0, rs1: T1, shamtd: T2);
1398}
1399
1400/// Single-Bit invert (Immediate)
1401///
1402/// This instruction returns rs1 with a single bit inverted at the index specified in shamt.
1403/// The index is read from the lower log2(XLEN) bits of shamt.
1404/// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
1405///
1406/// # Forms
1407/// Assembly: `binvi.rv32 xd, xs1, shamt`
1408/// Rust: `binvi_rv32(rd, rs1, shamtw)`
1409///
1410/// # Arguments
1411/// - `rd` — Destination register.
1412/// - `rs1` — Source register.
1413/// - `shamtw` — Immediate encoding value.
1414pub trait BinviRv32Emitter<T0, T1, T2> {
1415 fn binvi_rv32(&mut self, rd: T0, rs1: T1, shamtw: T2);
1416}
1417
1418/// RISC-V `ble` instruction.
1419///
1420/// # Forms
1421/// Assembly: `ble rs1 rs2 bimm12lohi`
1422/// Rust: `ble(rs1, rs2, imm)`
1423///
1424/// # Arguments
1425/// - `rs1` — Source register.
1426/// - `rs2` — Source register.
1427/// - `imm` — Immediate encoding value.
1428pub trait BleEmitter<T0, T1, T2> {
1429 fn ble(&mut self, rs1: T0, rs2: T1, imm: T2);
1430}
1431
1432/// RISC-V `bleu` instruction.
1433///
1434/// # Forms
1435/// Assembly: `bleu rs1 rs2 bimm12lohi`
1436/// Rust: `bleu(rs1, rs2, imm)`
1437///
1438/// # Arguments
1439/// - `rs1` — Source register.
1440/// - `rs2` — Source register.
1441/// - `imm` — Immediate encoding value.
1442pub trait BleuEmitter<T0, T1, T2> {
1443 fn bleu(&mut self, rs1: T0, rs2: T1, imm: T2);
1444}
1445
1446/// RISC-V `blez` instruction.
1447///
1448/// # Forms
1449/// Assembly: `blez rs2 bimm12lohi`
1450/// Rust: `blez(rs2, imm)`
1451///
1452/// # Arguments
1453/// - `rs2` — Source register.
1454/// - `imm` — Immediate encoding value.
1455pub trait BlezEmitter<T0, T1> {
1456 fn blez(&mut self, rs2: T0, imm: T1);
1457}
1458
1459/// Branch if less than
1460///
1461/// Branch to PC + imm if
1462/// the signed value in register rs1 is less than the signed value in register rs2.
1463///
1464/// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
1465///
1466/// # Forms
1467/// Assembly: `blt xs1, xs2, imm`
1468/// Rust: `blt(rs1, rs2, imm)`
1469///
1470/// # Arguments
1471/// - `rs1` — Source register.
1472/// - `rs2` — Source register.
1473/// - `imm` — Immediate encoding value.
1474pub trait BltEmitter<T0, T1, T2> {
1475 fn blt(&mut self, rs1: T0, rs2: T1, imm: T2);
1476}
1477
1478/// Branch if less than unsigned
1479///
1480/// Branch to PC + imm if
1481/// the unsigned value in register rs1 is less than the unsigned value in register rs2.
1482///
1483/// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
1484///
1485/// # Forms
1486/// Assembly: `bltu xs1, xs2, imm`
1487/// Rust: `bltu(rs1, rs2, imm)`
1488///
1489/// # Arguments
1490/// - `rs1` — Source register.
1491/// - `rs2` — Source register.
1492/// - `imm` — Immediate encoding value.
1493pub trait BltuEmitter<T0, T1, T2> {
1494 fn bltu(&mut self, rs1: T0, rs2: T1, imm: T2);
1495}
1496
1497/// RISC-V `bltz` instruction.
1498///
1499/// # Forms
1500/// Assembly: `bltz rs1 bimm12lohi`
1501/// Rust: `bltz(rs1, imm)`
1502///
1503/// # Arguments
1504/// - `rs1` — Source register.
1505/// - `imm` — Immediate encoding value.
1506pub trait BltzEmitter<T0, T1> {
1507 fn bltz(&mut self, rs1: T0, imm: T1);
1508}
1509
1510/// Branch if not equal
1511///
1512/// Branch to PC + imm if
1513/// the value in register rs1 is not equal to the value in register rs2.
1514///
1515/// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
1516///
1517/// # Forms
1518/// Assembly: `bne xs1, xs2, imm`
1519/// Rust: `bne(rs1, rs2, imm)`
1520///
1521/// # Arguments
1522/// - `rs1` — Source register.
1523/// - `rs2` — Source register.
1524/// - `imm` — Immediate encoding value.
1525pub trait BneEmitter<T0, T1, T2> {
1526 fn bne(&mut self, rs1: T0, rs2: T1, imm: T2);
1527}
1528
1529/// RISC-V `bnez` instruction.
1530///
1531/// # Forms
1532/// Assembly: `bnez rs1 bimm12lohi`
1533/// Rust: `bnez(rs1, imm)`
1534///
1535/// # Arguments
1536/// - `rs1` — Source register.
1537/// - `imm` — Immediate encoding value.
1538pub trait BnezEmitter<T0, T1> {
1539 fn bnez(&mut self, rs1: T0, imm: T1);
1540}
1541
1542/// Reverse bits in bytes
1543///
1544/// This instruction reverses the order of the bits in every byte of a register.
1545///
1546/// # Forms
1547/// Assembly: `brev8 xd, xs1`
1548/// Rust: `brev8(rd, rs1)`
1549///
1550/// # Arguments
1551/// - `rd` — Destination register.
1552/// - `rs1` — Source register.
1553pub trait Brev8Emitter<T0, T1> {
1554 fn brev8(&mut self, rd: T0, rs1: T1);
1555}
1556
1557/// Single-Bit set (Register)
1558///
1559/// This instruction returns rs1 with a single bit set at the index specified in rs2.
1560/// The index is read from the lower log2(XLEN) bits of rs2.
1561///
1562/// # Forms
1563/// Assembly: `bset xd, xs1, xs2`
1564/// Rust: `bset(rd, rs1, rs2)`
1565///
1566/// # Arguments
1567/// - `rd` — Destination register.
1568/// - `rs1` — Source register.
1569/// - `rs2` — Source register.
1570pub trait BsetEmitter<T0, T1, T2> {
1571 fn bset(&mut self, rd: T0, rs1: T1, rs2: T2);
1572}
1573
1574/// Single-Bit set (Immediate)
1575///
1576/// This instruction returns rs1 with a single bit set at the index specified in shamt.
1577/// The index is read from the lower log2(XLEN) bits of shamt.
1578/// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
1579///
1580/// # Forms
1581/// Assembly: `bseti xd, xs1, shamt`
1582/// Rust: `bseti(rd, rs1, shamtd)`
1583///
1584/// # Arguments
1585/// - `rd` — Destination register.
1586/// - `rs1` — Source register.
1587/// - `shamtd` — Immediate encoding value.
1588pub trait BsetiEmitter<T0, T1, T2> {
1589 fn bseti(&mut self, rd: T0, rs1: T1, shamtd: T2);
1590}
1591
1592/// Single-Bit set (Immediate)
1593///
1594/// This instruction returns rs1 with a single bit set at the index specified in shamt.
1595/// The index is read from the lower log2(XLEN) bits of shamt.
1596/// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
1597///
1598/// # Forms
1599/// Assembly: `bseti.rv32 xd, xs1, shamt`
1600/// Rust: `bseti_rv32(rd, rs1, shamtw)`
1601///
1602/// # Arguments
1603/// - `rd` — Destination register.
1604/// - `rs1` — Source register.
1605/// - `shamtw` — Immediate encoding value.
1606pub trait BsetiRv32Emitter<T0, T1, T2> {
1607 fn bseti_rv32(&mut self, rd: T0, rs1: T1, shamtw: T2);
1608}
1609
1610/// Add
1611///
1612/// Add the value in rs2 to rd, and store the result in rd.
1613/// C.ADD expands into `add rd, rd, rs2`.
1614///
1615/// # Forms
1616/// Assembly: `c.add xd, rs2`
1617/// Rust: `c_add(rd, rs2)`
1618///
1619/// # Arguments
1620/// - `rd` — Destination/source register.
1621/// - `rs2` — Instruction operand.
1622pub trait CAddEmitter<T0, T1> {
1623 fn c_add(&mut self, rd: T0, rs2: T1);
1624}
1625
1626/// Add a sign-extended non-zero immediate
1627///
1628/// C.ADDI adds the non-zero sign-extended 6-bit immediate to the value in register rd then writes the result to rd.
1629/// C.ADDI expands into `addi rd, rd, imm`.
1630/// C.ADDI is only valid when rd ≠ x0 and imm ≠ 0.
1631/// The code points with rd=x0 encode the C.NOP instruction; the remaining code points with imm=0 encode HINTs.
1632///
1633/// # Forms
1634/// Assembly: `c.addi xd, imm`
1635/// Rust: `c_addi(rd, imm)`
1636///
1637/// # Arguments
1638/// - `rd` — Destination/source register.
1639/// - `imm` — Immediate encoding value.
1640pub trait CAddiEmitter<T0, T1> {
1641 fn c_addi(&mut self, rd: T0, imm: T1);
1642}
1643
1644/// Add a sign-extended non-zero immediate
1645///
1646/// C.ADDI16SP adds the non-zero sign-extended 6-bit immediate to the value in the stack pointer (sp=x2), where the immediate is scaled to represent multiples of 16 in the range (-512,496).
1647/// C.ADDI16SP is used to adjust the stack pointer in procedure prologues and epilogues.
1648/// It expands into `addi x2, x2, nzimm\[9:4\]`.
1649/// C.ADDI16SP is only valid when nzimm ≠ 0; the code point with nzimm=0 is reserved.
1650///
1651/// # Forms
1652/// Assembly: `c.addi16sp imm`
1653/// Rust: `c_addi16sp(imm)`
1654///
1655/// # Arguments
1656/// - `imm` — Immediate encoding value.
1657pub trait CAddi16spEmitter<T0> {
1658 fn c_addi16sp(&mut self, imm: T0);
1659}
1660
1661/// Add a zero-extended non-zero immediate, scaled by 4, to the stack pointer
1662///
1663/// Adds a zero-extended non-zero immediate, scaled by 4, to the stack pointer, x2, and writes the result to rd'.
1664/// This instruction is used to generate pointers to stack-allocated variables.
1665/// It expands to `addi rd', x2, nzuimm\[9:2\]`.
1666/// C.ADDI4SPN is only valid when nzuimm ≠ 0; the code points with nzuimm=0 are reserved.
1667///
1668/// # Forms
1669/// Assembly: `c.addi4spn xd, imm`
1670/// Rust: `c_addi4spn(rd, imm)`
1671///
1672/// # Arguments
1673/// - `rd` — Destination register.
1674/// - `imm` — Immediate encoding value.
1675pub trait CAddi4spnEmitter<T0, T1> {
1676 fn c_addi4spn(&mut self, rd: T0, imm: T1);
1677}
1678
1679/// Add a sign-extended non-zero immediate
1680///
1681/// C.ADDIW is an RV64C/RV128C-only instruction that performs the same computation as C.ADDI but produces a 32-bit result, then sign-extends result to 64 bits.
1682/// C.ADDIW expands into `addiw rd, rd, imm`.
1683/// The immediate can be zero for C.ADDIW, where this corresponds to `sext.w rd`.
1684/// C.ADDIW is only valid when rd ≠ x0; the code points with rd=x0 are reserved.
1685///
1686/// # Forms
1687/// Assembly: `c.addiw xd, imm`
1688/// Rust: `c_addiw(rd, imm)`
1689///
1690/// # Arguments
1691/// - `rd` — Destination/source register.
1692/// - `imm` — Immediate encoding value.
1693pub trait CAddiwEmitter<T0, T1> {
1694 fn c_addiw(&mut self, rd: T0, imm: T1);
1695}
1696
1697/// Add word
1698///
1699/// Add the 32-bit values in rs2 from rd, and store the result in rd.
1700/// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
1701/// C.ADDW expands into `addw rd, rd, rs2`.
1702///
1703/// # Forms
1704/// Assembly: `c.addw xd, rs2`
1705/// Rust: `c_addw(rd, rs2)`
1706///
1707/// # Arguments
1708/// - `rd` — Destination/source register.
1709/// - `rs2` — Source register.
1710pub trait CAddwEmitter<T0, T1> {
1711 fn c_addw(&mut self, rd: T0, rs2: T1);
1712}
1713
1714/// And
1715///
1716/// And rd with rs2, and store the result in rd
1717/// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
1718/// C.AND expands into `and rd, rd, rs2`.
1719///
1720/// # Forms
1721/// Assembly: `c.and xd, rs2`
1722/// Rust: `c_and(rd, rs2)`
1723///
1724/// # Arguments
1725/// - `rd` — Destination/source register.
1726/// - `rs2` — Source register.
1727pub trait CAndEmitter<T0, T1> {
1728 fn c_and(&mut self, rd: T0, rs2: T1);
1729}
1730
1731/// And immediate
1732///
1733/// And an immediate to the value in rd, and store the result in rd.
1734/// The rd register index should be used as rd+8 (registers x8-x15).
1735/// C.ANDI expands into `andi rd, rd, imm`.
1736///
1737/// # Forms
1738/// Assembly: `c.andi xd, imm`
1739/// Rust: `c_andi(rd, imm)`
1740///
1741/// # Arguments
1742/// - `rd` — Destination/source register.
1743/// - `imm` — Immediate encoding value.
1744pub trait CAndiEmitter<T0, T1> {
1745 fn c_andi(&mut self, rd: T0, imm: T1);
1746}
1747
1748/// Branch if Equal Zero
1749///
1750/// C.BEQZ performs conditional control transfers. The offset is sign-extended and added to the pc to form the branch target address. It can therefore target a ±256 B range. C.BEQZ takes the branch if the value in register rs1' is zero.
1751/// It expands to `beq` `rs1, x0, offset`.
1752///
1753/// # Forms
1754/// Assembly: `c.beqz xs1, imm`
1755/// Rust: `c_beqz(rs1, bimm9lohi)`
1756///
1757/// # Arguments
1758/// - `rs1` — Source register.
1759/// - `bimm9lohi` — Immediate encoding value.
1760pub trait CBeqzEmitter<T0, T1> {
1761 fn c_beqz(&mut self, rs1: T0, bimm9lohi: T1);
1762}
1763
1764/// Branch if NOT Equal Zero
1765///
1766/// C.BEQZ performs conditional control transfers. The offset is sign-extended and added to the pc to form the branch target address. It can therefore target a ±256 B range. C.BEQZ takes the branch if the value in register rs1' is NOT zero.
1767/// It expands to `beq` `rs1, x0, offset`.
1768///
1769/// # Forms
1770/// Assembly: `c.bnez xs1, imm`
1771/// Rust: `c_bnez(rs1, bimm9lohi)`
1772///
1773/// # Arguments
1774/// - `rs1` — Source register.
1775/// - `bimm9lohi` — Immediate encoding value.
1776pub trait CBnezEmitter<T0, T1> {
1777 fn c_bnez(&mut self, rs1: T0, bimm9lohi: T1);
1778}
1779
1780/// Breakpoint exception.
1781///
1782/// The C.EBREAK instruction is used by debuggers to cause control to be transferred back to
1783/// a debugging environment. Unless overridden by an external debug environment,
1784/// C.EBREAK raises a breakpoint exception and performs no other operation.
1785///
1786/// \[NOTE\]
1787/// As described in the `C` Standard Extension for Compressed Instructions, the `c.ebreak`
1788/// instruction performs the same operation as the EBREAK instruction.
1789///
1790/// EBREAK causes the receiving privilege mode's epc register to be set to the address of
1791/// the EBREAK instruction itself, not the address of the following instruction.
1792/// As EBREAK causes a synchronous exception, it is not considered to retire,
1793/// and should not increment the `minstret` CSR.
1794///
1795/// # Forms
1796/// Assembly: `c.ebreak " "`
1797/// Rust: `c_ebreak()`
1798///
1799/// # Arguments
1800pub trait CEbreakEmitter {
1801 fn c_ebreak(&mut self);
1802}
1803
1804/// Load double-precision
1805///
1806/// Loads a double precision floating-point value from memory into register rd.
1807/// It computes an effective address by adding the zero-extended offset, scaled by 8,
1808/// to the base address in register rs1.
1809/// It expands to `fld` `rd, offset(rs1)`.
1810///
1811/// # Forms
1812/// Assembly: `c.fld xd, imm(xs1)`
1813/// Rust: `c_fld(rd, rs1, imm)`
1814///
1815/// # Arguments
1816/// - `rd` — Destination register.
1817/// - `rs1` — Memory base register.
1818/// - `imm` — Immediate encoding value.
1819pub trait CFldEmitter<T0, T1, T2> {
1820 fn c_fld(&mut self, rd: T0, rs1: T1, imm: T2);
1821}
1822
1823/// Load doubleword into floating-point register from stack
1824///
1825/// Loads a double-precision floating-point value from memory into floating-point register rd.
1826/// It computes its effective address by adding the zero-extended offset, scaled by 8,
1827/// to the stack pointer, x2.
1828/// It expands to `fld` `rd, offset(x2)`.
1829///
1830/// # Forms
1831/// Assembly: `c.fldsp fd, imm(sp)`
1832/// Rust: `c_fldsp(rd, imm)`
1833///
1834/// # Arguments
1835/// - `rd` — Destination register.
1836/// - `imm` — Immediate encoding value.
1837pub trait CFldspEmitter<T0, T1> {
1838 fn c_fldsp(&mut self, rd: T0, imm: T1);
1839}
1840
1841/// Load single-precision
1842///
1843/// Loads a single precision floating-point value from memory into register rd.
1844/// It computes an effective address by adding the zero-extended offset, scaled by 4,
1845/// to the base address in register rs1.
1846/// It expands to `flw` `rd, offset(rs1)`.
1847///
1848/// # Forms
1849/// Assembly: `c.flw xd, imm(xs1)`
1850/// Rust: `c_flw(rd, rs1, imm)`
1851///
1852/// # Arguments
1853/// - `rd` — Destination register.
1854/// - `rs1` — Memory base register.
1855/// - `imm` — Immediate encoding value.
1856pub trait CFlwEmitter<T0, T1, T2> {
1857 fn c_flw(&mut self, rd: T0, rs1: T1, imm: T2);
1858}
1859
1860/// Load word into floating-point register from stack
1861///
1862/// Loads a single-precision floating-point value from memory into floating-point register rd.
1863/// It computes its effective address by adding the zero-extended offset, scaled by 4,
1864/// to the stack pointer, x2.
1865/// It expands to `flw` `rd, offset(x2)`.
1866///
1867/// # Forms
1868/// Assembly: `c.flwsp fd, imm(sp)`
1869/// Rust: `c_flwsp(rd, imm)`
1870///
1871/// # Arguments
1872/// - `rd` — Destination register.
1873/// - `imm` — Immediate encoding value.
1874pub trait CFlwspEmitter<T0, T1> {
1875 fn c_flwsp(&mut self, rd: T0, imm: T1);
1876}
1877
1878/// Store double-precision
1879///
1880/// Stores a double precision floating-point value in register rs2 to memory.
1881/// It computes an effective address by adding the zero-extended offset, scaled by 8,
1882/// to the base address in register rs1.
1883/// It expands to `fsd` `rs2, offset(rs1)`.
1884///
1885/// # Forms
1886/// Assembly: `c.fsd xs2, imm(xs1)`
1887/// Rust: `c_fsd(rs1, rs2, imm)`
1888///
1889/// # Arguments
1890/// - `rs1` — Memory base register.
1891/// - `rs2` — Source register.
1892/// - `imm` — Immediate encoding value.
1893pub trait CFsdEmitter<T0, T1, T2> {
1894 fn c_fsd(&mut self, rs1: T0, rs2: T1, imm: T2);
1895}
1896
1897/// Store double-precision value to stack
1898///
1899/// Stores a double-precision floating-point value in floating-point register rs2 to memory.
1900/// It computes an effective address by adding the zero-extended offset, scaled by 8,
1901/// to the stack pointer, x2.
1902/// It expands to `fsd` `rs2, offset(x2)`.
1903///
1904/// # Forms
1905/// Assembly: `c.fsdsp fs2, imm(sp)`
1906/// Rust: `c_fsdsp(rs2, imm)`
1907///
1908/// # Arguments
1909/// - `rs2` — Instruction operand.
1910/// - `imm` — Immediate encoding value.
1911pub trait CFsdspEmitter<T0, T1> {
1912 fn c_fsdsp(&mut self, rs2: T0, imm: T1);
1913}
1914
1915/// Store single-precision
1916///
1917/// Stores a single precision floating-point value in register rs2 to memory.
1918/// It computes an effective address by adding the zero-extended offset, scaled by 4,
1919/// to the base address in register rs1.
1920/// It expands to `fsw` `rs2, offset(rs1)`.
1921///
1922/// # Forms
1923/// Assembly: `c.fsw xs2, imm(xs1)`
1924/// Rust: `c_fsw(rs1, rs2, imm)`
1925///
1926/// # Arguments
1927/// - `rs1` — Memory base register.
1928/// - `rs2` — Source register.
1929/// - `imm` — Immediate encoding value.
1930pub trait CFswEmitter<T0, T1, T2> {
1931 fn c_fsw(&mut self, rs1: T0, rs2: T1, imm: T2);
1932}
1933
1934/// Store single-precision value to stack
1935///
1936/// Stores a single-precision floating-point value in floating-point register rs2 to memory.
1937/// It computes an effective address by adding the zero-extended offset, scaled by 4,
1938/// to the stack pointer, x2.
1939/// It expands to `fsw` `rs2, offset(x2)`.
1940///
1941/// # Forms
1942/// Assembly: `c.fswsp fs2, imm(sp)`
1943/// Rust: `c_fswsp(rs2, imm)`
1944///
1945/// # Arguments
1946/// - `rs2` — Instruction operand.
1947/// - `imm` — Immediate encoding value.
1948pub trait CFswspEmitter<T0, T1> {
1949 fn c_fswsp(&mut self, rs2: T0, imm: T1);
1950}
1951
1952/// Jump
1953///
1954/// C.J performs an unconditional control transfer. The offset is sign-extended and added to the pc to form the jump target address. C.J can therefore target a ±2 KiB range.
1955/// It expands to `jal` `x0, offset`.
1956///
1957/// # Forms
1958/// Assembly: `c.j imm`
1959/// Rust: `c_j(imm)`
1960///
1961/// # Arguments
1962/// - `imm` — Immediate encoding value.
1963pub trait CJEmitter<T0> {
1964 fn c_j(&mut self, imm: T0);
1965}
1966
1967/// Jump and Link
1968///
1969/// C.JAL is an RV32C-only instruction that performs the same operation as C.J, but additionally writes the address of the instruction following the jump (pc+2) to the link register, x1.
1970/// It expands to `jal` `x1, offset`.
1971///
1972/// # Forms
1973/// Assembly: `c.jal imm`
1974/// Rust: `c_jal(imm)`
1975///
1976/// # Arguments
1977/// - `imm` — Immediate encoding value.
1978pub trait CJalEmitter<T0> {
1979 fn c_jal(&mut self, imm: T0);
1980}
1981
1982/// Jump and Link Register.
1983///
1984/// C.JALR (jump and link register) performs the same operation as C.JR, but additionally writes the address of the instruction following the jump (pc+2) to the link register, x1.
1985/// C.JALR expands to jalr x1, 0(rs1).
1986///
1987/// # Forms
1988/// Assembly: `c.jalr xs1`
1989/// Rust: `c_jalr(rs1)`
1990///
1991/// # Arguments
1992/// - `rs1` — Instruction operand.
1993pub trait CJalrEmitter<T0> {
1994 fn c_jalr(&mut self, rs1: T0);
1995}
1996
1997/// Jump Register
1998///
1999/// C.JR (jump register) performs an unconditional control transfer to the address in register rs1.
2000/// C.JR expands to jalr x0, 0(rs1).
2001///
2002/// # Forms
2003/// Assembly: `c.jr xs1`
2004/// Rust: `c_jr(rs1)`
2005///
2006/// # Arguments
2007/// - `rs1` — Source register.
2008pub trait CJrEmitter<T0> {
2009 fn c_jr(&mut self, rs1: T0);
2010}
2011
2012/// Load unsigned byte, 16-bit encoding
2013///
2014/// Loads a 8-bit value from memory into register rd.
2015/// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
2016/// It expands to `lbu` `rd, offset(rs1)`.
2017///
2018/// # Forms
2019/// Assembly: `c.lbu xd, imm(xs1)`
2020/// Rust: `c_lbu(rd, rs1, imm)`
2021///
2022/// # Arguments
2023/// - `rd` — Destination register.
2024/// - `rs1` — Source register.
2025/// - `imm` — Immediate encoding value.
2026pub trait CLbuEmitter<T0, T1, T2> {
2027 fn c_lbu(&mut self, rd: T0, rs1: T1, imm: T2);
2028}
2029
2030/// Load double
2031///
2032/// Loads a 64-bit value from memory into register rd.
2033/// It computes an effective address by adding the zero-extended offset, scaled by 8,
2034/// to the base address in register rs1.
2035/// It expands to `ld` `rd, offset(rs1)`.
2036///
2037/// # Forms
2038/// Assembly: `c.ld xd, imm(xs1)`
2039/// Rust: `c_ld(rd, rs1, imm)`
2040///
2041/// # Arguments
2042/// - `rd` — Destination register.
2043/// - `rs1` — Memory base register.
2044/// - `imm` — Immediate encoding value.
2045pub trait CLdEmitter<T0, T1, T2> {
2046 fn c_ld(&mut self, rd: T0, rs1: T1, imm: T2);
2047}
2048
2049/// Load doubleword from stack pointer
2050///
2051/// C.LDSP is an RV64C/RV128C-only instruction that loads a 64-bit value from memory
2052/// into register rd.
2053/// It computes its effective address by adding the zero-extended offset, scaled by 8,
2054/// to the stack pointer, x2.
2055/// It expands to `ld` `rd, offset(x2)`.
2056/// C.LDSP is only valid when rd ≠ x0 the code points with rd=x0 are reserved.
2057///
2058/// # Forms
2059/// Assembly: `c.ldsp xd, imm(sp)`
2060/// Rust: `c_ldsp(rd, imm)`
2061///
2062/// # Arguments
2063/// - `rd` — Destination register.
2064/// - `imm` — Immediate encoding value.
2065pub trait CLdspEmitter<T0, T1> {
2066 fn c_ldsp(&mut self, rd: T0, imm: T1);
2067}
2068
2069/// Load signed halfword, 16-bit encoding
2070///
2071/// Loads a 16-bit value from memory into register rd.
2072/// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
2073/// It expands to `lh` `rd, offset(rs1)`.
2074///
2075/// # Forms
2076/// Assembly: `c.lh xd, imm(xs1)`
2077/// Rust: `c_lh(rd, rs1, imm)`
2078///
2079/// # Arguments
2080/// - `rd` — Destination register.
2081/// - `rs1` — Source register.
2082/// - `imm` — Immediate encoding value.
2083pub trait CLhEmitter<T0, T1, T2> {
2084 fn c_lh(&mut self, rd: T0, rs1: T1, imm: T2);
2085}
2086
2087/// Load unsigned halfword, 16-bit encoding
2088///
2089/// Loads a 16-bit value from memory into register rd.
2090/// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
2091/// It expands to `lhu` `rd, offset(rs1)`.
2092///
2093/// # Forms
2094/// Assembly: `c.lhu xd, imm(xs1)`
2095/// Rust: `c_lhu(rd, rs1, imm)`
2096///
2097/// # Arguments
2098/// - `rd` — Destination register.
2099/// - `rs1` — Source register.
2100/// - `imm` — Immediate encoding value.
2101pub trait CLhuEmitter<T0, T1, T2> {
2102 fn c_lhu(&mut self, rd: T0, rs1: T1, imm: T2);
2103}
2104
2105/// Load the sign-extended 6-bit immediate
2106///
2107/// C.LI loads the sign-extended 6-bit immediate, imm, into register rd.
2108/// C.LI expands into `addi rd, x0, imm`.
2109/// C.LI is only valid when rd ≠ x0; the code points with rd=x0 encode HINTs.
2110///
2111/// # Forms
2112/// Assembly: `c.li xd, imm`
2113/// Rust: `c_li(rd, imm)`
2114///
2115/// # Arguments
2116/// - `rd` — Destination register.
2117/// - `imm` — Immediate encoding value.
2118pub trait CLiEmitter<T0, T1> {
2119 fn c_li(&mut self, rd: T0, imm: T1);
2120}
2121
2122/// Load the non-zero 6-bit immediate field into bits 17-12 of the destination register
2123///
2124/// C.LUI loads the non-zero 6-bit immediate field into bits 17-12 of the destination register, clears the bottom 12 bits, and sign-extends bit 17 into all higher bits of the destination.
2125/// C.LUI expands into `lui rd, imm`.
2126/// C.LUI is only valid when rd≠x0 and rd≠x2, and when the immediate is not equal to zero.
2127/// The code points with imm=0 are reserved; the remaining code points with rd=x0 are HINTs; and the remaining code points with rd=x2 correspond to the C.ADDI16SP instruction
2128///
2129/// # Forms
2130/// Assembly: `c.lui xd, imm`
2131/// Rust: `c_lui(rd, imm)`
2132///
2133/// # Arguments
2134/// - `rd` — Destination register.
2135/// - `imm` — Immediate encoding value.
2136pub trait CLuiEmitter<T0, T1> {
2137 fn c_lui(&mut self, rd: T0, imm: T1);
2138}
2139
2140/// Load word
2141///
2142/// Loads a 32-bit value from memory into register rd.
2143/// It computes an effective address by adding the zero-extended offset, scaled by 4,
2144/// to the base address in register rs1.
2145/// It expands to `lw` `rd, offset(rs1)`.
2146///
2147/// # Forms
2148/// Assembly: `c.lw xd, imm(xs1)`
2149/// Rust: `c_lw(rd, rs1, imm)`
2150///
2151/// # Arguments
2152/// - `rd` — Destination register.
2153/// - `rs1` — Memory base register.
2154/// - `imm` — Immediate encoding value.
2155pub trait CLwEmitter<T0, T1, T2> {
2156 fn c_lw(&mut self, rd: T0, rs1: T1, imm: T2);
2157}
2158
2159/// Load word from stack pointer
2160///
2161/// Loads a 32-bit value from memory into register rd.
2162/// It computes an effective address by adding the zero-extended offset, scaled by 4,
2163/// to the stack pointer, x2.
2164/// It expands to `lw` `rd, offset(x2)`.
2165/// C.LWSP is only valid when rd ≠ x0. The code points with rd=x0 are reserved.
2166///
2167/// # Forms
2168/// Assembly: `c.lwsp xd, imm(sp)`
2169/// Rust: `c_lwsp(rd, imm)`
2170///
2171/// # Arguments
2172/// - `rd` — Destination register.
2173/// - `imm` — Immediate encoding value.
2174pub trait CLwspEmitter<T0, T1> {
2175 fn c_lwsp(&mut self, rd: T0, imm: T1);
2176}
2177
2178/// RISC-V `c.mop.1` instruction.
2179///
2180/// # Forms
2181/// Assembly: `c.mop.1`
2182/// Rust: `c_mop_1()`
2183///
2184/// # Arguments
2185pub trait CMop1Emitter {
2186 fn c_mop_1(&mut self);
2187}
2188
2189/// RISC-V `c.mop.11` instruction.
2190///
2191/// # Forms
2192/// Assembly: `c.mop.11`
2193/// Rust: `c_mop_11()`
2194///
2195/// # Arguments
2196pub trait CMop11Emitter {
2197 fn c_mop_11(&mut self);
2198}
2199
2200/// RISC-V `c.mop.13` instruction.
2201///
2202/// # Forms
2203/// Assembly: `c.mop.13`
2204/// Rust: `c_mop_13()`
2205///
2206/// # Arguments
2207pub trait CMop13Emitter {
2208 fn c_mop_13(&mut self);
2209}
2210
2211/// RISC-V `c.mop.15` instruction.
2212///
2213/// # Forms
2214/// Assembly: `c.mop.15`
2215/// Rust: `c_mop_15()`
2216///
2217/// # Arguments
2218pub trait CMop15Emitter {
2219 fn c_mop_15(&mut self);
2220}
2221
2222/// RISC-V `c.mop.3` instruction.
2223///
2224/// # Forms
2225/// Assembly: `c.mop.3`
2226/// Rust: `c_mop_3()`
2227///
2228/// # Arguments
2229pub trait CMop3Emitter {
2230 fn c_mop_3(&mut self);
2231}
2232
2233/// RISC-V `c.mop.5` instruction.
2234///
2235/// # Forms
2236/// Assembly: `c.mop.5`
2237/// Rust: `c_mop_5()`
2238///
2239/// # Arguments
2240pub trait CMop5Emitter {
2241 fn c_mop_5(&mut self);
2242}
2243
2244/// RISC-V `c.mop.7` instruction.
2245///
2246/// # Forms
2247/// Assembly: `c.mop.7`
2248/// Rust: `c_mop_7()`
2249///
2250/// # Arguments
2251pub trait CMop7Emitter {
2252 fn c_mop_7(&mut self);
2253}
2254
2255/// RISC-V `c.mop.9` instruction.
2256///
2257/// # Forms
2258/// Assembly: `c.mop.9`
2259/// Rust: `c_mop_9()`
2260///
2261/// # Arguments
2262pub trait CMop9Emitter {
2263 fn c_mop_9(&mut self);
2264}
2265
2266/// RISC-V `c.mop.n` instruction.
2267///
2268/// # Forms
2269/// Assembly: `c.mop.n c_mop_t`
2270/// Rust: `c_mop_n(mop_t)`
2271///
2272/// # Arguments
2273/// - `mop_t` — Instruction operand.
2274pub trait CMopNEmitter<T0> {
2275 fn c_mop_n(&mut self, mop_t: T0);
2276}
2277
2278/// Multiply, 16-bit encoding
2279///
2280/// This instruction multiplies XLEN bits of the source operands from rsd' and rs2' and writes the lowest XLEN bits of the result to rsd'.
2281///
2282/// # Forms
2283/// Assembly: `c.mul xd, xs2`
2284/// Rust: `c_mul(rd, rs2)`
2285///
2286/// # Arguments
2287/// - `rd` — Destination/source register.
2288/// - `rs2` — Source register.
2289pub trait CMulEmitter<T0, T1> {
2290 fn c_mul(&mut self, rd: T0, rs2: T1);
2291}
2292
2293/// Move Register
2294///
2295/// C.MV (move register) performs copy of the data in register rs2 to register rd
2296/// C.MV expands to addi rd, x0, rs2.
2297///
2298/// # Forms
2299/// Assembly: `c.mv xd, xs2`
2300/// Rust: `c_mv(rd, rs2)`
2301///
2302/// # Arguments
2303/// - `rd` — Destination register.
2304/// - `rs2` — Instruction operand.
2305pub trait CMvEmitter<T0, T1> {
2306 fn c_mv(&mut self, rd: T0, rs2: T1);
2307}
2308
2309/// Non-operation
2310///
2311/// C.NOP expands into `addi x0, x0, imm`.
2312///
2313/// # Forms
2314/// Assembly: `c.nop imm`
2315/// Rust: `c_nop(imm)`
2316///
2317/// # Arguments
2318/// - `imm` — Immediate encoding value.
2319pub trait CNopEmitter<T0> {
2320 fn c_nop(&mut self, imm: T0);
2321}
2322
2323/// Bitwise not, 16-bit encoding
2324///
2325/// This instruction takes a single source/destination operand.
2326/// This instruction takes the one's complement of rd'/rs1' and writes the result to the same register.
2327///
2328/// # Forms
2329/// Assembly: `c.not xd`
2330/// Rust: `c_not(rd)`
2331///
2332/// # Arguments
2333/// - `rd` — Destination/source register.
2334pub trait CNotEmitter<T0> {
2335 fn c_not(&mut self, rd: T0);
2336}
2337
2338/// RISC-V `c.ntl.all` instruction.
2339///
2340/// # Forms
2341/// Assembly: `c.ntl.all`
2342/// Rust: `c_ntl_all()`
2343///
2344/// # Arguments
2345pub trait CNtlAllEmitter {
2346 fn c_ntl_all(&mut self);
2347}
2348
2349/// RISC-V `c.ntl.p1` instruction.
2350///
2351/// # Forms
2352/// Assembly: `c.ntl.p1`
2353/// Rust: `c_ntl_p1()`
2354///
2355/// # Arguments
2356pub trait CNtlP1Emitter {
2357 fn c_ntl_p1(&mut self);
2358}
2359
2360/// RISC-V `c.ntl.pall` instruction.
2361///
2362/// # Forms
2363/// Assembly: `c.ntl.pall`
2364/// Rust: `c_ntl_pall()`
2365///
2366/// # Arguments
2367pub trait CNtlPallEmitter {
2368 fn c_ntl_pall(&mut self);
2369}
2370
2371/// RISC-V `c.ntl.s1` instruction.
2372///
2373/// # Forms
2374/// Assembly: `c.ntl.s1`
2375/// Rust: `c_ntl_s1()`
2376///
2377/// # Arguments
2378pub trait CNtlS1Emitter {
2379 fn c_ntl_s1(&mut self);
2380}
2381
2382/// Or
2383///
2384/// Or rd with rs2, and store the result in rd
2385/// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
2386/// C.OR expands into `or rd, rd, rs2`.
2387///
2388/// # Forms
2389/// Assembly: `c.or xd, rs2`
2390/// Rust: `c_or(rd, rs2)`
2391///
2392/// # Arguments
2393/// - `rd` — Destination/source register.
2394/// - `rs2` — Source register.
2395pub trait COrEmitter<T0, T1> {
2396 fn c_or(&mut self, rd: T0, rs2: T1);
2397}
2398
2399/// Store unsigned byte, 16-bit encoding
2400///
2401/// Stores a 8-bit value from register rs2 into memory.
2402/// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
2403/// It expands to `sb` `rs2, offset(rs1)`.
2404///
2405/// # Forms
2406/// Assembly: `c.sb xs2, imm(xs1)`
2407/// Rust: `c_sb(rs1, rs2, imm)`
2408///
2409/// # Arguments
2410/// - `rs1` — Source register.
2411/// - `rs2` — Source register.
2412/// - `imm` — Immediate encoding value.
2413pub trait CSbEmitter<T0, T1, T2> {
2414 fn c_sb(&mut self, rs1: T0, rs2: T1, imm: T2);
2415}
2416
2417/// Store double
2418///
2419/// Stores a 64-bit value in register rs2 to memory.
2420/// It computes an effective address by adding the zero-extended offset, scaled by 8,
2421/// to the base address in register rs1.
2422/// It expands to `sd` `rs2, offset(rs1)`.
2423///
2424/// # Forms
2425/// Assembly: `c.sd xs2, imm(xs1)`
2426/// Rust: `c_sd(rs1, rs2, imm)`
2427///
2428/// # Arguments
2429/// - `rs1` — Memory base register.
2430/// - `rs2` — Source register.
2431/// - `imm` — Immediate encoding value.
2432pub trait CSdEmitter<T0, T1, T2> {
2433 fn c_sd(&mut self, rs1: T0, rs2: T1, imm: T2);
2434}
2435
2436/// Store doubleword to stack
2437///
2438/// Stores a 64-bit value in register rs2 to memory.
2439/// It computes an effective address by adding the zero-extended offset, scaled by 8,
2440/// to the stack pointer, x2.
2441/// It expands to `sd` `rs2, offset(x2)`.
2442///
2443/// # Forms
2444/// Assembly: `c.sdsp xs2, imm(sp)`
2445/// Rust: `c_sdsp(rs2, imm)`
2446///
2447/// # Arguments
2448/// - `rs2` — Instruction operand.
2449/// - `imm` — Immediate encoding value.
2450pub trait CSdspEmitter<T0, T1> {
2451 fn c_sdsp(&mut self, rs2: T0, imm: T1);
2452}
2453
2454/// Sign-extend byte, 16-bit encoding
2455///
2456/// This instruction takes a single source/destination operand.
2457/// This instruction sign-extends the least-significant byte of the source to XLEN by copying
2458/// the most-significant bit in the byte (i.e., bit 7) to all of the more-significant bits.
2459///
2460/// # Forms
2461/// Assembly: `c.sext.b xd`
2462/// Rust: `c_sext_b(rd)`
2463///
2464/// # Arguments
2465/// - `rd` — Destination/source register.
2466pub trait CSextBEmitter<T0> {
2467 fn c_sext_b(&mut self, rd: T0);
2468}
2469
2470/// Sign-extend halfword, 16-bit encoding
2471///
2472/// This instruction takes a single source/destination operand.
2473/// This instruction sign-extends the least-significant halfword of the source to XLEN by copying
2474/// the most-significant bit in the halfword (i.e., bit 15) to all of the more-significant bits.
2475///
2476/// # Forms
2477/// Assembly: `c.sext.h xd`
2478/// Rust: `c_sext_h(rd)`
2479///
2480/// # Arguments
2481/// - `rd` — Destination/source register.
2482pub trait CSextHEmitter<T0> {
2483 fn c_sext_h(&mut self, rd: T0);
2484}
2485
2486/// Store unsigned halfword, 16-bit encoding
2487///
2488/// Stores a 16-bit value from register rs2 into memory.
2489/// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
2490/// It expands to `sh` `rs2, offset(rs1)`.
2491///
2492/// # Forms
2493/// Assembly: `c.sh xs2, imm(xs1)`
2494/// Rust: `c_sh(rs1, rs2, imm)`
2495///
2496/// # Arguments
2497/// - `rs1` — Source register.
2498/// - `rs2` — Source register.
2499/// - `imm` — Immediate encoding value.
2500pub trait CShEmitter<T0, T1, T2> {
2501 fn c_sh(&mut self, rs1: T0, rs2: T1, imm: T2);
2502}
2503
2504/// Shift left logical immediate
2505///
2506/// Shift the value in rd left by shamt, and store the result back in rd.
2507/// C.SLLI expands into `slli rd, rd, shamt`.
2508///
2509/// # Forms
2510/// Assembly: `c.slli xd, shamt`
2511/// Rust: `c_slli(rd, imm)`
2512///
2513/// # Arguments
2514/// - `rd` — Destination/source register.
2515/// - `imm` — Immediate encoding value.
2516pub trait CSlliEmitter<T0, T1> {
2517 fn c_slli(&mut self, rd: T0, imm: T1);
2518}
2519
2520/// Shift left logical immediate
2521///
2522/// Shift the value in rd left by shamt, and store the result back in rd.
2523/// C.SLLI expands into `slli rd, rd, shamt`.
2524///
2525/// # Forms
2526/// Assembly: `c.slli.rv32 xd, shamt`
2527/// Rust: `c_slli_rv32(rd, imm)`
2528///
2529/// # Arguments
2530/// - `rd` — Destination/source register.
2531/// - `imm` — Immediate encoding value.
2532pub trait CSlliRv32Emitter<T0, T1> {
2533 fn c_slli_rv32(&mut self, rd: T0, imm: T1);
2534}
2535
2536/// Shift right arithmetical immediate
2537///
2538/// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the value in rd right by shamt, and store the result in rd.
2539/// The rd register index should be used as rd+8 (registers x8-x15).
2540/// C.SRAI expands into `srai rd, rd, shamt`.
2541///
2542/// # Forms
2543/// Assembly: `c.srai xd, shamt`
2544/// Rust: `c_srai(rd, imm)`
2545///
2546/// # Arguments
2547/// - `rd` — Destination/source register.
2548/// - `imm` — Immediate encoding value.
2549pub trait CSraiEmitter<T0, T1> {
2550 fn c_srai(&mut self, rd: T0, imm: T1);
2551}
2552
2553/// Shift right arithmetical immediate
2554///
2555/// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the value in rd right by shamt, and store the result in rd.
2556/// The rd register index should be used as rd+8 (registers x8-x15).
2557/// C.SRAI expands into `srai rd, rd, shamt`.
2558///
2559/// # Forms
2560/// Assembly: `c.srai.rv32 xd, shamt`
2561/// Rust: `c_srai_rv32(rd, imm)`
2562///
2563/// # Arguments
2564/// - `rd` — Destination/source register.
2565/// - `imm` — Immediate encoding value.
2566pub trait CSraiRv32Emitter<T0, T1> {
2567 fn c_srai_rv32(&mut self, rd: T0, imm: T1);
2568}
2569
2570/// Shift right logical immediate
2571///
2572/// Shift the value in rd right by shamt, and store the result back in rd.
2573/// The rd register index should be used as rd+8 (registers x8-x15).
2574/// C.SRLI expands into `srli rd, rd, shamt`.
2575///
2576/// # Forms
2577/// Assembly: `c.srli xd, shamt`
2578/// Rust: `c_srli(rd, imm)`
2579///
2580/// # Arguments
2581/// - `rd` — Destination/source register.
2582/// - `imm` — Immediate encoding value.
2583pub trait CSrliEmitter<T0, T1> {
2584 fn c_srli(&mut self, rd: T0, imm: T1);
2585}
2586
2587/// Shift right logical immediate
2588///
2589/// Shift the value in rd right by shamt, and store the result back in rd.
2590/// The rd register index should be used as rd+8 (registers x8-x15).
2591/// C.SRLI expands into `srli rd, rd, shamt`.
2592///
2593/// # Forms
2594/// Assembly: `c.srli.rv32 xd, shamt`
2595/// Rust: `c_srli_rv32(rd, imm)`
2596///
2597/// # Arguments
2598/// - `rd` — Destination/source register.
2599/// - `imm` — Immediate encoding value.
2600pub trait CSrliRv32Emitter<T0, T1> {
2601 fn c_srli_rv32(&mut self, rd: T0, imm: T1);
2602}
2603
2604/// RISC-V `c.sspopchk.x5` instruction.
2605///
2606/// # Forms
2607/// Assembly: `c.sspopchk.x5`
2608/// Rust: `c_sspopchk_x5()`
2609///
2610/// # Arguments
2611pub trait CSspopchkX5Emitter {
2612 fn c_sspopchk_x5(&mut self);
2613}
2614
2615/// RISC-V `c.sspush.x1` instruction.
2616///
2617/// # Forms
2618/// Assembly: `c.sspush.x1`
2619/// Rust: `c_sspush_x1()`
2620///
2621/// # Arguments
2622pub trait CSspushX1Emitter {
2623 fn c_sspush_x1(&mut self);
2624}
2625
2626/// Subtract
2627///
2628/// Subtract the value in rs2 from rd, and store the result in rd.
2629/// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
2630/// C.SUB expands into `sub rd, rd, rs2`.
2631///
2632/// # Forms
2633/// Assembly: `c.sub xd, rs2`
2634/// Rust: `c_sub(rd, rs2)`
2635///
2636/// # Arguments
2637/// - `rd` — Destination/source register.
2638/// - `rs2` — Source register.
2639pub trait CSubEmitter<T0, T1> {
2640 fn c_sub(&mut self, rd: T0, rs2: T1);
2641}
2642
2643/// Subtract word
2644///
2645/// Subtract the 32-bit values in rs2 from rd, and store the result in rd.
2646/// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
2647/// C.SUBW expands into `subw rd, rd, rs2`.
2648///
2649/// # Forms
2650/// Assembly: `c.subw xd, rs2`
2651/// Rust: `c_subw(rd, rs2)`
2652///
2653/// # Arguments
2654/// - `rd` — Destination/source register.
2655/// - `rs2` — Source register.
2656pub trait CSubwEmitter<T0, T1> {
2657 fn c_subw(&mut self, rd: T0, rs2: T1);
2658}
2659
2660/// Store word
2661///
2662/// Stores a 32-bit value in register rs2 to memory.
2663/// It computes an effective address by adding the zero-extended offset, scaled by 4,
2664/// to the base address in register rs1.
2665/// It expands to `sw` `rs2, offset(rs1)`.
2666///
2667/// # Forms
2668/// Assembly: `c.sw xs2, imm(xs1)`
2669/// Rust: `c_sw(rs1, rs2, imm)`
2670///
2671/// # Arguments
2672/// - `rs1` — Memory base register.
2673/// - `rs2` — Source register.
2674/// - `imm` — Immediate encoding value.
2675pub trait CSwEmitter<T0, T1, T2> {
2676 fn c_sw(&mut self, rs1: T0, rs2: T1, imm: T2);
2677}
2678
2679/// Store word to stack
2680///
2681/// Stores a 32-bit value in register rs2 to memory.
2682/// It computes an effective address by adding the zero-extended offset, scaled by 4,
2683/// to the stack pointer, x2.
2684/// It expands to `sw` `rs2, offset(x2)`.
2685///
2686/// # Forms
2687/// Assembly: `c.swsp xs2, imm(sp)`
2688/// Rust: `c_swsp(rs2, imm)`
2689///
2690/// # Arguments
2691/// - `rs2` — Instruction operand.
2692/// - `imm` — Immediate encoding value.
2693pub trait CSwspEmitter<T0, T1> {
2694 fn c_swsp(&mut self, rs2: T0, imm: T1);
2695}
2696
2697/// Exclusive Or
2698///
2699/// Exclusive or rd with rs2, and store the result in rd
2700/// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
2701/// C.XOR expands into `xor rd, rd, rs2`.
2702///
2703/// # Forms
2704/// Assembly: `c.xor xd, rs2`
2705/// Rust: `c_xor(rd, rs2)`
2706///
2707/// # Arguments
2708/// - `rd` — Destination/source register.
2709/// - `rs2` — Source register.
2710pub trait CXorEmitter<T0, T1> {
2711 fn c_xor(&mut self, rd: T0, rs2: T1);
2712}
2713
2714/// Zero-extend byte, 16-bit encoding
2715///
2716/// This instruction takes a single source/destination operand.
2717/// This instruction zero-extends the least-significant byte of the source to XLEN by inserting
2718/// 0's into all of the bits more significant than 7.
2719///
2720/// # Forms
2721/// Assembly: `c.zext.b xd`
2722/// Rust: `c_zext_b(rd)`
2723///
2724/// # Arguments
2725/// - `rd` — Destination/source register.
2726pub trait CZextBEmitter<T0> {
2727 fn c_zext_b(&mut self, rd: T0);
2728}
2729
2730/// Zero-extend halfword, 16-bit encoding
2731///
2732/// This instruction takes a single source/destination operand.
2733/// This instruction zero-extends the least-significant halfword of the source to XLEN by inserting
2734/// 0's into all of the bits more significant than 15.
2735///
2736/// # Forms
2737/// Assembly: `c.zext.h xd`
2738/// Rust: `c_zext_h(rd)`
2739///
2740/// # Arguments
2741/// - `rd` — Destination/source register.
2742pub trait CZextHEmitter<T0> {
2743 fn c_zext_h(&mut self, rd: T0);
2744}
2745
2746/// Zero-extend word, 16-bit encoding
2747///
2748/// This instruction takes a single source/destination operand.
2749/// It zero-extends the least-significant word of the operand to XLEN bits by inserting zeros into all of the bits more significant than 31.
2750///
2751/// # Forms
2752/// Assembly: `c.zext.w xd`
2753/// Rust: `c_zext_w(rd)`
2754///
2755/// # Arguments
2756/// - `rd` — Destination/source register.
2757pub trait CZextWEmitter<T0> {
2758 fn c_zext_w(&mut self, rd: T0);
2759}
2760
2761/// Cache Block Clean
2762///
2763/// Cleans an entire cache block globally throughout the system.
2764///
2765/// Exactly what happens is coherence protocol-dependent, but in general it is expected that after this
2766/// operation():
2767///
2768/// * The cache block will be in the clean (not dirty) state in any coherent cache holding a valid copy of the line.
2769/// * The data will be cleaned to a point such that an incoherent load can observe the cleaned data.
2770///
2771/// `cbo.clean` is ordered by `FENCE` instructions but not `FENCE.I` or `SFENCE.VMA`.
2772///
2773/// <%- if CACHE_BLOCK_SIZE.bit_length > \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
2774/// Both PMP and PMA access control must be the same for all bytes in the block; otherwise, `cbo.clean` has UNSPECIFIED behavior.
2775/// <%- end -%>
2776///
2777/// Clean operations are treated as stores for page and access permissions. If permission checks fail,
2778/// one of the following exceptions will occur:
2779///
2780/// <%- if ext?(:H) -%>
2781/// * `Store/AMO Guest-Page Fault` if virtual memory translation fails during G-stage translation.
2782/// <%- end -%>
2783/// * `Store/AMO Page Fault` if virtual memory translation fails <% if ext?(:H) %>when V=0 or during VS-stage translation<% end %>
2784/// * `Store/AMO Access Fault` if a PMP or PMA access check fails
2785///
2786/// <%- if CACHE_BLOCK_SIZE.bit_length <= \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
2787/// Because cache blocks are naturally aligned and always fit in a single PMP or PMA regions, the PMP
2788/// and PMA access checks only need to check a single address in the line.
2789/// <%- end -%>
2790///
2791/// CBO operations never raise a misaligned address fault.
2792///
2793/// # Forms
2794/// Assembly: `cbo.clean "TODO"`
2795/// Rust: `cbo_clean(rs1)`
2796///
2797/// # Arguments
2798/// - `rs1` — Source register.
2799pub trait CboCleanEmitter<T0> {
2800 fn cbo_clean(&mut self, rs1: T0);
2801}
2802
2803/// Cache Block Flush
2804///
2805/// Flushes an entire cache block by cleaning it and then invalidating it in all caches.
2806///
2807/// `cbo.flush` is ordered by `FENCE` instructions but not `FENCE.I` or `SFENCE.VMA`.
2808///
2809/// <%- if CACHE_BLOCK_SIZE.bit_length > \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
2810/// Both PMP and PMA access control must be the same for all bytes in the block; otherwise, `cbo.flush` has UNSPECIFIED behavior.
2811/// <%- end -%>
2812///
2813/// Flush operations are treated as stores for page and access permissions. If permission checks fail,
2814/// one of the following exceptions will occur:
2815///
2816/// <%- if ext?(:H) -%>
2817/// * `Store/AMO Guest-Page Fault` if virtual memory translation fails during G-stage translation.
2818/// <%- end -%>
2819/// * `Store/AMO Page Fault` if virtual memory translation fails <% if ext?(:H) %>when V=0 or during VS-stage translation<% end %>
2820/// * `Store/AMO Access Fault` if a PMP or PMA access check fails.
2821///
2822/// <%- if CACHE_BLOCK_SIZE.bit_length <= \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
2823/// Because cache blocks are naturally aligned and always fit in a single PMP or PMA regions, the PMP
2824/// and PMA access checks only need to check a single address in the line.
2825/// <%- end -%>
2826///
2827/// CBO operations never raise a misaligned address fault.
2828///
2829/// # Forms
2830/// Assembly: `cbo.flush "TODO"`
2831/// Rust: `cbo_flush(rs1)`
2832///
2833/// # Arguments
2834/// - `rs1` — Source register.
2835pub trait CboFlushEmitter<T0> {
2836 fn cbo_flush(&mut self, rs1: T0);
2837}
2838
2839/// Cache Block Invalidate
2840///
2841/// Either invalidates or flushes (clean + invalidate) a cache block, depending on the current mode and value of
2842/// `menvcfg.CBIE`, `senvcfg.CBIE`, and/or `henvcfg.CBIE`.
2843///
2844/// The instruction is an invalidate (without a clean) when:
2845///
2846/// * In M-mode
2847/// * In (H)S-mode and `menvcfg.CBIE` == 11
2848/// * In U-mode and `menvcfg.CBIE` == 11 and `senvcfg.CBIE` == 11
2849/// * In VS-mode and `menvcfg.CBIE` == 11 and `henvcfg.CBIE` == 11
2850/// * In VU-mode and `menvcfg.CBIE` == 11 and `henvcfg.CBIE` == 11 and `senvcfg.CBIE` == 11
2851///
2852/// Otherwise, if the instruction does not trap (see Access section), the operation is a flush.
2853/// The table below summarizes the options.
2854///
2855/// \[%autowidth,cols="1,1,1,1,1,1,1,1",separator="!"\]
2856/// !===
2857/// .2+h!\[.rotate\]#`menvcfg.CBIE`# .2+h! \[.rotate\]#`senvcfg.CBIE`# .2+h! \[.rotate\]#`henvcfg.CBIE`#
2858/// 5+^.>h! `cbe.inval` Operation
2859/// .^h! M-mode .^h! S-mode .^h! U-mode .^h! VS-mode .^h! VU-mode
2860///
2861/// ! 00 ! - ! - ! Invalidate ! `Illegal Instruction` ! `Illegal Instruction` ! `Virtual Instruction` ! `Virtual Instruction`
2862/// ! 01 ! 00 ! 00 ! Invalidate ! Flush ! `Illegal Instruction` ! `Virtual Instruction` ! `Virtual Instruction`
2863/// ! 01 ! 00 ! 01 ! Invalidate ! Flush ! `Illegal Instruction` ! Flush ! `Virtual Instruction`
2864/// ! 01 ! 00 ! 11 ! Invalidate ! Flush ! `Illegal Instruction` ! Flush ! `Virtual Instruction`
2865/// ! 01 ! 01 ! 00 ! Invalidate ! Flush ! Flush ! `Virtual Instruction` ! `Virtual Instruction`
2866/// ! 01 ! 01 ! 01 ! Invalidate ! Flush ! Flush ! Flush ! Flush
2867/// ! 01 ! 01 ! 11 ! Invalidate ! Flush ! Flush ! Flush ! Flush
2868/// ! 01 ! 11 ! 00 ! Invalidate ! Flush ! Flush ! `Virtual Instruction` ! `Virtual Instruction`
2869/// ! 01 ! 11 ! 01 ! Invalidate ! Flush ! Flush ! Flush ! Flush
2870/// ! 01 ! 11 ! 11 ! Invalidate ! Flush ! Flush ! Flush ! Flush
2871/// ! 11 ! 00 ! 00 ! Invalidate ! Invalidate ! `Illegal Instruction` ! `Virtual Instruction` ! `Virtual Instruction`
2872/// ! 11 ! 00 ! 01 ! Invalidate ! Invalidate ! `Illegal Instruction` ! Flush ! `Virtual Instruction`
2873/// ! 11 ! 00 ! 11 ! Invalidate ! Invalidate ! `Illegal Instruction` ! Invalidate ! `Virtual Instruction`
2874/// ! 11 ! 01 ! 00 ! Invalidate ! Invalidate ! Flush ! `Virtual Instruction` ! `Virtual Instruction`
2875/// ! 11 ! 01 ! 01 ! Invalidate ! Invalidate ! Flush ! Flush ! Flush
2876/// ! 11 ! 01 ! 11 ! Invalidate ! Invalidate ! Flush ! Invalidate ! Flush
2877/// ! 11 ! 11 ! 00 ! Invalidate ! Invalidate ! Invalidate ! `Virtual Instruction` ! `Virtual Instruction`
2878/// ! 11 ! 11 ! 01 ! Invalidate ! Invalidate ! Invalidate ! Flush ! Flush
2879/// ! 11 ! 11 ! 11 ! Invalidate ! Invalidate ! Invalidate ! Invalidate ! Invalidate
2880/// !===
2881///
2882/// `cbo.inval` is ordered by `FENCE` instructions but not `FENCE.I` or `SFENCE.VMA`.
2883///
2884/// <%- if CACHE_BLOCK_SIZE.bit_length > \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
2885/// Both PMP and PMA access control must be the same for all bytes in the block; otherwise, `cbo.zero` has UNSPECIFIED behavior.
2886/// <%- end -%>
2887///
2888/// Invalidate operations are treated as stores for page and access permissions. If permission checks fail,
2889/// one of the following exceptions will occur:
2890///
2891/// <%- if ext?(:H) -%>
2892/// * `Store/AMO Guest-Page Fault` if virtual memory translation fails during G-stage translation.
2893/// <%- end -%>
2894/// * `Store/AMO Page Fault` if virtual memory translation fails <% if ext?(:H) %>when V=0 or during VS-stage translation<% end %>
2895/// * `Store/AMO Access Fault` if a PMP or PMA access check fails.
2896///
2897/// <%- if CACHE_BLOCK_SIZE.bit_length <= \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
2898/// Because cache blocks are naturally aligned and always fit in a single PMP or PMA regions, the PMP
2899/// and PMA access checks only need to check a single address in the line.
2900/// <%- end -%>
2901///
2902/// CBO operations never raise a misaligned address fault.
2903///
2904/// # Forms
2905/// Assembly: `cbo.inval "TODO"`
2906/// Rust: `cbo_inval(rs1)`
2907///
2908/// # Arguments
2909/// - `rs1` — Source register.
2910pub trait CboInvalEmitter<T0> {
2911 fn cbo_inval(&mut self, rs1: T0);
2912}
2913
2914/// Cache Block Zero
2915///
2916/// Zeros an entire cache block
2917///
2918/// The block zeroing does not need to be atomic.
2919///
2920/// `cbo.zero` is ordered by `FENCE` instructions but not `FENCE.I` or `SFENCE.VMA`.
2921///
2922/// <%- if CACHE_BLOCK_SIZE.bit_length > \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
2923/// Both PMP and PMA access control must be the same for all bytes in the block; otherwise, `cbo.zero` has UNSPECIFIED behavior.
2924/// <%- end -%>
2925///
2926/// Clean operations are treated as stores for page and access permissions. If permission checks fail,
2927/// one of the following exceptions will occur:
2928///
2929/// <%- if ext?(:H) -%>
2930/// * `Store/AMO Guest-Page Fault` if virtual memory translation fails during G-stage translation.
2931/// <%- end -%>
2932/// * `Store/AMO Page Fault` if virtual memory translation fails <% if ext?(:H) %>when V=0 or during VS-stage translation<% end %>
2933/// * `Store/AMO Access Fault` if a PMP or PMA access check fails.
2934///
2935/// <%- if CACHE_BLOCK_SIZE.bit_length <= \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
2936/// Because cache blocks are naturally aligned and always fit in a single PMP or PMA regions, the PMP
2937/// and PMA access checks only need to check a single address in the line.
2938/// <%- end -%>
2939///
2940/// CBO operations never raise a misaligned address fault.
2941///
2942/// # Forms
2943/// Assembly: `cbo.zero "TODO"`
2944/// Rust: `cbo_zero(rs1)`
2945///
2946/// # Arguments
2947/// - `rs1` — Source register.
2948pub trait CboZeroEmitter<T0> {
2949 fn cbo_zero(&mut self, rs1: T0);
2950}
2951
2952/// Carry-less multiply (low-part)
2953///
2954/// `clmul` produces the lower half of the 2*XLEN carry-less product
2955///
2956/// # Forms
2957/// Assembly: `clmul xd, xs1, xs2`
2958/// Rust: `clmul(rd, rs1, rs2)`
2959///
2960/// # Arguments
2961/// - `rd` — Destination register.
2962/// - `rs1` — Source register.
2963/// - `rs2` — Source register.
2964pub trait ClmulEmitter<T0, T1, T2> {
2965 fn clmul(&mut self, rd: T0, rs1: T1, rs2: T2);
2966}
2967
2968/// Carry-less multiply (high-part)
2969///
2970/// `clmulh` produces the upper half of the 2*XLEN carry-less product
2971///
2972/// # Forms
2973/// Assembly: `clmulh xd, xs1, xs2`
2974/// Rust: `clmulh(rd, rs1, rs2)`
2975///
2976/// # Arguments
2977/// - `rd` — Destination register.
2978/// - `rs1` — Source register.
2979/// - `rs2` — Source register.
2980pub trait ClmulhEmitter<T0, T1, T2> {
2981 fn clmulh(&mut self, rd: T0, rs1: T1, rs2: T2);
2982}
2983
2984/// Carry-less multiply (reversed)
2985///
2986/// `clmulr` produces bits 2*XLEN-2:XLEN-1 of the 2*XLEN carry-less product
2987///
2988/// # Forms
2989/// Assembly: `clmulr xd, xs1, xs2`
2990/// Rust: `clmulr(rd, rs1, rs2)`
2991///
2992/// # Arguments
2993/// - `rd` — Destination register.
2994/// - `rs1` — Source register.
2995/// - `rs2` — Source register.
2996pub trait ClmulrEmitter<T0, T1, T2> {
2997 fn clmulr(&mut self, rd: T0, rs1: T1, rs2: T2);
2998}
2999
3000/// Count leading zero bits
3001///
3002/// This instruction counts the number of 0's before the first 1,
3003/// starting at the most-significant bit (i.e., XLEN-1) and progressing to bit 0.
3004/// Accordingly, if the input is 0, the output is XLEN, and if the most-significant
3005/// bit of the input is a 1, the output is 0.
3006///
3007/// # Forms
3008/// Assembly: `clz xd, xs1`
3009/// Rust: `clz(rd, rs1)`
3010///
3011/// # Arguments
3012/// - `rd` — Destination register.
3013/// - `rs1` — Source register.
3014pub trait ClzEmitter<T0, T1> {
3015 fn clz(&mut self, rd: T0, rs1: T1);
3016}
3017
3018/// Count leading zero bits in word
3019///
3020/// This instruction counts the number of 0's before the first 1 starting at bit 31 and progressing to bit 0.
3021/// Accordingly, if the least-significant word is 0, the output is 32, and if the most-significant
3022/// bit of the word (_i.e._, bit 31) is a 1, the output is 0.
3023///
3024/// # Forms
3025/// Assembly: `clzw xd, xs1`
3026/// Rust: `clzw(rd, rs1)`
3027///
3028/// # Arguments
3029/// - `rd` — Destination register.
3030/// - `rs1` — Source register.
3031pub trait ClzwEmitter<T0, T1> {
3032 fn clzw(&mut self, rd: T0, rs1: T1);
3033}
3034
3035/// RISC-V `cm.jalt` instruction.
3036///
3037/// # Forms
3038/// Assembly: `cm.jalt c_index`
3039/// Rust: `cm_jalt(index)`
3040///
3041/// # Arguments
3042/// - `index` — Instruction operand.
3043pub trait CmJaltEmitter<T0> {
3044 fn cm_jalt(&mut self, index: T0);
3045}
3046
3047/// Count set bits
3048///
3049/// This instructions counts the number of 1's (i.e., set bits) in the source register.
3050///
3051/// .Software Hint
3052/// \[NOTE\]
3053/// ----
3054/// This operations is known as population count, popcount, sideways sum,
3055/// bit summation, or Hamming weight.
3056///
3057/// The GCC builtin function `__builtin_popcount (unsigned int x)` is
3058/// implemented by cpop on RV32 and by cpopw on RV64. The GCC builtin
3059/// function `__builtin_popcountl (unsigned long x)` for LP64 is
3060/// implemented by cpop on RV64.
3061/// ----
3062///
3063/// # Forms
3064/// Assembly: `cpop xd, xs1`
3065/// Rust: `cpop(rd, rs1)`
3066///
3067/// # Arguments
3068/// - `rd` — Destination register.
3069/// - `rs1` — Source register.
3070pub trait CpopEmitter<T0, T1> {
3071 fn cpop(&mut self, rd: T0, rs1: T1);
3072}
3073
3074/// Count set bits in word
3075///
3076/// This instructions counts the number of 1's (i.e., set bits) in the least-significant word of the source register.
3077///
3078/// .Software Hint
3079/// \[NOTE\]
3080/// ----
3081/// This operations is known as population count, popcount, sideways sum,
3082/// bit summation, or Hamming weight.
3083///
3084/// The GCC builtin function `__builtin_popcount (unsigned int x)` is
3085/// implemented by cpop on RV32 and by cpopw on RV64. The GCC builtin
3086/// function `__builtin_popcountl (unsigned long x)` for LP64 is
3087/// implemented by cpop on RV64.
3088/// ----
3089///
3090/// # Forms
3091/// Assembly: `cpopw xd, xs1`
3092/// Rust: `cpopw(rd, rs1)`
3093///
3094/// # Arguments
3095/// - `rd` — Destination register.
3096/// - `rs1` — Source register.
3097pub trait CpopwEmitter<T0, T1> {
3098 fn cpopw(&mut self, rd: T0, rs1: T1);
3099}
3100
3101/// RISC-V `csrc` instruction.
3102///
3103/// # Forms
3104/// Assembly: `csrc rs1 csr`
3105/// Rust: `csrc(rs1, csr)`
3106///
3107/// # Arguments
3108/// - `rs1` — Source register.
3109/// - `csr` — Control and status register number.
3110pub trait CsrcEmitter<T0, T1> {
3111 fn csrc(&mut self, rs1: T0, csr: T1);
3112}
3113
3114/// RISC-V `csrci` instruction.
3115///
3116/// # Forms
3117/// Assembly: `csrci csr zimm5`
3118/// Rust: `csrci(csr, zimm5)`
3119///
3120/// # Arguments
3121/// - `csr` — Control and status register number.
3122/// - `zimm5` — Immediate encoding value.
3123pub trait CsrciEmitter<T0, T1> {
3124 fn csrci(&mut self, csr: T0, zimm5: T1);
3125}
3126
3127/// RISC-V `csrr` instruction.
3128///
3129/// # Forms
3130/// Assembly: `csrr rd csr`
3131/// Rust: `csrr(rd, csr)`
3132///
3133/// # Arguments
3134/// - `rd` — Destination register.
3135/// - `csr` — Control and status register number.
3136pub trait CsrrEmitter<T0, T1> {
3137 fn csrr(&mut self, rd: T0, csr: T1);
3138}
3139
3140/// RISC-V `csrrc` instruction.
3141///
3142/// # Forms
3143/// Assembly: `csrrc xd, xs1, csr`
3144/// Rust: `csrrc(rd, rs1, csr)`
3145///
3146/// # Arguments
3147/// - `rd` — Destination register.
3148/// - `rs1` — Source register.
3149/// - `csr` — Control and status register number.
3150pub trait CsrrcEmitter<T0, T1, T2> {
3151 fn csrrc(&mut self, rd: T0, rs1: T1, csr: T2);
3152}
3153
3154/// RISC-V `csrrci` instruction.
3155///
3156/// # Forms
3157/// Assembly: `csrrci xd, csr, imm`
3158/// Rust: `csrrci(rd, csr, zimm5)`
3159///
3160/// # Arguments
3161/// - `rd` — Destination register.
3162/// - `csr` — Control and status register number.
3163/// - `zimm5` — Immediate encoding value.
3164pub trait CsrrciEmitter<T0, T1, T2> {
3165 fn csrrci(&mut self, rd: T0, csr: T1, zimm5: T2);
3166}
3167
3168/// Atomic Read and Set Bits in CSR
3169///
3170/// Atomically read and set bits in a CSR.
3171///
3172/// Reads the value of the CSR, zero-extends the value to `XLEN` bits,
3173/// and writes it to integer register `rd`. The initial value in integer
3174/// register `rs1` is treated as a bit mask that specifies bit positions
3175/// to be set in the CSR. Any bit that is high in `rs1` will cause the
3176/// corresponding bit to be set in the CSR, if that CSR bit is writable.
3177/// Other bits in the CSR are not explicitly written.
3178///
3179/// # Forms
3180/// Assembly: `csrrs xd, xs1, csr`
3181/// Rust: `csrrs(rd, rs1, csr)`
3182///
3183/// # Arguments
3184/// - `rd` — Destination register.
3185/// - `rs1` — Source register.
3186/// - `csr` — Control and status register number.
3187pub trait CsrrsEmitter<T0, T1, T2> {
3188 fn csrrs(&mut self, rd: T0, rs1: T1, csr: T2);
3189}
3190
3191/// RISC-V `csrrsi` instruction.
3192///
3193/// # Forms
3194/// Assembly: `csrrsi xd, csr, imm`
3195/// Rust: `csrrsi(rd, csr, zimm5)`
3196///
3197/// # Arguments
3198/// - `rd` — Destination register.
3199/// - `csr` — Control and status register number.
3200/// - `zimm5` — Immediate encoding value.
3201pub trait CsrrsiEmitter<T0, T1, T2> {
3202 fn csrrsi(&mut self, rd: T0, csr: T1, zimm5: T2);
3203}
3204
3205/// Atomic Read/Write CSR
3206///
3207/// Atomically swap values in the CSRs and integer registers.
3208///
3209/// Read the old value of the CSR, zero-extends the value to `XLEN` bits,
3210/// and then write it to integer register rd.
3211/// The initial value in rs1 is written to the CSR.
3212/// If `rd=x0`, then the instruction shall not read the CSR and shall not
3213/// cause any of the side effects that might occur on a CSR read.
3214///
3215/// # Forms
3216/// Assembly: `csrrw xd, xs1, csr`
3217/// Rust: `csrrw(rd, rs1, csr)`
3218///
3219/// # Arguments
3220/// - `rd` — Destination register.
3221/// - `rs1` — Source register.
3222/// - `csr` — Control and status register number.
3223pub trait CsrrwEmitter<T0, T1, T2> {
3224 fn csrrw(&mut self, rd: T0, rs1: T1, csr: T2);
3225}
3226
3227/// Atomic Read/Write CSR Immediate
3228///
3229/// Atomically write CSR using a 5-bit immediate, and load the previous value into 'rd'.
3230///
3231/// Read the old value of the CSR, zero-extends the value to `XLEN` bits,
3232/// and then write it to integer register rd.
3233/// The 5-bit uimm field is zero-extended and written to the CSR.
3234/// If `rd=x0`, then the instruction shall not read the CSR and shall not
3235/// cause any of the side effects that might occur on a CSR read.
3236///
3237/// # Forms
3238/// Assembly: `csrrwi xd, zimm, csr`
3239/// Rust: `csrrwi(rd, csr, zimm5)`
3240///
3241/// # Arguments
3242/// - `rd` — Destination register.
3243/// - `csr` — Control and status register number.
3244/// - `zimm5` — Immediate encoding value.
3245pub trait CsrrwiEmitter<T0, T1, T2> {
3246 fn csrrwi(&mut self, rd: T0, csr: T1, zimm5: T2);
3247}
3248
3249/// RISC-V `csrs` instruction.
3250///
3251/// # Forms
3252/// Assembly: `csrs rs1 csr`
3253/// Rust: `csrs(rs1, csr)`
3254///
3255/// # Arguments
3256/// - `rs1` — Source register.
3257/// - `csr` — Control and status register number.
3258pub trait CsrsEmitter<T0, T1> {
3259 fn csrs(&mut self, rs1: T0, csr: T1);
3260}
3261
3262/// RISC-V `csrsi` instruction.
3263///
3264/// # Forms
3265/// Assembly: `csrsi csr zimm5`
3266/// Rust: `csrsi(csr, zimm5)`
3267///
3268/// # Arguments
3269/// - `csr` — Control and status register number.
3270/// - `zimm5` — Immediate encoding value.
3271pub trait CsrsiEmitter<T0, T1> {
3272 fn csrsi(&mut self, csr: T0, zimm5: T1);
3273}
3274
3275/// RISC-V `csrw` instruction.
3276///
3277/// # Forms
3278/// Assembly: `csrw rs1 csr`
3279/// Rust: `csrw(rs1, csr)`
3280///
3281/// # Arguments
3282/// - `rs1` — Source register.
3283/// - `csr` — Control and status register number.
3284pub trait CsrwEmitter<T0, T1> {
3285 fn csrw(&mut self, rs1: T0, csr: T1);
3286}
3287
3288/// RISC-V `csrwi` instruction.
3289///
3290/// # Forms
3291/// Assembly: `csrwi csr zimm5`
3292/// Rust: `csrwi(csr, zimm5)`
3293///
3294/// # Arguments
3295/// - `csr` — Control and status register number.
3296/// - `zimm5` — Immediate encoding value.
3297pub trait CsrwiEmitter<T0, T1> {
3298 fn csrwi(&mut self, csr: T0, zimm5: T1);
3299}
3300
3301/// Count trailing zero bits
3302///
3303/// This instruction counts the number of 0's before the first 1,
3304/// starting at the least-significant bit (i.e., 0) and progressing
3305/// to the most-significant bit (i.e., XLEN-1). Accordingly, if the
3306/// input is 0, the output is XLEN, and if the least-significant bit
3307/// of the input is a 1, the output is 0.
3308///
3309/// # Forms
3310/// Assembly: `ctz xd, xs1`
3311/// Rust: `ctz(rd, rs1)`
3312///
3313/// # Arguments
3314/// - `rd` — Destination register.
3315/// - `rs1` — Source register.
3316pub trait CtzEmitter<T0, T1> {
3317 fn ctz(&mut self, rd: T0, rs1: T1);
3318}
3319
3320/// Count trailing zero bits in word
3321///
3322/// This instruction counts the number of 0's before the first 1,
3323/// starting at the least-significant bit (i.e., 0) and progressing
3324/// to the most-significant bit of the least-significant word (i.e., 31). Accordingly, if the
3325/// least-significant word is 0, the output is 32, and if the least-significant bit
3326/// of the input is a 1, the output is 0.
3327///
3328/// # Forms
3329/// Assembly: `ctzw xd, xs1`
3330/// Rust: `ctzw(rd, rs1)`
3331///
3332/// # Arguments
3333/// - `rd` — Destination register.
3334/// - `rs1` — Source register.
3335pub trait CtzwEmitter<T0, T1> {
3336 fn ctzw(&mut self, rd: T0, rs1: T1);
3337}
3338
3339/// RISC-V `czero.eqz` instruction.
3340///
3341/// # Forms
3342/// Assembly: `czero.eqz xd, xs1, xs2`
3343/// Rust: `czero_eqz(rd, rs1, rs2)`
3344///
3345/// # Arguments
3346/// - `rd` — Destination register.
3347/// - `rs1` — Source register.
3348/// - `rs2` — Source register.
3349pub trait CzeroEqzEmitter<T0, T1, T2> {
3350 fn czero_eqz(&mut self, rd: T0, rs1: T1, rs2: T2);
3351}
3352
3353/// RISC-V `czero.nez` instruction.
3354///
3355/// # Forms
3356/// Assembly: `czero.nez xd, xs1, xs2`
3357/// Rust: `czero_nez(rd, rs1, rs2)`
3358///
3359/// # Arguments
3360/// - `rd` — Destination register.
3361/// - `rs1` — Source register.
3362/// - `rs2` — Source register.
3363pub trait CzeroNezEmitter<T0, T1, T2> {
3364 fn czero_nez(&mut self, rd: T0, rs1: T1, rs2: T2);
3365}
3366
3367/// Signed division
3368///
3369/// Divide rs1 by rs2, and store the result in rd. The remainder is discarded.
3370///
3371/// Division by zero will put -1 into rd.
3372///
3373/// Division resulting in signed overflow (when most negative number is divided by -1)
3374/// will put the most negative number into rd;
3375///
3376/// # Forms
3377/// Assembly: `div xd, xs1, xs2`
3378/// Rust: `div(rd, rs1, rs2)`
3379///
3380/// # Arguments
3381/// - `rd` — Destination register.
3382/// - `rs1` — Source register.
3383/// - `rs2` — Source register.
3384pub trait DivEmitter<T0, T1, T2> {
3385 fn div(&mut self, rd: T0, rs1: T1, rs2: T2);
3386}
3387
3388/// Unsigned division
3389///
3390/// Divide unsigned values in rs1 by rs2, and store the result in rd.
3391///
3392/// The remainder is discarded.
3393///
3394/// If the value in rs2 is zero, rd gets the largest unsigned value.
3395///
3396/// # Forms
3397/// Assembly: `divu xd, xs1, xs2`
3398/// Rust: `divu(rd, rs1, rs2)`
3399///
3400/// # Arguments
3401/// - `rd` — Destination register.
3402/// - `rs1` — Source register.
3403/// - `rs2` — Source register.
3404pub trait DivuEmitter<T0, T1, T2> {
3405 fn divu(&mut self, rd: T0, rs1: T1, rs2: T2);
3406}
3407
3408/// Unsigned 32-bit division
3409///
3410/// Divide the unsigned 32-bit values in rs1 and rs2, and store the sign-extended result in rd.
3411///
3412/// The remainder is discarded.
3413///
3414/// If the value in rs2 is zero, rd is written with all 1s.
3415///
3416/// # Forms
3417/// Assembly: `divuw xd, xs1, xs2`
3418/// Rust: `divuw(rd, rs1, rs2)`
3419///
3420/// # Arguments
3421/// - `rd` — Destination register.
3422/// - `rs1` — Source register.
3423/// - `rs2` — Source register.
3424pub trait DivuwEmitter<T0, T1, T2> {
3425 fn divuw(&mut self, rd: T0, rs1: T1, rs2: T2);
3426}
3427
3428/// Signed 32-bit division
3429///
3430/// Divide the lower 32-bits of register rs1 by the lower 32-bits of register rs2,
3431/// and store the sign-extended result in rd.
3432///
3433/// The remainder is discarded.
3434///
3435/// Division by zero will put -1 into rd.
3436///
3437/// Division resulting in signed overflow (when most negative number is divided by -1)
3438/// will put the most negative number into rd;
3439///
3440/// # Forms
3441/// Assembly: `divw xd, xs1, xs2`
3442/// Rust: `divw(rd, rs1, rs2)`
3443///
3444/// # Arguments
3445/// - `rd` — Destination register.
3446/// - `rs1` — Source register.
3447/// - `rs2` — Source register.
3448pub trait DivwEmitter<T0, T1, T2> {
3449 fn divw(&mut self, rd: T0, rs1: T1, rs2: T2);
3450}
3451
3452/// RISC-V `dret` instruction.
3453///
3454/// # Forms
3455/// Assembly: `dret dret`
3456/// Rust: `dret()`
3457///
3458/// # Arguments
3459pub trait DretEmitter {
3460 fn dret(&mut self);
3461}
3462
3463/// Breakpoint exception
3464///
3465/// The EBREAK instruction is used by debuggers to cause control to be transferred back to
3466/// a debugging environment. Unless overridden by an external debug environment,
3467/// EBREAK raises a breakpoint exception and performs no other operation.
3468///
3469/// \[NOTE\]
3470/// As described in the `C` Standard Extension for Compressed Instructions, the `c.ebreak`
3471/// instruction performs the same operation as the EBREAK instruction.
3472///
3473/// EBREAK causes the receiving privilege mode's epc register to be set to the address of
3474/// the EBREAK instruction itself, not the address of the following instruction.
3475/// As EBREAK causes a synchronous exception, it is not considered to retire,
3476/// and should not increment the `minstret` CSR.
3477///
3478/// # Forms
3479/// Assembly: `ebreak ""`
3480/// Rust: `ebreak()`
3481///
3482/// # Arguments
3483pub trait EbreakEmitter {
3484 fn ebreak(&mut self);
3485}
3486
3487/// Environment call
3488///
3489/// The ECALL instruction is used to make a request to the supporting execution environment.
3490/// When executed in U-mode, S-mode, or M-mode, it generates an environment-call-from-U-mode
3491/// exception, environment-call-from-S-mode exception, or environment-call-from-M-mode
3492/// exception, respectively, and performs no other operation.
3493///
3494/// \[NOTE\]
3495/// ECALL generates a different exception for each originating privilege mode so that
3496/// environment call exceptions can be selectively delegated.
3497/// A typical use case for Unix-like operating systems is to delegate to S-mode
3498/// the environment-call-from-U-mode exception but not the others.
3499///
3500/// ECALL causes the receiving privilege mode's epc register to be set to the address of
3501/// the ECALL instruction itself, not the address of the following instruction.
3502/// As ECALL causes a synchronous exception, it is not considered to retire,
3503/// and should not increment the `minstret` CSR.
3504///
3505/// # Forms
3506/// Assembly: `ecall ""`
3507/// Rust: `ecall()`
3508///
3509/// # Arguments
3510pub trait EcallEmitter {
3511 fn ecall(&mut self);
3512}
3513
3514/// RISC-V `fabs.d` instruction.
3515///
3516/// # Forms
3517/// Assembly: `fabs.d rd rs1 rs2_eq_rs1`
3518/// Rust: `fabs_d(rd, rs1, rs2)`
3519///
3520/// # Arguments
3521/// - `rd` — Destination register.
3522/// - `rs1` — Source register.
3523/// - `rs2` — Source register.
3524pub trait FabsDEmitter<T0, T1, T2> {
3525 fn fabs_d(&mut self, rd: T0, rs1: T1, rs2: T2);
3526}
3527
3528/// RISC-V `fabs.h` instruction.
3529///
3530/// # Forms
3531/// Assembly: `fabs.h rd rs1 rs2_eq_rs1`
3532/// Rust: `fabs_h(rd, rs1, rs2)`
3533///
3534/// # Arguments
3535/// - `rd` — Destination register.
3536/// - `rs1` — Source register.
3537/// - `rs2` — Source register.
3538pub trait FabsHEmitter<T0, T1, T2> {
3539 fn fabs_h(&mut self, rd: T0, rs1: T1, rs2: T2);
3540}
3541
3542/// RISC-V `fabs.q` instruction.
3543///
3544/// # Forms
3545/// Assembly: `fabs.q rd rs1 rs2_eq_rs1`
3546/// Rust: `fabs_q(rd, rs1, rs2)`
3547///
3548/// # Arguments
3549/// - `rd` — Destination register.
3550/// - `rs1` — Source register.
3551/// - `rs2` — Source register.
3552pub trait FabsQEmitter<T0, T1, T2> {
3553 fn fabs_q(&mut self, rd: T0, rs1: T1, rs2: T2);
3554}
3555
3556/// RISC-V `fabs.s` instruction.
3557///
3558/// # Forms
3559/// Assembly: `fabs.s rd rs1 rs2_eq_rs1`
3560/// Rust: `fabs_s(rd, rs1, rs2)`
3561///
3562/// # Arguments
3563/// - `rd` — Destination register.
3564/// - `rs1` — Source register.
3565/// - `rs2` — Source register.
3566pub trait FabsSEmitter<T0, T1, T2> {
3567 fn fabs_s(&mut self, rd: T0, rs1: T1, rs2: T2);
3568}
3569
3570/// RISC-V `fadd.d` instruction.
3571///
3572/// # Forms
3573/// Assembly: `fadd.d xd, xs1, xs2, rm`
3574/// Rust: `fadd_d(rd, rs1, rs2, rm)`
3575///
3576/// # Arguments
3577/// - `rd` — Destination register.
3578/// - `rs1` — Source register.
3579/// - `rs2` — Source register.
3580/// - `rm` — Rounding mode.
3581pub trait FaddDEmitter<T0, T1, T2, T3> {
3582 fn fadd_d(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
3583}
3584
3585/// RISC-V `fadd.h` instruction.
3586///
3587/// # Forms
3588/// Assembly: `fadd.h xd, xs1, xs2, rm`
3589/// Rust: `fadd_h(rd, rs1, rs2, rm)`
3590///
3591/// # Arguments
3592/// - `rd` — Destination register.
3593/// - `rs1` — Source register.
3594/// - `rs2` — Source register.
3595/// - `rm` — Rounding mode.
3596pub trait FaddHEmitter<T0, T1, T2, T3> {
3597 fn fadd_h(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
3598}
3599
3600/// RISC-V `fadd.q` instruction.
3601///
3602/// # Forms
3603/// Assembly: `fadd.q qd, qs1, qs2, rm`
3604/// Rust: `fadd_q(rd, rs1, rs2, rm)`
3605///
3606/// # Arguments
3607/// - `rd` — Destination register.
3608/// - `rs1` — Source register.
3609/// - `rs2` — Source register.
3610/// - `rm` — Rounding mode.
3611pub trait FaddQEmitter<T0, T1, T2, T3> {
3612 fn fadd_q(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
3613}
3614
3615/// Single-precision floating-point addition
3616///
3617/// Do the single-precision floating-point addition of fs1 and fs2 and store the result in fd.
3618/// rm is the dynamic Rounding Mode.
3619///
3620/// # Forms
3621/// Assembly: `fadd.s fd, fs1, fs2, rm`
3622/// Rust: `fadd_s(rd, rs1, rs2, rm)`
3623///
3624/// # Arguments
3625/// - `rd` — Destination register.
3626/// - `rs1` — Source register.
3627/// - `rs2` — Source register.
3628/// - `rm` — Rounding mode.
3629pub trait FaddSEmitter<T0, T1, T2, T3> {
3630 fn fadd_s(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
3631}
3632
3633/// RISC-V `fclass.d` instruction.
3634///
3635/// # Forms
3636/// Assembly: `fclass.d xd, xs1`
3637/// Rust: `fclass_d(rd, rs1)`
3638///
3639/// # Arguments
3640/// - `rd` — Destination register.
3641/// - `rs1` — Source register.
3642pub trait FclassDEmitter<T0, T1> {
3643 fn fclass_d(&mut self, rd: T0, rs1: T1);
3644}
3645
3646/// RISC-V `fclass.h` instruction.
3647///
3648/// # Forms
3649/// Assembly: `fclass.h xd, xs1`
3650/// Rust: `fclass_h(rd, rs1)`
3651///
3652/// # Arguments
3653/// - `rd` — Destination register.
3654/// - `rs1` — Source register.
3655pub trait FclassHEmitter<T0, T1> {
3656 fn fclass_h(&mut self, rd: T0, rs1: T1);
3657}
3658
3659/// RISC-V `fclass.q` instruction.
3660///
3661/// # Forms
3662/// Assembly: `fclass.q xd, qs1`
3663/// Rust: `fclass_q(rd, rs1)`
3664///
3665/// # Arguments
3666/// - `rd` — Destination register.
3667/// - `rs1` — Source register.
3668pub trait FclassQEmitter<T0, T1> {
3669 fn fclass_q(&mut self, rd: T0, rs1: T1);
3670}
3671
3672/// Single-precision floating-point classify.
3673///
3674/// The `fclass.s` instruction examines the value in floating-point register
3675/// _fs1_ and writes to integer register _rd_ a 10-bit mask that indicates
3676/// the class of the floating-point number.
3677/// The format of the mask is described in the table below.
3678/// The corresponding bit in _rd_ will be set if the property is true and
3679/// clear otherwise.
3680/// All other bits in _rd_ are cleared.
3681/// Note that exactly one bit in rd will be set.
3682/// `fclass.s` does not set the floating-point exception flags.
3683///
3684/// .Format of result of `fclass` instruction.
3685/// \[%autowidth,float="center",align="center",cols="^,<",options="header",\]
3686/// |===
3687/// |_rd_ bit |Meaning
3688/// |0 |_rs1_ is latexmath:\[$-\infty$\].
3689/// |1 |_rs1_ is a negative normal number.
3690/// |2 |_rs1_ is a negative subnormal number.
3691/// |3 |_rs1_ is latexmath:\[$-0$\].
3692/// |4 |_rs1_ is latexmath:\[$+0$\].
3693/// |5 |_rs1_ is a positive subnormal number.
3694/// |6 |_rs1_ is a positive normal number.
3695/// |7 |_rs1_ is latexmath:\[$+\infty$\].
3696/// |8 |_rs1_ is a signaling NaN.
3697/// |9 |_rs1_ is a quiet NaN.
3698/// |===
3699///
3700/// # Forms
3701/// Assembly: `fclass.s xd, fs1`
3702/// Rust: `fclass_s(rd, rs1)`
3703///
3704/// # Arguments
3705/// - `rd` — Destination register.
3706/// - `rs1` — Source register.
3707pub trait FclassSEmitter<T0, T1> {
3708 fn fclass_s(&mut self, rd: T0, rs1: T1);
3709}
3710
3711/// RISC-V `fcvt.bf16.s` instruction.
3712///
3713/// # Forms
3714/// Assembly: `fcvt.bf16.s xd, xs1, rm`
3715/// Rust: `fcvt_bf16_s(rd, rs1, rm)`
3716///
3717/// # Arguments
3718/// - `rd` — Destination register.
3719/// - `rs1` — Source register.
3720/// - `rm` — Rounding mode.
3721pub trait FcvtBf16SEmitter<T0, T1, T2> {
3722 fn fcvt_bf16_s(&mut self, rd: T0, rs1: T1, rm: T2);
3723}
3724
3725/// RISC-V `fcvt.d.h` instruction.
3726///
3727/// # Forms
3728/// Assembly: `fcvt.d.h xd, xs1, rm`
3729/// Rust: `fcvt_d_h(rd, rs1, rm)`
3730///
3731/// # Arguments
3732/// - `rd` — Destination register.
3733/// - `rs1` — Source register.
3734/// - `rm` — Rounding mode.
3735pub trait FcvtDHEmitter<T0, T1, T2> {
3736 fn fcvt_d_h(&mut self, rd: T0, rs1: T1, rm: T2);
3737}
3738
3739/// RISC-V `fcvt.d.l` instruction.
3740///
3741/// # Forms
3742/// Assembly: `fcvt.d.l xd, xs1, rm`
3743/// Rust: `fcvt_d_l(rd, rs1, rm)`
3744///
3745/// # Arguments
3746/// - `rd` — Destination register.
3747/// - `rs1` — Source register.
3748/// - `rm` — Rounding mode.
3749pub trait FcvtDLEmitter<T0, T1, T2> {
3750 fn fcvt_d_l(&mut self, rd: T0, rs1: T1, rm: T2);
3751}
3752
3753/// RISC-V `fcvt.d.lu` instruction.
3754///
3755/// # Forms
3756/// Assembly: `fcvt.d.lu xd, xs1, rm`
3757/// Rust: `fcvt_d_lu(rd, rs1, rm)`
3758///
3759/// # Arguments
3760/// - `rd` — Destination register.
3761/// - `rs1` — Source register.
3762/// - `rm` — Rounding mode.
3763pub trait FcvtDLuEmitter<T0, T1, T2> {
3764 fn fcvt_d_lu(&mut self, rd: T0, rs1: T1, rm: T2);
3765}
3766
3767/// RISC-V `fcvt.d.q` instruction.
3768///
3769/// # Forms
3770/// Assembly: `fcvt.d.q xd, qs1, rm`
3771/// Rust: `fcvt_d_q(rd, rs1, rm)`
3772///
3773/// # Arguments
3774/// - `rd` — Destination register.
3775/// - `rs1` — Source register.
3776/// - `rm` — Rounding mode.
3777pub trait FcvtDQEmitter<T0, T1, T2> {
3778 fn fcvt_d_q(&mut self, rd: T0, rs1: T1, rm: T2);
3779}
3780
3781/// RISC-V `fcvt.d.s` instruction.
3782///
3783/// # Forms
3784/// Assembly: `fcvt.d.s xd, xs1, rm`
3785/// Rust: `fcvt_d_s(rd, rs1, rm)`
3786///
3787/// # Arguments
3788/// - `rd` — Destination register.
3789/// - `rs1` — Source register.
3790/// - `rm` — Rounding mode.
3791pub trait FcvtDSEmitter<T0, T1, T2> {
3792 fn fcvt_d_s(&mut self, rd: T0, rs1: T1, rm: T2);
3793}
3794
3795/// RISC-V `fcvt.d.w` instruction.
3796///
3797/// # Forms
3798/// Assembly: `fcvt.d.w xd, xs1, rm`
3799/// Rust: `fcvt_d_w(rd, rs1, rm)`
3800///
3801/// # Arguments
3802/// - `rd` — Destination register.
3803/// - `rs1` — Source register.
3804/// - `rm` — Rounding mode.
3805pub trait FcvtDWEmitter<T0, T1, T2> {
3806 fn fcvt_d_w(&mut self, rd: T0, rs1: T1, rm: T2);
3807}
3808
3809/// RISC-V `fcvt.d.wu` instruction.
3810///
3811/// # Forms
3812/// Assembly: `fcvt.d.wu xd, xs1, rm`
3813/// Rust: `fcvt_d_wu(rd, rs1, rm)`
3814///
3815/// # Arguments
3816/// - `rd` — Destination register.
3817/// - `rs1` — Source register.
3818/// - `rm` — Rounding mode.
3819pub trait FcvtDWuEmitter<T0, T1, T2> {
3820 fn fcvt_d_wu(&mut self, rd: T0, rs1: T1, rm: T2);
3821}
3822
3823/// RISC-V `fcvt.h.d` instruction.
3824///
3825/// # Forms
3826/// Assembly: `fcvt.h.d xd, xs1, rm`
3827/// Rust: `fcvt_h_d(rd, rs1, rm)`
3828///
3829/// # Arguments
3830/// - `rd` — Destination register.
3831/// - `rs1` — Source register.
3832/// - `rm` — Rounding mode.
3833pub trait FcvtHDEmitter<T0, T1, T2> {
3834 fn fcvt_h_d(&mut self, rd: T0, rs1: T1, rm: T2);
3835}
3836
3837/// RISC-V `fcvt.h.l` instruction.
3838///
3839/// # Forms
3840/// Assembly: `fcvt.h.l xd, xs1, rm`
3841/// Rust: `fcvt_h_l(rd, rs1, rm)`
3842///
3843/// # Arguments
3844/// - `rd` — Destination register.
3845/// - `rs1` — Source register.
3846/// - `rm` — Rounding mode.
3847pub trait FcvtHLEmitter<T0, T1, T2> {
3848 fn fcvt_h_l(&mut self, rd: T0, rs1: T1, rm: T2);
3849}
3850
3851/// RISC-V `fcvt.h.lu` instruction.
3852///
3853/// # Forms
3854/// Assembly: `fcvt.h.lu xd, xs1, rm`
3855/// Rust: `fcvt_h_lu(rd, rs1, rm)`
3856///
3857/// # Arguments
3858/// - `rd` — Destination register.
3859/// - `rs1` — Source register.
3860/// - `rm` — Rounding mode.
3861pub trait FcvtHLuEmitter<T0, T1, T2> {
3862 fn fcvt_h_lu(&mut self, rd: T0, rs1: T1, rm: T2);
3863}
3864
3865/// RISC-V `fcvt.h.q` instruction.
3866///
3867/// # Forms
3868/// Assembly: `fcvt.h.q xd, qs1, rm`
3869/// Rust: `fcvt_h_q(rd, rs1, rm)`
3870///
3871/// # Arguments
3872/// - `rd` — Destination register.
3873/// - `rs1` — Source register.
3874/// - `rm` — Rounding mode.
3875pub trait FcvtHQEmitter<T0, T1, T2> {
3876 fn fcvt_h_q(&mut self, rd: T0, rs1: T1, rm: T2);
3877}
3878
3879/// Convert half-precision float to a single-precision float
3880///
3881/// Converts a half-precision number in floating-point register _fs1_ into a single-precision floating-point number in
3882/// floating-point register _fd_.
3883///
3884/// `fcvt.h.s` rounds according to the _rm_ field.
3885///
3886/// All floating-point conversion instructions set the Inexact exception flag if the rounded
3887/// result differs from the operand value and the Invalid exception flag is not set.
3888///
3889/// # Forms
3890/// Assembly: `fcvt.h.s fd, xs1`
3891/// Rust: `fcvt_h_s(rd, rs1, rm)`
3892///
3893/// # Arguments
3894/// - `rd` — Destination register.
3895/// - `rs1` — Source register.
3896/// - `rm` — Rounding mode.
3897pub trait FcvtHSEmitter<T0, T1, T2> {
3898 fn fcvt_h_s(&mut self, rd: T0, rs1: T1, rm: T2);
3899}
3900
3901/// RISC-V `fcvt.h.w` instruction.
3902///
3903/// # Forms
3904/// Assembly: `fcvt.h.w xd, xs1, rm`
3905/// Rust: `fcvt_h_w(rd, rs1, rm)`
3906///
3907/// # Arguments
3908/// - `rd` — Destination register.
3909/// - `rs1` — Source register.
3910/// - `rm` — Rounding mode.
3911pub trait FcvtHWEmitter<T0, T1, T2> {
3912 fn fcvt_h_w(&mut self, rd: T0, rs1: T1, rm: T2);
3913}
3914
3915/// RISC-V `fcvt.h.wu` instruction.
3916///
3917/// # Forms
3918/// Assembly: `fcvt.h.wu xd, xs1, rm`
3919/// Rust: `fcvt_h_wu(rd, rs1, rm)`
3920///
3921/// # Arguments
3922/// - `rd` — Destination register.
3923/// - `rs1` — Source register.
3924/// - `rm` — Rounding mode.
3925pub trait FcvtHWuEmitter<T0, T1, T2> {
3926 fn fcvt_h_wu(&mut self, rd: T0, rs1: T1, rm: T2);
3927}
3928
3929/// RISC-V `fcvt.l.d` instruction.
3930///
3931/// # Forms
3932/// Assembly: `fcvt.l.d xd, xs1, rm`
3933/// Rust: `fcvt_l_d(rd, rs1, rm)`
3934///
3935/// # Arguments
3936/// - `rd` — Destination register.
3937/// - `rs1` — Source register.
3938/// - `rm` — Rounding mode.
3939pub trait FcvtLDEmitter<T0, T1, T2> {
3940 fn fcvt_l_d(&mut self, rd: T0, rs1: T1, rm: T2);
3941}
3942
3943/// RISC-V `fcvt.l.h` instruction.
3944///
3945/// # Forms
3946/// Assembly: `fcvt.l.h xd, xs1, rm`
3947/// Rust: `fcvt_l_h(rd, rs1, rm)`
3948///
3949/// # Arguments
3950/// - `rd` — Destination register.
3951/// - `rs1` — Source register.
3952/// - `rm` — Rounding mode.
3953pub trait FcvtLHEmitter<T0, T1, T2> {
3954 fn fcvt_l_h(&mut self, rd: T0, rs1: T1, rm: T2);
3955}
3956
3957/// RISC-V `fcvt.l.q` instruction.
3958///
3959/// # Forms
3960/// Assembly: `fcvt.l.q xd, qs1, rm`
3961/// Rust: `fcvt_l_q(rd, rs1, rm)`
3962///
3963/// # Arguments
3964/// - `rd` — Destination register.
3965/// - `rs1` — Source register.
3966/// - `rm` — Rounding mode.
3967pub trait FcvtLQEmitter<T0, T1, T2> {
3968 fn fcvt_l_q(&mut self, rd: T0, rs1: T1, rm: T2);
3969}
3970
3971/// RISC-V `fcvt.l.s` instruction.
3972///
3973/// # Forms
3974/// Assembly: `fcvt.l.s xd, fs1, rm`
3975/// Rust: `fcvt_l_s(rd, rs1, rm)`
3976///
3977/// # Arguments
3978/// - `rd` — Destination register.
3979/// - `rs1` — Source register.
3980/// - `rm` — Rounding mode.
3981pub trait FcvtLSEmitter<T0, T1, T2> {
3982 fn fcvt_l_s(&mut self, rd: T0, rs1: T1, rm: T2);
3983}
3984
3985/// RISC-V `fcvt.lu.d` instruction.
3986///
3987/// # Forms
3988/// Assembly: `fcvt.lu.d xd, xs1, rm`
3989/// Rust: `fcvt_lu_d(rd, rs1, rm)`
3990///
3991/// # Arguments
3992/// - `rd` — Destination register.
3993/// - `rs1` — Source register.
3994/// - `rm` — Rounding mode.
3995pub trait FcvtLuDEmitter<T0, T1, T2> {
3996 fn fcvt_lu_d(&mut self, rd: T0, rs1: T1, rm: T2);
3997}
3998
3999/// RISC-V `fcvt.lu.h` instruction.
4000///
4001/// # Forms
4002/// Assembly: `fcvt.lu.h xd, xs1, rm`
4003/// Rust: `fcvt_lu_h(rd, rs1, rm)`
4004///
4005/// # Arguments
4006/// - `rd` — Destination register.
4007/// - `rs1` — Source register.
4008/// - `rm` — Rounding mode.
4009pub trait FcvtLuHEmitter<T0, T1, T2> {
4010 fn fcvt_lu_h(&mut self, rd: T0, rs1: T1, rm: T2);
4011}
4012
4013/// RISC-V `fcvt.lu.q` instruction.
4014///
4015/// # Forms
4016/// Assembly: `fcvt.lu.q qd, hs1, rm`
4017/// Rust: `fcvt_lu_q(rd, rs1, rm)`
4018///
4019/// # Arguments
4020/// - `rd` — Destination register.
4021/// - `rs1` — Source register.
4022/// - `rm` — Rounding mode.
4023pub trait FcvtLuQEmitter<T0, T1, T2> {
4024 fn fcvt_lu_q(&mut self, rd: T0, rs1: T1, rm: T2);
4025}
4026
4027/// RISC-V `fcvt.lu.s` instruction.
4028///
4029/// # Forms
4030/// Assembly: `fcvt.lu.s xd, fs1, rm`
4031/// Rust: `fcvt_lu_s(rd, rs1, rm)`
4032///
4033/// # Arguments
4034/// - `rd` — Destination register.
4035/// - `rs1` — Source register.
4036/// - `rm` — Rounding mode.
4037pub trait FcvtLuSEmitter<T0, T1, T2> {
4038 fn fcvt_lu_s(&mut self, rd: T0, rs1: T1, rm: T2);
4039}
4040
4041/// RISC-V `fcvt.q.d` instruction.
4042///
4043/// # Forms
4044/// Assembly: `fcvt.q.d dd, fs1, rm`
4045/// Rust: `fcvt_q_d(rd, rs1, rm)`
4046///
4047/// # Arguments
4048/// - `rd` — Destination register.
4049/// - `rs1` — Source register.
4050/// - `rm` — Rounding mode.
4051pub trait FcvtQDEmitter<T0, T1, T2> {
4052 fn fcvt_q_d(&mut self, rd: T0, rs1: T1, rm: T2);
4053}
4054
4055/// RISC-V `fcvt.q.h` instruction.
4056///
4057/// # Forms
4058/// Assembly: `fcvt.q.h hd, qs1, rm`
4059/// Rust: `fcvt_q_h(rd, rs1, rm)`
4060///
4061/// # Arguments
4062/// - `rd` — Destination register.
4063/// - `rs1` — Source register.
4064/// - `rm` — Rounding mode.
4065pub trait FcvtQHEmitter<T0, T1, T2> {
4066 fn fcvt_q_h(&mut self, rd: T0, rs1: T1, rm: T2);
4067}
4068
4069/// RISC-V `fcvt.q.l` instruction.
4070///
4071/// # Forms
4072/// Assembly: `fcvt.q.l qd, xs1, rm`
4073/// Rust: `fcvt_q_l(rd, rs1, rm)`
4074///
4075/// # Arguments
4076/// - `rd` — Destination register.
4077/// - `rs1` — Source register.
4078/// - `rm` — Rounding mode.
4079pub trait FcvtQLEmitter<T0, T1, T2> {
4080 fn fcvt_q_l(&mut self, rd: T0, rs1: T1, rm: T2);
4081}
4082
4083/// RISC-V `fcvt.q.lu` instruction.
4084///
4085/// # Forms
4086/// Assembly: `fcvt.q.lu qd, xs1, rm`
4087/// Rust: `fcvt_q_lu(rd, rs1, rm)`
4088///
4089/// # Arguments
4090/// - `rd` — Destination register.
4091/// - `rs1` — Source register.
4092/// - `rm` — Rounding mode.
4093pub trait FcvtQLuEmitter<T0, T1, T2> {
4094 fn fcvt_q_lu(&mut self, rd: T0, rs1: T1, rm: T2);
4095}
4096
4097/// RISC-V `fcvt.q.s` instruction.
4098///
4099/// # Forms
4100/// Assembly: `fcvt.q.s qd, fs1, rm`
4101/// Rust: `fcvt_q_s(rd, rs1, rm)`
4102///
4103/// # Arguments
4104/// - `rd` — Destination register.
4105/// - `rs1` — Source register.
4106/// - `rm` — Rounding mode.
4107pub trait FcvtQSEmitter<T0, T1, T2> {
4108 fn fcvt_q_s(&mut self, rd: T0, rs1: T1, rm: T2);
4109}
4110
4111/// RISC-V `fcvt.q.w` instruction.
4112///
4113/// # Forms
4114/// Assembly: `fcvt.q.w fd, xs1, rm`
4115/// Rust: `fcvt_q_w(rd, rs1, rm)`
4116///
4117/// # Arguments
4118/// - `rd` — Destination register.
4119/// - `rs1` — Source register.
4120/// - `rm` — Rounding mode.
4121pub trait FcvtQWEmitter<T0, T1, T2> {
4122 fn fcvt_q_w(&mut self, rd: T0, rs1: T1, rm: T2);
4123}
4124
4125/// RISC-V `fcvt.q.wu` instruction.
4126///
4127/// # Forms
4128/// Assembly: `fcvt.q.wu qd, xs1, rm`
4129/// Rust: `fcvt_q_wu(rd, rs1, rm)`
4130///
4131/// # Arguments
4132/// - `rd` — Destination register.
4133/// - `rs1` — Source register.
4134/// - `rm` — Rounding mode.
4135pub trait FcvtQWuEmitter<T0, T1, T2> {
4136 fn fcvt_q_wu(&mut self, rd: T0, rs1: T1, rm: T2);
4137}
4138
4139/// RISC-V `fcvt.s.bf16` instruction.
4140///
4141/// # Forms
4142/// Assembly: `fcvt.s.bf16 xd, xs1, rm`
4143/// Rust: `fcvt_s_bf16(rd, rs1, rm)`
4144///
4145/// # Arguments
4146/// - `rd` — Destination register.
4147/// - `rs1` — Source register.
4148/// - `rm` — Rounding mode.
4149pub trait FcvtSBf16Emitter<T0, T1, T2> {
4150 fn fcvt_s_bf16(&mut self, rd: T0, rs1: T1, rm: T2);
4151}
4152
4153/// RISC-V `fcvt.s.d` instruction.
4154///
4155/// # Forms
4156/// Assembly: `fcvt.s.d xd, xs1, rm`
4157/// Rust: `fcvt_s_d(rd, rs1, rm)`
4158///
4159/// # Arguments
4160/// - `rd` — Destination register.
4161/// - `rs1` — Source register.
4162/// - `rm` — Rounding mode.
4163pub trait FcvtSDEmitter<T0, T1, T2> {
4164 fn fcvt_s_d(&mut self, rd: T0, rs1: T1, rm: T2);
4165}
4166
4167/// Convert single-precision float to a half-precision float
4168///
4169/// Converts a single-precision number in floating-point register _fs1_ into a half-precision floating-point number in
4170/// floating-point register _fd_.
4171///
4172/// `fcvt.s.h` will never round, and so the 'rm' field is effectively ignored.
4173///
4174/// # Forms
4175/// Assembly: `fcvt.s.h fd, xs1`
4176/// Rust: `fcvt_s_h(rd, rs1, rm)`
4177///
4178/// # Arguments
4179/// - `rd` — Destination register.
4180/// - `rs1` — Source register.
4181/// - `rm` — Rounding mode.
4182pub trait FcvtSHEmitter<T0, T1, T2> {
4183 fn fcvt_s_h(&mut self, rd: T0, rs1: T1, rm: T2);
4184}
4185
4186/// RISC-V `fcvt.s.l` instruction.
4187///
4188/// # Forms
4189/// Assembly: `fcvt.s.l fd, xs1, rm`
4190/// Rust: `fcvt_s_l(rd, rs1, rm)`
4191///
4192/// # Arguments
4193/// - `rd` — Destination register.
4194/// - `rs1` — Source register.
4195/// - `rm` — Rounding mode.
4196pub trait FcvtSLEmitter<T0, T1, T2> {
4197 fn fcvt_s_l(&mut self, rd: T0, rs1: T1, rm: T2);
4198}
4199
4200/// RISC-V `fcvt.s.lu` instruction.
4201///
4202/// # Forms
4203/// Assembly: `fcvt.s.lu fd, xs1, rm`
4204/// Rust: `fcvt_s_lu(rd, rs1, rm)`
4205///
4206/// # Arguments
4207/// - `rd` — Destination register.
4208/// - `rs1` — Source register.
4209/// - `rm` — Rounding mode.
4210pub trait FcvtSLuEmitter<T0, T1, T2> {
4211 fn fcvt_s_lu(&mut self, rd: T0, rs1: T1, rm: T2);
4212}
4213
4214/// RISC-V `fcvt.s.q` instruction.
4215///
4216/// # Forms
4217/// Assembly: `fcvt.s.q fd, qs1, rm`
4218/// Rust: `fcvt_s_q(rd, rs1, rm)`
4219///
4220/// # Arguments
4221/// - `rd` — Destination register.
4222/// - `rs1` — Source register.
4223/// - `rm` — Rounding mode.
4224pub trait FcvtSQEmitter<T0, T1, T2> {
4225 fn fcvt_s_q(&mut self, rd: T0, rs1: T1, rm: T2);
4226}
4227
4228/// Convert signed 32-bit integer to single-precision float
4229///
4230/// Converts a 32-bit signed integer in integer register _rs1_ into a floating-point number in
4231/// floating-point register _fd_.
4232///
4233/// All floating-point to integer and integer to floating-point conversion instructions round
4234/// according to the _rm_ field.
4235/// A floating-point register can be initialized to floating-point positive zero using
4236/// `fcvt.s.w rd, x0`, which will never set any exception flags.
4237///
4238/// All floating-point conversion instructions set the Inexact exception flag if the rounded
4239/// result differs from the operand value and the Invalid exception flag is not set.
4240///
4241/// # Forms
4242/// Assembly: `fcvt.s.w fd, xs1`
4243/// Rust: `fcvt_s_w(rd, rs1, rm)`
4244///
4245/// # Arguments
4246/// - `rd` — Destination register.
4247/// - `rs1` — Source register.
4248/// - `rm` — Rounding mode.
4249pub trait FcvtSWEmitter<T0, T1, T2> {
4250 fn fcvt_s_w(&mut self, rd: T0, rs1: T1, rm: T2);
4251}
4252
4253/// RISC-V `fcvt.s.wu` instruction.
4254///
4255/// # Forms
4256/// Assembly: `fcvt.s.wu fd, xs1, rm`
4257/// Rust: `fcvt_s_wu(rd, rs1, rm)`
4258///
4259/// # Arguments
4260/// - `rd` — Destination register.
4261/// - `rs1` — Source register.
4262/// - `rm` — Rounding mode.
4263pub trait FcvtSWuEmitter<T0, T1, T2> {
4264 fn fcvt_s_wu(&mut self, rd: T0, rs1: T1, rm: T2);
4265}
4266
4267/// RISC-V `fcvt.w.d` instruction.
4268///
4269/// # Forms
4270/// Assembly: `fcvt.w.d xd, xs1, rm`
4271/// Rust: `fcvt_w_d(rd, rs1, rm)`
4272///
4273/// # Arguments
4274/// - `rd` — Destination register.
4275/// - `rs1` — Source register.
4276/// - `rm` — Rounding mode.
4277pub trait FcvtWDEmitter<T0, T1, T2> {
4278 fn fcvt_w_d(&mut self, rd: T0, rs1: T1, rm: T2);
4279}
4280
4281/// RISC-V `fcvt.w.h` instruction.
4282///
4283/// # Forms
4284/// Assembly: `fcvt.w.h xd, xs1, rm`
4285/// Rust: `fcvt_w_h(rd, rs1, rm)`
4286///
4287/// # Arguments
4288/// - `rd` — Destination register.
4289/// - `rs1` — Source register.
4290/// - `rm` — Rounding mode.
4291pub trait FcvtWHEmitter<T0, T1, T2> {
4292 fn fcvt_w_h(&mut self, rd: T0, rs1: T1, rm: T2);
4293}
4294
4295/// RISC-V `fcvt.w.q` instruction.
4296///
4297/// # Forms
4298/// Assembly: `fcvt.w.q xd, qs1, rm`
4299/// Rust: `fcvt_w_q(rd, rs1, rm)`
4300///
4301/// # Arguments
4302/// - `rd` — Destination register.
4303/// - `rs1` — Source register.
4304/// - `rm` — Rounding mode.
4305pub trait FcvtWQEmitter<T0, T1, T2> {
4306 fn fcvt_w_q(&mut self, rd: T0, rs1: T1, rm: T2);
4307}
4308
4309/// Convert single-precision float to integer word to signed 32-bit integer.
4310///
4311/// Converts a floating-point number in floating-point register _fs1_ to a signed 32-bit integer indicates
4312/// integer register _rd_.
4313///
4314/// For XLEN >32, `fcvt.w.s` sign-extends the 32-bit result to the destination register width.
4315///
4316/// If the rounded result is not representable as a 32-bit signed integer, it is clipped to the
4317/// nearest value and the invalid flag is set.
4318///
4319/// The range of valid inputs and behavior for invalid inputs are:
4320///
4321/// \[separator="!"\]
4322/// !===
4323/// ! ! Value
4324///
4325/// h! Minimum valid input (after rounding) ! `-2^31`
4326/// h! Maximum valid input (after rounding) ! `2^31 - 1`
4327/// h! Output for out-of-range negative input ! `-2^31`
4328/// h! Output for `-∞` ! `-2^31`
4329/// h! Output for out-of-range positive input ! `2^31 - 1`
4330/// h! Output for `+∞` for `NaN` ! `2^31 - 1`
4331/// !===
4332///
4333/// All floating-point to integer and integer to floating-point conversion instructions round
4334/// according to the _rm_ field.
4335/// A floating-point register can be initialized to floating-point positive zero using
4336/// `fcvt.s.w rd, x0`, which will never set any exception flags.
4337///
4338/// All floating-point conversion instructions set the Inexact exception flag if the rounded
4339/// result differs from the operand value and the Invalid exception flag is not set.
4340///
4341/// # Forms
4342/// Assembly: `fcvt.w.s xd, fs1`
4343/// Rust: `fcvt_w_s(rd, rs1, rm)`
4344///
4345/// # Arguments
4346/// - `rd` — Destination register.
4347/// - `rs1` — Source register.
4348/// - `rm` — Rounding mode.
4349pub trait FcvtWSEmitter<T0, T1, T2> {
4350 fn fcvt_w_s(&mut self, rd: T0, rs1: T1, rm: T2);
4351}
4352
4353/// RISC-V `fcvt.wu.d` instruction.
4354///
4355/// # Forms
4356/// Assembly: `fcvt.wu.d xd, xs1, rm`
4357/// Rust: `fcvt_wu_d(rd, rs1, rm)`
4358///
4359/// # Arguments
4360/// - `rd` — Destination register.
4361/// - `rs1` — Source register.
4362/// - `rm` — Rounding mode.
4363pub trait FcvtWuDEmitter<T0, T1, T2> {
4364 fn fcvt_wu_d(&mut self, rd: T0, rs1: T1, rm: T2);
4365}
4366
4367/// RISC-V `fcvt.wu.h` instruction.
4368///
4369/// # Forms
4370/// Assembly: `fcvt.wu.h xd, xs1, rm`
4371/// Rust: `fcvt_wu_h(rd, rs1, rm)`
4372///
4373/// # Arguments
4374/// - `rd` — Destination register.
4375/// - `rs1` — Source register.
4376/// - `rm` — Rounding mode.
4377pub trait FcvtWuHEmitter<T0, T1, T2> {
4378 fn fcvt_wu_h(&mut self, rd: T0, rs1: T1, rm: T2);
4379}
4380
4381/// RISC-V `fcvt.wu.q` instruction.
4382///
4383/// # Forms
4384/// Assembly: `fcvt.wu.q xd, xs1, rm`
4385/// Rust: `fcvt_wu_q(rd, rs1, rm)`
4386///
4387/// # Arguments
4388/// - `rd` — Destination register.
4389/// - `rs1` — Source register.
4390/// - `rm` — Rounding mode.
4391pub trait FcvtWuQEmitter<T0, T1, T2> {
4392 fn fcvt_wu_q(&mut self, rd: T0, rs1: T1, rm: T2);
4393}
4394
4395/// RISC-V `fcvt.wu.s` instruction.
4396///
4397/// # Forms
4398/// Assembly: `fcvt.wu.s xd, fs1, rm`
4399/// Rust: `fcvt_wu_s(rd, rs1, rm)`
4400///
4401/// # Arguments
4402/// - `rd` — Destination register.
4403/// - `rs1` — Source register.
4404/// - `rm` — Rounding mode.
4405pub trait FcvtWuSEmitter<T0, T1, T2> {
4406 fn fcvt_wu_s(&mut self, rd: T0, rs1: T1, rm: T2);
4407}
4408
4409/// RISC-V `fcvtmod.w.d` instruction.
4410///
4411/// # Forms
4412/// Assembly: `fcvtmod.w.d xd, xs1`
4413/// Rust: `fcvtmod_w_d(rd, rs1)`
4414///
4415/// # Arguments
4416/// - `rd` — Destination register.
4417/// - `rs1` — Source register.
4418pub trait FcvtmodWDEmitter<T0, T1> {
4419 fn fcvtmod_w_d(&mut self, rd: T0, rs1: T1);
4420}
4421
4422/// RISC-V `fdiv.d` instruction.
4423///
4424/// # Forms
4425/// Assembly: `fdiv.d xd, xs1, xs2, rm`
4426/// Rust: `fdiv_d(rd, rs1, rs2, rm)`
4427///
4428/// # Arguments
4429/// - `rd` — Destination register.
4430/// - `rs1` — Source register.
4431/// - `rs2` — Source register.
4432/// - `rm` — Rounding mode.
4433pub trait FdivDEmitter<T0, T1, T2, T3> {
4434 fn fdiv_d(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
4435}
4436
4437/// RISC-V `fdiv.h` instruction.
4438///
4439/// # Forms
4440/// Assembly: `fdiv.h xd, xs1, xs2, rm`
4441/// Rust: `fdiv_h(rd, rs1, rs2, rm)`
4442///
4443/// # Arguments
4444/// - `rd` — Destination register.
4445/// - `rs1` — Source register.
4446/// - `rs2` — Source register.
4447/// - `rm` — Rounding mode.
4448pub trait FdivHEmitter<T0, T1, T2, T3> {
4449 fn fdiv_h(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
4450}
4451
4452/// RISC-V `fdiv.q` instruction.
4453///
4454/// # Forms
4455/// Assembly: `fdiv.q qd, qs1, qs2, rm`
4456/// Rust: `fdiv_q(rd, rs1, rs2, rm)`
4457///
4458/// # Arguments
4459/// - `rd` — Destination register.
4460/// - `rs1` — Source register.
4461/// - `rs2` — Source register.
4462/// - `rm` — Rounding mode.
4463pub trait FdivQEmitter<T0, T1, T2, T3> {
4464 fn fdiv_q(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
4465}
4466
4467/// RISC-V `fdiv.s` instruction.
4468///
4469/// # Forms
4470/// Assembly: `fdiv.s fd, fs1, fs2, rm`
4471/// Rust: `fdiv_s(rd, rs1, rs2, rm)`
4472///
4473/// # Arguments
4474/// - `rd` — Destination register.
4475/// - `rs1` — Source register.
4476/// - `rs2` — Source register.
4477/// - `rm` — Rounding mode.
4478pub trait FdivSEmitter<T0, T1, T2, T3> {
4479 fn fdiv_s(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
4480}
4481
4482/// Memory ordering fence
4483///
4484/// Orders memory operations.
4485///
4486/// The `fence` instruction is used to order device I/O and memory accesses as
4487/// viewed by other RISC-V harts and external devices or coprocessors. Any
4488/// combination of device input (I), device output (O), memory reads \(R),
4489/// and memory writes (W) may be ordered with respect to any combination of
4490/// the same. Informally, no other RISC-V hart or external device can
4491/// observe any operation in the _successor_ set following a `fence` before
4492/// any operation in the _predecessor_ set preceding the `fence`.
4493///
4494/// The predecessor and successor fields have the same format to specify operation types:
4495///
4496/// \[%autowidth\]
4497/// |===
4498/// 4+| `pred` 4+| `succ`
4499///
4500/// | 27 | 26 |25 | 24 | 23 | 22 | 21| 20
4501/// | PI | PO |PR | PW | SI | SO |SR | SW
4502/// |===
4503///
4504/// \[%autowidth,align="center",cols="^1,^1,<3",options="header"\]
4505/// .Fence mode encoding
4506/// |===
4507/// |_fm_ field |Mnemonic |Meaning
4508/// |0000 |_none_ |Normal Fence
4509/// |1000 |TSO |With `FENCE RW,RW`: exclude write-to-read ordering; otherwise: _Reserved for future use._
4510/// 2+|_other_ |_Reserved for future use._
4511/// |===
4512///
4513/// When the mode field _fm_ is `0001` and both the predecessor and successor sets are 'RW',
4514/// then the instruction acts as a special-case `fence.tso`. `fence.tso` orders all load operations
4515/// in its predecessor set before all memory operations in its successor set, and all store operations
4516/// in its predecessor set before all store operations in its successor set. This leaves non-AMO store
4517/// operations in the 'fence.tso's predecessor set unordered with non-AMO loads in its successor set.
4518///
4519/// When mode field _fm_ is not `0001`, or when mode field _fm_ is `0001` but the _pred_ and
4520/// _succ_ fields are not both 'RW' (0x3), then the fence acts as a baseline fence (_e.g._, _fm_ is
4521/// effectively `0000`). This is unaffected by the FIOM bits, described below (implicit promotion does
4522/// not change how `fence.tso` is decoded).
4523///
4524/// The `rs1` and `rd` fields are unused and ignored.
4525///
4526/// In modes other than M-mode, `fence` is further affected by `menvcfg.FIOM`,
4527/// `senvcfg.FIOM`<% if ext?(:H) %>, and/or `henvcfg.FIOM`<% end %>
4528/// as follows:
4529///
4530/// .Effective PR/PW/SR/SW in (H)S-mode
4531/// \[%autowidth,cols=",,,",options="header",separator="!"\]
4532/// !===
4533/// ! \[.rotate\]#`menvcfg.FIOM`# ! `pred.PI` +
4534/// `pred.PO` +
4535/// `succ.SI` +
4536/// `succ.SO`
4537/// ! -> +
4538/// -> +
4539/// -> +
4540/// ->
4541/// ! effective `PR` +
4542/// effective `PW` +
4543/// effective `SR` +
4544/// effective `SW`
4545///
4546/// ! 0 ! - ! ! from encoding
4547/// ! 1 ! 0 ! ! from encoding
4548/// ! 1 ! 1 ! ! 1
4549/// !===
4550///
4551/// .Effective PR/PW/SR/SW in U-mode
4552/// \[%autowidth,options="header",separator="!",cols=",,,,"\]
4553/// !===
4554/// ! \[.rotate\]#`menvcfg.FIOM`# ! \[.rotate\]#`senvcfg.FIOM`# ! `pred.PI` +
4555/// `pred.PO` +
4556/// `succ.SI` +
4557/// `succ.SO`
4558/// ! -> +
4559/// -> +
4560/// -> +
4561/// ->
4562/// ! effective `PR` +
4563/// effective `PW` +
4564/// effective `SR` +
4565/// effective `SW`
4566///
4567/// ! 0 ! 0 ! - ! ! from encoding
4568/// ! 0 ! 1 ! 0 ! ! from encoding
4569/// ! 0 ! 1 ! 1 ! ! 1
4570/// ! 1 ! - ! 0 ! ! from encoding
4571/// ! 1 ! - ! 1 ! ! 1
4572/// !===
4573///
4574/// <%- if ext?(:H) -%>
4575/// .Effective PR/PW/SR/SW in VS-mode and VU-mode
4576/// \[%autowidth,options="header",separator="!",cols=",,,,"\]
4577/// !===
4578/// ! \[.rotate\]#`menvcfg.FIOM`# ! \[.rotate\]#`henvcfg.FIOM`# ! `pred.PI` +
4579/// `pred.PO` +
4580/// `succ.SI` +
4581/// `succ.SO`
4582/// ! -> +
4583/// -> +
4584/// -> +
4585/// ->
4586/// ! effective `PR` +
4587/// effective `PW` +
4588/// effective `SR` +
4589/// effective `SW`
4590///
4591/// ! 0 ! 0 ! - ! ! from encoding
4592/// ! 0 ! 1 ! 0 ! ! from encoding
4593/// ! 0 ! 1 ! 1 ! ! 1
4594/// ! 1 ! - ! 0 ! ! from encoding
4595/// ! 1 ! - ! 1 ! ! 1
4596/// !===
4597/// <%- end -%>
4598///
4599/// # Forms
4600/// Assembly: `fence "TODO"`
4601/// Rust: `fence(fm, pred, succ, rs1, rd)`
4602///
4603/// # Arguments
4604/// - `fm` — Immediate encoding value.
4605/// - `pred` — Immediate encoding value.
4606/// - `succ` — Immediate encoding value.
4607/// - `rs1` — Source register.
4608/// - `rd` — Destination/source register.
4609pub trait FenceEmitter<T0, T1, T2, T3, T4> {
4610 fn fence(&mut self, fm: T0, pred: T1, succ: T2, rs1: T3, rd: T4);
4611}
4612
4613/// Instruction fence
4614///
4615/// The FENCE.I instruction is used to synchronize the instruction and data
4616/// streams. RISC-V does not guarantee that stores to instruction memory
4617/// will be made visible to instruction fetches on a RISC-V hart until that
4618/// hart executes a FENCE.I instruction. A FENCE.I instruction ensures that
4619/// a subsequent instruction fetch on a RISC-V hart will see any previous
4620/// data stores already visible to the same RISC-V hart. FENCE.I does _not_
4621/// ensure that other RISC-V harts' instruction fetches will observe the
4622/// local hart's stores in a multiprocessor system. To make a store to
4623/// instruction memory visible to all RISC-V harts, the writing hart also
4624/// has to execute a data FENCE before requesting that all remote RISC-V
4625/// harts execute a FENCE.I.
4626///
4627/// The unused fields in the FENCE.I instruction, _imm\[11:0\]_, _rs1_, and
4628/// _rd_, are reserved for finer-grain fences in future extensions. For
4629/// forward compatibility, base implementations shall ignore these fields,
4630/// and standard software shall zero these fields.
4631/// (((FENCE.I, finer-grained)))
4632/// (((FENCE.I, forward compatibility)))
4633///
4634/// \[NOTE\]
4635/// ====
4636/// Because FENCE.I only orders stores with a hart's own instruction
4637/// fetches, application code should only rely upon FENCE.I if the
4638/// application thread will not be migrated to a different hart. The EEI can
4639/// provide mechanisms for efficient multiprocessor instruction-stream
4640/// synchronization.
4641/// ====
4642///
4643/// # Forms
4644/// Assembly: `fence.i ""`
4645/// Rust: `fence_i()`
4646///
4647/// # Arguments
4648pub trait FenceIEmitter {
4649 fn fence_i(&mut self);
4650}
4651
4652/// RISC-V `fence.tso` instruction.
4653///
4654/// # Forms
4655/// Assembly: `fence.tso`
4656/// Rust: `fence_tso()`
4657///
4658/// # Arguments
4659pub trait FenceTsoEmitter {
4660 fn fence_tso(&mut self);
4661}
4662
4663/// RISC-V `feq.d` instruction.
4664///
4665/// # Forms
4666/// Assembly: `feq.d xd, xs1, xs2`
4667/// Rust: `feq_d(rd, rs1, rs2)`
4668///
4669/// # Arguments
4670/// - `rd` — Destination register.
4671/// - `rs1` — Source register.
4672/// - `rs2` — Source register.
4673pub trait FeqDEmitter<T0, T1, T2> {
4674 fn feq_d(&mut self, rd: T0, rs1: T1, rs2: T2);
4675}
4676
4677/// RISC-V `feq.h` instruction.
4678///
4679/// # Forms
4680/// Assembly: `feq.h xd, xs1, xs2`
4681/// Rust: `feq_h(rd, rs1, rs2)`
4682///
4683/// # Arguments
4684/// - `rd` — Destination register.
4685/// - `rs1` — Source register.
4686/// - `rs2` — Source register.
4687pub trait FeqHEmitter<T0, T1, T2> {
4688 fn feq_h(&mut self, rd: T0, rs1: T1, rs2: T2);
4689}
4690
4691/// RISC-V `feq.q` instruction.
4692///
4693/// # Forms
4694/// Assembly: `feq.q xd, qs1, qs2`
4695/// Rust: `feq_q(rd, rs1, rs2)`
4696///
4697/// # Arguments
4698/// - `rd` — Destination register.
4699/// - `rs1` — Source register.
4700/// - `rs2` — Source register.
4701pub trait FeqQEmitter<T0, T1, T2> {
4702 fn feq_q(&mut self, rd: T0, rs1: T1, rs2: T2);
4703}
4704
4705/// Single-precision floating-point equal
4706///
4707/// Writes 1 to _rd_ if _fs1_ and _fs2_ are equal, and 0 otherwise.
4708///
4709/// If either operand is NaN, the result is 0 (not equal). If either operand is a signaling NaN, the invalid flag is set.
4710///
4711/// Positive zero is considered equal to negative zero.
4712///
4713/// # Forms
4714/// Assembly: `feq.s xd, fs1, fs2`
4715/// Rust: `feq_s(rd, rs1, rs2)`
4716///
4717/// # Arguments
4718/// - `rd` — Destination register.
4719/// - `rs1` — Source register.
4720/// - `rs2` — Source register.
4721pub trait FeqSEmitter<T0, T1, T2> {
4722 fn feq_s(&mut self, rd: T0, rs1: T1, rs2: T2);
4723}
4724
4725/// RISC-V `fld` instruction.
4726///
4727/// # Forms
4728/// Assembly: `fld xd, xs1, imm`
4729/// Rust: `fld(rd, rs1, imm)`
4730///
4731/// # Arguments
4732/// - `rd` — Destination register.
4733/// - `rs1` — Memory base register.
4734/// - `imm` — Immediate encoding value.
4735pub trait FldEmitter<T0, T1, T2> {
4736 fn fld(&mut self, rd: T0, rs1: T1, imm: T2);
4737}
4738
4739/// RISC-V `fle.d` instruction.
4740///
4741/// # Forms
4742/// Assembly: `fle.d xd, xs1, xs2`
4743/// Rust: `fle_d(rd, rs1, rs2)`
4744///
4745/// # Arguments
4746/// - `rd` — Destination register.
4747/// - `rs1` — Source register.
4748/// - `rs2` — Source register.
4749pub trait FleDEmitter<T0, T1, T2> {
4750 fn fle_d(&mut self, rd: T0, rs1: T1, rs2: T2);
4751}
4752
4753/// RISC-V `fle.h` instruction.
4754///
4755/// # Forms
4756/// Assembly: `fle.h xd, xs1, xs2`
4757/// Rust: `fle_h(rd, rs1, rs2)`
4758///
4759/// # Arguments
4760/// - `rd` — Destination register.
4761/// - `rs1` — Source register.
4762/// - `rs2` — Source register.
4763pub trait FleHEmitter<T0, T1, T2> {
4764 fn fle_h(&mut self, rd: T0, rs1: T1, rs2: T2);
4765}
4766
4767/// RISC-V `fle.q` instruction.
4768///
4769/// # Forms
4770/// Assembly: `fle.q xd, qs1, qs2`
4771/// Rust: `fle_q(rd, rs1, rs2)`
4772///
4773/// # Arguments
4774/// - `rd` — Destination register.
4775/// - `rs1` — Source register.
4776/// - `rs2` — Source register.
4777pub trait FleQEmitter<T0, T1, T2> {
4778 fn fle_q(&mut self, rd: T0, rs1: T1, rs2: T2);
4779}
4780
4781/// Single-precision floating-point less than or equal
4782///
4783/// Writes 1 to _rd_ if _fs1_ is less than or equal to _fs2_, and 0 otherwise.
4784///
4785/// If either operand is NaN, the result is 0 (not equal).
4786/// If either operand is a NaN (signaling or quiet), the invalid flag is set.
4787///
4788/// Positive zero and negative zero are considered equal.
4789///
4790/// # Forms
4791/// Assembly: `fle.s xd, fs1, fs2`
4792/// Rust: `fle_s(rd, rs1, rs2)`
4793///
4794/// # Arguments
4795/// - `rd` — Destination register.
4796/// - `rs1` — Source register.
4797/// - `rs2` — Source register.
4798pub trait FleSEmitter<T0, T1, T2> {
4799 fn fle_s(&mut self, rd: T0, rs1: T1, rs2: T2);
4800}
4801
4802/// RISC-V `fleq.d` instruction.
4803///
4804/// # Forms
4805/// Assembly: `fleq.d xd, xs1, xs2`
4806/// Rust: `fleq_d(rd, rs1, rs2)`
4807///
4808/// # Arguments
4809/// - `rd` — Destination register.
4810/// - `rs1` — Source register.
4811/// - `rs2` — Source register.
4812pub trait FleqDEmitter<T0, T1, T2> {
4813 fn fleq_d(&mut self, rd: T0, rs1: T1, rs2: T2);
4814}
4815
4816/// RISC-V `fleq.h` instruction.
4817///
4818/// # Forms
4819/// Assembly: `fleq.h xd, xs1, xs2`
4820/// Rust: `fleq_h(rd, rs1, rs2)`
4821///
4822/// # Arguments
4823/// - `rd` — Destination register.
4824/// - `rs1` — Source register.
4825/// - `rs2` — Source register.
4826pub trait FleqHEmitter<T0, T1, T2> {
4827 fn fleq_h(&mut self, rd: T0, rs1: T1, rs2: T2);
4828}
4829
4830/// RISC-V `fleq.q` instruction.
4831///
4832/// # Forms
4833/// Assembly: `fleq.q xd, qs1, qs2`
4834/// Rust: `fleq_q(rd, rs1, rs2)`
4835///
4836/// # Arguments
4837/// - `rd` — Destination register.
4838/// - `rs1` — Source register.
4839/// - `rs2` — Source register.
4840pub trait FleqQEmitter<T0, T1, T2> {
4841 fn fleq_q(&mut self, rd: T0, rs1: T1, rs2: T2);
4842}
4843
4844/// RISC-V `fleq.s` instruction.
4845///
4846/// # Forms
4847/// Assembly: `fleq.s xd, fs1, fs2`
4848/// Rust: `fleq_s(rd, rs1, rs2)`
4849///
4850/// # Arguments
4851/// - `rd` — Destination register.
4852/// - `rs1` — Source register.
4853/// - `rs2` — Source register.
4854pub trait FleqSEmitter<T0, T1, T2> {
4855 fn fleq_s(&mut self, rd: T0, rs1: T1, rs2: T2);
4856}
4857
4858/// Half-precision floating-point load
4859///
4860/// The `flh` instruction loads a single-precision floating-point value from memory at address _rs1_ + _imm_ into floating-point register _rd_.
4861///
4862/// `flh` does not modify the bits being transferred; in particular, the payloads of non-canonical NaNs are preserved.
4863///
4864/// `flh` is only guaranteed to execute atomically if the effective address is naturally aligned.
4865///
4866/// # Forms
4867/// Assembly: `flh fd, imm(xs1)`
4868/// Rust: `flh(rd, rs1, imm)`
4869///
4870/// # Arguments
4871/// - `rd` — Destination register.
4872/// - `rs1` — Memory base register.
4873/// - `imm` — Immediate encoding value.
4874pub trait FlhEmitter<T0, T1, T2> {
4875 fn flh(&mut self, rd: T0, rs1: T1, imm: T2);
4876}
4877
4878/// RISC-V `fli.d` instruction.
4879///
4880/// # Forms
4881/// Assembly: `fli.d xd, xs1`
4882/// Rust: `fli_d(rd, rs1)`
4883///
4884/// # Arguments
4885/// - `rd` — Destination register.
4886/// - `rs1` — Source register.
4887pub trait FliDEmitter<T0, T1> {
4888 fn fli_d(&mut self, rd: T0, rs1: T1);
4889}
4890
4891/// RISC-V `fli.h` instruction.
4892///
4893/// # Forms
4894/// Assembly: `fli.h xd, xs1`
4895/// Rust: `fli_h(rd, rs1)`
4896///
4897/// # Arguments
4898/// - `rd` — Destination register.
4899/// - `rs1` — Source register.
4900pub trait FliHEmitter<T0, T1> {
4901 fn fli_h(&mut self, rd: T0, rs1: T1);
4902}
4903
4904/// RISC-V `fli.q` instruction.
4905///
4906/// # Forms
4907/// Assembly: `fli.q fd, qs1`
4908/// Rust: `fli_q(rd, rs1)`
4909///
4910/// # Arguments
4911/// - `rd` — Destination register.
4912/// - `rs1` — Source register.
4913pub trait FliQEmitter<T0, T1> {
4914 fn fli_q(&mut self, rd: T0, rs1: T1);
4915}
4916
4917/// RISC-V `fli.s` instruction.
4918///
4919/// # Forms
4920/// Assembly: `fli.s fd, fs1`
4921/// Rust: `fli_s(rd, rs1)`
4922///
4923/// # Arguments
4924/// - `rd` — Destination register.
4925/// - `rs1` — Source register.
4926pub trait FliSEmitter<T0, T1> {
4927 fn fli_s(&mut self, rd: T0, rs1: T1);
4928}
4929
4930/// RISC-V `flq` instruction.
4931///
4932/// # Forms
4933/// Assembly: `flq qd, xs1, imm`
4934/// Rust: `flq(rd, rs1, imm)`
4935///
4936/// # Arguments
4937/// - `rd` — Destination register.
4938/// - `rs1` — Memory base register.
4939/// - `imm` — Immediate encoding value.
4940pub trait FlqEmitter<T0, T1, T2> {
4941 fn flq(&mut self, rd: T0, rs1: T1, imm: T2);
4942}
4943
4944/// RISC-V `flt.d` instruction.
4945///
4946/// # Forms
4947/// Assembly: `flt.d xd, xs1, xs2`
4948/// Rust: `flt_d(rd, rs1, rs2)`
4949///
4950/// # Arguments
4951/// - `rd` — Destination register.
4952/// - `rs1` — Source register.
4953/// - `rs2` — Source register.
4954pub trait FltDEmitter<T0, T1, T2> {
4955 fn flt_d(&mut self, rd: T0, rs1: T1, rs2: T2);
4956}
4957
4958/// RISC-V `flt.h` instruction.
4959///
4960/// # Forms
4961/// Assembly: `flt.h xd, xs1, xs2`
4962/// Rust: `flt_h(rd, rs1, rs2)`
4963///
4964/// # Arguments
4965/// - `rd` — Destination register.
4966/// - `rs1` — Source register.
4967/// - `rs2` — Source register.
4968pub trait FltHEmitter<T0, T1, T2> {
4969 fn flt_h(&mut self, rd: T0, rs1: T1, rs2: T2);
4970}
4971
4972/// RISC-V `flt.q` instruction.
4973///
4974/// # Forms
4975/// Assembly: `flt.q xd, qs1, qs2`
4976/// Rust: `flt_q(rd, rs1, rs2)`
4977///
4978/// # Arguments
4979/// - `rd` — Destination register.
4980/// - `rs1` — Source register.
4981/// - `rs2` — Source register.
4982pub trait FltQEmitter<T0, T1, T2> {
4983 fn flt_q(&mut self, rd: T0, rs1: T1, rs2: T2);
4984}
4985
4986/// Single-precision floating-point less than
4987///
4988/// Writes 1 to _rd_ if _fs1_ is less than _fs2_, and 0 otherwise.
4989///
4990/// If either operand is NaN, the result is 0 (not equal).
4991/// If either operand is a NaN (signaling or quiet), the invalid flag is set.
4992///
4993/// # Forms
4994/// Assembly: `flt.s xd, fs1, fs2`
4995/// Rust: `flt_s(rd, rs1, rs2)`
4996///
4997/// # Arguments
4998/// - `rd` — Destination register.
4999/// - `rs1` — Source register.
5000/// - `rs2` — Source register.
5001pub trait FltSEmitter<T0, T1, T2> {
5002 fn flt_s(&mut self, rd: T0, rs1: T1, rs2: T2);
5003}
5004
5005/// RISC-V `fltq.d` instruction.
5006///
5007/// # Forms
5008/// Assembly: `fltq.d xd, xs1, xs2`
5009/// Rust: `fltq_d(rd, rs1, rs2)`
5010///
5011/// # Arguments
5012/// - `rd` — Destination register.
5013/// - `rs1` — Source register.
5014/// - `rs2` — Source register.
5015pub trait FltqDEmitter<T0, T1, T2> {
5016 fn fltq_d(&mut self, rd: T0, rs1: T1, rs2: T2);
5017}
5018
5019/// RISC-V `fltq.h` instruction.
5020///
5021/// # Forms
5022/// Assembly: `fltq.h xd, xs1, xs2`
5023/// Rust: `fltq_h(rd, rs1, rs2)`
5024///
5025/// # Arguments
5026/// - `rd` — Destination register.
5027/// - `rs1` — Source register.
5028/// - `rs2` — Source register.
5029pub trait FltqHEmitter<T0, T1, T2> {
5030 fn fltq_h(&mut self, rd: T0, rs1: T1, rs2: T2);
5031}
5032
5033/// RISC-V `fltq.q` instruction.
5034///
5035/// # Forms
5036/// Assembly: `fltq.q qd, qs1, qs2`
5037/// Rust: `fltq_q(rd, rs1, rs2)`
5038///
5039/// # Arguments
5040/// - `rd` — Destination register.
5041/// - `rs1` — Source register.
5042/// - `rs2` — Source register.
5043pub trait FltqQEmitter<T0, T1, T2> {
5044 fn fltq_q(&mut self, rd: T0, rs1: T1, rs2: T2);
5045}
5046
5047/// RISC-V `fltq.s` instruction.
5048///
5049/// # Forms
5050/// Assembly: `fltq.s xd, fs1, fs2`
5051/// Rust: `fltq_s(rd, rs1, rs2)`
5052///
5053/// # Arguments
5054/// - `rd` — Destination register.
5055/// - `rs1` — Source register.
5056/// - `rs2` — Source register.
5057pub trait FltqSEmitter<T0, T1, T2> {
5058 fn fltq_s(&mut self, rd: T0, rs1: T1, rs2: T2);
5059}
5060
5061/// Single-precision floating-point load
5062///
5063/// The `flw` instruction loads a single-precision floating-point value from memory at address _rs1_ + _imm_ into floating-point register _fd_.
5064///
5065/// `flw` does not modify the bits being transferred; in particular, the payloads of non-canonical NaNs are preserved.
5066///
5067/// # Forms
5068/// Assembly: `flw fd, xs1, imm`
5069/// Rust: `flw(rd, rs1, imm)`
5070///
5071/// # Arguments
5072/// - `rd` — Destination register.
5073/// - `rs1` — Memory base register.
5074/// - `imm` — Immediate encoding value.
5075pub trait FlwEmitter<T0, T1, T2> {
5076 fn flw(&mut self, rd: T0, rs1: T1, imm: T2);
5077}
5078
5079/// RISC-V `fmadd.d` instruction.
5080///
5081/// # Forms
5082/// Assembly: `fmadd.d xd, xs1, xs2, xs3, rm`
5083/// Rust: `fmadd_d(rd, rs1, rs2, rs3, rm)`
5084///
5085/// # Arguments
5086/// - `rd` — Destination register.
5087/// - `rs1` — Source register.
5088/// - `rs2` — Source register.
5089/// - `rs3` — Source register.
5090/// - `rm` — Rounding mode.
5091pub trait FmaddDEmitter<T0, T1, T2, T3, T4> {
5092 fn fmadd_d(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5093}
5094
5095/// RISC-V `fmadd.h` instruction.
5096///
5097/// # Forms
5098/// Assembly: `fmadd.h xd, xs1, xs2, xs3, rm`
5099/// Rust: `fmadd_h(rd, rs1, rs2, rs3, rm)`
5100///
5101/// # Arguments
5102/// - `rd` — Destination register.
5103/// - `rs1` — Source register.
5104/// - `rs2` — Source register.
5105/// - `rs3` — Source register.
5106/// - `rm` — Rounding mode.
5107pub trait FmaddHEmitter<T0, T1, T2, T3, T4> {
5108 fn fmadd_h(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5109}
5110
5111/// RISC-V `fmadd.q` instruction.
5112///
5113/// # Forms
5114/// Assembly: `fmadd.q qd, qs1, qs2, qs3, rm`
5115/// Rust: `fmadd_q(rd, rs1, rs2, rs3, rm)`
5116///
5117/// # Arguments
5118/// - `rd` — Destination register.
5119/// - `rs1` — Source register.
5120/// - `rs2` — Source register.
5121/// - `rs3` — Source register.
5122/// - `rm` — Rounding mode.
5123pub trait FmaddQEmitter<T0, T1, T2, T3, T4> {
5124 fn fmadd_q(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5125}
5126
5127/// RISC-V `fmadd.s` instruction.
5128///
5129/// # Forms
5130/// Assembly: `fmadd.s fd, fs1, fs2, fs3, rm`
5131/// Rust: `fmadd_s(rd, rs1, rs2, rs3, rm)`
5132///
5133/// # Arguments
5134/// - `rd` — Destination register.
5135/// - `rs1` — Source register.
5136/// - `rs2` — Source register.
5137/// - `rs3` — Source register.
5138/// - `rm` — Rounding mode.
5139pub trait FmaddSEmitter<T0, T1, T2, T3, T4> {
5140 fn fmadd_s(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5141}
5142
5143/// RISC-V `fmax.d` instruction.
5144///
5145/// # Forms
5146/// Assembly: `fmax.d xd, xs1, xs2`
5147/// Rust: `fmax_d(rd, rs1, rs2)`
5148///
5149/// # Arguments
5150/// - `rd` — Destination register.
5151/// - `rs1` — Source register.
5152/// - `rs2` — Source register.
5153pub trait FmaxDEmitter<T0, T1, T2> {
5154 fn fmax_d(&mut self, rd: T0, rs1: T1, rs2: T2);
5155}
5156
5157/// RISC-V `fmax.h` instruction.
5158///
5159/// # Forms
5160/// Assembly: `fmax.h xd, xs1, xs2`
5161/// Rust: `fmax_h(rd, rs1, rs2)`
5162///
5163/// # Arguments
5164/// - `rd` — Destination register.
5165/// - `rs1` — Source register.
5166/// - `rs2` — Source register.
5167pub trait FmaxHEmitter<T0, T1, T2> {
5168 fn fmax_h(&mut self, rd: T0, rs1: T1, rs2: T2);
5169}
5170
5171/// RISC-V `fmax.q` instruction.
5172///
5173/// # Forms
5174/// Assembly: `fmax.q qd, qs1, qs2`
5175/// Rust: `fmax_q(rd, rs1, rs2)`
5176///
5177/// # Arguments
5178/// - `rd` — Destination register.
5179/// - `rs1` — Source register.
5180/// - `rs2` — Source register.
5181pub trait FmaxQEmitter<T0, T1, T2> {
5182 fn fmax_q(&mut self, rd: T0, rs1: T1, rs2: T2);
5183}
5184
5185/// RISC-V `fmax.s` instruction.
5186///
5187/// # Forms
5188/// Assembly: `fmax.s fd, fs1, fs2`
5189/// Rust: `fmax_s(rd, rs1, rs2)`
5190///
5191/// # Arguments
5192/// - `rd` — Destination register.
5193/// - `rs1` — Source register.
5194/// - `rs2` — Source register.
5195pub trait FmaxSEmitter<T0, T1, T2> {
5196 fn fmax_s(&mut self, rd: T0, rs1: T1, rs2: T2);
5197}
5198
5199/// RISC-V `fmaxm.d` instruction.
5200///
5201/// # Forms
5202/// Assembly: `fmaxm.d xd, xs1, xs2`
5203/// Rust: `fmaxm_d(rd, rs1, rs2)`
5204///
5205/// # Arguments
5206/// - `rd` — Destination register.
5207/// - `rs1` — Source register.
5208/// - `rs2` — Source register.
5209pub trait FmaxmDEmitter<T0, T1, T2> {
5210 fn fmaxm_d(&mut self, rd: T0, rs1: T1, rs2: T2);
5211}
5212
5213/// RISC-V `fmaxm.h` instruction.
5214///
5215/// # Forms
5216/// Assembly: `fmaxm.h xd, xs1, xs2`
5217/// Rust: `fmaxm_h(rd, rs1, rs2)`
5218///
5219/// # Arguments
5220/// - `rd` — Destination register.
5221/// - `rs1` — Source register.
5222/// - `rs2` — Source register.
5223pub trait FmaxmHEmitter<T0, T1, T2> {
5224 fn fmaxm_h(&mut self, rd: T0, rs1: T1, rs2: T2);
5225}
5226
5227/// RISC-V `fmaxm.q` instruction.
5228///
5229/// # Forms
5230/// Assembly: `fmaxm.q qd, qs1, qs2`
5231/// Rust: `fmaxm_q(rd, rs1, rs2)`
5232///
5233/// # Arguments
5234/// - `rd` — Destination register.
5235/// - `rs1` — Source register.
5236/// - `rs2` — Source register.
5237pub trait FmaxmQEmitter<T0, T1, T2> {
5238 fn fmaxm_q(&mut self, rd: T0, rs1: T1, rs2: T2);
5239}
5240
5241/// RISC-V `fmaxm.s` instruction.
5242///
5243/// # Forms
5244/// Assembly: `fmaxm.s xd, xs1, xs2`
5245/// Rust: `fmaxm_s(rd, rs1, rs2)`
5246///
5247/// # Arguments
5248/// - `rd` — Destination register.
5249/// - `rs1` — Source register.
5250/// - `rs2` — Source register.
5251pub trait FmaxmSEmitter<T0, T1, T2> {
5252 fn fmaxm_s(&mut self, rd: T0, rs1: T1, rs2: T2);
5253}
5254
5255/// RISC-V `fmin.d` instruction.
5256///
5257/// # Forms
5258/// Assembly: `fmin.d xd, xs1, xs2`
5259/// Rust: `fmin_d(rd, rs1, rs2)`
5260///
5261/// # Arguments
5262/// - `rd` — Destination register.
5263/// - `rs1` — Source register.
5264/// - `rs2` — Source register.
5265pub trait FminDEmitter<T0, T1, T2> {
5266 fn fmin_d(&mut self, rd: T0, rs1: T1, rs2: T2);
5267}
5268
5269/// RISC-V `fmin.h` instruction.
5270///
5271/// # Forms
5272/// Assembly: `fmin.h xd, xs1, xs2`
5273/// Rust: `fmin_h(rd, rs1, rs2)`
5274///
5275/// # Arguments
5276/// - `rd` — Destination register.
5277/// - `rs1` — Source register.
5278/// - `rs2` — Source register.
5279pub trait FminHEmitter<T0, T1, T2> {
5280 fn fmin_h(&mut self, rd: T0, rs1: T1, rs2: T2);
5281}
5282
5283/// RISC-V `fmin.q` instruction.
5284///
5285/// # Forms
5286/// Assembly: `fmin.q xd, xs1, xs2`
5287/// Rust: `fmin_q(rd, rs1, rs2)`
5288///
5289/// # Arguments
5290/// - `rd` — Destination register.
5291/// - `rs1` — Source register.
5292/// - `rs2` — Source register.
5293pub trait FminQEmitter<T0, T1, T2> {
5294 fn fmin_q(&mut self, rd: T0, rs1: T1, rs2: T2);
5295}
5296
5297/// RISC-V `fmin.s` instruction.
5298///
5299/// # Forms
5300/// Assembly: `fmin.s xd, xs1, xs2`
5301/// Rust: `fmin_s(rd, rs1, rs2)`
5302///
5303/// # Arguments
5304/// - `rd` — Destination register.
5305/// - `rs1` — Source register.
5306/// - `rs2` — Source register.
5307pub trait FminSEmitter<T0, T1, T2> {
5308 fn fmin_s(&mut self, rd: T0, rs1: T1, rs2: T2);
5309}
5310
5311/// RISC-V `fminm.d` instruction.
5312///
5313/// # Forms
5314/// Assembly: `fminm.d xd, xs1, xs2`
5315/// Rust: `fminm_d(rd, rs1, rs2)`
5316///
5317/// # Arguments
5318/// - `rd` — Destination register.
5319/// - `rs1` — Source register.
5320/// - `rs2` — Source register.
5321pub trait FminmDEmitter<T0, T1, T2> {
5322 fn fminm_d(&mut self, rd: T0, rs1: T1, rs2: T2);
5323}
5324
5325/// RISC-V `fminm.h` instruction.
5326///
5327/// # Forms
5328/// Assembly: `fminm.h xd, xs1, xs2`
5329/// Rust: `fminm_h(rd, rs1, rs2)`
5330///
5331/// # Arguments
5332/// - `rd` — Destination register.
5333/// - `rs1` — Source register.
5334/// - `rs2` — Source register.
5335pub trait FminmHEmitter<T0, T1, T2> {
5336 fn fminm_h(&mut self, rd: T0, rs1: T1, rs2: T2);
5337}
5338
5339/// RISC-V `fminm.q` instruction.
5340///
5341/// # Forms
5342/// Assembly: `fminm.q qd, qs1, qs2`
5343/// Rust: `fminm_q(rd, rs1, rs2)`
5344///
5345/// # Arguments
5346/// - `rd` — Destination register.
5347/// - `rs1` — Source register.
5348/// - `rs2` — Source register.
5349pub trait FminmQEmitter<T0, T1, T2> {
5350 fn fminm_q(&mut self, rd: T0, rs1: T1, rs2: T2);
5351}
5352
5353/// RISC-V `fminm.s` instruction.
5354///
5355/// # Forms
5356/// Assembly: `fminm.s fd, fs1, fs2`
5357/// Rust: `fminm_s(rd, rs1, rs2)`
5358///
5359/// # Arguments
5360/// - `rd` — Destination register.
5361/// - `rs1` — Source register.
5362/// - `rs2` — Source register.
5363pub trait FminmSEmitter<T0, T1, T2> {
5364 fn fminm_s(&mut self, rd: T0, rs1: T1, rs2: T2);
5365}
5366
5367/// RISC-V `fmsub.d` instruction.
5368///
5369/// # Forms
5370/// Assembly: `fmsub.d xd, xs1, xs2, xs3, rm`
5371/// Rust: `fmsub_d(rd, rs1, rs2, rs3, rm)`
5372///
5373/// # Arguments
5374/// - `rd` — Destination register.
5375/// - `rs1` — Source register.
5376/// - `rs2` — Source register.
5377/// - `rs3` — Source register.
5378/// - `rm` — Rounding mode.
5379pub trait FmsubDEmitter<T0, T1, T2, T3, T4> {
5380 fn fmsub_d(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5381}
5382
5383/// RISC-V `fmsub.h` instruction.
5384///
5385/// # Forms
5386/// Assembly: `fmsub.h xd, xs1, xs2, xs3, rm`
5387/// Rust: `fmsub_h(rd, rs1, rs2, rs3, rm)`
5388///
5389/// # Arguments
5390/// - `rd` — Destination register.
5391/// - `rs1` — Source register.
5392/// - `rs2` — Source register.
5393/// - `rs3` — Source register.
5394/// - `rm` — Rounding mode.
5395pub trait FmsubHEmitter<T0, T1, T2, T3, T4> {
5396 fn fmsub_h(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5397}
5398
5399/// RISC-V `fmsub.q` instruction.
5400///
5401/// # Forms
5402/// Assembly: `fmsub.q qd, qs1, qs2, qs3, rm`
5403/// Rust: `fmsub_q(rd, rs1, rs2, rs3, rm)`
5404///
5405/// # Arguments
5406/// - `rd` — Destination register.
5407/// - `rs1` — Source register.
5408/// - `rs2` — Source register.
5409/// - `rs3` — Source register.
5410/// - `rm` — Rounding mode.
5411pub trait FmsubQEmitter<T0, T1, T2, T3, T4> {
5412 fn fmsub_q(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5413}
5414
5415/// RISC-V `fmsub.s` instruction.
5416///
5417/// # Forms
5418/// Assembly: `fmsub.s fd, fs1, fs2, fs3, rm`
5419/// Rust: `fmsub_s(rd, rs1, rs2, rs3, rm)`
5420///
5421/// # Arguments
5422/// - `rd` — Destination register.
5423/// - `rs1` — Source register.
5424/// - `rs2` — Source register.
5425/// - `rs3` — Source register.
5426/// - `rm` — Rounding mode.
5427pub trait FmsubSEmitter<T0, T1, T2, T3, T4> {
5428 fn fmsub_s(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5429}
5430
5431/// RISC-V `fmul.d` instruction.
5432///
5433/// # Forms
5434/// Assembly: `fmul.d xd, xs1, xs2, rm`
5435/// Rust: `fmul_d(rd, rs1, rs2, rm)`
5436///
5437/// # Arguments
5438/// - `rd` — Destination register.
5439/// - `rs1` — Source register.
5440/// - `rs2` — Source register.
5441/// - `rm` — Rounding mode.
5442pub trait FmulDEmitter<T0, T1, T2, T3> {
5443 fn fmul_d(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
5444}
5445
5446/// RISC-V `fmul.h` instruction.
5447///
5448/// # Forms
5449/// Assembly: `fmul.h xd, xs1, xs2, rm`
5450/// Rust: `fmul_h(rd, rs1, rs2, rm)`
5451///
5452/// # Arguments
5453/// - `rd` — Destination register.
5454/// - `rs1` — Source register.
5455/// - `rs2` — Source register.
5456/// - `rm` — Rounding mode.
5457pub trait FmulHEmitter<T0, T1, T2, T3> {
5458 fn fmul_h(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
5459}
5460
5461/// RISC-V `fmul.q` instruction.
5462///
5463/// # Forms
5464/// Assembly: `fmul.q qd, qs1, qs2, rm`
5465/// Rust: `fmul_q(rd, rs1, rs2, rm)`
5466///
5467/// # Arguments
5468/// - `rd` — Destination register.
5469/// - `rs1` — Source register.
5470/// - `rs2` — Source register.
5471/// - `rm` — Rounding mode.
5472pub trait FmulQEmitter<T0, T1, T2, T3> {
5473 fn fmul_q(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
5474}
5475
5476/// RISC-V `fmul.s` instruction.
5477///
5478/// # Forms
5479/// Assembly: `fmul.s fd, fs1, fs2, rm`
5480/// Rust: `fmul_s(rd, rs1, rs2, rm)`
5481///
5482/// # Arguments
5483/// - `rd` — Destination register.
5484/// - `rs1` — Source register.
5485/// - `rs2` — Source register.
5486/// - `rm` — Rounding mode.
5487pub trait FmulSEmitter<T0, T1, T2, T3> {
5488 fn fmul_s(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
5489}
5490
5491/// RISC-V `fmv.d` instruction.
5492///
5493/// # Forms
5494/// Assembly: `fmv.d rd rs1 rs2_eq_rs1`
5495/// Rust: `fmv_d(rd, rs1, rs2)`
5496///
5497/// # Arguments
5498/// - `rd` — Destination register.
5499/// - `rs1` — Source register.
5500/// - `rs2` — Source register.
5501pub trait FmvDEmitter<T0, T1, T2> {
5502 fn fmv_d(&mut self, rd: T0, rs1: T1, rs2: T2);
5503}
5504
5505/// RISC-V `fmv.d.x` instruction.
5506///
5507/// # Forms
5508/// Assembly: `fmv.d.x xd, xs1`
5509/// Rust: `fmv_d_x(rd, rs1)`
5510///
5511/// # Arguments
5512/// - `rd` — Destination register.
5513/// - `rs1` — Source register.
5514pub trait FmvDXEmitter<T0, T1> {
5515 fn fmv_d_x(&mut self, rd: T0, rs1: T1);
5516}
5517
5518/// RISC-V `fmv.h` instruction.
5519///
5520/// # Forms
5521/// Assembly: `fmv.h rd rs1 rs2_eq_rs1`
5522/// Rust: `fmv_h(rd, rs1, rs2)`
5523///
5524/// # Arguments
5525/// - `rd` — Destination register.
5526/// - `rs1` — Source register.
5527/// - `rs2` — Source register.
5528pub trait FmvHEmitter<T0, T1, T2> {
5529 fn fmv_h(&mut self, rd: T0, rs1: T1, rs2: T2);
5530}
5531
5532/// Half-precision floating-point move from integer
5533///
5534/// Moves the half-precision value encoded in IEEE 754-2008 standard encoding
5535/// from the lower 16 bits of integer register `rs1` to the floating-point
5536/// register `fd`. The bits are not modified in the transfer, and in particular,
5537/// the payloads of non-canonical NaNs are preserved.
5538///
5539/// # Forms
5540/// Assembly: `fmv.h.x fd, xs1`
5541/// Rust: `fmv_h_x(rd, rs1)`
5542///
5543/// # Arguments
5544/// - `rd` — Destination register.
5545/// - `rs1` — Source register.
5546pub trait FmvHXEmitter<T0, T1> {
5547 fn fmv_h_x(&mut self, rd: T0, rs1: T1);
5548}
5549
5550/// RISC-V `fmv.q` instruction.
5551///
5552/// # Forms
5553/// Assembly: `fmv.q rd rs1 rs2_eq_rs1`
5554/// Rust: `fmv_q(rd, rs1, rs2)`
5555///
5556/// # Arguments
5557/// - `rd` — Destination register.
5558/// - `rs1` — Source register.
5559/// - `rs2` — Source register.
5560pub trait FmvQEmitter<T0, T1, T2> {
5561 fn fmv_q(&mut self, rd: T0, rs1: T1, rs2: T2);
5562}
5563
5564/// RISC-V `fmv.s` instruction.
5565///
5566/// # Forms
5567/// Assembly: `fmv.s rd rs1 rs2_eq_rs1`
5568/// Rust: `fmv_s(rd, rs1, rs2)`
5569///
5570/// # Arguments
5571/// - `rd` — Destination register.
5572/// - `rs1` — Source register.
5573/// - `rs2` — Source register.
5574pub trait FmvSEmitter<T0, T1, T2> {
5575 fn fmv_s(&mut self, rd: T0, rs1: T1, rs2: T2);
5576}
5577
5578/// RISC-V `fmv.s.x` instruction.
5579///
5580/// # Forms
5581/// Assembly: `fmv.s.x rd rs1`
5582/// Rust: `fmv_s_x(rd, rs1)`
5583///
5584/// # Arguments
5585/// - `rd` — Destination register.
5586/// - `rs1` — Source register.
5587pub trait FmvSXEmitter<T0, T1> {
5588 fn fmv_s_x(&mut self, rd: T0, rs1: T1);
5589}
5590
5591/// Single-precision floating-point move from integer
5592///
5593/// Moves the single-precision value encoded in IEEE 754-2008 standard encoding
5594/// from the lower 32 bits of integer register `rs1` to the floating-point
5595/// register `fd`. The bits are not modified in the transfer, and in particular,
5596/// the payloads of non-canonical NaNs are preserved.
5597///
5598/// # Forms
5599/// Assembly: `fmv.w.x fd, xs1`
5600/// Rust: `fmv_w_x(rd, rs1)`
5601///
5602/// # Arguments
5603/// - `rd` — Destination register.
5604/// - `rs1` — Source register.
5605pub trait FmvWXEmitter<T0, T1> {
5606 fn fmv_w_x(&mut self, rd: T0, rs1: T1);
5607}
5608
5609/// RISC-V `fmv.x.d` instruction.
5610///
5611/// # Forms
5612/// Assembly: `fmv.x.d xd, xs1`
5613/// Rust: `fmv_x_d(rd, rs1)`
5614///
5615/// # Arguments
5616/// - `rd` — Destination register.
5617/// - `rs1` — Source register.
5618pub trait FmvXDEmitter<T0, T1> {
5619 fn fmv_x_d(&mut self, rd: T0, rs1: T1);
5620}
5621
5622/// Move half-precision value from floating-point to integer register
5623///
5624/// Moves the half-precision value in floating-point register rs1 represented in IEEE 754-2008
5625/// encoding to the lower 16 bits of integer register rd.
5626///
5627/// The bits are not modified in the transfer, and in particular, the payloads of non-canonical
5628/// NaNs are preserved.
5629///
5630/// The highest XLEN-16 bits of the destination register are filled with copies of the
5631/// floating-point number's sign bit.
5632///
5633/// # Forms
5634/// Assembly: `fmv.x.h rd, fs1`
5635/// Rust: `fmv_x_h(rd, rs1)`
5636///
5637/// # Arguments
5638/// - `rd` — Destination register.
5639/// - `rs1` — Source register.
5640pub trait FmvXHEmitter<T0, T1> {
5641 fn fmv_x_h(&mut self, rd: T0, rs1: T1);
5642}
5643
5644/// RISC-V `fmv.x.s` instruction.
5645///
5646/// # Forms
5647/// Assembly: `fmv.x.s rd rs1`
5648/// Rust: `fmv_x_s(rd, rs1)`
5649///
5650/// # Arguments
5651/// - `rd` — Destination register.
5652/// - `rs1` — Source register.
5653pub trait FmvXSEmitter<T0, T1> {
5654 fn fmv_x_s(&mut self, rd: T0, rs1: T1);
5655}
5656
5657/// Move single-precision value from floating-point to integer register
5658///
5659/// Moves the single-precision value in floating-point register rs1 represented in IEEE 754-2008
5660/// encoding to the lower 32 bits of integer register rd.
5661/// The bits are not modified in the transfer, and in particular, the payloads of non-canonical
5662/// NaNs are preserved.
5663/// For RV64, the higher 32 bits of the destination register are filled with copies of the
5664/// floating-point number's sign bit.
5665///
5666/// # Forms
5667/// Assembly: `fmv.x.w xd, fs1`
5668/// Rust: `fmv_x_w(rd, rs1)`
5669///
5670/// # Arguments
5671/// - `rd` — Destination register.
5672/// - `rs1` — Source register.
5673pub trait FmvXWEmitter<T0, T1> {
5674 fn fmv_x_w(&mut self, rd: T0, rs1: T1);
5675}
5676
5677/// RISC-V `fmvh.x.d` instruction.
5678///
5679/// # Forms
5680/// Assembly: `fmvh.x.d xd, xs1`
5681/// Rust: `fmvh_x_d(rd, rs1)`
5682///
5683/// # Arguments
5684/// - `rd` — Destination register.
5685/// - `rs1` — Source register.
5686pub trait FmvhXDEmitter<T0, T1> {
5687 fn fmvh_x_d(&mut self, rd: T0, rs1: T1);
5688}
5689
5690/// RISC-V `fmvh.x.q` instruction.
5691///
5692/// # Forms
5693/// Assembly: `fmvh.x.q xd, qs1`
5694/// Rust: `fmvh_x_q(rd, rs1)`
5695///
5696/// # Arguments
5697/// - `rd` — Destination register.
5698/// - `rs1` — Source register.
5699pub trait FmvhXQEmitter<T0, T1> {
5700 fn fmvh_x_q(&mut self, rd: T0, rs1: T1);
5701}
5702
5703/// RISC-V `fmvp.d.x` instruction.
5704///
5705/// # Forms
5706/// Assembly: `fmvp.d.x xd, xs1, xs2`
5707/// Rust: `fmvp_d_x(rd, rs1, rs2)`
5708///
5709/// # Arguments
5710/// - `rd` — Destination register.
5711/// - `rs1` — Source register.
5712/// - `rs2` — Source register.
5713pub trait FmvpDXEmitter<T0, T1, T2> {
5714 fn fmvp_d_x(&mut self, rd: T0, rs1: T1, rs2: T2);
5715}
5716
5717/// RISC-V `fmvp.q.x` instruction.
5718///
5719/// # Forms
5720/// Assembly: `fmvp.q.x qd, xs1, xs2`
5721/// Rust: `fmvp_q_x(rd, rs1, rs2)`
5722///
5723/// # Arguments
5724/// - `rd` — Destination register.
5725/// - `rs1` — Source register.
5726/// - `rs2` — Source register.
5727pub trait FmvpQXEmitter<T0, T1, T2> {
5728 fn fmvp_q_x(&mut self, rd: T0, rs1: T1, rs2: T2);
5729}
5730
5731/// RISC-V `fneg.d` instruction.
5732///
5733/// # Forms
5734/// Assembly: `fneg.d rd rs1 rs2_eq_rs1`
5735/// Rust: `fneg_d(rd, rs1, rs2)`
5736///
5737/// # Arguments
5738/// - `rd` — Destination register.
5739/// - `rs1` — Source register.
5740/// - `rs2` — Source register.
5741pub trait FnegDEmitter<T0, T1, T2> {
5742 fn fneg_d(&mut self, rd: T0, rs1: T1, rs2: T2);
5743}
5744
5745/// RISC-V `fneg.h` instruction.
5746///
5747/// # Forms
5748/// Assembly: `fneg.h rd rs1 rs2_eq_rs1`
5749/// Rust: `fneg_h(rd, rs1, rs2)`
5750///
5751/// # Arguments
5752/// - `rd` — Destination register.
5753/// - `rs1` — Source register.
5754/// - `rs2` — Source register.
5755pub trait FnegHEmitter<T0, T1, T2> {
5756 fn fneg_h(&mut self, rd: T0, rs1: T1, rs2: T2);
5757}
5758
5759/// RISC-V `fneg.q` instruction.
5760///
5761/// # Forms
5762/// Assembly: `fneg.q rd rs1 rs2_eq_rs1`
5763/// Rust: `fneg_q(rd, rs1, rs2)`
5764///
5765/// # Arguments
5766/// - `rd` — Destination register.
5767/// - `rs1` — Source register.
5768/// - `rs2` — Source register.
5769pub trait FnegQEmitter<T0, T1, T2> {
5770 fn fneg_q(&mut self, rd: T0, rs1: T1, rs2: T2);
5771}
5772
5773/// RISC-V `fneg.s` instruction.
5774///
5775/// # Forms
5776/// Assembly: `fneg.s rd rs1 rs2_eq_rs1`
5777/// Rust: `fneg_s(rd, rs1, rs2)`
5778///
5779/// # Arguments
5780/// - `rd` — Destination register.
5781/// - `rs1` — Source register.
5782/// - `rs2` — Source register.
5783pub trait FnegSEmitter<T0, T1, T2> {
5784 fn fneg_s(&mut self, rd: T0, rs1: T1, rs2: T2);
5785}
5786
5787/// RISC-V `fnmadd.d` instruction.
5788///
5789/// # Forms
5790/// Assembly: `fnmadd.d xd, xs1, xs2, xs3, rm`
5791/// Rust: `fnmadd_d(rd, rs1, rs2, rs3, rm)`
5792///
5793/// # Arguments
5794/// - `rd` — Destination register.
5795/// - `rs1` — Source register.
5796/// - `rs2` — Source register.
5797/// - `rs3` — Source register.
5798/// - `rm` — Rounding mode.
5799pub trait FnmaddDEmitter<T0, T1, T2, T3, T4> {
5800 fn fnmadd_d(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5801}
5802
5803/// RISC-V `fnmadd.h` instruction.
5804///
5805/// # Forms
5806/// Assembly: `fnmadd.h xd, xs1, xs2, xs3, rm`
5807/// Rust: `fnmadd_h(rd, rs1, rs2, rs3, rm)`
5808///
5809/// # Arguments
5810/// - `rd` — Destination register.
5811/// - `rs1` — Source register.
5812/// - `rs2` — Source register.
5813/// - `rs3` — Source register.
5814/// - `rm` — Rounding mode.
5815pub trait FnmaddHEmitter<T0, T1, T2, T3, T4> {
5816 fn fnmadd_h(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5817}
5818
5819/// RISC-V `fnmadd.q` instruction.
5820///
5821/// # Forms
5822/// Assembly: `fnmadd.q qd, qs1, qs2, qs3, rm`
5823/// Rust: `fnmadd_q(rd, rs1, rs2, rs3, rm)`
5824///
5825/// # Arguments
5826/// - `rd` — Destination register.
5827/// - `rs1` — Source register.
5828/// - `rs2` — Source register.
5829/// - `rs3` — Source register.
5830/// - `rm` — Rounding mode.
5831pub trait FnmaddQEmitter<T0, T1, T2, T3, T4> {
5832 fn fnmadd_q(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5833}
5834
5835/// RISC-V `fnmadd.s` instruction.
5836///
5837/// # Forms
5838/// Assembly: `fnmadd.s fd, fs1, fs2, fs3, rm`
5839/// Rust: `fnmadd_s(rd, rs1, rs2, rs3, rm)`
5840///
5841/// # Arguments
5842/// - `rd` — Destination register.
5843/// - `rs1` — Source register.
5844/// - `rs2` — Source register.
5845/// - `rs3` — Source register.
5846/// - `rm` — Rounding mode.
5847pub trait FnmaddSEmitter<T0, T1, T2, T3, T4> {
5848 fn fnmadd_s(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5849}
5850
5851/// RISC-V `fnmsub.d` instruction.
5852///
5853/// # Forms
5854/// Assembly: `fnmsub.d xd, xs1, xs2, xs3, rm`
5855/// Rust: `fnmsub_d(rd, rs1, rs2, rs3, rm)`
5856///
5857/// # Arguments
5858/// - `rd` — Destination register.
5859/// - `rs1` — Source register.
5860/// - `rs2` — Source register.
5861/// - `rs3` — Source register.
5862/// - `rm` — Rounding mode.
5863pub trait FnmsubDEmitter<T0, T1, T2, T3, T4> {
5864 fn fnmsub_d(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5865}
5866
5867/// RISC-V `fnmsub.h` instruction.
5868///
5869/// # Forms
5870/// Assembly: `fnmsub.h xd, xs1, xs2, xs3, rm`
5871/// Rust: `fnmsub_h(rd, rs1, rs2, rs3, rm)`
5872///
5873/// # Arguments
5874/// - `rd` — Destination register.
5875/// - `rs1` — Source register.
5876/// - `rs2` — Source register.
5877/// - `rs3` — Source register.
5878/// - `rm` — Rounding mode.
5879pub trait FnmsubHEmitter<T0, T1, T2, T3, T4> {
5880 fn fnmsub_h(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5881}
5882
5883/// RISC-V `fnmsub.q` instruction.
5884///
5885/// # Forms
5886/// Assembly: `fnmsub.q qd, qs1, qs2, qs3, rm`
5887/// Rust: `fnmsub_q(rd, rs1, rs2, rs3, rm)`
5888///
5889/// # Arguments
5890/// - `rd` — Destination register.
5891/// - `rs1` — Source register.
5892/// - `rs2` — Source register.
5893/// - `rs3` — Source register.
5894/// - `rm` — Rounding mode.
5895pub trait FnmsubQEmitter<T0, T1, T2, T3, T4> {
5896 fn fnmsub_q(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5897}
5898
5899/// RISC-V `fnmsub.s` instruction.
5900///
5901/// # Forms
5902/// Assembly: `fnmsub.s xd, xs1, xs2, xs3, rm`
5903/// Rust: `fnmsub_s(rd, rs1, rs2, rs3, rm)`
5904///
5905/// # Arguments
5906/// - `rd` — Destination register.
5907/// - `rs1` — Source register.
5908/// - `rs2` — Source register.
5909/// - `rs3` — Source register.
5910/// - `rm` — Rounding mode.
5911pub trait FnmsubSEmitter<T0, T1, T2, T3, T4> {
5912 fn fnmsub_s(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4);
5913}
5914
5915/// RISC-V `frcsr` instruction.
5916///
5917/// # Forms
5918/// Assembly: `frcsr rd`
5919/// Rust: `frcsr(rd)`
5920///
5921/// # Arguments
5922/// - `rd` — Destination register.
5923pub trait FrcsrEmitter<T0> {
5924 fn frcsr(&mut self, rd: T0);
5925}
5926
5927/// RISC-V `frflags` instruction.
5928///
5929/// # Forms
5930/// Assembly: `frflags rd`
5931/// Rust: `frflags(rd)`
5932///
5933/// # Arguments
5934/// - `rd` — Destination register.
5935pub trait FrflagsEmitter<T0> {
5936 fn frflags(&mut self, rd: T0);
5937}
5938
5939/// RISC-V `fround.d` instruction.
5940///
5941/// # Forms
5942/// Assembly: `fround.d xd, xs1, rm`
5943/// Rust: `fround_d(rd, rs1, rm)`
5944///
5945/// # Arguments
5946/// - `rd` — Destination register.
5947/// - `rs1` — Source register.
5948/// - `rm` — Rounding mode.
5949pub trait FroundDEmitter<T0, T1, T2> {
5950 fn fround_d(&mut self, rd: T0, rs1: T1, rm: T2);
5951}
5952
5953/// RISC-V `fround.h` instruction.
5954///
5955/// # Forms
5956/// Assembly: `fround.h xd, xs1, rm`
5957/// Rust: `fround_h(rd, rs1, rm)`
5958///
5959/// # Arguments
5960/// - `rd` — Destination register.
5961/// - `rs1` — Source register.
5962/// - `rm` — Rounding mode.
5963pub trait FroundHEmitter<T0, T1, T2> {
5964 fn fround_h(&mut self, rd: T0, rs1: T1, rm: T2);
5965}
5966
5967/// RISC-V `fround.q` instruction.
5968///
5969/// # Forms
5970/// Assembly: `fround.q qd, qs1, rm`
5971/// Rust: `fround_q(rd, rs1, rm)`
5972///
5973/// # Arguments
5974/// - `rd` — Destination register.
5975/// - `rs1` — Source register.
5976/// - `rm` — Rounding mode.
5977pub trait FroundQEmitter<T0, T1, T2> {
5978 fn fround_q(&mut self, rd: T0, rs1: T1, rm: T2);
5979}
5980
5981/// RISC-V `fround.s` instruction.
5982///
5983/// # Forms
5984/// Assembly: `fround.s fd, xs1, rm`
5985/// Rust: `fround_s(rd, rs1, rm)`
5986///
5987/// # Arguments
5988/// - `rd` — Destination register.
5989/// - `rs1` — Source register.
5990/// - `rm` — Rounding mode.
5991pub trait FroundSEmitter<T0, T1, T2> {
5992 fn fround_s(&mut self, rd: T0, rs1: T1, rm: T2);
5993}
5994
5995/// RISC-V `froundnx.d` instruction.
5996///
5997/// # Forms
5998/// Assembly: `froundnx.d xd, xs1, rm`
5999/// Rust: `froundnx_d(rd, rs1, rm)`
6000///
6001/// # Arguments
6002/// - `rd` — Destination register.
6003/// - `rs1` — Source register.
6004/// - `rm` — Rounding mode.
6005pub trait FroundnxDEmitter<T0, T1, T2> {
6006 fn froundnx_d(&mut self, rd: T0, rs1: T1, rm: T2);
6007}
6008
6009/// RISC-V `froundnx.h` instruction.
6010///
6011/// # Forms
6012/// Assembly: `froundnx.h xd, xs1, rm`
6013/// Rust: `froundnx_h(rd, rs1, rm)`
6014///
6015/// # Arguments
6016/// - `rd` — Destination register.
6017/// - `rs1` — Source register.
6018/// - `rm` — Rounding mode.
6019pub trait FroundnxHEmitter<T0, T1, T2> {
6020 fn froundnx_h(&mut self, rd: T0, rs1: T1, rm: T2);
6021}
6022
6023/// RISC-V `froundnx.q` instruction.
6024///
6025/// # Forms
6026/// Assembly: `froundnx.q qd, qs1, rm`
6027/// Rust: `froundnx_q(rd, rs1, rm)`
6028///
6029/// # Arguments
6030/// - `rd` — Destination register.
6031/// - `rs1` — Source register.
6032/// - `rm` — Rounding mode.
6033pub trait FroundnxQEmitter<T0, T1, T2> {
6034 fn froundnx_q(&mut self, rd: T0, rs1: T1, rm: T2);
6035}
6036
6037/// RISC-V `froundnx.s` instruction.
6038///
6039/// # Forms
6040/// Assembly: `froundnx.s fd, rs1, rm`
6041/// Rust: `froundnx_s(rd, rs1, rm)`
6042///
6043/// # Arguments
6044/// - `rd` — Destination register.
6045/// - `rs1` — Source register.
6046/// - `rm` — Rounding mode.
6047pub trait FroundnxSEmitter<T0, T1, T2> {
6048 fn froundnx_s(&mut self, rd: T0, rs1: T1, rm: T2);
6049}
6050
6051/// RISC-V `frrm` instruction.
6052///
6053/// # Forms
6054/// Assembly: `frrm rd`
6055/// Rust: `frrm(rd)`
6056///
6057/// # Arguments
6058/// - `rd` — Destination register.
6059pub trait FrrmEmitter<T0> {
6060 fn frrm(&mut self, rd: T0);
6061}
6062
6063/// RISC-V `fscsr` instruction.
6064///
6065/// # Forms
6066/// Assembly: `fscsr rd rs1`
6067/// Rust: `fscsr(rd, rs1)`
6068///
6069/// # Arguments
6070/// - `rd` — Destination register.
6071/// - `rs1` — Source register.
6072pub trait FscsrEmitter<T0, T1> {
6073 fn fscsr(&mut self, rd: T0, rs1: T1);
6074}
6075
6076/// RISC-V `fsd` instruction.
6077///
6078/// # Forms
6079/// Assembly: `fsd xs1, xs2, imm`
6080/// Rust: `fsd(rs1, rs2, imm)`
6081///
6082/// # Arguments
6083/// - `rs1` — Memory base register.
6084/// - `rs2` — Source register.
6085/// - `imm` — Immediate encoding value.
6086pub trait FsdEmitter<T0, T1, T2> {
6087 fn fsd(&mut self, rs1: T0, rs2: T1, imm: T2);
6088}
6089
6090/// RISC-V `fsflags` instruction.
6091///
6092/// # Forms
6093/// Assembly: `fsflags rd rs1`
6094/// Rust: `fsflags(rd, rs1)`
6095///
6096/// # Arguments
6097/// - `rd` — Destination register.
6098/// - `rs1` — Source register.
6099pub trait FsflagsEmitter<T0, T1> {
6100 fn fsflags(&mut self, rd: T0, rs1: T1);
6101}
6102
6103/// RISC-V `fsflagsi` instruction.
6104///
6105/// # Forms
6106/// Assembly: `fsflagsi rd zimm5`
6107/// Rust: `fsflagsi(rd, zimm5)`
6108///
6109/// # Arguments
6110/// - `rd` — Destination register.
6111/// - `zimm5` — Immediate encoding value.
6112pub trait FsflagsiEmitter<T0, T1> {
6113 fn fsflagsi(&mut self, rd: T0, zimm5: T1);
6114}
6115
6116/// RISC-V `fsgnj.d` instruction.
6117///
6118/// # Forms
6119/// Assembly: `fsgnj.d xd, xs1, xs2`
6120/// Rust: `fsgnj_d(rd, rs1, rs2)`
6121///
6122/// # Arguments
6123/// - `rd` — Destination register.
6124/// - `rs1` — Source register.
6125/// - `rs2` — Source register.
6126pub trait FsgnjDEmitter<T0, T1, T2> {
6127 fn fsgnj_d(&mut self, rd: T0, rs1: T1, rs2: T2);
6128}
6129
6130/// RISC-V `fsgnj.h` instruction.
6131///
6132/// # Forms
6133/// Assembly: `fsgnj.h xd, xs1, xs2`
6134/// Rust: `fsgnj_h(rd, rs1, rs2)`
6135///
6136/// # Arguments
6137/// - `rd` — Destination register.
6138/// - `rs1` — Source register.
6139/// - `rs2` — Source register.
6140pub trait FsgnjHEmitter<T0, T1, T2> {
6141 fn fsgnj_h(&mut self, rd: T0, rs1: T1, rs2: T2);
6142}
6143
6144/// RISC-V `fsgnj.q` instruction.
6145///
6146/// # Forms
6147/// Assembly: `fsgnj.q qd, qs1, qs2`
6148/// Rust: `fsgnj_q(rd, rs1, rs2)`
6149///
6150/// # Arguments
6151/// - `rd` — Destination register.
6152/// - `rs1` — Source register.
6153/// - `rs2` — Source register.
6154pub trait FsgnjQEmitter<T0, T1, T2> {
6155 fn fsgnj_q(&mut self, rd: T0, rs1: T1, rs2: T2);
6156}
6157
6158/// Single-precision sign inject
6159///
6160/// Writes _fd_ with sign bit of _fs2_ and the exponent and mantissa of _fs1_.
6161///
6162/// Sign-injection instructions do not set floating-point exception flags, nor do they canonicalize NaNs.
6163///
6164/// # Forms
6165/// Assembly: `fsgnj.s fd, fs1, fs2`
6166/// Rust: `fsgnj_s(rd, rs1, rs2)`
6167///
6168/// # Arguments
6169/// - `rd` — Destination register.
6170/// - `rs1` — Source register.
6171/// - `rs2` — Source register.
6172pub trait FsgnjSEmitter<T0, T1, T2> {
6173 fn fsgnj_s(&mut self, rd: T0, rs1: T1, rs2: T2);
6174}
6175
6176/// RISC-V `fsgnjn.d` instruction.
6177///
6178/// # Forms
6179/// Assembly: `fsgnjn.d xd, xs1, xs2`
6180/// Rust: `fsgnjn_d(rd, rs1, rs2)`
6181///
6182/// # Arguments
6183/// - `rd` — Destination register.
6184/// - `rs1` — Source register.
6185/// - `rs2` — Source register.
6186pub trait FsgnjnDEmitter<T0, T1, T2> {
6187 fn fsgnjn_d(&mut self, rd: T0, rs1: T1, rs2: T2);
6188}
6189
6190/// RISC-V `fsgnjn.h` instruction.
6191///
6192/// # Forms
6193/// Assembly: `fsgnjn.h xd, xs1, xs2`
6194/// Rust: `fsgnjn_h(rd, rs1, rs2)`
6195///
6196/// # Arguments
6197/// - `rd` — Destination register.
6198/// - `rs1` — Source register.
6199/// - `rs2` — Source register.
6200pub trait FsgnjnHEmitter<T0, T1, T2> {
6201 fn fsgnjn_h(&mut self, rd: T0, rs1: T1, rs2: T2);
6202}
6203
6204/// RISC-V `fsgnjn.q` instruction.
6205///
6206/// # Forms
6207/// Assembly: `fsgnjn.q qd, qs1, qs2`
6208/// Rust: `fsgnjn_q(rd, rs1, rs2)`
6209///
6210/// # Arguments
6211/// - `rd` — Destination register.
6212/// - `rs1` — Source register.
6213/// - `rs2` — Source register.
6214pub trait FsgnjnQEmitter<T0, T1, T2> {
6215 fn fsgnjn_q(&mut self, rd: T0, rs1: T1, rs2: T2);
6216}
6217
6218/// Single-precision sign inject negate
6219///
6220/// Writes _fd_ with the opposite of the sign bit of _fs2_ and the exponent and mantissa of _fs1_.
6221///
6222/// Sign-injection instructions do not set floating-point exception flags, nor do they canonicalize NaNs.
6223///
6224/// # Forms
6225/// Assembly: `fsgnjn.s fd, fs1, fs2`
6226/// Rust: `fsgnjn_s(rd, rs1, rs2)`
6227///
6228/// # Arguments
6229/// - `rd` — Destination register.
6230/// - `rs1` — Source register.
6231/// - `rs2` — Source register.
6232pub trait FsgnjnSEmitter<T0, T1, T2> {
6233 fn fsgnjn_s(&mut self, rd: T0, rs1: T1, rs2: T2);
6234}
6235
6236/// RISC-V `fsgnjx.d` instruction.
6237///
6238/// # Forms
6239/// Assembly: `fsgnjx.d xd, xs1, xs2`
6240/// Rust: `fsgnjx_d(rd, rs1, rs2)`
6241///
6242/// # Arguments
6243/// - `rd` — Destination register.
6244/// - `rs1` — Source register.
6245/// - `rs2` — Source register.
6246pub trait FsgnjxDEmitter<T0, T1, T2> {
6247 fn fsgnjx_d(&mut self, rd: T0, rs1: T1, rs2: T2);
6248}
6249
6250/// RISC-V `fsgnjx.h` instruction.
6251///
6252/// # Forms
6253/// Assembly: `fsgnjx.h xd, xs1, xs2`
6254/// Rust: `fsgnjx_h(rd, rs1, rs2)`
6255///
6256/// # Arguments
6257/// - `rd` — Destination register.
6258/// - `rs1` — Source register.
6259/// - `rs2` — Source register.
6260pub trait FsgnjxHEmitter<T0, T1, T2> {
6261 fn fsgnjx_h(&mut self, rd: T0, rs1: T1, rs2: T2);
6262}
6263
6264/// RISC-V `fsgnjx.q` instruction.
6265///
6266/// # Forms
6267/// Assembly: `fsgnjx.q qd, qs1, qs2`
6268/// Rust: `fsgnjx_q(rd, rs1, rs2)`
6269///
6270/// # Arguments
6271/// - `rd` — Destination register.
6272/// - `rs1` — Source register.
6273/// - `rs2` — Source register.
6274pub trait FsgnjxQEmitter<T0, T1, T2> {
6275 fn fsgnjx_q(&mut self, rd: T0, rs1: T1, rs2: T2);
6276}
6277
6278/// Single-precision sign inject exclusive or
6279///
6280/// Writes _fd_ with the xor of the sign bits of _fs2_ and _fs1_ and the exponent and mantissa of _fs1_.
6281///
6282/// Sign-injection instructions do not set floating-point exception flags, nor do they canonicalize NaNs.
6283///
6284/// # Forms
6285/// Assembly: `fsgnjx.s fd, fs1, fs2`
6286/// Rust: `fsgnjx_s(rd, rs1, rs2)`
6287///
6288/// # Arguments
6289/// - `rd` — Destination register.
6290/// - `rs1` — Source register.
6291/// - `rs2` — Source register.
6292pub trait FsgnjxSEmitter<T0, T1, T2> {
6293 fn fsgnjx_s(&mut self, rd: T0, rs1: T1, rs2: T2);
6294}
6295
6296/// Half-precision floating-point store
6297///
6298/// The `fsh` instruction stores a half-precision floating-point value
6299/// from register _rd_ to memory at address _rs1_ + _imm_.
6300///
6301/// `fsh` does not modify the bits being transferred; in particular, the payloads of non-canonical NaNs are preserved.
6302///
6303/// `fsh` ignores all but the lower 16 bits in _rs2_.
6304///
6305/// `fsh` is only guaranteed to execute atomically if the effective address is naturally aligned.
6306///
6307/// # Forms
6308/// Assembly: `fsh fs2, imm(xs1)`
6309/// Rust: `fsh(rs1, rs2, imm)`
6310///
6311/// # Arguments
6312/// - `rs1` — Memory base register.
6313/// - `rs2` — Source register.
6314/// - `imm` — Immediate encoding value.
6315pub trait FshEmitter<T0, T1, T2> {
6316 fn fsh(&mut self, rs1: T0, rs2: T1, imm: T2);
6317}
6318
6319/// RISC-V `fsq` instruction.
6320///
6321/// # Forms
6322/// Assembly: `fsq xs1, qs2, imm`
6323/// Rust: `fsq(rs1, rs2, imm)`
6324///
6325/// # Arguments
6326/// - `rs1` — Memory base register.
6327/// - `rs2` — Source register.
6328/// - `imm` — Immediate encoding value.
6329pub trait FsqEmitter<T0, T1, T2> {
6330 fn fsq(&mut self, rs1: T0, rs2: T1, imm: T2);
6331}
6332
6333/// RISC-V `fsqrt.d` instruction.
6334///
6335/// # Forms
6336/// Assembly: `fsqrt.d xd, xs1, rm`
6337/// Rust: `fsqrt_d(rd, rs1, rm)`
6338///
6339/// # Arguments
6340/// - `rd` — Destination register.
6341/// - `rs1` — Source register.
6342/// - `rm` — Rounding mode.
6343pub trait FsqrtDEmitter<T0, T1, T2> {
6344 fn fsqrt_d(&mut self, rd: T0, rs1: T1, rm: T2);
6345}
6346
6347/// RISC-V `fsqrt.h` instruction.
6348///
6349/// # Forms
6350/// Assembly: `fsqrt.h xd, xs1, rm`
6351/// Rust: `fsqrt_h(rd, rs1, rm)`
6352///
6353/// # Arguments
6354/// - `rd` — Destination register.
6355/// - `rs1` — Source register.
6356/// - `rm` — Rounding mode.
6357pub trait FsqrtHEmitter<T0, T1, T2> {
6358 fn fsqrt_h(&mut self, rd: T0, rs1: T1, rm: T2);
6359}
6360
6361/// RISC-V `fsqrt.q` instruction.
6362///
6363/// # Forms
6364/// Assembly: `fsqrt.q qd, qs1, rm`
6365/// Rust: `fsqrt_q(rd, rs1, rm)`
6366///
6367/// # Arguments
6368/// - `rd` — Destination register.
6369/// - `rs1` — Source register.
6370/// - `rm` — Rounding mode.
6371pub trait FsqrtQEmitter<T0, T1, T2> {
6372 fn fsqrt_q(&mut self, rd: T0, rs1: T1, rm: T2);
6373}
6374
6375/// RISC-V `fsqrt.s` instruction.
6376///
6377/// # Forms
6378/// Assembly: `fsqrt.s fd, fs1, rm`
6379/// Rust: `fsqrt_s(rd, rs1, rm)`
6380///
6381/// # Arguments
6382/// - `rd` — Destination register.
6383/// - `rs1` — Source register.
6384/// - `rm` — Rounding mode.
6385pub trait FsqrtSEmitter<T0, T1, T2> {
6386 fn fsqrt_s(&mut self, rd: T0, rs1: T1, rm: T2);
6387}
6388
6389/// RISC-V `fsrm` instruction.
6390///
6391/// # Forms
6392/// Assembly: `fsrm rd rs1`
6393/// Rust: `fsrm(rd, rs1)`
6394///
6395/// # Arguments
6396/// - `rd` — Destination register.
6397/// - `rs1` — Source register.
6398pub trait FsrmEmitter<T0, T1> {
6399 fn fsrm(&mut self, rd: T0, rs1: T1);
6400}
6401
6402/// RISC-V `fsrmi` instruction.
6403///
6404/// # Forms
6405/// Assembly: `fsrmi rd zimm5`
6406/// Rust: `fsrmi(rd, zimm5)`
6407///
6408/// # Arguments
6409/// - `rd` — Destination register.
6410/// - `zimm5` — Immediate encoding value.
6411pub trait FsrmiEmitter<T0, T1> {
6412 fn fsrmi(&mut self, rd: T0, zimm5: T1);
6413}
6414
6415/// RISC-V `fsub.d` instruction.
6416///
6417/// # Forms
6418/// Assembly: `fsub.d xd, xs1, xs2, rm`
6419/// Rust: `fsub_d(rd, rs1, rs2, rm)`
6420///
6421/// # Arguments
6422/// - `rd` — Destination register.
6423/// - `rs1` — Source register.
6424/// - `rs2` — Source register.
6425/// - `rm` — Rounding mode.
6426pub trait FsubDEmitter<T0, T1, T2, T3> {
6427 fn fsub_d(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
6428}
6429
6430/// RISC-V `fsub.h` instruction.
6431///
6432/// # Forms
6433/// Assembly: `fsub.h xd, xs1, xs2, rm`
6434/// Rust: `fsub_h(rd, rs1, rs2, rm)`
6435///
6436/// # Arguments
6437/// - `rd` — Destination register.
6438/// - `rs1` — Source register.
6439/// - `rs2` — Source register.
6440/// - `rm` — Rounding mode.
6441pub trait FsubHEmitter<T0, T1, T2, T3> {
6442 fn fsub_h(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
6443}
6444
6445/// RISC-V `fsub.q` instruction.
6446///
6447/// # Forms
6448/// Assembly: `fsub.q qd, qs1, qs2, rm`
6449/// Rust: `fsub_q(rd, rs1, rs2, rm)`
6450///
6451/// # Arguments
6452/// - `rd` — Destination register.
6453/// - `rs1` — Source register.
6454/// - `rs2` — Source register.
6455/// - `rm` — Rounding mode.
6456pub trait FsubQEmitter<T0, T1, T2, T3> {
6457 fn fsub_q(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
6458}
6459
6460/// Single-precision floating-point subtraction
6461///
6462/// Do the single-precision floating-point subtraction of fs2 from fs1 and store the result in fd.
6463/// rm is the dynamic Rounding Mode.
6464///
6465/// # Forms
6466/// Assembly: `fsub.s fd, fs1, fs2, rm`
6467/// Rust: `fsub_s(rd, rs1, rs2, rm)`
6468///
6469/// # Arguments
6470/// - `rd` — Destination register.
6471/// - `rs1` — Source register.
6472/// - `rs2` — Source register.
6473/// - `rm` — Rounding mode.
6474pub trait FsubSEmitter<T0, T1, T2, T3> {
6475 fn fsub_s(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3);
6476}
6477
6478/// Single-precision floating-point store
6479///
6480/// The `fsw` instruction stores a single-precision floating-point value in _fs2_ to memory at address _rs1_ + _imm_.
6481///
6482/// `fsw` does not modify the bits being transferred; in particular, the payloads of non-canonical NaNs are preserved.
6483///
6484/// # Forms
6485/// Assembly: `fsw fs2, xs1, imm`
6486/// Rust: `fsw(rs1, rs2, imm)`
6487///
6488/// # Arguments
6489/// - `rs1` — Memory base register.
6490/// - `rs2` — Source register.
6491/// - `imm` — Immediate encoding value.
6492pub trait FswEmitter<T0, T1, T2> {
6493 fn fsw(&mut self, rs1: T0, rs2: T1, imm: T2);
6494}
6495
6496/// RISC-V `hfence.gvma` instruction.
6497///
6498/// # Forms
6499/// Assembly: `hfence.gvma xs1, xs2`
6500/// Rust: `hfence_gvma(rs1, rs2)`
6501///
6502/// # Arguments
6503/// - `rs1` — Source register.
6504/// - `rs2` — Source register.
6505pub trait HfenceGvmaEmitter<T0, T1> {
6506 fn hfence_gvma(&mut self, rs1: T0, rs2: T1);
6507}
6508
6509/// RISC-V `hfence.vvma` instruction.
6510///
6511/// # Forms
6512/// Assembly: `hfence.vvma xs1, xs2`
6513/// Rust: `hfence_vvma(rs1, rs2)`
6514///
6515/// # Arguments
6516/// - `rs1` — Source register.
6517/// - `rs2` — Source register.
6518pub trait HfenceVvmaEmitter<T0, T1> {
6519 fn hfence_vvma(&mut self, rs1: T0, rs2: T1);
6520}
6521
6522/// Invalidate cached address translations
6523///
6524/// `hinval.gvma` has the same semantics as `sinval.vma` except that it combines with
6525/// `sfence.w.inval` and `sfence.inval.ir` to replace `hfence.gvma` and uses VMID instead of ASID.
6526///
6527/// # Forms
6528/// Assembly: `hinval.gvma xs1, xs2`
6529/// Rust: `hinval_gvma(rs1, rs2)`
6530///
6531/// # Arguments
6532/// - `rs1` — Source register.
6533/// - `rs2` — Source register.
6534pub trait HinvalGvmaEmitter<T0, T1> {
6535 fn hinval_gvma(&mut self, rs1: T0, rs2: T1);
6536}
6537
6538/// Invalidate cached address translations
6539///
6540/// `hinval.vvma` has the same semantics as `sinval.vma` except that it combines with
6541/// `sfence.w.inval` and `sfence.inval.ir` to replace `hfence.vvma`.
6542///
6543/// # Forms
6544/// Assembly: `hinval.vvma xs1, xs2`
6545/// Rust: `hinval_vvma(rs1, rs2)`
6546///
6547/// # Arguments
6548/// - `rs1` — Source register.
6549/// - `rs2` — Source register.
6550pub trait HinvalVvmaEmitter<T0, T1> {
6551 fn hinval_vvma(&mut self, rs1: T0, rs2: T1);
6552}
6553
6554/// RISC-V `hlv.b` instruction.
6555///
6556/// # Forms
6557/// Assembly: `hlv.b xd, xs1`
6558/// Rust: `hlv_b(rd, rs1)`
6559///
6560/// # Arguments
6561/// - `rd` — Destination register.
6562/// - `rs1` — Source register.
6563pub trait HlvBEmitter<T0, T1> {
6564 fn hlv_b(&mut self, rd: T0, rs1: T1);
6565}
6566
6567/// RISC-V `hlv.bu` instruction.
6568///
6569/// # Forms
6570/// Assembly: `hlv.bu xd, xs1`
6571/// Rust: `hlv_bu(rd, rs1)`
6572///
6573/// # Arguments
6574/// - `rd` — Destination register.
6575/// - `rs1` — Source register.
6576pub trait HlvBuEmitter<T0, T1> {
6577 fn hlv_bu(&mut self, rd: T0, rs1: T1);
6578}
6579
6580/// RISC-V `hlv.d` instruction.
6581///
6582/// # Forms
6583/// Assembly: `hlv.d xd, xs1`
6584/// Rust: `hlv_d(rd, rs1)`
6585///
6586/// # Arguments
6587/// - `rd` — Destination register.
6588/// - `rs1` — Source register.
6589pub trait HlvDEmitter<T0, T1> {
6590 fn hlv_d(&mut self, rd: T0, rs1: T1);
6591}
6592
6593/// RISC-V `hlv.h` instruction.
6594///
6595/// # Forms
6596/// Assembly: `hlv.h xd, xs1`
6597/// Rust: `hlv_h(rd, rs1)`
6598///
6599/// # Arguments
6600/// - `rd` — Destination register.
6601/// - `rs1` — Source register.
6602pub trait HlvHEmitter<T0, T1> {
6603 fn hlv_h(&mut self, rd: T0, rs1: T1);
6604}
6605
6606/// RISC-V `hlv.hu` instruction.
6607///
6608/// # Forms
6609/// Assembly: `hlv.hu xd, xs1`
6610/// Rust: `hlv_hu(rd, rs1)`
6611///
6612/// # Arguments
6613/// - `rd` — Destination register.
6614/// - `rs1` — Source register.
6615pub trait HlvHuEmitter<T0, T1> {
6616 fn hlv_hu(&mut self, rd: T0, rs1: T1);
6617}
6618
6619/// RISC-V `hlv.w` instruction.
6620///
6621/// # Forms
6622/// Assembly: `hlv.w xd, xs1`
6623/// Rust: `hlv_w(rd, rs1)`
6624///
6625/// # Arguments
6626/// - `rd` — Destination register.
6627/// - `rs1` — Source register.
6628pub trait HlvWEmitter<T0, T1> {
6629 fn hlv_w(&mut self, rd: T0, rs1: T1);
6630}
6631
6632/// RISC-V `hlv.wu` instruction.
6633///
6634/// # Forms
6635/// Assembly: `hlv.wu xd, xs1`
6636/// Rust: `hlv_wu(rd, rs1)`
6637///
6638/// # Arguments
6639/// - `rd` — Destination register.
6640/// - `rs1` — Source register.
6641pub trait HlvWuEmitter<T0, T1> {
6642 fn hlv_wu(&mut self, rd: T0, rs1: T1);
6643}
6644
6645/// RISC-V `hlvx.hu` instruction.
6646///
6647/// # Forms
6648/// Assembly: `hlvx.hu xd, xs1`
6649/// Rust: `hlvx_hu(rd, rs1)`
6650///
6651/// # Arguments
6652/// - `rd` — Destination register.
6653/// - `rs1` — Source register.
6654pub trait HlvxHuEmitter<T0, T1> {
6655 fn hlvx_hu(&mut self, rd: T0, rs1: T1);
6656}
6657
6658/// RISC-V `hlvx.wu` instruction.
6659///
6660/// # Forms
6661/// Assembly: `hlvx.wu xd, xs1`
6662/// Rust: `hlvx_wu(rd, rs1)`
6663///
6664/// # Arguments
6665/// - `rd` — Destination register.
6666/// - `rs1` — Source register.
6667pub trait HlvxWuEmitter<T0, T1> {
6668 fn hlvx_wu(&mut self, rd: T0, rs1: T1);
6669}
6670
6671/// RISC-V `hsv.b` instruction.
6672///
6673/// # Forms
6674/// Assembly: `hsv.b xs1, xs2`
6675/// Rust: `hsv_b(rs1, rs2)`
6676///
6677/// # Arguments
6678/// - `rs1` — Source register.
6679/// - `rs2` — Source register.
6680pub trait HsvBEmitter<T0, T1> {
6681 fn hsv_b(&mut self, rs1: T0, rs2: T1);
6682}
6683
6684/// RISC-V `hsv.d` instruction.
6685///
6686/// # Forms
6687/// Assembly: `hsv.d xs1, xs2`
6688/// Rust: `hsv_d(rs1, rs2)`
6689///
6690/// # Arguments
6691/// - `rs1` — Source register.
6692/// - `rs2` — Source register.
6693pub trait HsvDEmitter<T0, T1> {
6694 fn hsv_d(&mut self, rs1: T0, rs2: T1);
6695}
6696
6697/// RISC-V `hsv.h` instruction.
6698///
6699/// # Forms
6700/// Assembly: `hsv.h xs1, xs2`
6701/// Rust: `hsv_h(rs1, rs2)`
6702///
6703/// # Arguments
6704/// - `rs1` — Source register.
6705/// - `rs2` — Source register.
6706pub trait HsvHEmitter<T0, T1> {
6707 fn hsv_h(&mut self, rs1: T0, rs2: T1);
6708}
6709
6710/// RISC-V `hsv.w` instruction.
6711///
6712/// # Forms
6713/// Assembly: `hsv.w xs1, xs2`
6714/// Rust: `hsv_w(rs1, rs2)`
6715///
6716/// # Arguments
6717/// - `rs1` — Source register.
6718/// - `rs2` — Source register.
6719pub trait HsvWEmitter<T0, T1> {
6720 fn hsv_w(&mut self, rs1: T0, rs2: T1);
6721}
6722
6723/// RISC-V `j` instruction.
6724///
6725/// # Forms
6726/// Assembly: `j jimm20`
6727/// Rust: `j(imm)`
6728///
6729/// # Arguments
6730/// - `imm` — Immediate encoding value.
6731pub trait JEmitter<T0> {
6732 fn j(&mut self, imm: T0);
6733}
6734
6735/// Jump and link
6736///
6737/// Jump to a PC-relative offset and store the return
6738/// address in rd.
6739///
6740/// # Forms
6741/// Assembly: `jal xd, imm`
6742/// Rust: `jal(rd, imm)`
6743///
6744/// # Arguments
6745/// - `rd` — Destination register.
6746/// - `imm` — Immediate encoding value.
6747pub trait JalEmitter<T0, T1> {
6748 fn jal(&mut self, rd: T0, imm: T1);
6749}
6750
6751/// RISC-V `jal.pseudo` instruction.
6752///
6753/// # Forms
6754/// Assembly: `jal.pseudo jimm20`
6755/// Rust: `jal_pseudo(imm)`
6756///
6757/// # Arguments
6758/// - `imm` — Immediate encoding value.
6759pub trait JalPseudoEmitter<T0> {
6760 fn jal_pseudo(&mut self, imm: T0);
6761}
6762
6763/// Jump and link register
6764///
6765/// Jump to an address formed by adding rs1
6766/// to a signed offset then clearing the least
6767/// significant bit, and store the return address
6768/// in rd.
6769///
6770/// # Forms
6771/// Assembly: `jalr xd, imm(rs1)`
6772/// Rust: `jalr(rd, rs1, imm)`
6773///
6774/// # Arguments
6775/// - `rd` — Destination register.
6776/// - `rs1` — Source register.
6777/// - `imm` — Immediate encoding value.
6778pub trait JalrEmitter<T0, T1, T2> {
6779 fn jalr(&mut self, rd: T0, rs1: T1, imm: T2);
6780}
6781
6782/// RISC-V `jalr.pseudo` instruction.
6783///
6784/// # Forms
6785/// Assembly: `jalr.pseudo rs1`
6786/// Rust: `jalr_pseudo(rs1)`
6787///
6788/// # Arguments
6789/// - `rs1` — Source register.
6790pub trait JalrPseudoEmitter<T0> {
6791 fn jalr_pseudo(&mut self, rs1: T0);
6792}
6793
6794/// RISC-V `jr` instruction.
6795///
6796/// # Forms
6797/// Assembly: `jr rs1`
6798/// Rust: `jr(rs1)`
6799///
6800/// # Arguments
6801/// - `rs1` — Source register.
6802pub trait JrEmitter<T0> {
6803 fn jr(&mut self, rs1: T0);
6804}
6805
6806/// Load byte
6807///
6808/// Load 8 bits of data into register `rd` from an
6809/// address formed by adding `rs1` to a signed offset.
6810/// Sign extend the result.
6811///
6812/// # Forms
6813/// Assembly: `lb xd, imm(rs1)`
6814/// Rust: `lb(rd, rs1, imm)`
6815///
6816/// # Arguments
6817/// - `rd` — Destination register.
6818/// - `rs1` — Memory base register.
6819/// - `imm` — Immediate encoding value.
6820pub trait LbEmitter<T0, T1, T2> {
6821 fn lb(&mut self, rd: T0, rs1: T1, imm: T2);
6822}
6823
6824/// Load byte unsigned
6825///
6826/// Load 8 bits of data into register `rd` from an
6827/// address formed by adding `rs1` to a signed offset.
6828/// Zero extend the result.
6829///
6830/// # Forms
6831/// Assembly: `lbu xd, imm(rs1)`
6832/// Rust: `lbu(rd, rs1, imm)`
6833///
6834/// # Arguments
6835/// - `rd` — Destination register.
6836/// - `rs1` — Memory base register.
6837/// - `imm` — Immediate encoding value.
6838pub trait LbuEmitter<T0, T1, T2> {
6839 fn lbu(&mut self, rd: T0, rs1: T1, imm: T2);
6840}
6841
6842/// Load doubleword
6843///
6844/// Load 64 bits of data into register `rd` from an
6845/// address formed by adding `rs1` to a signed offset.
6846///
6847/// # Forms
6848/// Assembly: `ld xd, imm(rs1)`
6849/// Rust: `ld(rd, rs1, imm)`
6850///
6851/// # Arguments
6852/// - `rd` — Destination register.
6853/// - `rs1` — Memory base register.
6854/// - `imm` — Immediate encoding value.
6855pub trait LdEmitter<T0, T1, T2> {
6856 fn ld(&mut self, rd: T0, rs1: T1, imm: T2);
6857}
6858
6859/// Load halfword
6860///
6861/// Load 16 bits of data into register `rd` from an
6862/// address formed by adding `rs1` to a signed offset.
6863/// Sign extend the result.
6864///
6865/// # Forms
6866/// Assembly: `lh xd, imm(rs1)`
6867/// Rust: `lh(rd, rs1, imm)`
6868///
6869/// # Arguments
6870/// - `rd` — Destination register.
6871/// - `rs1` — Memory base register.
6872/// - `imm` — Immediate encoding value.
6873pub trait LhEmitter<T0, T1, T2> {
6874 fn lh(&mut self, rd: T0, rs1: T1, imm: T2);
6875}
6876
6877/// Load halfword unsigned
6878///
6879/// Load 16 bits of data into register `rd` from an
6880/// address formed by adding `rs1` to a signed offset.
6881/// Zero extend the result.
6882///
6883/// # Forms
6884/// Assembly: `lhu xd, imm(rs1)`
6885/// Rust: `lhu(rd, rs1, imm)`
6886///
6887/// # Arguments
6888/// - `rd` — Destination register.
6889/// - `rs1` — Memory base register.
6890/// - `imm` — Immediate encoding value.
6891pub trait LhuEmitter<T0, T1, T2> {
6892 fn lhu(&mut self, rd: T0, rs1: T1, imm: T2);
6893}
6894
6895/// RISC-V `lpad` instruction.
6896///
6897/// # Forms
6898/// Assembly: `lpad imm`
6899/// Rust: `lpad(imm)`
6900///
6901/// # Arguments
6902/// - `imm` — Immediate encoding value.
6903pub trait LpadEmitter<T0> {
6904 fn lpad(&mut self, imm: T0);
6905}
6906
6907/// Load reserved doubleword
6908///
6909/// Loads a word from the address in rs1, places the value in rd,
6910/// and registers a _reservation set_ -- a set of bytes that subsumes the bytes in the
6911/// addressed word.
6912///
6913/// The address in rs1 must be 8-byte aligned.
6914///
6915/// If the address is not naturally aligned, a `LoadAddressMisaligned` exception or an
6916/// `LoadAccessFault` exception will be generated. The access-fault exception can be generated
6917/// for a memory access that would otherwise be able to complete except for the misalignment,
6918/// if the misaligned access should not be emulated.
6919///
6920/// An implementation can register an arbitrarily large reservation set on each LR, provided the
6921/// reservation set includes all bytes of the addressed data word or doubleword.
6922/// An SC can only pair with the most recent LR in program order.
6923/// An SC may succeed only if no store from another hart to the reservation set can be
6924/// observed to have occurred between the LR and the SC, and if there is no other SC between the
6925/// LR and itself in program order.
6926/// An SC may succeed only if no write from a device other than a hart to the bytes accessed by
6927/// the LR instruction can be observed to have occurred between the LR and SC. Note this LR
6928/// might have had a different effective address and data size, but reserved the SC's
6929/// address as part of the reservation set.
6930///
6931/// \[NOTE\]
6932/// ----
6933/// Following this model, in systems with memory translation, an SC is allowed to succeed if the
6934/// earlier LR reserved the same location using an alias with a different virtual address, but is
6935/// also allowed to fail if the virtual address is different.
6936///
6937/// To accommodate legacy devices and buses, writes from devices other than RISC-V harts are only
6938/// required to invalidate reservations when they overlap the bytes accessed by the LR.
6939/// These writes are not required to invalidate the reservation when they access other bytes in
6940/// the reservation set.
6941/// ----
6942///
6943/// Software should not set the _rl_ bit on an LR instruction unless the _aq_ bit is also set.
6944/// LR.rl and SC.aq instructions are not guaranteed to provide any stronger ordering than those
6945/// with both bits clear, but may result in lower performance.
6946///
6947/// # Forms
6948/// Assembly: `lr.d xd, xs1`
6949/// Rust: `lr_d(rd, rs1, aq, rl)`
6950///
6951/// # Arguments
6952/// - `rd` — Destination register.
6953/// - `rs1` — Memory base register.
6954/// - `aq` — Acquire-order bit.
6955/// - `rl` — Release-order bit; retained for the existing emitter API.
6956pub trait LrDEmitter<T0, T1, T2, T3> {
6957 fn lr_d(&mut self, rd: T0, rs1: T1, aq: T2, rl: T3);
6958}
6959
6960/// Load reserved word
6961///
6962/// Loads a word from the address in rs1, places the sign-extended value in rd,
6963/// and registers a _reservation set_ -- a set of bytes that subsumes the bytes in the
6964/// addressed word.
6965///
6966/// <%- if XLEN == 64 -%>
6967/// The 32-bit load result is sign-extended to 64-bits.
6968/// <%- end -%>
6969///
6970/// The address in rs1 must be naturally aligned to the size of the operand
6971/// (_i.e._, eight-byte aligned for doublewords and four-byte aligned for words).
6972///
6973/// If the address is not naturally aligned, a `LoadAddressMisaligned` exception or an
6974/// `LoadAccessFault` exception will be generated. The access-fault exception can be generated
6975/// for a memory access that would otherwise be able to complete except for the misalignment,
6976/// if the misaligned access should not be emulated.
6977///
6978/// An implementation can register an arbitrarily large reservation set on each LR, provided the
6979/// reservation set includes all bytes of the addressed data word or doubleword.
6980/// An SC can only pair with the most recent LR in program order.
6981/// An SC may succeed only if no store from another hart to the reservation set can be
6982/// observed to have occurred between the LR and the SC, and if there is no other SC between the
6983/// LR and itself in program order.
6984/// An SC may succeed only if no write from a device other than a hart to the bytes accessed by
6985/// the LR instruction can be observed to have occurred between the LR and SC. Note this LR
6986/// might have had a different effective address and data size, but reserved the SC's
6987/// address as part of the reservation set.
6988///
6989/// \[NOTE\]
6990/// ----
6991/// Following this model, in systems with memory translation, an SC is allowed to succeed if the
6992/// earlier LR reserved the same location using an alias with a different virtual address, but is
6993/// also allowed to fail if the virtual address is different.
6994///
6995/// To accommodate legacy devices and buses, writes from devices other than RISC-V harts are only
6996/// required to invalidate reservations when they overlap the bytes accessed by the LR.
6997/// These writes are not required to invalidate the reservation when they access other bytes in
6998/// the reservation set.
6999/// ----
7000///
7001/// Software should not set the _rl_ bit on an LR instruction unless the _aq_ bit is also set.
7002/// LR.rl and SC.aq instructions are not guaranteed to provide any stronger ordering than those
7003/// with both bits clear, but may result in lower performance.
7004///
7005/// # Forms
7006/// Assembly: `lr.w xd, xs1`
7007/// Rust: `lr_w(rd, rs1, aq, rl)`
7008///
7009/// # Arguments
7010/// - `rd` — Destination register.
7011/// - `rs1` — Memory base register.
7012/// - `aq` — Acquire-order bit.
7013/// - `rl` — Release-order bit; retained for the existing emitter API.
7014pub trait LrWEmitter<T0, T1, T2, T3> {
7015 fn lr_w(&mut self, rd: T0, rs1: T1, aq: T2, rl: T3);
7016}
7017
7018/// Load upper immediate
7019///
7020/// Load the zero-extended imm into rd.
7021///
7022/// # Forms
7023/// Assembly: `lui xd, imm`
7024/// Rust: `lui(rd, imm)`
7025///
7026/// # Arguments
7027/// - `rd` — Destination register.
7028/// - `imm` — Immediate encoding value.
7029pub trait LuiEmitter<T0, T1> {
7030 fn lui(&mut self, rd: T0, imm: T1);
7031}
7032
7033/// Load word
7034///
7035/// Load 32 bits of data into register `rd` from an
7036/// address formed by adding `rs1` to a signed offset.
7037/// Sign extend the result.
7038///
7039/// # Forms
7040/// Assembly: `lw xd, imm(rs1)`
7041/// Rust: `lw(rd, rs1, imm)`
7042///
7043/// # Arguments
7044/// - `rd` — Destination register.
7045/// - `rs1` — Memory base register.
7046/// - `imm` — Immediate encoding value.
7047pub trait LwEmitter<T0, T1, T2> {
7048 fn lw(&mut self, rd: T0, rs1: T1, imm: T2);
7049}
7050
7051/// Load word unsigned
7052///
7053/// Load 64 bits of data into register `rd` from an
7054/// address formed by adding `rs1` to a signed offset.
7055/// Zero extend the result.
7056///
7057/// # Forms
7058/// Assembly: `lwu xd, imm(rs1)`
7059/// Rust: `lwu(rd, rs1, imm)`
7060///
7061/// # Arguments
7062/// - `rd` — Destination register.
7063/// - `rs1` — Memory base register.
7064/// - `imm` — Immediate encoding value.
7065pub trait LwuEmitter<T0, T1, T2> {
7066 fn lwu(&mut self, rd: T0, rs1: T1, imm: T2);
7067}
7068
7069/// Maximum
7070///
7071/// This instruction returns the larger of two signed integers.
7072///
7073/// .Software Hint
7074/// \[NOTE\]
7075/// Calculating the absolute value of a signed integer can be performed using the
7076/// following sequence: `neg rD,rS` followed by `max rD,rS,rD. When using this
7077/// common sequence, it is suggested that they are scheduled with no intervening
7078/// instructions so that implementations that are so optimized can fuse them
7079/// together.
7080///
7081/// # Forms
7082/// Assembly: `max xd, xs1, xs2`
7083/// Rust: `max(rd, rs1, rs2)`
7084///
7085/// # Arguments
7086/// - `rd` — Destination register.
7087/// - `rs1` — Source register.
7088/// - `rs2` — Source register.
7089pub trait MaxEmitter<T0, T1, T2> {
7090 fn max(&mut self, rd: T0, rs1: T1, rs2: T2);
7091}
7092
7093/// Unsigned maximum
7094///
7095/// This instruction returns the larger of two unsigned integers.
7096///
7097/// # Forms
7098/// Assembly: `maxu xd, xs1, xs2`
7099/// Rust: `maxu(rd, rs1, rs2)`
7100///
7101/// # Arguments
7102/// - `rd` — Destination register.
7103/// - `rs1` — Source register.
7104/// - `rs2` — Source register.
7105pub trait MaxuEmitter<T0, T1, T2> {
7106 fn maxu(&mut self, rd: T0, rs1: T1, rs2: T2);
7107}
7108
7109/// Minimum
7110///
7111/// This instruction returns the smaller of two signed integers.
7112///
7113/// # Forms
7114/// Assembly: `min xd, xs1, xs2`
7115/// Rust: `min(rd, rs1, rs2)`
7116///
7117/// # Arguments
7118/// - `rd` — Destination register.
7119/// - `rs1` — Source register.
7120/// - `rs2` — Source register.
7121pub trait MinEmitter<T0, T1, T2> {
7122 fn min(&mut self, rd: T0, rs1: T1, rs2: T2);
7123}
7124
7125/// Unsigned minimum
7126///
7127/// This instruction returns the smaller of two unsigned integers.
7128///
7129/// # Forms
7130/// Assembly: `minu xd, xs1, xs2`
7131/// Rust: `minu(rd, rs1, rs2)`
7132///
7133/// # Arguments
7134/// - `rd` — Destination register.
7135/// - `rs1` — Source register.
7136/// - `rs2` — Source register.
7137pub trait MinuEmitter<T0, T1, T2> {
7138 fn minu(&mut self, rd: T0, rs1: T1, rs2: T2);
7139}
7140
7141/// RISC-V `mnret` instruction.
7142///
7143/// # Forms
7144/// Assembly: `mnret mnret`
7145/// Rust: `mnret()`
7146///
7147/// # Arguments
7148pub trait MnretEmitter {
7149 fn mnret(&mut self);
7150}
7151
7152/// RISC-V `mop.r.0` instruction.
7153///
7154/// # Forms
7155/// Assembly: `mop.r.0 rd rs1`
7156/// Rust: `mop_r_0(rd, rs1)`
7157///
7158/// # Arguments
7159/// - `rd` — Destination register.
7160/// - `rs1` — Source register.
7161pub trait MopR0Emitter<T0, T1> {
7162 fn mop_r_0(&mut self, rd: T0, rs1: T1);
7163}
7164
7165/// RISC-V `mop.r.1` instruction.
7166///
7167/// # Forms
7168/// Assembly: `mop.r.1 rd rs1`
7169/// Rust: `mop_r_1(rd, rs1)`
7170///
7171/// # Arguments
7172/// - `rd` — Destination register.
7173/// - `rs1` — Source register.
7174pub trait MopR1Emitter<T0, T1> {
7175 fn mop_r_1(&mut self, rd: T0, rs1: T1);
7176}
7177
7178/// RISC-V `mop.r.10` instruction.
7179///
7180/// # Forms
7181/// Assembly: `mop.r.10 rd rs1`
7182/// Rust: `mop_r_10(rd, rs1)`
7183///
7184/// # Arguments
7185/// - `rd` — Destination register.
7186/// - `rs1` — Source register.
7187pub trait MopR10Emitter<T0, T1> {
7188 fn mop_r_10(&mut self, rd: T0, rs1: T1);
7189}
7190
7191/// RISC-V `mop.r.11` instruction.
7192///
7193/// # Forms
7194/// Assembly: `mop.r.11 rd rs1`
7195/// Rust: `mop_r_11(rd, rs1)`
7196///
7197/// # Arguments
7198/// - `rd` — Destination register.
7199/// - `rs1` — Source register.
7200pub trait MopR11Emitter<T0, T1> {
7201 fn mop_r_11(&mut self, rd: T0, rs1: T1);
7202}
7203
7204/// RISC-V `mop.r.12` instruction.
7205///
7206/// # Forms
7207/// Assembly: `mop.r.12 rd rs1`
7208/// Rust: `mop_r_12(rd, rs1)`
7209///
7210/// # Arguments
7211/// - `rd` — Destination register.
7212/// - `rs1` — Source register.
7213pub trait MopR12Emitter<T0, T1> {
7214 fn mop_r_12(&mut self, rd: T0, rs1: T1);
7215}
7216
7217/// RISC-V `mop.r.13` instruction.
7218///
7219/// # Forms
7220/// Assembly: `mop.r.13 rd rs1`
7221/// Rust: `mop_r_13(rd, rs1)`
7222///
7223/// # Arguments
7224/// - `rd` — Destination register.
7225/// - `rs1` — Source register.
7226pub trait MopR13Emitter<T0, T1> {
7227 fn mop_r_13(&mut self, rd: T0, rs1: T1);
7228}
7229
7230/// RISC-V `mop.r.14` instruction.
7231///
7232/// # Forms
7233/// Assembly: `mop.r.14 rd rs1`
7234/// Rust: `mop_r_14(rd, rs1)`
7235///
7236/// # Arguments
7237/// - `rd` — Destination register.
7238/// - `rs1` — Source register.
7239pub trait MopR14Emitter<T0, T1> {
7240 fn mop_r_14(&mut self, rd: T0, rs1: T1);
7241}
7242
7243/// RISC-V `mop.r.15` instruction.
7244///
7245/// # Forms
7246/// Assembly: `mop.r.15 rd rs1`
7247/// Rust: `mop_r_15(rd, rs1)`
7248///
7249/// # Arguments
7250/// - `rd` — Destination register.
7251/// - `rs1` — Source register.
7252pub trait MopR15Emitter<T0, T1> {
7253 fn mop_r_15(&mut self, rd: T0, rs1: T1);
7254}
7255
7256/// RISC-V `mop.r.16` instruction.
7257///
7258/// # Forms
7259/// Assembly: `mop.r.16 rd rs1`
7260/// Rust: `mop_r_16(rd, rs1)`
7261///
7262/// # Arguments
7263/// - `rd` — Destination register.
7264/// - `rs1` — Source register.
7265pub trait MopR16Emitter<T0, T1> {
7266 fn mop_r_16(&mut self, rd: T0, rs1: T1);
7267}
7268
7269/// RISC-V `mop.r.17` instruction.
7270///
7271/// # Forms
7272/// Assembly: `mop.r.17 rd rs1`
7273/// Rust: `mop_r_17(rd, rs1)`
7274///
7275/// # Arguments
7276/// - `rd` — Destination register.
7277/// - `rs1` — Source register.
7278pub trait MopR17Emitter<T0, T1> {
7279 fn mop_r_17(&mut self, rd: T0, rs1: T1);
7280}
7281
7282/// RISC-V `mop.r.18` instruction.
7283///
7284/// # Forms
7285/// Assembly: `mop.r.18 rd rs1`
7286/// Rust: `mop_r_18(rd, rs1)`
7287///
7288/// # Arguments
7289/// - `rd` — Destination register.
7290/// - `rs1` — Source register.
7291pub trait MopR18Emitter<T0, T1> {
7292 fn mop_r_18(&mut self, rd: T0, rs1: T1);
7293}
7294
7295/// RISC-V `mop.r.19` instruction.
7296///
7297/// # Forms
7298/// Assembly: `mop.r.19 rd rs1`
7299/// Rust: `mop_r_19(rd, rs1)`
7300///
7301/// # Arguments
7302/// - `rd` — Destination register.
7303/// - `rs1` — Source register.
7304pub trait MopR19Emitter<T0, T1> {
7305 fn mop_r_19(&mut self, rd: T0, rs1: T1);
7306}
7307
7308/// RISC-V `mop.r.2` instruction.
7309///
7310/// # Forms
7311/// Assembly: `mop.r.2 rd rs1`
7312/// Rust: `mop_r_2(rd, rs1)`
7313///
7314/// # Arguments
7315/// - `rd` — Destination register.
7316/// - `rs1` — Source register.
7317pub trait MopR2Emitter<T0, T1> {
7318 fn mop_r_2(&mut self, rd: T0, rs1: T1);
7319}
7320
7321/// RISC-V `mop.r.20` instruction.
7322///
7323/// # Forms
7324/// Assembly: `mop.r.20 rd rs1`
7325/// Rust: `mop_r_20(rd, rs1)`
7326///
7327/// # Arguments
7328/// - `rd` — Destination register.
7329/// - `rs1` — Source register.
7330pub trait MopR20Emitter<T0, T1> {
7331 fn mop_r_20(&mut self, rd: T0, rs1: T1);
7332}
7333
7334/// RISC-V `mop.r.21` instruction.
7335///
7336/// # Forms
7337/// Assembly: `mop.r.21 rd rs1`
7338/// Rust: `mop_r_21(rd, rs1)`
7339///
7340/// # Arguments
7341/// - `rd` — Destination register.
7342/// - `rs1` — Source register.
7343pub trait MopR21Emitter<T0, T1> {
7344 fn mop_r_21(&mut self, rd: T0, rs1: T1);
7345}
7346
7347/// RISC-V `mop.r.22` instruction.
7348///
7349/// # Forms
7350/// Assembly: `mop.r.22 rd rs1`
7351/// Rust: `mop_r_22(rd, rs1)`
7352///
7353/// # Arguments
7354/// - `rd` — Destination register.
7355/// - `rs1` — Source register.
7356pub trait MopR22Emitter<T0, T1> {
7357 fn mop_r_22(&mut self, rd: T0, rs1: T1);
7358}
7359
7360/// RISC-V `mop.r.23` instruction.
7361///
7362/// # Forms
7363/// Assembly: `mop.r.23 rd rs1`
7364/// Rust: `mop_r_23(rd, rs1)`
7365///
7366/// # Arguments
7367/// - `rd` — Destination register.
7368/// - `rs1` — Source register.
7369pub trait MopR23Emitter<T0, T1> {
7370 fn mop_r_23(&mut self, rd: T0, rs1: T1);
7371}
7372
7373/// RISC-V `mop.r.24` instruction.
7374///
7375/// # Forms
7376/// Assembly: `mop.r.24 rd rs1`
7377/// Rust: `mop_r_24(rd, rs1)`
7378///
7379/// # Arguments
7380/// - `rd` — Destination register.
7381/// - `rs1` — Source register.
7382pub trait MopR24Emitter<T0, T1> {
7383 fn mop_r_24(&mut self, rd: T0, rs1: T1);
7384}
7385
7386/// RISC-V `mop.r.25` instruction.
7387///
7388/// # Forms
7389/// Assembly: `mop.r.25 rd rs1`
7390/// Rust: `mop_r_25(rd, rs1)`
7391///
7392/// # Arguments
7393/// - `rd` — Destination register.
7394/// - `rs1` — Source register.
7395pub trait MopR25Emitter<T0, T1> {
7396 fn mop_r_25(&mut self, rd: T0, rs1: T1);
7397}
7398
7399/// RISC-V `mop.r.26` instruction.
7400///
7401/// # Forms
7402/// Assembly: `mop.r.26 rd rs1`
7403/// Rust: `mop_r_26(rd, rs1)`
7404///
7405/// # Arguments
7406/// - `rd` — Destination register.
7407/// - `rs1` — Source register.
7408pub trait MopR26Emitter<T0, T1> {
7409 fn mop_r_26(&mut self, rd: T0, rs1: T1);
7410}
7411
7412/// RISC-V `mop.r.27` instruction.
7413///
7414/// # Forms
7415/// Assembly: `mop.r.27 rd rs1`
7416/// Rust: `mop_r_27(rd, rs1)`
7417///
7418/// # Arguments
7419/// - `rd` — Destination register.
7420/// - `rs1` — Source register.
7421pub trait MopR27Emitter<T0, T1> {
7422 fn mop_r_27(&mut self, rd: T0, rs1: T1);
7423}
7424
7425/// RISC-V `mop.r.28` instruction.
7426///
7427/// # Forms
7428/// Assembly: `mop.r.28 rd rs1`
7429/// Rust: `mop_r_28(rd, rs1)`
7430///
7431/// # Arguments
7432/// - `rd` — Destination register.
7433/// - `rs1` — Source register.
7434pub trait MopR28Emitter<T0, T1> {
7435 fn mop_r_28(&mut self, rd: T0, rs1: T1);
7436}
7437
7438/// RISC-V `mop.r.29` instruction.
7439///
7440/// # Forms
7441/// Assembly: `mop.r.29 rd rs1`
7442/// Rust: `mop_r_29(rd, rs1)`
7443///
7444/// # Arguments
7445/// - `rd` — Destination register.
7446/// - `rs1` — Source register.
7447pub trait MopR29Emitter<T0, T1> {
7448 fn mop_r_29(&mut self, rd: T0, rs1: T1);
7449}
7450
7451/// RISC-V `mop.r.3` instruction.
7452///
7453/// # Forms
7454/// Assembly: `mop.r.3 rd rs1`
7455/// Rust: `mop_r_3(rd, rs1)`
7456///
7457/// # Arguments
7458/// - `rd` — Destination register.
7459/// - `rs1` — Source register.
7460pub trait MopR3Emitter<T0, T1> {
7461 fn mop_r_3(&mut self, rd: T0, rs1: T1);
7462}
7463
7464/// RISC-V `mop.r.30` instruction.
7465///
7466/// # Forms
7467/// Assembly: `mop.r.30 rd rs1`
7468/// Rust: `mop_r_30(rd, rs1)`
7469///
7470/// # Arguments
7471/// - `rd` — Destination register.
7472/// - `rs1` — Source register.
7473pub trait MopR30Emitter<T0, T1> {
7474 fn mop_r_30(&mut self, rd: T0, rs1: T1);
7475}
7476
7477/// RISC-V `mop.r.31` instruction.
7478///
7479/// # Forms
7480/// Assembly: `mop.r.31 rd rs1`
7481/// Rust: `mop_r_31(rd, rs1)`
7482///
7483/// # Arguments
7484/// - `rd` — Destination register.
7485/// - `rs1` — Source register.
7486pub trait MopR31Emitter<T0, T1> {
7487 fn mop_r_31(&mut self, rd: T0, rs1: T1);
7488}
7489
7490/// RISC-V `mop.r.4` instruction.
7491///
7492/// # Forms
7493/// Assembly: `mop.r.4 rd rs1`
7494/// Rust: `mop_r_4(rd, rs1)`
7495///
7496/// # Arguments
7497/// - `rd` — Destination register.
7498/// - `rs1` — Source register.
7499pub trait MopR4Emitter<T0, T1> {
7500 fn mop_r_4(&mut self, rd: T0, rs1: T1);
7501}
7502
7503/// RISC-V `mop.r.5` instruction.
7504///
7505/// # Forms
7506/// Assembly: `mop.r.5 rd rs1`
7507/// Rust: `mop_r_5(rd, rs1)`
7508///
7509/// # Arguments
7510/// - `rd` — Destination register.
7511/// - `rs1` — Source register.
7512pub trait MopR5Emitter<T0, T1> {
7513 fn mop_r_5(&mut self, rd: T0, rs1: T1);
7514}
7515
7516/// RISC-V `mop.r.6` instruction.
7517///
7518/// # Forms
7519/// Assembly: `mop.r.6 rd rs1`
7520/// Rust: `mop_r_6(rd, rs1)`
7521///
7522/// # Arguments
7523/// - `rd` — Destination register.
7524/// - `rs1` — Source register.
7525pub trait MopR6Emitter<T0, T1> {
7526 fn mop_r_6(&mut self, rd: T0, rs1: T1);
7527}
7528
7529/// RISC-V `mop.r.7` instruction.
7530///
7531/// # Forms
7532/// Assembly: `mop.r.7 rd rs1`
7533/// Rust: `mop_r_7(rd, rs1)`
7534///
7535/// # Arguments
7536/// - `rd` — Destination register.
7537/// - `rs1` — Source register.
7538pub trait MopR7Emitter<T0, T1> {
7539 fn mop_r_7(&mut self, rd: T0, rs1: T1);
7540}
7541
7542/// RISC-V `mop.r.8` instruction.
7543///
7544/// # Forms
7545/// Assembly: `mop.r.8 rd rs1`
7546/// Rust: `mop_r_8(rd, rs1)`
7547///
7548/// # Arguments
7549/// - `rd` — Destination register.
7550/// - `rs1` — Source register.
7551pub trait MopR8Emitter<T0, T1> {
7552 fn mop_r_8(&mut self, rd: T0, rs1: T1);
7553}
7554
7555/// RISC-V `mop.r.9` instruction.
7556///
7557/// # Forms
7558/// Assembly: `mop.r.9 rd rs1`
7559/// Rust: `mop_r_9(rd, rs1)`
7560///
7561/// # Arguments
7562/// - `rd` — Destination register.
7563/// - `rs1` — Source register.
7564pub trait MopR9Emitter<T0, T1> {
7565 fn mop_r_9(&mut self, rd: T0, rs1: T1);
7566}
7567
7568/// RISC-V `mop.rr.0` instruction.
7569///
7570/// # Forms
7571/// Assembly: `mop.rr.0 rd rs1 rs2`
7572/// Rust: `mop_rr_0(rd, rs1, rs2)`
7573///
7574/// # Arguments
7575/// - `rd` — Destination register.
7576/// - `rs1` — Source register.
7577/// - `rs2` — Source register.
7578pub trait MopRr0Emitter<T0, T1, T2> {
7579 fn mop_rr_0(&mut self, rd: T0, rs1: T1, rs2: T2);
7580}
7581
7582/// RISC-V `mop.rr.1` instruction.
7583///
7584/// # Forms
7585/// Assembly: `mop.rr.1 rd rs1 rs2`
7586/// Rust: `mop_rr_1(rd, rs1, rs2)`
7587///
7588/// # Arguments
7589/// - `rd` — Destination register.
7590/// - `rs1` — Source register.
7591/// - `rs2` — Source register.
7592pub trait MopRr1Emitter<T0, T1, T2> {
7593 fn mop_rr_1(&mut self, rd: T0, rs1: T1, rs2: T2);
7594}
7595
7596/// RISC-V `mop.rr.2` instruction.
7597///
7598/// # Forms
7599/// Assembly: `mop.rr.2 rd rs1 rs2`
7600/// Rust: `mop_rr_2(rd, rs1, rs2)`
7601///
7602/// # Arguments
7603/// - `rd` — Destination register.
7604/// - `rs1` — Source register.
7605/// - `rs2` — Source register.
7606pub trait MopRr2Emitter<T0, T1, T2> {
7607 fn mop_rr_2(&mut self, rd: T0, rs1: T1, rs2: T2);
7608}
7609
7610/// RISC-V `mop.rr.3` instruction.
7611///
7612/// # Forms
7613/// Assembly: `mop.rr.3 rd rs1 rs2`
7614/// Rust: `mop_rr_3(rd, rs1, rs2)`
7615///
7616/// # Arguments
7617/// - `rd` — Destination register.
7618/// - `rs1` — Source register.
7619/// - `rs2` — Source register.
7620pub trait MopRr3Emitter<T0, T1, T2> {
7621 fn mop_rr_3(&mut self, rd: T0, rs1: T1, rs2: T2);
7622}
7623
7624/// RISC-V `mop.rr.4` instruction.
7625///
7626/// # Forms
7627/// Assembly: `mop.rr.4 rd rs1 rs2`
7628/// Rust: `mop_rr_4(rd, rs1, rs2)`
7629///
7630/// # Arguments
7631/// - `rd` — Destination register.
7632/// - `rs1` — Source register.
7633/// - `rs2` — Source register.
7634pub trait MopRr4Emitter<T0, T1, T2> {
7635 fn mop_rr_4(&mut self, rd: T0, rs1: T1, rs2: T2);
7636}
7637
7638/// RISC-V `mop.rr.5` instruction.
7639///
7640/// # Forms
7641/// Assembly: `mop.rr.5 rd rs1 rs2`
7642/// Rust: `mop_rr_5(rd, rs1, rs2)`
7643///
7644/// # Arguments
7645/// - `rd` — Destination register.
7646/// - `rs1` — Source register.
7647/// - `rs2` — Source register.
7648pub trait MopRr5Emitter<T0, T1, T2> {
7649 fn mop_rr_5(&mut self, rd: T0, rs1: T1, rs2: T2);
7650}
7651
7652/// RISC-V `mop.rr.6` instruction.
7653///
7654/// # Forms
7655/// Assembly: `mop.rr.6 rd rs1 rs2`
7656/// Rust: `mop_rr_6(rd, rs1, rs2)`
7657///
7658/// # Arguments
7659/// - `rd` — Destination register.
7660/// - `rs1` — Source register.
7661/// - `rs2` — Source register.
7662pub trait MopRr6Emitter<T0, T1, T2> {
7663 fn mop_rr_6(&mut self, rd: T0, rs1: T1, rs2: T2);
7664}
7665
7666/// RISC-V `mop.rr.7` instruction.
7667///
7668/// # Forms
7669/// Assembly: `mop.rr.7 rd rs1 rs2`
7670/// Rust: `mop_rr_7(rd, rs1, rs2)`
7671///
7672/// # Arguments
7673/// - `rd` — Destination register.
7674/// - `rs1` — Source register.
7675/// - `rs2` — Source register.
7676pub trait MopRr7Emitter<T0, T1, T2> {
7677 fn mop_rr_7(&mut self, rd: T0, rs1: T1, rs2: T2);
7678}
7679
7680/// Machine Exception Return
7681///
7682/// Returns from an exception in M-mode.
7683///
7684/// # Forms
7685/// Assembly: `mret ""`
7686/// Rust: `mret()`
7687///
7688/// # Arguments
7689pub trait MretEmitter {
7690 fn mret(&mut self);
7691}
7692
7693/// Signed multiply
7694///
7695/// MUL performs an XLEN-bitxXLEN-bit multiplication of `rs1` by `rs2` and places the lower
7696/// XLEN bits in the destination register.
7697/// Any overflow is thrown away.
7698///
7699/// \[NOTE\]
7700/// If both the high and low bits of the same product are required, then the recommended code
7701/// sequence is:
7702/// MULH\[\[S\]U\] rdh, rs1, rs2; MUL rdl, rs1, rs2
7703/// (source register specifiers must be in same order and rdh cannot be the same as rs1 or rs2).
7704/// Microarchitectures can then fuse these into a single multiply operation instead of
7705/// performing two separate multiplies.
7706///
7707/// # Forms
7708/// Assembly: `mul xd, xs1, xs2`
7709/// Rust: `mul(rd, rs1, rs2)`
7710///
7711/// # Arguments
7712/// - `rd` — Destination register.
7713/// - `rs1` — Source register.
7714/// - `rs2` — Source register.
7715pub trait MulEmitter<T0, T1, T2> {
7716 fn mul(&mut self, rd: T0, rs1: T1, rs2: T2);
7717}
7718
7719/// Signed multiply high
7720///
7721/// Multiply the signed values in rs1 to rs2, and store the upper half of the result in rd.
7722/// The lower half is thrown away.
7723///
7724/// If both the upper and lower halves are needed, it suggested to use the sequence:
7725///
7726/// ---
7727/// mulh rdh, rs1, rs2
7728/// mul rdl, rs1, rs2
7729/// ---
7730///
7731/// Microarchitectures may look for that sequence and fuse the operations.
7732///
7733/// # Forms
7734/// Assembly: `mulh xd, xs1, xs2`
7735/// Rust: `mulh(rd, rs1, rs2)`
7736///
7737/// # Arguments
7738/// - `rd` — Destination register.
7739/// - `rs1` — Source register.
7740/// - `rs2` — Source register.
7741pub trait MulhEmitter<T0, T1, T2> {
7742 fn mulh(&mut self, rd: T0, rs1: T1, rs2: T2);
7743}
7744
7745/// Signed/unsigned multiply high
7746///
7747/// Multiply the signed value in rs1 by the unsigned value in rs2, and store the upper half of the result in rd.
7748/// The lower half is thrown away.
7749///
7750/// If both the upper and lower halves are needed, it suggested to use the sequence:
7751///
7752/// ---
7753/// mulhsu rdh, rs1, rs2
7754/// mul rdl, rs1, rs2
7755/// ---
7756///
7757/// Microarchitectures may look for that sequence and fuse the operations.
7758///
7759/// # Forms
7760/// Assembly: `mulhsu xd, xs1, xs2`
7761/// Rust: `mulhsu(rd, rs1, rs2)`
7762///
7763/// # Arguments
7764/// - `rd` — Destination register.
7765/// - `rs1` — Source register.
7766/// - `rs2` — Source register.
7767pub trait MulhsuEmitter<T0, T1, T2> {
7768 fn mulhsu(&mut self, rd: T0, rs1: T1, rs2: T2);
7769}
7770
7771/// Unsigned multiply high
7772///
7773/// Multiply the unsigned values in rs1 to rs2, and store the upper half of the result in rd.
7774/// The lower half is thrown away.
7775///
7776/// If both the upper and lower halves are needed, it suggested to use the sequence:
7777///
7778/// ---
7779/// mulhu rdh, rs1, rs2
7780/// mul rdl, rs1, rs2
7781/// ---
7782///
7783/// Microarchitectures may look for that sequence and fuse the operations.
7784///
7785/// # Forms
7786/// Assembly: `mulhu xd, xs1, xs2`
7787/// Rust: `mulhu(rd, rs1, rs2)`
7788///
7789/// # Arguments
7790/// - `rd` — Destination register.
7791/// - `rs1` — Source register.
7792/// - `rs2` — Source register.
7793pub trait MulhuEmitter<T0, T1, T2> {
7794 fn mulhu(&mut self, rd: T0, rs1: T1, rs2: T2);
7795}
7796
7797/// Signed 32-bit multiply
7798///
7799/// Multiplies the lower 32 bits of the source registers, placing the sign-extension of the
7800/// lower 32 bits of the result into the destination register.
7801///
7802/// Any overflow is thrown away.
7803///
7804/// \[NOTE\]
7805/// In RV64, MUL can be used to obtain the upper 32 bits of the 64-bit product,
7806/// but signed arguments must be proper 32-bit signed values, whereas unsigned arguments
7807/// must have their upper 32 bits clear. If the arguments are not known to be sign- or zero-extended,
7808/// an alternative is to shift both arguments left by 32 bits, then use MULH\[\[S\]U\].
7809///
7810/// # Forms
7811/// Assembly: `mulw xd, xs1, xs2`
7812/// Rust: `mulw(rd, rs1, rs2)`
7813///
7814/// # Arguments
7815/// - `rd` — Destination register.
7816/// - `rs1` — Source register.
7817/// - `rs2` — Source register.
7818pub trait MulwEmitter<T0, T1, T2> {
7819 fn mulw(&mut self, rd: T0, rs1: T1, rs2: T2);
7820}
7821
7822/// RISC-V `mv` instruction.
7823///
7824/// # Forms
7825/// Assembly: `mv rd rs1`
7826/// Rust: `mv(rd, rs1)`
7827///
7828/// # Arguments
7829/// - `rd` — Destination register.
7830/// - `rs1` — Source register.
7831pub trait MvEmitter<T0, T1> {
7832 fn mv(&mut self, rd: T0, rs1: T1);
7833}
7834
7835/// RISC-V `neg` instruction.
7836///
7837/// # Forms
7838/// Assembly: `neg rd rs1`
7839/// Rust: `neg(rd, rs1)`
7840///
7841/// # Arguments
7842/// - `rd` — Destination register.
7843/// - `rs1` — Source register.
7844pub trait NegEmitter<T0, T1> {
7845 fn neg(&mut self, rd: T0, rs1: T1);
7846}
7847
7848/// RISC-V `nop` instruction.
7849///
7850/// # Forms
7851/// Assembly: `nop`
7852/// Rust: `nop()`
7853///
7854/// # Arguments
7855pub trait NopEmitter {
7856 fn nop(&mut self);
7857}
7858
7859/// RISC-V `ntl.all` instruction.
7860///
7861/// # Forms
7862/// Assembly: `ntl.all`
7863/// Rust: `ntl_all()`
7864///
7865/// # Arguments
7866pub trait NtlAllEmitter {
7867 fn ntl_all(&mut self);
7868}
7869
7870/// RISC-V `ntl.p1` instruction.
7871///
7872/// # Forms
7873/// Assembly: `ntl.p1`
7874/// Rust: `ntl_p1()`
7875///
7876/// # Arguments
7877pub trait NtlP1Emitter {
7878 fn ntl_p1(&mut self);
7879}
7880
7881/// RISC-V `ntl.pall` instruction.
7882///
7883/// # Forms
7884/// Assembly: `ntl.pall`
7885/// Rust: `ntl_pall()`
7886///
7887/// # Arguments
7888pub trait NtlPallEmitter {
7889 fn ntl_pall(&mut self);
7890}
7891
7892/// RISC-V `ntl.s1` instruction.
7893///
7894/// # Forms
7895/// Assembly: `ntl.s1`
7896/// Rust: `ntl_s1()`
7897///
7898/// # Arguments
7899pub trait NtlS1Emitter {
7900 fn ntl_s1(&mut self);
7901}
7902
7903/// Or
7904///
7905/// Or rs1 with rs2, and store the result in rd
7906///
7907/// # Forms
7908/// Assembly: `or xd, xs1, xs2`
7909/// Rust: `or(rd, rs1, rs2)`
7910///
7911/// # Arguments
7912/// - `rd` — Destination register.
7913/// - `rs1` — Source register.
7914/// - `rs2` — Source register.
7915pub trait OrEmitter<T0, T1, T2> {
7916 fn or(&mut self, rd: T0, rs1: T1, rs2: T2);
7917}
7918
7919/// Bitware OR-combine, byte granule
7920///
7921/// Combines the bits within each byte using bitwise logical OR. This sets the bits
7922/// of each byte in the result rd to all zeros if no bit within the respective byte
7923/// of rs is set, or to all ones if any bit within the respective byte of rs is set.
7924///
7925/// # Forms
7926/// Assembly: `orc.b xd, xs1, xs2`
7927/// Rust: `orc_b(rd, rs1)`
7928///
7929/// # Arguments
7930/// - `rd` — Destination register.
7931/// - `rs1` — Source register.
7932pub trait OrcBEmitter<T0, T1> {
7933 fn orc_b(&mut self, rd: T0, rs1: T1);
7934}
7935
7936/// Or immediate
7937///
7938/// Or an immediate to the value in rs1, and store the result in rd
7939///
7940/// # Forms
7941/// Assembly: `ori xd, xs1, imm`
7942/// Rust: `ori(rd, rs1, imm)`
7943///
7944/// # Arguments
7945/// - `rd` — Destination register.
7946/// - `rs1` — Source register.
7947/// - `imm` — Immediate encoding value.
7948pub trait OriEmitter<T0, T1, T2> {
7949 fn ori(&mut self, rd: T0, rs1: T1, imm: T2);
7950}
7951
7952/// OR with inverted operand
7953///
7954/// This instruction performs the bitwise logical OR operation between rs1 and the bitwise inversion of rs2.
7955///
7956/// # Forms
7957/// Assembly: `orn xd, xs1, xs2`
7958/// Rust: `orn(rd, rs1, rs2)`
7959///
7960/// # Arguments
7961/// - `rd` — Destination register.
7962/// - `rs1` — Source register.
7963/// - `rs2` — Source register.
7964pub trait OrnEmitter<T0, T1, T2> {
7965 fn orn(&mut self, rd: T0, rs1: T1, rs2: T2);
7966}
7967
7968/// RISC-V `pack` instruction.
7969///
7970/// # Forms
7971/// Assembly: `pack xd, xs1, xs2`
7972/// Rust: `pack(rd, rs1, rs2)`
7973///
7974/// # Arguments
7975/// - `rd` — Destination register.
7976/// - `rs1` — Source register.
7977/// - `rs2` — Source register.
7978pub trait PackEmitter<T0, T1, T2> {
7979 fn pack(&mut self, rd: T0, rs1: T1, rs2: T2);
7980}
7981
7982/// RISC-V `packh` instruction.
7983///
7984/// # Forms
7985/// Assembly: `packh xd, xs1, xs2`
7986/// Rust: `packh(rd, rs1, rs2)`
7987///
7988/// # Arguments
7989/// - `rd` — Destination register.
7990/// - `rs1` — Source register.
7991/// - `rs2` — Source register.
7992pub trait PackhEmitter<T0, T1, T2> {
7993 fn packh(&mut self, rd: T0, rs1: T1, rs2: T2);
7994}
7995
7996/// RISC-V `packw` instruction.
7997///
7998/// # Forms
7999/// Assembly: `packw xd, xs1, xs2`
8000/// Rust: `packw(rd, rs1, rs2)`
8001///
8002/// # Arguments
8003/// - `rd` — Destination register.
8004/// - `rs1` — Source register.
8005/// - `rs2` — Source register.
8006pub trait PackwEmitter<T0, T1, T2> {
8007 fn packw(&mut self, rd: T0, rs1: T1, rs2: T2);
8008}
8009
8010/// RISC-V `pause` instruction.
8011///
8012/// # Forms
8013/// Assembly: `pause`
8014/// Rust: `pause()`
8015///
8016/// # Arguments
8017pub trait PauseEmitter {
8018 fn pause(&mut self);
8019}
8020
8021/// RISC-V `prefetch.i` instruction.
8022///
8023/// # Forms
8024/// Assembly: `prefetch.i rs1 imm12lohi`
8025/// Rust: `prefetch_i(rs1, imm)`
8026///
8027/// # Arguments
8028/// - `rs1` — Source register.
8029/// - `imm` — Immediate encoding value.
8030pub trait PrefetchIEmitter<T0, T1> {
8031 fn prefetch_i(&mut self, rs1: T0, imm: T1);
8032}
8033
8034/// RISC-V `prefetch.r` instruction.
8035///
8036/// # Forms
8037/// Assembly: `prefetch.r rs1 imm12lohi`
8038/// Rust: `prefetch_r(rs1, imm)`
8039///
8040/// # Arguments
8041/// - `rs1` — Source register.
8042/// - `imm` — Immediate encoding value.
8043pub trait PrefetchREmitter<T0, T1> {
8044 fn prefetch_r(&mut self, rs1: T0, imm: T1);
8045}
8046
8047/// RISC-V `prefetch.w` instruction.
8048///
8049/// # Forms
8050/// Assembly: `prefetch.w rs1 imm12lohi`
8051/// Rust: `prefetch_w(rs1, imm)`
8052///
8053/// # Arguments
8054/// - `rs1` — Source register.
8055/// - `imm` — Immediate encoding value.
8056pub trait PrefetchWEmitter<T0, T1> {
8057 fn prefetch_w(&mut self, rs1: T0, imm: T1);
8058}
8059
8060/// RISC-V `rdcycle` instruction.
8061///
8062/// # Forms
8063/// Assembly: `rdcycle rd`
8064/// Rust: `rdcycle(rd)`
8065///
8066/// # Arguments
8067/// - `rd` — Destination register.
8068pub trait RdcycleEmitter<T0> {
8069 fn rdcycle(&mut self, rd: T0);
8070}
8071
8072/// RISC-V `rdcycleh` instruction.
8073///
8074/// # Forms
8075/// Assembly: `rdcycleh rd`
8076/// Rust: `rdcycleh(rd)`
8077///
8078/// # Arguments
8079/// - `rd` — Destination register.
8080pub trait RdcyclehEmitter<T0> {
8081 fn rdcycleh(&mut self, rd: T0);
8082}
8083
8084/// RISC-V `rdinstret` instruction.
8085///
8086/// # Forms
8087/// Assembly: `rdinstret rd`
8088/// Rust: `rdinstret(rd)`
8089///
8090/// # Arguments
8091/// - `rd` — Destination register.
8092pub trait RdinstretEmitter<T0> {
8093 fn rdinstret(&mut self, rd: T0);
8094}
8095
8096/// RISC-V `rdinstreth` instruction.
8097///
8098/// # Forms
8099/// Assembly: `rdinstreth rd`
8100/// Rust: `rdinstreth(rd)`
8101///
8102/// # Arguments
8103/// - `rd` — Destination register.
8104pub trait RdinstrethEmitter<T0> {
8105 fn rdinstreth(&mut self, rd: T0);
8106}
8107
8108/// RISC-V `rdtime` instruction.
8109///
8110/// # Forms
8111/// Assembly: `rdtime rd`
8112/// Rust: `rdtime(rd)`
8113///
8114/// # Arguments
8115/// - `rd` — Destination register.
8116pub trait RdtimeEmitter<T0> {
8117 fn rdtime(&mut self, rd: T0);
8118}
8119
8120/// RISC-V `rdtimeh` instruction.
8121///
8122/// # Forms
8123/// Assembly: `rdtimeh rd`
8124/// Rust: `rdtimeh(rd)`
8125///
8126/// # Arguments
8127/// - `rd` — Destination register.
8128pub trait RdtimehEmitter<T0> {
8129 fn rdtimeh(&mut self, rd: T0);
8130}
8131
8132/// Signed remainder
8133///
8134/// Calculate the remainder of signed division of rs1 by rs2, and store the result in rd.
8135///
8136/// If the value in register rs2 is zero, write the value in rs1 into rd;
8137///
8138/// If the result of the division overflows, write zero into rd;
8139///
8140/// # Forms
8141/// Assembly: `rem xd, xs1, xs2`
8142/// Rust: `rem(rd, rs1, rs2)`
8143///
8144/// # Arguments
8145/// - `rd` — Destination register.
8146/// - `rs1` — Source register.
8147/// - `rs2` — Source register.
8148pub trait RemEmitter<T0, T1, T2> {
8149 fn rem(&mut self, rd: T0, rs1: T1, rs2: T2);
8150}
8151
8152/// Unsigned remainder
8153///
8154/// Calculate the remainder of unsigned division of rs1 by rs2, and store the result in rd.
8155///
8156/// # Forms
8157/// Assembly: `remu xd, xs1, xs2`
8158/// Rust: `remu(rd, rs1, rs2)`
8159///
8160/// # Arguments
8161/// - `rd` — Destination register.
8162/// - `rs1` — Source register.
8163/// - `rs2` — Source register.
8164pub trait RemuEmitter<T0, T1, T2> {
8165 fn remu(&mut self, rd: T0, rs1: T1, rs2: T2);
8166}
8167
8168/// Unsigned 32-bit remainder
8169///
8170/// Calculate the remainder of unsigned division of the 32-bit values in rs1 by rs2,
8171/// and store the sign-extended result in rd.
8172///
8173/// If the value in rs2 is zero, rd gets the sign-extended value in rs1.
8174///
8175/// # Forms
8176/// Assembly: `remuw xd, xs1, xs2`
8177/// Rust: `remuw(rd, rs1, rs2)`
8178///
8179/// # Arguments
8180/// - `rd` — Destination register.
8181/// - `rs1` — Source register.
8182/// - `rs2` — Source register.
8183pub trait RemuwEmitter<T0, T1, T2> {
8184 fn remuw(&mut self, rd: T0, rs1: T1, rs2: T2);
8185}
8186
8187/// Signed 32-bit remainder
8188///
8189/// Calculate the remainder of signed division of the 32-bit values rs1 by rs2,
8190/// and store the sign-extended result in rd.
8191///
8192/// If the value in register rs2 is zero, write the sign-extended 32-bit value in rs1 into rd;
8193///
8194/// If the result of the division overflows, write zero into rd;
8195///
8196/// # Forms
8197/// Assembly: `remw xd, xs1, xs2`
8198/// Rust: `remw(rd, rs1, rs2)`
8199///
8200/// # Arguments
8201/// - `rd` — Destination register.
8202/// - `rs1` — Source register.
8203/// - `rs2` — Source register.
8204pub trait RemwEmitter<T0, T1, T2> {
8205 fn remw(&mut self, rd: T0, rs1: T1, rs2: T2);
8206}
8207
8208/// RISC-V `ret` instruction.
8209///
8210/// # Forms
8211/// Assembly: `ret`
8212/// Rust: `ret()`
8213///
8214/// # Arguments
8215pub trait RetEmitter {
8216 fn ret(&mut self);
8217}
8218
8219/// Byte-reverse register (RV64 encoding)
8220///
8221/// This instruction reverses the order of the bytes in rs1.
8222///
8223/// \[NOTE\]
8224/// The rev8 mnemonic corresponds to different instruction encodings in RV32 and RV64.
8225///
8226/// \[NOTE\]
8227/// The byte-reverse operation is only available for the full register width. To emulate word-sized
8228/// and halfword-sized byte-reversal, perform a `rev8 rd,rs` followed by a `srai rd,rd,K`, where K
8229/// is XLEN-32 and XLEN-16, respectively.
8230///
8231/// # Forms
8232/// Assembly: `rev8 xd, xs1`
8233/// Rust: `rev8(rd, rs1)`
8234///
8235/// # Arguments
8236/// - `rd` — Destination register.
8237/// - `rs1` — Source register.
8238pub trait Rev8Emitter<T0, T1> {
8239 fn rev8(&mut self, rd: T0, rs1: T1);
8240}
8241
8242/// Byte-reverse register (RV64 encoding)
8243///
8244/// This instruction reverses the order of the bytes in rs1.
8245///
8246/// \[NOTE\]
8247/// The rev8 mnemonic corresponds to different instruction encodings in RV32 and RV64.
8248///
8249/// \[NOTE\]
8250/// The byte-reverse operation is only available for the full register width. To emulate word-sized
8251/// and halfword-sized byte-reversal, perform a `rev8 rd,rs` followed by a `srai rd,rd,K`, where K
8252/// is XLEN-32 and XLEN-16, respectively.
8253///
8254/// # Forms
8255/// Assembly: `rev8.rv32 xd, xs1`
8256/// Rust: `rev8_rv32(rd, rs1)`
8257///
8258/// # Arguments
8259/// - `rd` — Destination register.
8260/// - `rs1` — Source register.
8261pub trait Rev8Rv32Emitter<T0, T1> {
8262 fn rev8_rv32(&mut self, rd: T0, rs1: T1);
8263}
8264
8265/// Rotate left (Register)
8266///
8267/// This instruction performs a rotate left of rs1 by the amount in least-significant `log2(XLEN)` bits of rs2.
8268///
8269/// # Forms
8270/// Assembly: `rol xd, xs1, xs2`
8271/// Rust: `rol(rd, rs1, rs2)`
8272///
8273/// # Arguments
8274/// - `rd` — Destination register.
8275/// - `rs1` — Source register.
8276/// - `rs2` — Source register.
8277pub trait RolEmitter<T0, T1, T2> {
8278 fn rol(&mut self, rd: T0, rs1: T1, rs2: T2);
8279}
8280
8281/// Rotate left word (Register)
8282///
8283/// This instruction performs a rotate left of the least-significant word of rs1 by the amount in least-significant 5 bits of rs2.
8284/// The resulting word value is sign-extended by copying bit 31 to all of the more-significant bits.
8285///
8286/// # Forms
8287/// Assembly: `rolw xd, xs1, xs2`
8288/// Rust: `rolw(rd, rs1, rs2)`
8289///
8290/// # Arguments
8291/// - `rd` — Destination register.
8292/// - `rs1` — Source register.
8293/// - `rs2` — Source register.
8294pub trait RolwEmitter<T0, T1, T2> {
8295 fn rolw(&mut self, rd: T0, rs1: T1, rs2: T2);
8296}
8297
8298/// Rotate right (Register)
8299///
8300/// This instruction performs a rotate right of rs1 by the amount in least-significant `log2(XLEN)` bits of rs2.
8301///
8302/// # Forms
8303/// Assembly: `ror xd, xs1, xs2`
8304/// Rust: `ror(rd, rs1, rs2)`
8305///
8306/// # Arguments
8307/// - `rd` — Destination register.
8308/// - `rs1` — Source register.
8309/// - `rs2` — Source register.
8310pub trait RorEmitter<T0, T1, T2> {
8311 fn ror(&mut self, rd: T0, rs1: T1, rs2: T2);
8312}
8313
8314/// Rotate right (Immediate)
8315///
8316/// This instruction performs a rotate right of rs1 by the amount in the least-significant log2(XLEN) bits of shamt.
8317/// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
8318///
8319/// # Forms
8320/// Assembly: `rori xd, xs1, shamt`
8321/// Rust: `rori(rd, rs1, shamtd)`
8322///
8323/// # Arguments
8324/// - `rd` — Destination register.
8325/// - `rs1` — Source register.
8326/// - `shamtd` — Immediate encoding value.
8327pub trait RoriEmitter<T0, T1, T2> {
8328 fn rori(&mut self, rd: T0, rs1: T1, shamtd: T2);
8329}
8330
8331/// Rotate right (Immediate)
8332///
8333/// This instruction performs a rotate right of rs1 by the amount in the least-significant log2(XLEN) bits of shamt.
8334/// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
8335///
8336/// # Forms
8337/// Assembly: `rori.rv32 xd, xs1, shamt`
8338/// Rust: `rori_rv32(rd, rs1, shamtw)`
8339///
8340/// # Arguments
8341/// - `rd` — Destination register.
8342/// - `rs1` — Source register.
8343/// - `shamtw` — Immediate encoding value.
8344pub trait RoriRv32Emitter<T0, T1, T2> {
8345 fn rori_rv32(&mut self, rd: T0, rs1: T1, shamtw: T2);
8346}
8347
8348/// Rotate right word (Immediate)
8349///
8350/// This instruction performs a rotate right on the least-significant word of rs1 by the amount in
8351/// the least-significant log2(XLEN) bits of shamt. The resulting word value is sign-extended by
8352/// copying bit 31 to all of the more-significant bits.
8353///
8354/// # Forms
8355/// Assembly: `roriw xd, xs1, shamt`
8356/// Rust: `roriw(rd, rs1, shamtw)`
8357///
8358/// # Arguments
8359/// - `rd` — Destination register.
8360/// - `rs1` — Source register.
8361/// - `shamtw` — Immediate encoding value.
8362pub trait RoriwEmitter<T0, T1, T2> {
8363 fn roriw(&mut self, rd: T0, rs1: T1, shamtw: T2);
8364}
8365
8366/// Rotate right word (Register)
8367///
8368/// This instruction performs a rotate right on the least-significant word of rs1 by the amount in
8369/// least-significant 5 bits of rs2. The resultant word is sign-extended by copying bit 31 to all
8370/// of the more-significant bits.
8371///
8372/// # Forms
8373/// Assembly: `rorw xd, xs1, xs2`
8374/// Rust: `rorw(rd, rs1, rs2)`
8375///
8376/// # Arguments
8377/// - `rd` — Destination register.
8378/// - `rs1` — Source register.
8379/// - `rs2` — Source register.
8380pub trait RorwEmitter<T0, T1, T2> {
8381 fn rorw(&mut self, rd: T0, rs1: T1, rs2: T2);
8382}
8383
8384/// Store byte
8385///
8386/// Store 8 bits of data from register `rs2` to an
8387/// address formed by adding `rs1` to a signed offset.
8388///
8389/// # Forms
8390/// Assembly: `sb xs2, imm(xs1)`
8391/// Rust: `sb(rs1, rs2, imm)`
8392///
8393/// # Arguments
8394/// - `rs1` — Memory base register.
8395/// - `rs2` — Source register.
8396/// - `imm` — Immediate encoding value.
8397pub trait SbEmitter<T0, T1, T2> {
8398 fn sb(&mut self, rs1: T0, rs2: T1, imm: T2);
8399}
8400
8401/// RISC-V `sbreak` instruction.
8402///
8403/// # Forms
8404/// Assembly: `sbreak`
8405/// Rust: `sbreak()`
8406///
8407/// # Arguments
8408pub trait SbreakEmitter {
8409 fn sbreak(&mut self);
8410}
8411
8412/// Store conditional doubleword
8413///
8414/// `sc.d` conditionally writes a doubleword in _rs2_ to the address in _rs1_:
8415/// the `sc.d` succeeds only if the reservation is still valid and the
8416/// reservation set contains the bytes being written. If the `sc.d` succeeds,
8417/// the instruction writes the doubleword in _rs2_ to memory, and it writes zero to _rd_.
8418/// If the `sc.d` fails, the instruction does not write to memory, and it writes a
8419/// nonzero value to _rd_. For the purposes of memory protection, a failed `sc.d`
8420/// may be treated like a store. Regardless of success or failure, executing an
8421/// `sc.d` instruction invalidates any reservation held by this hart.
8422///
8423/// The failure code with value 1 encodes an unspecified failure.
8424/// Other failure codes are reserved at this time.
8425/// Portable software should only assume the failure code will be non-zero.
8426///
8427/// The address held in _rs1_ must be naturally aligned to the size of the operand
8428/// (_i.e._, eight-byte aligned).
8429/// If the address is not naturally aligned, an address-misaligned exception or an
8430/// access-fault exception will be generated.
8431/// The access-fault exception can be generated for a memory access that would otherwise
8432/// be able to complete except for the misalignment,
8433/// if the misaligned access should not be emulated.
8434///
8435/// \[NOTE\]
8436/// --
8437/// Emulating misaligned LR/SC sequences is impractical in most systems.
8438///
8439/// Misaligned LR/SC sequences also raise the possibility of accessing multiple
8440/// reservation sets at once, which present definitions do not provide for.
8441/// --
8442///
8443/// An implementation can register an arbitrarily large reservation set on each LR,
8444/// provided the reservation set includes all bytes of the addressed data word or
8445/// doubleword.
8446/// An SC can only pair with the most recent LR in program order.
8447/// An SC may succeed only if no store from another hart to the reservation set
8448/// can be observed to have occurred between the LR and the SC,
8449/// and if there is no other SC between the LR and itself in program order.
8450/// An SC may succeed only if no write from a device other than a hart to the bytes
8451/// accessed by the LR instruction can be observed to have occurred between the LR
8452/// and SC.
8453/// Note this LR might have had a different effective address and data size,
8454/// but reserved the SC's address as part of the reservation set.
8455///
8456/// \[NOTE\]
8457/// ----
8458/// Following this model, in systems with memory translation, an SC is allowed to succeed if the
8459/// earlier LR reserved the same location using an alias with a different virtual address, but is
8460/// also allowed to fail if the virtual address is different.
8461///
8462/// To accommodate legacy devices and buses, writes from devices other than RISC-V harts are only
8463/// required to invalidate reservations when they overlap the bytes accessed by the LR.
8464/// These writes are not required to invalidate the reservation when they access other bytes in
8465/// the reservation set.
8466/// ----
8467///
8468/// The SC must fail if the address is not within the reservation set of the most
8469/// recent LR in program order.
8470/// The SC must fail if a store to the reservation set from another hart can be
8471/// observed to occur between the LR and SC.
8472/// The SC must fail if a write from some other device to the bytes accessed by the
8473/// LR can be observed to occur between the LR and SC.
8474/// (If such a device writes the reservation set but does not write the bytes accessed
8475/// by the LR, the SC may or may not fail.)
8476/// An SC must fail if there is another SC (to any address) between the LR and the SC
8477/// in program order.
8478/// The precise statement of the atomicity requirements for successful LR/SC sequences
8479/// is defined by the Atomicity Axiom of the memory model.
8480///
8481/// \[NOTE\]
8482/// --
8483/// The platform should provide a means to determine the size and shape of the reservation set.
8484///
8485/// A platform specification may constrain the size and shape of the reservation set.
8486///
8487/// A store-conditional instruction to a scratch word of memory should be used to forcibly invalidate any existing load reservation:
8488///
8489/// * during a preemptive context switch, and
8490/// * if necessary when changing virtual to physical address mappings, such as when migrating pages that might contain an active reservation.
8491///
8492/// The invalidation of a hart's reservation when it executes an LR or SC imply that a hart can only hold one reservation at a time, and that an SC can only pair with the most recent LR, and LR with the next following SC, in program order. This is a restriction to the Atomicity Axiom in Section 18.1 that ensures software runs correctly on expected common implementations that operate in this manner.
8493/// --
8494///
8495/// An SC instruction can never be observed by another RISC-V hart before the LR instruction that established the reservation.
8496///
8497/// \[NOTE\]
8498/// --
8499/// The LR/SC sequence can be given acquire semantics by setting the aq bit on the LR instruction. The LR/SC sequence can be given release semantics by by setting the rl bit on the SC instruction. Assuming suitable mappings for other atomic operations, setting the aq bit on the LR instruction, and setting the rl bit on the SC instruction makes the LR/SC sequence sequentially consistent in the C++ memory_order_seq_cst sense. Such a sequence does not act as a fence for ordering ordinary load and store instructions before and after the sequence. Specific instruction mappings for other C++ atomic operations, or stronger notions of "sequential consistency", may require both bits to be set on either or both of the LR or SC instruction.
8500///
8501/// If neither bit is set on either LR or SC, the LR/SC sequence can be observed to occur before or after surrounding memory operations from the same RISC-V hart. This can be appropriate when the LR/SC sequence is used to implement a parallel reduction operation.
8502/// --
8503///
8504/// Software should not set the _rl_ bit on an LR instruction unless the _aq_ bit is also set.
8505/// LR.rl and SC.aq instructions are not guaranteed to provide any stronger ordering than those
8506/// with both bits clear, but may result in lower performance.
8507///
8508/// # Forms
8509/// Assembly: `sc.d xd, xs2, xs1`
8510/// Rust: `sc_d(rd, rs1, rs2, aq, rl)`
8511///
8512/// # Arguments
8513/// - `rd` — Destination register.
8514/// - `rs1` — Memory base register.
8515/// - `rs2` — Source register.
8516/// - `aq` — Acquire-order bit.
8517/// - `rl` — Release-order bit; retained for the existing emitter API.
8518pub trait ScDEmitter<T0, T1, T2, T3, T4> {
8519 fn sc_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
8520}
8521
8522/// Store conditional word
8523///
8524/// `sc.w` conditionally writes a word in _rs2_ to the address in _rs1_:
8525/// the `sc.w` succeeds only if the reservation is still valid and the
8526/// reservation set contains the bytes being written. If the `sc.w` succeeds,
8527/// the instruction writes the word in _rs2_ to memory, and it writes zero to _rd_.
8528/// If the `sc.w` fails, the instruction does not write to memory, and it writes a
8529/// nonzero value to _rd_. For the purposes of memory protection, a failed `sc.w`
8530/// may be treated like a store. Regardless of success or failure, executing an
8531/// `sc.w` instruction invalidates any reservation held by this hart.
8532///
8533/// <%- if XLEN == 64 -%>
8534/// \[NOTE\]
8535/// If a value other than 0 or 1 is defined as a result for `sc.w`, the value will before
8536/// sign-extended into _rd_.
8537/// <%- end -%>
8538///
8539/// The failure code with value 1 encodes an unspecified failure.
8540/// Other failure codes are reserved at this time.
8541/// Portable software should only assume the failure code will be non-zero.
8542///
8543/// The address held in _rs1_ must be naturally aligned to the size of the operand
8544/// (_i.e._, eight-byte aligned for doublewords and four-byte aligned for words).
8545/// If the address is not naturally aligned, an address-misaligned exception or an
8546/// access-fault exception will be generated.
8547/// The access-fault exception can be generated for a memory access that would otherwise
8548/// be able to complete except for the misalignment,
8549/// if the misaligned access should not be emulated.
8550///
8551/// \[NOTE\]
8552/// --
8553/// Emulating misaligned LR/SC sequences is impractical in most systems.
8554///
8555/// Misaligned LR/SC sequences also raise the possibility of accessing multiple
8556/// reservation sets at once, which present definitions do not provide for.
8557/// --
8558///
8559/// An implementation can register an arbitrarily large reservation set on each LR,
8560/// provided the reservation set includes all bytes of the addressed data word or
8561/// doubleword.
8562/// An SC can only pair with the most recent LR in program order.
8563/// An SC may succeed only if no store from another hart to the reservation set
8564/// can be observed to have occurred between the LR and the SC,
8565/// and if there is no other SC between the LR and itself in program order.
8566/// An SC may succeed only if no write from a device other than a hart to the bytes
8567/// accessed by the LR instruction can be observed to have occurred between the LR
8568/// and SC.
8569/// Note this LR might have had a different effective address and data size,
8570/// but reserved the SC's address as part of the reservation set.
8571///
8572/// \[NOTE\]
8573/// ----
8574/// Following this model, in systems with memory translation, an SC is allowed to succeed if the
8575/// earlier LR reserved the same location using an alias with a different virtual address, but is
8576/// also allowed to fail if the virtual address is different.
8577///
8578/// To accommodate legacy devices and buses, writes from devices other than RISC-V harts are only
8579/// required to invalidate reservations when they overlap the bytes accessed by the LR.
8580/// These writes are not required to invalidate the reservation when they access other bytes in
8581/// the reservation set.
8582/// ----
8583///
8584/// The SC must fail if the address is not within the reservation set of the most
8585/// recent LR in program order.
8586/// The SC must fail if a store to the reservation set from another hart can be
8587/// observed to occur between the LR and SC.
8588/// The SC must fail if a write from some other device to the bytes accessed by the
8589/// LR can be observed to occur between the LR and SC.
8590/// (If such a device writes the reservation set but does not write the bytes accessed
8591/// by the LR, the SC may or may not fail.)
8592/// An SC must fail if there is another SC (to any address) between the LR and the SC
8593/// in program order.
8594/// The precise statement of the atomicity requirements for successful LR/SC sequences
8595/// is defined by the Atomicity Axiom of the memory model.
8596///
8597/// \[NOTE\]
8598/// --
8599/// The platform should provide a means to determine the size and shape of the reservation set.
8600///
8601/// A platform specification may constrain the size and shape of the reservation set.
8602///
8603/// A store-conditional instruction to a scratch word of memory should be used to forcibly invalidate any existing load reservation:
8604///
8605/// * during a preemptive context switch, and
8606/// * if necessary when changing virtual to physical address mappings, such as when migrating pages that might contain an active reservation.
8607///
8608/// The invalidation of a hart's reservation when it executes an LR or SC imply that a hart can only hold one reservation at a time, and that an SC can only pair with the most recent LR, and LR with the next following SC, in program order. This is a restriction to the Atomicity Axiom in Section 18.1 that ensures software runs correctly on expected common implementations that operate in this manner.
8609/// --
8610///
8611/// An SC instruction can never be observed by another RISC-V hart before the LR instruction that established the reservation.
8612///
8613/// \[NOTE\]
8614/// --
8615/// The LR/SC sequence can be given acquire semantics by setting the aq bit on the LR instruction. The LR/SC sequence can be given release semantics by by setting the rl bit on the SC instruction. Assuming suitable mappings for other atomic operations, setting the aq bit on the LR instruction, and setting the rl bit on the SC instruction makes the LR/SC sequence sequentially consistent in the C++ memory_order_seq_cst sense. Such a sequence does not act as a fence for ordering ordinary load and store instructions before and after the sequence. Specific instruction mappings for other C++ atomic operations, or stronger notions of "sequential consistency", may require both bits to be set on either or both of the LR or SC instruction.
8616///
8617/// If neither bit is set on either LR or SC, the LR/SC sequence can be observed to occur before or after surrounding memory operations from the same RISC-V hart. This can be appropriate when the LR/SC sequence is used to implement a parallel reduction operation.
8618/// --
8619///
8620/// Software should not set the _rl_ bit on an LR instruction unless the _aq_ bit is also set.
8621/// LR.rl and SC.aq instructions are not guaranteed to provide any stronger ordering than those
8622/// with both bits clear, but may result in lower performance.
8623///
8624/// # Forms
8625/// Assembly: `sc.w xd, xs2, xs1`
8626/// Rust: `sc_w(rd, rs1, rs2, aq, rl)`
8627///
8628/// # Arguments
8629/// - `rd` — Destination register.
8630/// - `rs1` — Memory base register.
8631/// - `rs2` — Source register.
8632/// - `aq` — Acquire-order bit.
8633/// - `rl` — Release-order bit; retained for the existing emitter API.
8634pub trait ScWEmitter<T0, T1, T2, T3, T4> {
8635 fn sc_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
8636}
8637
8638/// RISC-V `scall` instruction.
8639///
8640/// # Forms
8641/// Assembly: `scall`
8642/// Rust: `scall()`
8643///
8644/// # Arguments
8645pub trait ScallEmitter {
8646 fn scall(&mut self);
8647}
8648
8649/// RISC-V `sctrclr` instruction.
8650///
8651/// # Forms
8652/// Assembly: `sctrclr sctrclr`
8653/// Rust: `sctrclr()`
8654///
8655/// # Arguments
8656pub trait SctrclrEmitter {
8657 fn sctrclr(&mut self);
8658}
8659
8660/// Store doubleword
8661///
8662/// Store 64 bits of data from register `rs2` to an
8663/// address formed by adding `rs1` to a signed offset.
8664///
8665/// # Forms
8666/// Assembly: `sd xs2, imm(xs1)`
8667/// Rust: `sd(rs1, rs2, imm)`
8668///
8669/// # Arguments
8670/// - `rs1` — Memory base register.
8671/// - `rs2` — Source register.
8672/// - `imm` — Immediate encoding value.
8673pub trait SdEmitter<T0, T1, T2> {
8674 fn sd(&mut self, rs1: T0, rs2: T1, imm: T2);
8675}
8676
8677/// RISC-V `seqz` instruction.
8678///
8679/// # Forms
8680/// Assembly: `seqz rd rs1`
8681/// Rust: `seqz(rd, rs1)`
8682///
8683/// # Arguments
8684/// - `rd` — Destination register.
8685/// - `rs1` — Source register.
8686pub trait SeqzEmitter<T0, T1> {
8687 fn seqz(&mut self, rd: T0, rs1: T1);
8688}
8689
8690/// Sign-extend byte
8691///
8692/// This instruction sign-extends the least-significant byte in the source to XLEN by copying the
8693/// most-significant bit in the byte (i.e., bit 7) to all of the more-significant bits.
8694///
8695/// # Forms
8696/// Assembly: `sext.b xd, xs1`
8697/// Rust: `sext_b(rd, rs1)`
8698///
8699/// # Arguments
8700/// - `rd` — Destination register.
8701/// - `rs1` — Source register.
8702pub trait SextBEmitter<T0, T1> {
8703 fn sext_b(&mut self, rd: T0, rs1: T1);
8704}
8705
8706/// Sign-extend halfword
8707///
8708/// This instruction sign-extends the least-significant halfword in the source to XLEN by copying the
8709/// most-significant bit in the halfword (i.e., bit 15) to all of the more-significant bits.
8710///
8711/// # Forms
8712/// Assembly: `sext.h xd, xs1`
8713/// Rust: `sext_h(rd, rs1)`
8714///
8715/// # Arguments
8716/// - `rd` — Destination register.
8717/// - `rs1` — Source register.
8718pub trait SextHEmitter<T0, T1> {
8719 fn sext_h(&mut self, rd: T0, rs1: T1);
8720}
8721
8722/// RISC-V `sext.w` instruction.
8723///
8724/// # Forms
8725/// Assembly: `sext.w rd rs1`
8726/// Rust: `sext_w(rd, rs1)`
8727///
8728/// # Arguments
8729/// - `rd` — Destination register.
8730/// - `rs1` — Source register.
8731pub trait SextWEmitter<T0, T1> {
8732 fn sext_w(&mut self, rd: T0, rs1: T1);
8733}
8734
8735/// Order implicit page table reads after invalidation
8736///
8737/// The `sfence.inval.ir` instruction guarantees that any previous `sinval.vma`
8738/// instructions executed by the current hart are ordered before subsequent implicit references by
8739/// that hart to the memory-management data structures.
8740///
8741/// # Forms
8742/// Assembly: `sfence.inval.ir ""`
8743/// Rust: `sfence_inval_ir()`
8744///
8745/// # Arguments
8746pub trait SfenceInvalIrEmitter {
8747 fn sfence_inval_ir(&mut self);
8748}
8749
8750/// Supervisor memory-management fence
8751///
8752/// The supervisor memory-management fence instruction `SFENCE.VMA` is used to
8753/// synchronize updates to in-memory memory-management data structures with
8754/// current execution. Instruction execution causes implicit reads and
8755/// writes to these data structures; however, these implicit references are
8756/// ordinarily not ordered with respect to explicit loads and stores.
8757/// Executing an SFENCE.VMA instruction guarantees that any previous stores
8758/// already visible to the current RISC-V hart are ordered before certain
8759/// implicit references by subsequent instructions in that hart to the
8760/// memory-management data structures. The specific set of operations
8761/// ordered by SFENCE.VMA is determined by _rs1_ and _rs2_, as described
8762/// below. SFENCE.VMA is also used to invalidate entries in the
8763/// address-translation cache associated with a hart (see <<sv32algorithm>>). Further details on the behavior of this instruction are described in <<virt-control>> and <<pmp-vmem>>.
8764///
8765/// \[NOTE\]
8766/// ====
8767/// The SFENCE.VMA is used to flush any local hardware caches related to
8768/// address translation. It is specified as a fence rather than a TLB flush
8769/// to provide cleaner semantics with respect to which instructions are
8770/// affected by the flush operation and to support a wider variety of
8771/// dynamic caching structures and memory-management schemes. SFENCE.VMA is
8772/// also used by higher privilege levels to synchronize page table writes
8773/// and the address translation hardware.
8774/// ====
8775///
8776/// SFENCE.VMA orders only the local hart's implicit references to the
8777/// memory-management data structures.
8778///
8779/// \[NOTE\]
8780/// ====
8781/// Consequently, other harts must be notified separately when the
8782/// memory-management data structures have been modified. One approach is to
8783/// use 1) a local data fence to ensure local writes are visible globally,
8784/// then 2) an interprocessor interrupt to the other thread, then 3) a local
8785/// SFENCE.VMA in the interrupt handler of the remote thread, and finally 4)
8786/// signal back to originating thread that operation is complete. This is,
8787/// of course, the RISC-V analog to a TLB shootdown.
8788/// ====
8789///
8790/// For the common case that the translation data structures have only been
8791/// modified for a single address mapping (i.e., one page or superpage),
8792/// _rs1_ can specify a virtual address within that mapping to effect a
8793/// translation fence for that mapping only. Furthermore, for the common
8794/// case that the translation data structures have only been modified for a
8795/// single address-space identifier, _rs2_ can specify the address space.
8796/// The behavior of SFENCE.VMA depends on _rs1_ and _rs2_ as follows:
8797///
8798/// * If __rs1__=`x0` and __rs2__=`x0`, the fence orders all reads and writes
8799/// made to any level of the page tables, for all address spaces. The fence
8800/// also invalidates all address-translation cache entries, for all address
8801/// spaces.
8802/// * If __rs1__=`x0` and __rs2__≠``x0``, the fence orders all
8803/// reads and writes made to any level of the page tables, but only for the
8804/// address space identified by integer register _rs2_. Accesses to _global_
8805/// mappings (see <<translation>>) are not ordered. The
8806/// fence also invalidates all address-translation cache entries matching
8807/// the address space identified by integer register _rs2_, except for
8808/// entries containing global mappings.
8809/// * If __rs1__≠``x0`` and __rs2__=`x0`, the fence orders only
8810/// reads and writes made to leaf page table entries corresponding to the
8811/// virtual address in __rs1__, for all address spaces. The fence also
8812/// invalidates all address-translation cache entries that contain leaf page
8813/// table entries corresponding to the virtual address in _rs1_, for all
8814/// address spaces.
8815/// * If __rs1__≠``x0`` and __rs2__≠``x0``, the
8816/// fence orders only reads and writes made to leaf page table entries
8817/// corresponding to the virtual address in _rs1_, for the address space
8818/// identified by integer register _rs2_. Accesses to global mappings are
8819/// not ordered. The fence also invalidates all address-translation cache
8820/// entries that contain leaf page table entries corresponding to the
8821/// virtual address in _rs1_ and that match the address space identified by
8822/// integer register _rs2_, except for entries containing global mappings.
8823///
8824/// If the value held in _rs1_ is not a valid virtual address, then the
8825/// SFENCE.VMA instruction has no effect. No exception is raised in this
8826/// case.
8827///
8828/// When __rs2__≠``x0``, bits SXLEN-1:ASIDMAX of the value held
8829/// in _rs2_ are reserved for future standard use. Until their use is
8830/// defined by a standard extension, they should be zeroed by software and
8831/// ignored by current implementations. Furthermore, if
8832/// ASIDLEN<ASIDMAX, the implementation shall ignore bits
8833/// ASIDMAX-1:ASIDLEN of the value held in _rs2_.
8834///
8835/// \[NOTE\]
8836/// ====
8837/// It is always legal to over-fence, e.g., by fencing only based on a
8838/// subset of the bits in _rs1_ and/or _rs2_, and/or by simply treating all
8839/// SFENCE.VMA instructions as having _rs1_=`x0` and/or _rs2_=`x0`. For
8840/// example, simpler implementations can ignore the virtual address in _rs1_
8841/// and the ASID value in _rs2_ and always perform a global fence. The
8842/// choice not to raise an exception when an invalid virtual address is held
8843/// in _rs1_ facilitates this type of simplification.
8844/// ====
8845///
8846/// An implicit read of the memory-management data structures may return any
8847/// translation for an address that was valid at any time since the most
8848/// recent SFENCE.VMA that subsumes that address. The ordering implied by
8849/// SFENCE.VMA does not place implicit reads and writes to the
8850/// memory-management data structures into the global memory order in a way
8851/// that interacts cleanly with the standard RVWMO ordering rules. In
8852/// particular, even though an SFENCE.VMA orders prior explicit accesses
8853/// before subsequent implicit accesses, and those implicit accesses are
8854/// ordered before their associated explicit accesses, SFENCE.VMA does not
8855/// necessarily place prior explicit accesses before subsequent explicit
8856/// accesses in the global memory order. These implicit loads also need not
8857/// otherwise obey normal program order semantics with respect to prior
8858/// loads or stores to the same address.
8859///
8860/// \[NOTE\]
8861/// ====
8862/// A consequence of this specification is that an implementation may use
8863/// any translation for an address that was valid at any time since the most
8864/// recent SFENCE.VMA that subsumes that address. In particular, if a leaf
8865/// PTE is modified but a subsuming SFENCE.VMA is not executed, either the
8866/// old translation or the new translation will be used, but the choice is
8867/// unpredictable. The behavior is otherwise well-defined.
8868///
8869/// In a conventional TLB design, it is possible for multiple entries to
8870/// match a single address if, for example, a page is upgraded to a
8871/// superpage without first clearing the original non-leaf PTE's valid bit
8872/// and executing an SFENCE.VMA with __rs1__=`x0`. In this case, a similar
8873/// remark applies: it is unpredictable whether the old non-leaf PTE or the
8874/// new leaf PTE is used, but the behavior is otherwise well defined.
8875///
8876/// Another consequence of this specification is that it is generally unsafe
8877/// to update a PTE using a set of stores of a width less than the width of
8878/// the PTE, as it is legal for the implementation to read the PTE at any
8879/// time, including when only some of the partial stores have taken effect.
8880///
8881/// ***
8882///
8883/// This specification permits the caching of PTEs whose V (Valid) bit is
8884/// clear. Operating systems must be written to cope with this possibility,
8885/// but implementers are reminded that eagerly caching invalid PTEs will
8886/// reduce performance by causing additional page faults.
8887/// ====
8888///
8889/// Implementations must only perform implicit reads of the translation data
8890/// structures pointed to by the current contents of the `satp` register or
8891/// a subsequent valid (V=1) translation data structure entry, and must only
8892/// raise exceptions for implicit accesses that are generated as a result of
8893/// instruction execution, not those that are performed speculatively.
8894///
8895/// Changes to the `sstatus` fields SUM and MXR take effect immediately,
8896/// without the need to execute an SFENCE.VMA instruction. Changing
8897/// `satp`.MODE from Bare to other modes and vice versa also takes effect
8898/// immediately, without the need to execute an SFENCE.VMA instruction.
8899/// Likewise, changes to `satp`.ASID take effect immediately.
8900///
8901/// \[TIP\]
8902/// ====
8903/// The following common situations typically require executing an
8904/// SFENCE.VMA instruction:
8905///
8906/// * When software recycles an ASID (i.e., reassociates it with a different
8907/// page table), it should _first_ change `satp` to point to the new page
8908/// table using the recycled ASID, _then_ execute SFENCE.VMA with __rs1__=`x0`
8909/// and _rs2_ set to the recycled ASID. Alternatively, software can execute
8910/// the same SFENCE.VMA instruction while a different ASID is loaded into
8911/// `satp`, provided the next time `satp` is loaded with the recycled ASID,
8912/// it is simultaneously loaded with the new page table.
8913/// * If the implementation does not provide ASIDs, or software chooses to
8914/// always use ASID 0, then after every `satp` write, software should
8915/// execute SFENCE.VMA with __rs1__=`x0`. In the common case that no global
8916/// translations have been modified, _rs2_ should be set to a register other
8917/// than `x0` but which contains the value zero, so that global translations
8918/// are not flushed.
8919/// * If software modifies a non-leaf PTE, it should execute SFENCE.VMA with
8920/// __rs1__=`x0`. If any PTE along the traversal path had its G bit set, _rs2_
8921/// must be `x0`; otherwise, _rs2_ should be set to the ASID for which the
8922/// translation is being modified.
8923/// * If software modifies a leaf PTE, it should execute SFENCE.VMA with
8924/// _rs1_ set to a virtual address within the page. If any PTE along the
8925/// traversal path had its G bit set, _rs2_ must be `x0`; otherwise, _rs2_
8926/// should be set to the ASID for which the translation is being modified.
8927/// * For the special cases of increasing the permissions on a leaf PTE and
8928/// changing an invalid PTE to a valid leaf, software may choose to execute
8929/// the SFENCE.VMA lazily. After modifying the PTE but before executing
8930/// SFENCE.VMA, either the new or old permissions will be used. In the
8931/// latter case, a page-fault exception might occur, at which point software
8932/// should execute SFENCE.VMA in accordance with the previous bullet point.
8933/// ====
8934///
8935/// If a hart employs an address-translation cache, that cache must appear
8936/// to be private to that hart. In particular, the meaning of an ASID is
8937/// local to a hart; software may choose to use the same ASID to refer to
8938/// different address spaces on different harts.
8939///
8940/// \[NOTE\]
8941/// ====
8942/// A future extension could redefine ASIDs to be global across the SEE,
8943/// enabling such options as shared translation caches and hardware support
8944/// for broadcast TLB shootdown. However, as OSes have evolved to
8945/// significantly reduce the scope of TLB shootdowns using novel
8946/// ASID-management techniques, we expect the local-ASID scheme to remain
8947/// attractive for its simplicity and possibly better scalability.
8948/// ====
8949///
8950/// For implementations that make `satp`.MODE read-only zero (always Bare),
8951/// attempts to execute an SFENCE.VMA instruction might raise an
8952/// illegal-instruction exception.
8953///
8954/// # Forms
8955/// Assembly: `sfence.vma xs1, xs2`
8956/// Rust: `sfence_vma(rs1, rs2)`
8957///
8958/// # Arguments
8959/// - `rs1` — Source register.
8960/// - `rs2` — Source register.
8961pub trait SfenceVmaEmitter<T0, T1> {
8962 fn sfence_vma(&mut self, rs1: T0, rs2: T1);
8963}
8964
8965/// Order writes before sfence
8966///
8967/// The `sfence.w.inval` instruction guarantees that any previous stores already visible to the
8968/// current RISC-V hart are ordered before subsequent `sinval.vma` instructions executed by the
8969/// same hart.
8970///
8971/// # Forms
8972/// Assembly: `sfence.w.inval ""`
8973/// Rust: `sfence_w_inval()`
8974///
8975/// # Arguments
8976pub trait SfenceWInvalEmitter {
8977 fn sfence_w_inval(&mut self);
8978}
8979
8980/// RISC-V `sgtz` instruction.
8981///
8982/// # Forms
8983/// Assembly: `sgtz rd rs2`
8984/// Rust: `sgtz(rd, rs2)`
8985///
8986/// # Arguments
8987/// - `rd` — Destination register.
8988/// - `rs2` — Source register.
8989pub trait SgtzEmitter<T0, T1> {
8990 fn sgtz(&mut self, rd: T0, rs2: T1);
8991}
8992
8993/// Store halfword
8994///
8995/// Store 16 bits of data from register `rs2` to an
8996/// address formed by adding `rs1` to a signed offset.
8997///
8998/// # Forms
8999/// Assembly: `sh xs2, imm(xs1)`
9000/// Rust: `sh(rs1, rs2, imm)`
9001///
9002/// # Arguments
9003/// - `rs1` — Memory base register.
9004/// - `rs2` — Source register.
9005/// - `imm` — Immediate encoding value.
9006pub trait ShEmitter<T0, T1, T2> {
9007 fn sh(&mut self, rs1: T0, rs2: T1, imm: T2);
9008}
9009
9010/// Shift left by 1 and add
9011///
9012/// This instruction shifts `rs1` to the left by 1 bit and adds it to `rs2`.
9013///
9014/// # Forms
9015/// Assembly: `sh1add xd, xs1, xs2`
9016/// Rust: `sh1add(rd, rs1, rs2)`
9017///
9018/// # Arguments
9019/// - `rd` — Destination register.
9020/// - `rs1` — Source register.
9021/// - `rs2` — Source register.
9022pub trait Sh1AddEmitter<T0, T1, T2> {
9023 fn sh1add(&mut self, rd: T0, rs1: T1, rs2: T2);
9024}
9025
9026/// Shift unsigned word left by 1 and add
9027///
9028/// This instruction performs an XLEN-wide addition of two addends. The first addend is rs2.
9029/// The second addend is the unsigned value formed by extracting the least-significant word of rs1
9030/// and shifting it left by 1 place.
9031///
9032/// # Forms
9033/// Assembly: `sh1add.uw xd, xs1, xs2`
9034/// Rust: `sh1add_uw(rd, rs1, rs2)`
9035///
9036/// # Arguments
9037/// - `rd` — Destination register.
9038/// - `rs1` — Source register.
9039/// - `rs2` — Source register.
9040pub trait Sh1AddUwEmitter<T0, T1, T2> {
9041 fn sh1add_uw(&mut self, rd: T0, rs1: T1, rs2: T2);
9042}
9043
9044/// Shift left by 2 and add
9045///
9046/// This instruction shifts `rs1` to the left by 2 places and adds it to `rs2`.
9047///
9048/// # Forms
9049/// Assembly: `sh2add xd, xs1, xs2`
9050/// Rust: `sh2add(rd, rs1, rs2)`
9051///
9052/// # Arguments
9053/// - `rd` — Destination register.
9054/// - `rs1` — Source register.
9055/// - `rs2` — Source register.
9056pub trait Sh2AddEmitter<T0, T1, T2> {
9057 fn sh2add(&mut self, rd: T0, rs1: T1, rs2: T2);
9058}
9059
9060/// Shift unsigned word left by 2 and add
9061///
9062/// This instruction performs an XLEN-wide addition of two addends. The first addend is rs2.
9063/// The second addend is the unsigned value formed by extracting the least-significant word of rs1
9064/// and shifting it left by 2 places.
9065///
9066/// # Forms
9067/// Assembly: `sh2add.uw xd, xs1, xs2`
9068/// Rust: `sh2add_uw(rd, rs1, rs2)`
9069///
9070/// # Arguments
9071/// - `rd` — Destination register.
9072/// - `rs1` — Source register.
9073/// - `rs2` — Source register.
9074pub trait Sh2AddUwEmitter<T0, T1, T2> {
9075 fn sh2add_uw(&mut self, rd: T0, rs1: T1, rs2: T2);
9076}
9077
9078/// Shift left by 3 and add
9079///
9080/// This instruction shifts `rs1` to the left by 3 places and adds it to `rs2`.
9081///
9082/// # Forms
9083/// Assembly: `sh3add xd, xs1, xs2`
9084/// Rust: `sh3add(rd, rs1, rs2)`
9085///
9086/// # Arguments
9087/// - `rd` — Destination register.
9088/// - `rs1` — Source register.
9089/// - `rs2` — Source register.
9090pub trait Sh3AddEmitter<T0, T1, T2> {
9091 fn sh3add(&mut self, rd: T0, rs1: T1, rs2: T2);
9092}
9093
9094/// Shift unsigned word left by 3 and add
9095///
9096/// This instruction performs an XLEN-wide addition of two addends. The first addend is rs2.
9097/// The second addend is the unsigned value formed by extracting the least-significant word of rs1
9098/// and shifting it left by 3 places.
9099///
9100/// # Forms
9101/// Assembly: `sh3add.uw xd, xs1, xs2`
9102/// Rust: `sh3add_uw(rd, rs1, rs2)`
9103///
9104/// # Arguments
9105/// - `rd` — Destination register.
9106/// - `rs1` — Source register.
9107/// - `rs2` — Source register.
9108pub trait Sh3AddUwEmitter<T0, T1, T2> {
9109 fn sh3add_uw(&mut self, rd: T0, rs1: T1, rs2: T2);
9110}
9111
9112/// RISC-V `sha256sig0` instruction.
9113///
9114/// # Forms
9115/// Assembly: `sha256sig0 xd, xs1`
9116/// Rust: `sha256sig0(rd, rs1)`
9117///
9118/// # Arguments
9119/// - `rd` — Destination register.
9120/// - `rs1` — Source register.
9121pub trait Sha256Sig0Emitter<T0, T1> {
9122 fn sha256sig0(&mut self, rd: T0, rs1: T1);
9123}
9124
9125/// RISC-V `sha256sig1` instruction.
9126///
9127/// # Forms
9128/// Assembly: `sha256sig1 xd, xs1`
9129/// Rust: `sha256sig1(rd, rs1)`
9130///
9131/// # Arguments
9132/// - `rd` — Destination register.
9133/// - `rs1` — Source register.
9134pub trait Sha256Sig1Emitter<T0, T1> {
9135 fn sha256sig1(&mut self, rd: T0, rs1: T1);
9136}
9137
9138/// RISC-V `sha256sum0` instruction.
9139///
9140/// # Forms
9141/// Assembly: `sha256sum0 xd, xs1`
9142/// Rust: `sha256sum0(rd, rs1)`
9143///
9144/// # Arguments
9145/// - `rd` — Destination register.
9146/// - `rs1` — Source register.
9147pub trait Sha256Sum0Emitter<T0, T1> {
9148 fn sha256sum0(&mut self, rd: T0, rs1: T1);
9149}
9150
9151/// RISC-V `sha256sum1` instruction.
9152///
9153/// # Forms
9154/// Assembly: `sha256sum1 xd, xs1`
9155/// Rust: `sha256sum1(rd, rs1)`
9156///
9157/// # Arguments
9158/// - `rd` — Destination register.
9159/// - `rs1` — Source register.
9160pub trait Sha256Sum1Emitter<T0, T1> {
9161 fn sha256sum1(&mut self, rd: T0, rs1: T1);
9162}
9163
9164/// RISC-V `sha512sig0` instruction.
9165///
9166/// # Forms
9167/// Assembly: `sha512sig0 xd, xs1`
9168/// Rust: `sha512sig0(rd, rs1)`
9169///
9170/// # Arguments
9171/// - `rd` — Destination register.
9172/// - `rs1` — Source register.
9173pub trait Sha512Sig0Emitter<T0, T1> {
9174 fn sha512sig0(&mut self, rd: T0, rs1: T1);
9175}
9176
9177/// RISC-V `sha512sig0h` instruction.
9178///
9179/// # Forms
9180/// Assembly: `sha512sig0h xd, xs1, xs2`
9181/// Rust: `sha512sig0h(rd, rs1, rs2)`
9182///
9183/// # Arguments
9184/// - `rd` — Destination register.
9185/// - `rs1` — Source register.
9186/// - `rs2` — Source register.
9187pub trait Sha512Sig0HEmitter<T0, T1, T2> {
9188 fn sha512sig0h(&mut self, rd: T0, rs1: T1, rs2: T2);
9189}
9190
9191/// RISC-V `sha512sig0l` instruction.
9192///
9193/// # Forms
9194/// Assembly: `sha512sig0l xd, xs1, xs2`
9195/// Rust: `sha512sig0l(rd, rs1, rs2)`
9196///
9197/// # Arguments
9198/// - `rd` — Destination register.
9199/// - `rs1` — Source register.
9200/// - `rs2` — Source register.
9201pub trait Sha512Sig0LEmitter<T0, T1, T2> {
9202 fn sha512sig0l(&mut self, rd: T0, rs1: T1, rs2: T2);
9203}
9204
9205/// RISC-V `sha512sig1` instruction.
9206///
9207/// # Forms
9208/// Assembly: `sha512sig1 xd, xs1`
9209/// Rust: `sha512sig1(rd, rs1)`
9210///
9211/// # Arguments
9212/// - `rd` — Destination register.
9213/// - `rs1` — Source register.
9214pub trait Sha512Sig1Emitter<T0, T1> {
9215 fn sha512sig1(&mut self, rd: T0, rs1: T1);
9216}
9217
9218/// RISC-V `sha512sig1h` instruction.
9219///
9220/// # Forms
9221/// Assembly: `sha512sig1h xd, xs1, xs2`
9222/// Rust: `sha512sig1h(rd, rs1, rs2)`
9223///
9224/// # Arguments
9225/// - `rd` — Destination register.
9226/// - `rs1` — Source register.
9227/// - `rs2` — Source register.
9228pub trait Sha512Sig1HEmitter<T0, T1, T2> {
9229 fn sha512sig1h(&mut self, rd: T0, rs1: T1, rs2: T2);
9230}
9231
9232/// RISC-V `sha512sig1l` instruction.
9233///
9234/// # Forms
9235/// Assembly: `sha512sig1l xd, xs1, xs2`
9236/// Rust: `sha512sig1l(rd, rs1, rs2)`
9237///
9238/// # Arguments
9239/// - `rd` — Destination register.
9240/// - `rs1` — Source register.
9241/// - `rs2` — Source register.
9242pub trait Sha512Sig1LEmitter<T0, T1, T2> {
9243 fn sha512sig1l(&mut self, rd: T0, rs1: T1, rs2: T2);
9244}
9245
9246/// RISC-V `sha512sum0` instruction.
9247///
9248/// # Forms
9249/// Assembly: `sha512sum0 xd, xs1`
9250/// Rust: `sha512sum0(rd, rs1)`
9251///
9252/// # Arguments
9253/// - `rd` — Destination register.
9254/// - `rs1` — Source register.
9255pub trait Sha512Sum0Emitter<T0, T1> {
9256 fn sha512sum0(&mut self, rd: T0, rs1: T1);
9257}
9258
9259/// RISC-V `sha512sum0r` instruction.
9260///
9261/// # Forms
9262/// Assembly: `sha512sum0r xd, xs1, xs2`
9263/// Rust: `sha512sum0r(rd, rs1, rs2)`
9264///
9265/// # Arguments
9266/// - `rd` — Destination register.
9267/// - `rs1` — Source register.
9268/// - `rs2` — Source register.
9269pub trait Sha512Sum0REmitter<T0, T1, T2> {
9270 fn sha512sum0r(&mut self, rd: T0, rs1: T1, rs2: T2);
9271}
9272
9273/// RISC-V `sha512sum1` instruction.
9274///
9275/// # Forms
9276/// Assembly: `sha512sum1 xd, xs1`
9277/// Rust: `sha512sum1(rd, rs1)`
9278///
9279/// # Arguments
9280/// - `rd` — Destination register.
9281/// - `rs1` — Source register.
9282pub trait Sha512Sum1Emitter<T0, T1> {
9283 fn sha512sum1(&mut self, rd: T0, rs1: T1);
9284}
9285
9286/// RISC-V `sha512sum1r` instruction.
9287///
9288/// # Forms
9289/// Assembly: `sha512sum1r xd, xs1, xs2`
9290/// Rust: `sha512sum1r(rd, rs1, rs2)`
9291///
9292/// # Arguments
9293/// - `rd` — Destination register.
9294/// - `rs1` — Source register.
9295/// - `rs2` — Source register.
9296pub trait Sha512Sum1REmitter<T0, T1, T2> {
9297 fn sha512sum1r(&mut self, rd: T0, rs1: T1, rs2: T2);
9298}
9299
9300/// Invalidate cached address translations
9301///
9302/// # Forms
9303/// Assembly: `sinval.vma xs1, xs2`
9304/// Rust: `sinval_vma(rs1, rs2)`
9305///
9306/// # Arguments
9307/// - `rs1` — Source register.
9308/// - `rs2` — Source register.
9309pub trait SinvalVmaEmitter<T0, T1> {
9310 fn sinval_vma(&mut self, rs1: T0, rs2: T1);
9311}
9312
9313/// Shift left logical
9314///
9315/// Shift the value in `rs1` left by the value in the lower 6 bits of `rs2`, and store the result in `rd`.
9316///
9317/// # Forms
9318/// Assembly: `sll xd, xs1, xs2`
9319/// Rust: `sll(rd, rs1, rs2)`
9320///
9321/// # Arguments
9322/// - `rd` — Destination register.
9323/// - `rs1` — Source register.
9324/// - `rs2` — Source register.
9325pub trait SllEmitter<T0, T1, T2> {
9326 fn sll(&mut self, rd: T0, rs1: T1, rs2: T2);
9327}
9328
9329/// Shift left logical immediate
9330///
9331/// Shift the value in rs1 left by shamt, and store the result in rd
9332///
9333/// # Forms
9334/// Assembly: `slli xd, xs1, shamt`
9335/// Rust: `slli(rd, rs1, shamtd)`
9336///
9337/// # Arguments
9338/// - `rd` — Destination register.
9339/// - `rs1` — Source register.
9340/// - `shamtd` — Immediate encoding value.
9341pub trait SlliEmitter<T0, T1, T2> {
9342 fn slli(&mut self, rd: T0, rs1: T1, shamtd: T2);
9343}
9344
9345/// Shift left logical immediate
9346///
9347/// Shift the value in rs1 left by shamt, and store the result in rd
9348///
9349/// # Forms
9350/// Assembly: `slli.rv32 xd, xs1, shamt`
9351/// Rust: `slli_rv32(rd, rs1, shamtw)`
9352///
9353/// # Arguments
9354/// - `rd` — Destination register.
9355/// - `rs1` — Source register.
9356/// - `shamtw` — Immediate encoding value.
9357pub trait SlliRv32Emitter<T0, T1, T2> {
9358 fn slli_rv32(&mut self, rd: T0, rs1: T1, shamtw: T2);
9359}
9360
9361/// Shift left unsigned word (Immediate)
9362///
9363/// This instruction takes the least-significant word of rs1, zero-extends it, and shifts it
9364/// left by the immediate.
9365///
9366/// \[NOTE\]
9367/// This instruction is the same as `slli` with `zext.w` performed on rs1 before shifting.
9368///
9369/// # Forms
9370/// Assembly: `slli.uw xd, xs1, shamt`
9371/// Rust: `slli_uw(rd, rs1, shamtd)`
9372///
9373/// # Arguments
9374/// - `rd` — Destination register.
9375/// - `rs1` — Source register.
9376/// - `shamtd` — Immediate encoding value.
9377pub trait SlliUwEmitter<T0, T1, T2> {
9378 fn slli_uw(&mut self, rd: T0, rs1: T1, shamtd: T2);
9379}
9380
9381/// Shift left logical immediate word
9382///
9383/// Shift the 32-bit value in rs1 left by shamt, and store the sign-extended result in rd
9384///
9385/// # Forms
9386/// Assembly: `slliw xd, xs1, shamt`
9387/// Rust: `slliw(rd, rs1, shamtw)`
9388///
9389/// # Arguments
9390/// - `rd` — Destination register.
9391/// - `rs1` — Source register.
9392/// - `shamtw` — Immediate encoding value.
9393pub trait SlliwEmitter<T0, T1, T2> {
9394 fn slliw(&mut self, rd: T0, rs1: T1, shamtw: T2);
9395}
9396
9397/// Shift left logical word
9398///
9399/// Shift the 32-bit value in `rs1` left by the value in the lower 5 bits of `rs2`, and store the sign-extended result in `rd`.
9400///
9401/// # Forms
9402/// Assembly: `sllw xd, xs1, xs2`
9403/// Rust: `sllw(rd, rs1, rs2)`
9404///
9405/// # Arguments
9406/// - `rd` — Destination register.
9407/// - `rs1` — Source register.
9408/// - `rs2` — Source register.
9409pub trait SllwEmitter<T0, T1, T2> {
9410 fn sllw(&mut self, rd: T0, rs1: T1, rs2: T2);
9411}
9412
9413/// Set on less than
9414///
9415/// Places the value 1 in register `rd` if register `rs1` is less than the value in register `rs2`, where
9416/// both sources are treated as signed numbers, else 0 is written to `rd`.
9417///
9418/// # Forms
9419/// Assembly: `slt xd, xs1, rs2`
9420/// Rust: `slt(rd, rs1, rs2)`
9421///
9422/// # Arguments
9423/// - `rd` — Destination register.
9424/// - `rs1` — Source register.
9425/// - `rs2` — Source register.
9426pub trait SltEmitter<T0, T1, T2> {
9427 fn slt(&mut self, rd: T0, rs1: T1, rs2: T2);
9428}
9429
9430/// Set on less than immediate
9431///
9432/// Places the value 1 in register `rd` if register `rs1` is less than the sign-extended immediate
9433/// when both are treated as signed numbers, else 0 is written to `rd`.
9434///
9435/// # Forms
9436/// Assembly: `slti xd, xs1, imm`
9437/// Rust: `slti(rd, rs1, imm)`
9438///
9439/// # Arguments
9440/// - `rd` — Destination register.
9441/// - `rs1` — Source register.
9442/// - `imm` — Immediate encoding value.
9443pub trait SltiEmitter<T0, T1, T2> {
9444 fn slti(&mut self, rd: T0, rs1: T1, imm: T2);
9445}
9446
9447/// Set on less than immediate unsigned
9448///
9449/// Places the value 1 in register `rd` if register `rs1` is less than the sign-extended immediate
9450/// when both are treated as unsigned numbers (_i.e._, the immediate is first sign-extended to
9451/// XLEN bits then treated as an unsigned number), else 0 is written to `rd`.
9452///
9453/// NOTE: `sltiu rd, rs1, 1` sets `rd` to 1 if `rs1` equals zero, otherwise sets `rd` to 0
9454/// (assembler pseudoinstruction `SEQZ rd, rs`).
9455///
9456/// # Forms
9457/// Assembly: `sltiu xd, xs1, imm`
9458/// Rust: `sltiu(rd, rs1, imm)`
9459///
9460/// # Arguments
9461/// - `rd` — Destination register.
9462/// - `rs1` — Source register.
9463/// - `imm` — Immediate encoding value.
9464pub trait SltiuEmitter<T0, T1, T2> {
9465 fn sltiu(&mut self, rd: T0, rs1: T1, imm: T2);
9466}
9467
9468/// Set on less than unsigned
9469///
9470/// Places the value 1 in register `rd` if register `rs1` is less than the value in register `rs2`, where
9471/// both sources are treated as unsigned numbers, else 0 is written to `rd`.
9472///
9473/// # Forms
9474/// Assembly: `sltu xd, xs1, xs2`
9475/// Rust: `sltu(rd, rs1, rs2)`
9476///
9477/// # Arguments
9478/// - `rd` — Destination register.
9479/// - `rs1` — Source register.
9480/// - `rs2` — Source register.
9481pub trait SltuEmitter<T0, T1, T2> {
9482 fn sltu(&mut self, rd: T0, rs1: T1, rs2: T2);
9483}
9484
9485/// RISC-V `sltz` instruction.
9486///
9487/// # Forms
9488/// Assembly: `sltz rd rs1`
9489/// Rust: `sltz(rd, rs1)`
9490///
9491/// # Arguments
9492/// - `rd` — Destination register.
9493/// - `rs1` — Source register.
9494pub trait SltzEmitter<T0, T1> {
9495 fn sltz(&mut self, rd: T0, rs1: T1);
9496}
9497
9498/// RISC-V `sm3p0` instruction.
9499///
9500/// # Forms
9501/// Assembly: `sm3p0 xd, xs1`
9502/// Rust: `sm3p0(rd, rs1)`
9503///
9504/// # Arguments
9505/// - `rd` — Destination register.
9506/// - `rs1` — Source register.
9507pub trait Sm3P0Emitter<T0, T1> {
9508 fn sm3p0(&mut self, rd: T0, rs1: T1);
9509}
9510
9511/// RISC-V `sm3p1` instruction.
9512///
9513/// # Forms
9514/// Assembly: `sm3p1 xd, xs1`
9515/// Rust: `sm3p1(rd, rs1)`
9516///
9517/// # Arguments
9518/// - `rd` — Destination register.
9519/// - `rs1` — Source register.
9520pub trait Sm3P1Emitter<T0, T1> {
9521 fn sm3p1(&mut self, rd: T0, rs1: T1);
9522}
9523
9524/// RISC-V `sm4ed` instruction.
9525///
9526/// # Forms
9527/// Assembly: `sm4ed xd, xs1, xs2, bs`
9528/// Rust: `sm4ed(rd, rs1, rs2, bs)`
9529///
9530/// # Arguments
9531/// - `rd` — Destination register.
9532/// - `rs1` — Source register.
9533/// - `rs2` — Source register.
9534/// - `bs` — Immediate encoding value.
9535pub trait Sm4EdEmitter<T0, T1, T2, T3> {
9536 fn sm4ed(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3);
9537}
9538
9539/// RISC-V `sm4ks` instruction.
9540///
9541/// # Forms
9542/// Assembly: `sm4ks xd, xs1, xs2, bs`
9543/// Rust: `sm4ks(rd, rs1, rs2, bs)`
9544///
9545/// # Arguments
9546/// - `rd` — Destination register.
9547/// - `rs1` — Source register.
9548/// - `rs2` — Source register.
9549/// - `bs` — Immediate encoding value.
9550pub trait Sm4KsEmitter<T0, T1, T2, T3> {
9551 fn sm4ks(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3);
9552}
9553
9554/// RISC-V `snez` instruction.
9555///
9556/// # Forms
9557/// Assembly: `snez rd rs2`
9558/// Rust: `snez(rd, rs2)`
9559///
9560/// # Arguments
9561/// - `rd` — Destination register.
9562/// - `rs2` — Source register.
9563pub trait SnezEmitter<T0, T1> {
9564 fn snez(&mut self, rd: T0, rs2: T1);
9565}
9566
9567/// Shift right arithmetic
9568///
9569/// Arithmetic shift the value in `rs1` right by the value in the lower 5 bits of `rs2`, and store the result in `rd`.
9570///
9571/// # Forms
9572/// Assembly: `sra xd, xs1, xs2`
9573/// Rust: `sra(rd, rs1, rs2)`
9574///
9575/// # Arguments
9576/// - `rd` — Destination register.
9577/// - `rs1` — Source register.
9578/// - `rs2` — Source register.
9579pub trait SraEmitter<T0, T1, T2> {
9580 fn sra(&mut self, rd: T0, rs1: T1, rs2: T2);
9581}
9582
9583/// Shift right arithmetic immediate
9584///
9585/// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the
9586/// value in rs1 right by shamt, and store the result in rd.
9587///
9588/// # Forms
9589/// Assembly: `srai xd, xs1, shamt`
9590/// Rust: `srai(rd, rs1, shamtd)`
9591///
9592/// # Arguments
9593/// - `rd` — Destination register.
9594/// - `rs1` — Source register.
9595/// - `shamtd` — Immediate encoding value.
9596pub trait SraiEmitter<T0, T1, T2> {
9597 fn srai(&mut self, rd: T0, rs1: T1, shamtd: T2);
9598}
9599
9600/// Shift right arithmetic immediate
9601///
9602/// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the
9603/// value in rs1 right by shamt, and store the result in rd.
9604///
9605/// # Forms
9606/// Assembly: `srai.rv32 xd, xs1, shamt`
9607/// Rust: `srai_rv32(rd, rs1, shamtw)`
9608///
9609/// # Arguments
9610/// - `rd` — Destination register.
9611/// - `rs1` — Source register.
9612/// - `shamtw` — Immediate encoding value.
9613pub trait SraiRv32Emitter<T0, T1, T2> {
9614 fn srai_rv32(&mut self, rd: T0, rs1: T1, shamtw: T2);
9615}
9616
9617/// Shift right arithmetic immediate word
9618///
9619/// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the
9620/// 32-bit value in rs1 right by shamt, and store the sign-extended result in rd.
9621///
9622/// # Forms
9623/// Assembly: `sraiw xd, xs1, shamt`
9624/// Rust: `sraiw(rd, rs1, shamtw)`
9625///
9626/// # Arguments
9627/// - `rd` — Destination register.
9628/// - `rs1` — Source register.
9629/// - `shamtw` — Immediate encoding value.
9630pub trait SraiwEmitter<T0, T1, T2> {
9631 fn sraiw(&mut self, rd: T0, rs1: T1, shamtw: T2);
9632}
9633
9634/// Shift right arithmetic word
9635///
9636/// Arithmetic shift the 32-bit value in `rs1` right by the value in the lower 5 bits of `rs2`, and store the sign-extended result in `rd`.
9637///
9638/// # Forms
9639/// Assembly: `sraw xd, xs1, xs2`
9640/// Rust: `sraw(rd, rs1, rs2)`
9641///
9642/// # Arguments
9643/// - `rd` — Destination register.
9644/// - `rs1` — Source register.
9645/// - `rs2` — Source register.
9646pub trait SrawEmitter<T0, T1, T2> {
9647 fn sraw(&mut self, rd: T0, rs1: T1, rs2: T2);
9648}
9649
9650/// Supervisor Exception Return
9651///
9652/// Returns from an exception.
9653///
9654/// When `sret` is allowed to execute, its behavior depends on whether or not the current privilege
9655/// mode is virtualized.
9656///
9657/// *When the current privilege mode is (H)S-mode or M-mode*
9658///
9659/// `sret` sets `hstatus.HPV` = 0, `mstatus.SPP` = 0,
9660/// `mstatus.SIE` = `mstatus.SPIE`, and `mstatus.SPIE` = 1,
9661/// changes the privilege mode according to the table below,
9662/// and then jumps to the address in `sepc`.
9663///
9664/// .Next privilege mode following an `sret` in (H)S-mode or M-mode
9665/// \[%autowidth\]
9666/// |===
9667/// | \[.rotate\]#`mstatus.SPP`# | \[.rotate\]#`hstatus.SPV`# .>| Mode after `sret`
9668///
9669/// | 0 | 0 | U-mode
9670/// | 0 | 1 | VU-mode
9671/// | 1 | 0 | (H)S-mode
9672/// | 1 | 1 | VS-mode
9673/// |===
9674///
9675/// *When the current privilege mode is VS-mode*
9676///
9677/// `sret` sets
9678/// `vsstatus.SPP` = 0, `vsstatus.SIE` = `vstatus.SPIE`, and `vsstatus.SPIE` = 1,
9679/// changes the privilege mode according to the table below,
9680/// and then jumps to the address in `vsepc`.
9681///
9682/// .Next privilege mode following an `sret` in (H)S-mode or M-mode
9683/// \[%autowidth\]
9684/// |===
9685/// | \[.rotate\]#`vsstatus.SPP`# .>| Mode after `sret`
9686///
9687/// | 0 | VU-mode
9688/// | 1 | VS-mode
9689/// |===
9690///
9691/// # Forms
9692/// Assembly: `sret ""`
9693/// Rust: `sret()`
9694///
9695/// # Arguments
9696pub trait SretEmitter {
9697 fn sret(&mut self);
9698}
9699
9700/// Shift right logical
9701///
9702/// Logical shift the value in `rs1` right by the value in the lower bits of `rs2`, and store the result in `rd`.
9703///
9704/// # Forms
9705/// Assembly: `srl xd, xs1, xs2`
9706/// Rust: `srl(rd, rs1, rs2)`
9707///
9708/// # Arguments
9709/// - `rd` — Destination register.
9710/// - `rs1` — Source register.
9711/// - `rs2` — Source register.
9712pub trait SrlEmitter<T0, T1, T2> {
9713 fn srl(&mut self, rd: T0, rs1: T1, rs2: T2);
9714}
9715
9716/// Shift right logical immediate
9717///
9718/// Shift the value in rs1 right by shamt, and store the result in rd
9719///
9720/// # Forms
9721/// Assembly: `srli xd, xs1, shamt`
9722/// Rust: `srli(rd, rs1, shamtd)`
9723///
9724/// # Arguments
9725/// - `rd` — Destination register.
9726/// - `rs1` — Source register.
9727/// - `shamtd` — Immediate encoding value.
9728pub trait SrliEmitter<T0, T1, T2> {
9729 fn srli(&mut self, rd: T0, rs1: T1, shamtd: T2);
9730}
9731
9732/// Shift right logical immediate
9733///
9734/// Shift the value in rs1 right by shamt, and store the result in rd
9735///
9736/// # Forms
9737/// Assembly: `srli.rv32 xd, xs1, shamt`
9738/// Rust: `srli_rv32(rd, rs1, shamtw)`
9739///
9740/// # Arguments
9741/// - `rd` — Destination register.
9742/// - `rs1` — Source register.
9743/// - `shamtw` — Immediate encoding value.
9744pub trait SrliRv32Emitter<T0, T1, T2> {
9745 fn srli_rv32(&mut self, rd: T0, rs1: T1, shamtw: T2);
9746}
9747
9748/// Shift right logical immediate word
9749///
9750/// Shift the 32-bit value in rs1 right by shamt, and store the sign-extended result in rd
9751///
9752/// # Forms
9753/// Assembly: `srliw xd, xs1, shamt`
9754/// Rust: `srliw(rd, rs1, shamtw)`
9755///
9756/// # Arguments
9757/// - `rd` — Destination register.
9758/// - `rs1` — Source register.
9759/// - `shamtw` — Immediate encoding value.
9760pub trait SrliwEmitter<T0, T1, T2> {
9761 fn srliw(&mut self, rd: T0, rs1: T1, shamtw: T2);
9762}
9763
9764/// Shift right logical word
9765///
9766/// Logical shift the 32-bit value in `rs1` right by the value in the lower 5 bits of `rs2`, and store the sign-extended result in `rd`.
9767///
9768/// # Forms
9769/// Assembly: `srlw xd, xs1, xs2`
9770/// Rust: `srlw(rd, rs1, rs2)`
9771///
9772/// # Arguments
9773/// - `rd` — Destination register.
9774/// - `rs1` — Source register.
9775/// - `rs2` — Source register.
9776pub trait SrlwEmitter<T0, T1, T2> {
9777 fn srlw(&mut self, rd: T0, rs1: T1, rs2: T2);
9778}
9779
9780/// RISC-V `ssamoswap.d` instruction.
9781///
9782/// # Forms
9783/// Assembly: `ssamoswap.d xd, xs1, xs2, aq, rl`
9784/// Rust: `ssamoswap_d(rd, rs1, rs2, aq, rl)`
9785///
9786/// # Arguments
9787/// - `rd` — Destination register.
9788/// - `rs1` — Memory base register.
9789/// - `rs2` — Source register.
9790/// - `aq` — Acquire-order bit.
9791/// - `rl` — Release-order bit; retained for the existing emitter API.
9792pub trait SsamoswapDEmitter<T0, T1, T2, T3, T4> {
9793 fn ssamoswap_d(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
9794}
9795
9796/// RISC-V `ssamoswap.w` instruction.
9797///
9798/// # Forms
9799/// Assembly: `ssamoswap.w xd, xs1, xs2, aq, rl`
9800/// Rust: `ssamoswap_w(rd, rs1, rs2, aq, rl)`
9801///
9802/// # Arguments
9803/// - `rd` — Destination register.
9804/// - `rs1` — Memory base register.
9805/// - `rs2` — Source register.
9806/// - `aq` — Acquire-order bit.
9807/// - `rl` — Release-order bit; retained for the existing emitter API.
9808pub trait SsamoswapWEmitter<T0, T1, T2, T3, T4> {
9809 fn ssamoswap_w(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4);
9810}
9811
9812/// RISC-V `sspopchk.x1` instruction.
9813///
9814/// # Forms
9815/// Assembly: `sspopchk.x1 sspopchk_x1`
9816/// Rust: `sspopchk_x1()`
9817///
9818/// # Arguments
9819pub trait SspopchkX1Emitter {
9820 fn sspopchk_x1(&mut self);
9821}
9822
9823/// RISC-V `sspopchk.x5` instruction.
9824///
9825/// # Forms
9826/// Assembly: `sspopchk.x5 sspopchk_x5`
9827/// Rust: `sspopchk_x5()`
9828///
9829/// # Arguments
9830pub trait SspopchkX5Emitter {
9831 fn sspopchk_x5(&mut self);
9832}
9833
9834/// RISC-V `sspush.x1` instruction.
9835///
9836/// # Forms
9837/// Assembly: `sspush.x1 sspush_x1`
9838/// Rust: `sspush_x1()`
9839///
9840/// # Arguments
9841pub trait SspushX1Emitter {
9842 fn sspush_x1(&mut self);
9843}
9844
9845/// RISC-V `sspush.x5` instruction.
9846///
9847/// # Forms
9848/// Assembly: `sspush.x5 sspush_x5`
9849/// Rust: `sspush_x5()`
9850///
9851/// # Arguments
9852pub trait SspushX5Emitter {
9853 fn sspush_x5(&mut self);
9854}
9855
9856/// RISC-V `ssrdp` instruction.
9857///
9858/// # Forms
9859/// Assembly: `ssrdp xd`
9860/// Rust: `ssrdp(rd)`
9861///
9862/// # Arguments
9863/// - `rd` — Destination register.
9864pub trait SsrdpEmitter<T0> {
9865 fn ssrdp(&mut self, rd: T0);
9866}
9867
9868/// Subtract
9869///
9870/// Subtract the value in rs2 from rs1, and store the result in rd
9871///
9872/// # Forms
9873/// Assembly: `sub xd, xs1, xs2`
9874/// Rust: `sub(rd, rs1, rs2)`
9875///
9876/// # Arguments
9877/// - `rd` — Destination register.
9878/// - `rs1` — Source register.
9879/// - `rs2` — Source register.
9880pub trait SubEmitter<T0, T1, T2> {
9881 fn sub(&mut self, rd: T0, rs1: T1, rs2: T2);
9882}
9883
9884/// Subtract word
9885///
9886/// Subtract the 32-bit values in rs2 from rs1, and store the sign-extended result in rd
9887///
9888/// # Forms
9889/// Assembly: `subw xd, xs1, xs2`
9890/// Rust: `subw(rd, rs1, rs2)`
9891///
9892/// # Arguments
9893/// - `rd` — Destination register.
9894/// - `rs1` — Source register.
9895/// - `rs2` — Source register.
9896pub trait SubwEmitter<T0, T1, T2> {
9897 fn subw(&mut self, rd: T0, rs1: T1, rs2: T2);
9898}
9899
9900/// Store word
9901///
9902/// Store 32 bits of data from register `rs2` to an
9903/// address formed by adding `rs1` to a signed offset.
9904///
9905/// # Forms
9906/// Assembly: `sw xs2, imm(xs1)`
9907/// Rust: `sw(rs1, rs2, imm)`
9908///
9909/// # Arguments
9910/// - `rs1` — Memory base register.
9911/// - `rs2` — Source register.
9912/// - `imm` — Immediate encoding value.
9913pub trait SwEmitter<T0, T1, T2> {
9914 fn sw(&mut self, rs1: T0, rs2: T1, imm: T2);
9915}
9916
9917/// Bit deinterleave
9918///
9919/// This instruction gathers bits from the high and low halves of the source word into odd/even bit
9920/// positions in the destination word. It is the inverse of the zip instruction. This instruction is
9921/// available only on RV32.
9922///
9923/// # Forms
9924/// Assembly: `unzip xd, xs1`
9925/// Rust: `unzip(rd, rs1)`
9926///
9927/// # Arguments
9928/// - `rd` — Destination register.
9929/// - `rs1` — Source register.
9930pub trait UnzipEmitter<T0, T1> {
9931 fn unzip(&mut self, rd: T0, rs1: T1);
9932}
9933
9934/// RISC-V `vaadd.vv` instruction.
9935///
9936/// # Forms
9937/// Assembly: `vaadd.vv vm, vs2, vs1, vd`
9938/// Rust: `vaadd_vv(vd, vs1, vs2, vm)`
9939///
9940/// # Arguments
9941/// - `vd` — Vector register operand.
9942/// - `vs1` — Vector register operand.
9943/// - `vs2` — Vector register operand.
9944/// - `vm` — Vector mask control.
9945pub trait VaaddVvEmitter<T0, T1, T2, T3> {
9946 fn vaadd_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
9947}
9948
9949/// RISC-V `vaadd.vx` instruction.
9950///
9951/// # Forms
9952/// Assembly: `vaadd.vx vm, vs2, xs1, vd`
9953/// Rust: `vaadd_vx(vd, vs2, rs1, vm)`
9954///
9955/// # Arguments
9956/// - `vd` — Vector register operand.
9957/// - `vs2` — Vector register operand.
9958/// - `rs1` — Source register.
9959/// - `vm` — Vector mask control.
9960pub trait VaaddVxEmitter<T0, T1, T2, T3> {
9961 fn vaadd_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
9962}
9963
9964/// RISC-V `vaaddu.vv` instruction.
9965///
9966/// # Forms
9967/// Assembly: `vaaddu.vv vm, vs2, vs1, vd`
9968/// Rust: `vaaddu_vv(vd, vs1, vs2, vm)`
9969///
9970/// # Arguments
9971/// - `vd` — Vector register operand.
9972/// - `vs1` — Vector register operand.
9973/// - `vs2` — Vector register operand.
9974/// - `vm` — Vector mask control.
9975pub trait VaadduVvEmitter<T0, T1, T2, T3> {
9976 fn vaaddu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
9977}
9978
9979/// RISC-V `vaaddu.vx` instruction.
9980///
9981/// # Forms
9982/// Assembly: `vaaddu.vx vm, vs2, xs1, vd`
9983/// Rust: `vaaddu_vx(vd, vs2, rs1, vm)`
9984///
9985/// # Arguments
9986/// - `vd` — Vector register operand.
9987/// - `vs2` — Vector register operand.
9988/// - `rs1` — Source register.
9989/// - `vm` — Vector mask control.
9990pub trait VaadduVxEmitter<T0, T1, T2, T3> {
9991 fn vaaddu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
9992}
9993
9994/// RISC-V `vadc.vim` instruction.
9995///
9996/// # Forms
9997/// Assembly: `vadc.vim vs2, vd, imm`
9998/// Rust: `vadc_vim(vd, vs2, simm5)`
9999///
10000/// # Arguments
10001/// - `vd` — Vector register operand.
10002/// - `vs2` — Vector register operand.
10003/// - `simm5` — Immediate encoding value.
10004pub trait VadcVimEmitter<T0, T1, T2> {
10005 fn vadc_vim(&mut self, vd: T0, vs2: T1, simm5: T2);
10006}
10007
10008/// RISC-V `vadc.vvm` instruction.
10009///
10010/// # Forms
10011/// Assembly: `vadc.vvm vs2, vs1, vd`
10012/// Rust: `vadc_vvm(vd, vs1, vs2)`
10013///
10014/// # Arguments
10015/// - `vd` — Vector register operand.
10016/// - `vs1` — Vector register operand.
10017/// - `vs2` — Vector register operand.
10018pub trait VadcVvmEmitter<T0, T1, T2> {
10019 fn vadc_vvm(&mut self, vd: T0, vs1: T1, vs2: T2);
10020}
10021
10022/// RISC-V `vadc.vxm` instruction.
10023///
10024/// # Forms
10025/// Assembly: `vadc.vxm vs2, xs1, vd`
10026/// Rust: `vadc_vxm(vd, rs1, vs2)`
10027///
10028/// # Arguments
10029/// - `vd` — Vector register operand.
10030/// - `rs1` — Source register.
10031/// - `vs2` — Vector register operand.
10032pub trait VadcVxmEmitter<T0, T1, T2> {
10033 fn vadc_vxm(&mut self, vd: T0, rs1: T1, vs2: T2);
10034}
10035
10036/// RISC-V `vadd.vi` instruction.
10037///
10038/// # Forms
10039/// Assembly: `vadd.vi vm, vs2, vd, imm`
10040/// Rust: `vadd_vi(vd, vs2, simm5, vm)`
10041///
10042/// # Arguments
10043/// - `vd` — Vector register operand.
10044/// - `vs2` — Vector register operand.
10045/// - `simm5` — Immediate encoding value.
10046/// - `vm` — Vector mask control.
10047pub trait VaddViEmitter<T0, T1, T2, T3> {
10048 fn vadd_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
10049}
10050
10051/// RISC-V `vadd.vv` instruction.
10052///
10053/// # Forms
10054/// Assembly: `vadd.vv vm, vs2, vs1, vd`
10055/// Rust: `vadd_vv(vd, vs1, vs2, vm)`
10056///
10057/// # Arguments
10058/// - `vd` — Vector register operand.
10059/// - `vs1` — Vector register operand.
10060/// - `vs2` — Vector register operand.
10061/// - `vm` — Vector mask control.
10062pub trait VaddVvEmitter<T0, T1, T2, T3> {
10063 fn vadd_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10064}
10065
10066/// RISC-V `vadd.vx` instruction.
10067///
10068/// # Forms
10069/// Assembly: `vadd.vx vm, vs2, xs1, vd`
10070/// Rust: `vadd_vx(vd, vs2, rs1, vm)`
10071///
10072/// # Arguments
10073/// - `vd` — Vector register operand.
10074/// - `vs2` — Vector register operand.
10075/// - `rs1` — Source register.
10076/// - `vm` — Vector mask control.
10077pub trait VaddVxEmitter<T0, T1, T2, T3> {
10078 fn vadd_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10079}
10080
10081/// RISC-V `vaesdf.vs` instruction.
10082///
10083/// # Forms
10084/// Assembly: `vaesdf.vs vs2, vd`
10085/// Rust: `vaesdf_vs(vd, vs2)`
10086///
10087/// # Arguments
10088/// - `vd` — Vector register operand.
10089/// - `vs2` — Vector register operand.
10090pub trait VaesdfVsEmitter<T0, T1> {
10091 fn vaesdf_vs(&mut self, vd: T0, vs2: T1);
10092}
10093
10094/// RISC-V `vaesdf.vv` instruction.
10095///
10096/// # Forms
10097/// Assembly: `vaesdf.vv vs2, vd`
10098/// Rust: `vaesdf_vv(vd, vs2)`
10099///
10100/// # Arguments
10101/// - `vd` — Vector register operand.
10102/// - `vs2` — Vector register operand.
10103pub trait VaesdfVvEmitter<T0, T1> {
10104 fn vaesdf_vv(&mut self, vd: T0, vs2: T1);
10105}
10106
10107/// RISC-V `vaesdm.vs` instruction.
10108///
10109/// # Forms
10110/// Assembly: `vaesdm.vs vs2, vd`
10111/// Rust: `vaesdm_vs(vd, vs2)`
10112///
10113/// # Arguments
10114/// - `vd` — Vector register operand.
10115/// - `vs2` — Vector register operand.
10116pub trait VaesdmVsEmitter<T0, T1> {
10117 fn vaesdm_vs(&mut self, vd: T0, vs2: T1);
10118}
10119
10120/// RISC-V `vaesdm.vv` instruction.
10121///
10122/// # Forms
10123/// Assembly: `vaesdm.vv vs2, vd`
10124/// Rust: `vaesdm_vv(vd, vs2)`
10125///
10126/// # Arguments
10127/// - `vd` — Vector register operand.
10128/// - `vs2` — Vector register operand.
10129pub trait VaesdmVvEmitter<T0, T1> {
10130 fn vaesdm_vv(&mut self, vd: T0, vs2: T1);
10131}
10132
10133/// RISC-V `vaesef.vs` instruction.
10134///
10135/// # Forms
10136/// Assembly: `vaesef.vs vs2, vd`
10137/// Rust: `vaesef_vs(vd, vs2)`
10138///
10139/// # Arguments
10140/// - `vd` — Vector register operand.
10141/// - `vs2` — Vector register operand.
10142pub trait VaesefVsEmitter<T0, T1> {
10143 fn vaesef_vs(&mut self, vd: T0, vs2: T1);
10144}
10145
10146/// RISC-V `vaesef.vv` instruction.
10147///
10148/// # Forms
10149/// Assembly: `vaesef.vv vs2, vd`
10150/// Rust: `vaesef_vv(vd, vs2)`
10151///
10152/// # Arguments
10153/// - `vd` — Vector register operand.
10154/// - `vs2` — Vector register operand.
10155pub trait VaesefVvEmitter<T0, T1> {
10156 fn vaesef_vv(&mut self, vd: T0, vs2: T1);
10157}
10158
10159/// RISC-V `vaesem.vs` instruction.
10160///
10161/// # Forms
10162/// Assembly: `vaesem.vs vs2, vd`
10163/// Rust: `vaesem_vs(vd, vs2)`
10164///
10165/// # Arguments
10166/// - `vd` — Vector register operand.
10167/// - `vs2` — Vector register operand.
10168pub trait VaesemVsEmitter<T0, T1> {
10169 fn vaesem_vs(&mut self, vd: T0, vs2: T1);
10170}
10171
10172/// RISC-V `vaesem.vv` instruction.
10173///
10174/// # Forms
10175/// Assembly: `vaesem.vv vs2, vd`
10176/// Rust: `vaesem_vv(vd, vs2)`
10177///
10178/// # Arguments
10179/// - `vd` — Vector register operand.
10180/// - `vs2` — Vector register operand.
10181pub trait VaesemVvEmitter<T0, T1> {
10182 fn vaesem_vv(&mut self, vd: T0, vs2: T1);
10183}
10184
10185/// RISC-V `vaeskf1.vi` instruction.
10186///
10187/// # Forms
10188/// Assembly: `vaeskf1.vi vs2, vd, imm`
10189/// Rust: `vaeskf1_vi(vd, vs2, zimm5)`
10190///
10191/// # Arguments
10192/// - `vd` — Vector register operand.
10193/// - `vs2` — Vector register operand.
10194/// - `zimm5` — Immediate encoding value.
10195pub trait Vaeskf1ViEmitter<T0, T1, T2> {
10196 fn vaeskf1_vi(&mut self, vd: T0, vs2: T1, zimm5: T2);
10197}
10198
10199/// RISC-V `vaeskf2.vi` instruction.
10200///
10201/// # Forms
10202/// Assembly: `vaeskf2.vi vs2, vd, imm`
10203/// Rust: `vaeskf2_vi(vd, vs2, zimm5)`
10204///
10205/// # Arguments
10206/// - `vd` — Vector register operand.
10207/// - `vs2` — Vector register operand.
10208/// - `zimm5` — Immediate encoding value.
10209pub trait Vaeskf2ViEmitter<T0, T1, T2> {
10210 fn vaeskf2_vi(&mut self, vd: T0, vs2: T1, zimm5: T2);
10211}
10212
10213/// Vector AES round zero
10214///
10215/// # Forms
10216/// Assembly: `vaesz.vs vs2, vd`
10217/// Rust: `vaesz_vs(vd, vs2)`
10218///
10219/// # Arguments
10220/// - `vd` — Vector register operand.
10221/// - `vs2` — Vector register operand.
10222pub trait VaeszVsEmitter<T0, T1> {
10223 fn vaesz_vs(&mut self, vd: T0, vs2: T1);
10224}
10225
10226/// RISC-V `vand.vi` instruction.
10227///
10228/// # Forms
10229/// Assembly: `vand.vi vm, vs2, vd, imm`
10230/// Rust: `vand_vi(vd, vs2, simm5, vm)`
10231///
10232/// # Arguments
10233/// - `vd` — Vector register operand.
10234/// - `vs2` — Vector register operand.
10235/// - `simm5` — Immediate encoding value.
10236/// - `vm` — Vector mask control.
10237pub trait VandViEmitter<T0, T1, T2, T3> {
10238 fn vand_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
10239}
10240
10241/// RISC-V `vand.vv` instruction.
10242///
10243/// # Forms
10244/// Assembly: `vand.vv vm, vs2, vs1, vd`
10245/// Rust: `vand_vv(vd, vs1, vs2, vm)`
10246///
10247/// # Arguments
10248/// - `vd` — Vector register operand.
10249/// - `vs1` — Vector register operand.
10250/// - `vs2` — Vector register operand.
10251/// - `vm` — Vector mask control.
10252pub trait VandVvEmitter<T0, T1, T2, T3> {
10253 fn vand_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10254}
10255
10256/// RISC-V `vand.vx` instruction.
10257///
10258/// # Forms
10259/// Assembly: `vand.vx vm, vs2, xs1, vd`
10260/// Rust: `vand_vx(vd, vs2, rs1, vm)`
10261///
10262/// # Arguments
10263/// - `vd` — Vector register operand.
10264/// - `vs2` — Vector register operand.
10265/// - `rs1` — Source register.
10266/// - `vm` — Vector mask control.
10267pub trait VandVxEmitter<T0, T1, T2, T3> {
10268 fn vand_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10269}
10270
10271/// RISC-V `vandn.vv` instruction.
10272///
10273/// # Forms
10274/// Assembly: `vandn.vv vm, vs2, vs1, vd`
10275/// Rust: `vandn_vv(vd, vs1, vs2, vm)`
10276///
10277/// # Arguments
10278/// - `vd` — Vector register operand.
10279/// - `vs1` — Vector register operand.
10280/// - `vs2` — Vector register operand.
10281/// - `vm` — Vector mask control.
10282pub trait VandnVvEmitter<T0, T1, T2, T3> {
10283 fn vandn_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10284}
10285
10286/// RISC-V `vandn.vx` instruction.
10287///
10288/// # Forms
10289/// Assembly: `vandn.vx vm, vs2, xs1, vd`
10290/// Rust: `vandn_vx(vd, vs2, rs1, vm)`
10291///
10292/// # Arguments
10293/// - `vd` — Vector register operand.
10294/// - `vs2` — Vector register operand.
10295/// - `rs1` — Source register.
10296/// - `vm` — Vector mask control.
10297pub trait VandnVxEmitter<T0, T1, T2, T3> {
10298 fn vandn_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10299}
10300
10301/// RISC-V `vasub.vv` instruction.
10302///
10303/// # Forms
10304/// Assembly: `vasub.vv vm, vs2, vs1, vd`
10305/// Rust: `vasub_vv(vd, vs1, vs2, vm)`
10306///
10307/// # Arguments
10308/// - `vd` — Vector register operand.
10309/// - `vs1` — Vector register operand.
10310/// - `vs2` — Vector register operand.
10311/// - `vm` — Vector mask control.
10312pub trait VasubVvEmitter<T0, T1, T2, T3> {
10313 fn vasub_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10314}
10315
10316/// RISC-V `vasub.vx` instruction.
10317///
10318/// # Forms
10319/// Assembly: `vasub.vx vm, vs2, xs1, vd`
10320/// Rust: `vasub_vx(vd, vs2, rs1, vm)`
10321///
10322/// # Arguments
10323/// - `vd` — Vector register operand.
10324/// - `vs2` — Vector register operand.
10325/// - `rs1` — Source register.
10326/// - `vm` — Vector mask control.
10327pub trait VasubVxEmitter<T0, T1, T2, T3> {
10328 fn vasub_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10329}
10330
10331/// RISC-V `vasubu.vv` instruction.
10332///
10333/// # Forms
10334/// Assembly: `vasubu.vv vm, vs2, vs1, vd`
10335/// Rust: `vasubu_vv(vd, vs1, vs2, vm)`
10336///
10337/// # Arguments
10338/// - `vd` — Vector register operand.
10339/// - `vs1` — Vector register operand.
10340/// - `vs2` — Vector register operand.
10341/// - `vm` — Vector mask control.
10342pub trait VasubuVvEmitter<T0, T1, T2, T3> {
10343 fn vasubu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10344}
10345
10346/// RISC-V `vasubu.vx` instruction.
10347///
10348/// # Forms
10349/// Assembly: `vasubu.vx vm, vs2, xs1, vd`
10350/// Rust: `vasubu_vx(vd, vs2, rs1, vm)`
10351///
10352/// # Arguments
10353/// - `vd` — Vector register operand.
10354/// - `vs2` — Vector register operand.
10355/// - `rs1` — Source register.
10356/// - `vm` — Vector mask control.
10357pub trait VasubuVxEmitter<T0, T1, T2, T3> {
10358 fn vasubu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10359}
10360
10361/// RISC-V `vbrev8.v` instruction.
10362///
10363/// # Forms
10364/// Assembly: `vbrev8.v vm, vs2, vd`
10365/// Rust: `vbrev8_v(vd, vs2, vm)`
10366///
10367/// # Arguments
10368/// - `vd` — Vector register operand.
10369/// - `vs2` — Vector register operand.
10370/// - `vm` — Vector mask control.
10371pub trait Vbrev8VEmitter<T0, T1, T2> {
10372 fn vbrev8_v(&mut self, vd: T0, vs2: T1, vm: T2);
10373}
10374
10375/// RISC-V `vbrev.v` instruction.
10376///
10377/// # Forms
10378/// Assembly: `vbrev.v vm, vs2, vd`
10379/// Rust: `vbrev_v(vd, vs2, vm)`
10380///
10381/// # Arguments
10382/// - `vd` — Vector register operand.
10383/// - `vs2` — Vector register operand.
10384/// - `vm` — Vector mask control.
10385pub trait VbrevVEmitter<T0, T1, T2> {
10386 fn vbrev_v(&mut self, vd: T0, vs2: T1, vm: T2);
10387}
10388
10389/// RISC-V `vclmul.vv` instruction.
10390///
10391/// # Forms
10392/// Assembly: `vclmul.vv vm, vs2, vs1, vd`
10393/// Rust: `vclmul_vv(vd, vs1, vs2, vm)`
10394///
10395/// # Arguments
10396/// - `vd` — Vector register operand.
10397/// - `vs1` — Vector register operand.
10398/// - `vs2` — Vector register operand.
10399/// - `vm` — Vector mask control.
10400pub trait VclmulVvEmitter<T0, T1, T2, T3> {
10401 fn vclmul_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10402}
10403
10404/// RISC-V `vclmul.vx` instruction.
10405///
10406/// # Forms
10407/// Assembly: `vclmul.vx vm, vs2, xs1, vd`
10408/// Rust: `vclmul_vx(vd, vs2, rs1, vm)`
10409///
10410/// # Arguments
10411/// - `vd` — Vector register operand.
10412/// - `vs2` — Vector register operand.
10413/// - `rs1` — Source register.
10414/// - `vm` — Vector mask control.
10415pub trait VclmulVxEmitter<T0, T1, T2, T3> {
10416 fn vclmul_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10417}
10418
10419/// RISC-V `vclmulh.vv` instruction.
10420///
10421/// # Forms
10422/// Assembly: `vclmulh.vv vm, vs2, vs1, vd`
10423/// Rust: `vclmulh_vv(vd, vs1, vs2, vm)`
10424///
10425/// # Arguments
10426/// - `vd` — Vector register operand.
10427/// - `vs1` — Vector register operand.
10428/// - `vs2` — Vector register operand.
10429/// - `vm` — Vector mask control.
10430pub trait VclmulhVvEmitter<T0, T1, T2, T3> {
10431 fn vclmulh_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10432}
10433
10434/// RISC-V `vclmulh.vx` instruction.
10435///
10436/// # Forms
10437/// Assembly: `vclmulh.vx vm, vs2, xs1, vd`
10438/// Rust: `vclmulh_vx(vd, vs2, rs1, vm)`
10439///
10440/// # Arguments
10441/// - `vd` — Vector register operand.
10442/// - `vs2` — Vector register operand.
10443/// - `rs1` — Source register.
10444/// - `vm` — Vector mask control.
10445pub trait VclmulhVxEmitter<T0, T1, T2, T3> {
10446 fn vclmulh_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10447}
10448
10449/// RISC-V `vclz.v` instruction.
10450///
10451/// # Forms
10452/// Assembly: `vclz.v vm, vs2, vd`
10453/// Rust: `vclz_v(vd, vs2, vm)`
10454///
10455/// # Arguments
10456/// - `vd` — Vector register operand.
10457/// - `vs2` — Vector register operand.
10458/// - `vm` — Vector mask control.
10459pub trait VclzVEmitter<T0, T1, T2> {
10460 fn vclz_v(&mut self, vd: T0, vs2: T1, vm: T2);
10461}
10462
10463/// RISC-V `vcompress.vm` instruction.
10464///
10465/// # Forms
10466/// Assembly: `vcompress.vm vs2, vs1, vd`
10467/// Rust: `vcompress_vm(vd, vs1, vs2)`
10468///
10469/// # Arguments
10470/// - `vd` — Vector register operand.
10471/// - `vs1` — Vector register operand.
10472/// - `vs2` — Vector register operand.
10473pub trait VcompressVmEmitter<T0, T1, T2> {
10474 fn vcompress_vm(&mut self, vd: T0, vs1: T1, vs2: T2);
10475}
10476
10477/// RISC-V `vcpop.m` instruction.
10478///
10479/// # Forms
10480/// Assembly: `vcpop.m vm, vs2, xd`
10481/// Rust: `vcpop_m(rd, vs2, vm)`
10482///
10483/// # Arguments
10484/// - `rd` — Destination register.
10485/// - `vs2` — Vector register operand.
10486/// - `vm` — Vector mask control.
10487pub trait VcpopMEmitter<T0, T1, T2> {
10488 fn vcpop_m(&mut self, rd: T0, vs2: T1, vm: T2);
10489}
10490
10491/// RISC-V `vcpop.v` instruction.
10492///
10493/// # Forms
10494/// Assembly: `vcpop.v vm, vs2, vd`
10495/// Rust: `vcpop_v(vd, vs2, vm)`
10496///
10497/// # Arguments
10498/// - `vd` — Vector register operand.
10499/// - `vs2` — Vector register operand.
10500/// - `vm` — Vector mask control.
10501pub trait VcpopVEmitter<T0, T1, T2> {
10502 fn vcpop_v(&mut self, vd: T0, vs2: T1, vm: T2);
10503}
10504
10505/// RISC-V `vctz.v` instruction.
10506///
10507/// # Forms
10508/// Assembly: `vctz.v vm, vs2, vd`
10509/// Rust: `vctz_v(vd, vs2, vm)`
10510///
10511/// # Arguments
10512/// - `vd` — Vector register operand.
10513/// - `vs2` — Vector register operand.
10514/// - `vm` — Vector mask control.
10515pub trait VctzVEmitter<T0, T1, T2> {
10516 fn vctz_v(&mut self, vd: T0, vs2: T1, vm: T2);
10517}
10518
10519/// RISC-V `vdiv.vv` instruction.
10520///
10521/// # Forms
10522/// Assembly: `vdiv.vv vm, vs2, vs1, vd`
10523/// Rust: `vdiv_vv(vd, vs1, vs2, vm)`
10524///
10525/// # Arguments
10526/// - `vd` — Vector register operand.
10527/// - `vs1` — Vector register operand.
10528/// - `vs2` — Vector register operand.
10529/// - `vm` — Vector mask control.
10530pub trait VdivVvEmitter<T0, T1, T2, T3> {
10531 fn vdiv_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10532}
10533
10534/// RISC-V `vdiv.vx` instruction.
10535///
10536/// # Forms
10537/// Assembly: `vdiv.vx vm, vs2, xs1, vd`
10538/// Rust: `vdiv_vx(vd, vs2, rs1, vm)`
10539///
10540/// # Arguments
10541/// - `vd` — Vector register operand.
10542/// - `vs2` — Vector register operand.
10543/// - `rs1` — Source register.
10544/// - `vm` — Vector mask control.
10545pub trait VdivVxEmitter<T0, T1, T2, T3> {
10546 fn vdiv_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10547}
10548
10549/// RISC-V `vdivu.vv` instruction.
10550///
10551/// # Forms
10552/// Assembly: `vdivu.vv vm, vs2, vs1, vd`
10553/// Rust: `vdivu_vv(vd, vs1, vs2, vm)`
10554///
10555/// # Arguments
10556/// - `vd` — Vector register operand.
10557/// - `vs1` — Vector register operand.
10558/// - `vs2` — Vector register operand.
10559/// - `vm` — Vector mask control.
10560pub trait VdivuVvEmitter<T0, T1, T2, T3> {
10561 fn vdivu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10562}
10563
10564/// RISC-V `vdivu.vx` instruction.
10565///
10566/// # Forms
10567/// Assembly: `vdivu.vx vm, vs2, xs1, vd`
10568/// Rust: `vdivu_vx(vd, vs2, rs1, vm)`
10569///
10570/// # Arguments
10571/// - `vd` — Vector register operand.
10572/// - `vs2` — Vector register operand.
10573/// - `rs1` — Source register.
10574/// - `vm` — Vector mask control.
10575pub trait VdivuVxEmitter<T0, T1, T2, T3> {
10576 fn vdivu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10577}
10578
10579/// RISC-V `vfadd.vf` instruction.
10580///
10581/// # Forms
10582/// Assembly: `vfadd.vf vm, vs2, xs1, vd`
10583/// Rust: `vfadd_vf(vd, vs2, rs1, vm)`
10584///
10585/// # Arguments
10586/// - `vd` — Vector register operand.
10587/// - `vs2` — Vector register operand.
10588/// - `rs1` — Source register.
10589/// - `vm` — Vector mask control.
10590pub trait VfaddVfEmitter<T0, T1, T2, T3> {
10591 fn vfadd_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10592}
10593
10594/// RISC-V `vfadd.vv` instruction.
10595///
10596/// # Forms
10597/// Assembly: `vfadd.vv vm, vs2, vs1, vd`
10598/// Rust: `vfadd_vv(vd, vs1, vs2, vm)`
10599///
10600/// # Arguments
10601/// - `vd` — Vector register operand.
10602/// - `vs1` — Vector register operand.
10603/// - `vs2` — Vector register operand.
10604/// - `vm` — Vector mask control.
10605pub trait VfaddVvEmitter<T0, T1, T2, T3> {
10606 fn vfadd_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10607}
10608
10609/// RISC-V `vfclass.v` instruction.
10610///
10611/// # Forms
10612/// Assembly: `vfclass.v vm, vs2, vd`
10613/// Rust: `vfclass_v(vd, vs2, vm)`
10614///
10615/// # Arguments
10616/// - `vd` — Vector register operand.
10617/// - `vs2` — Vector register operand.
10618/// - `vm` — Vector mask control.
10619pub trait VfclassVEmitter<T0, T1, T2> {
10620 fn vfclass_v(&mut self, vd: T0, vs2: T1, vm: T2);
10621}
10622
10623/// RISC-V `vfcvt.f.x.v` instruction.
10624///
10625/// # Forms
10626/// Assembly: `vfcvt.f.x.v vm, vs2, vd`
10627/// Rust: `vfcvt_f_x_v(vd, vs2, vm)`
10628///
10629/// # Arguments
10630/// - `vd` — Vector register operand.
10631/// - `vs2` — Vector register operand.
10632/// - `vm` — Vector mask control.
10633pub trait VfcvtFXVEmitter<T0, T1, T2> {
10634 fn vfcvt_f_x_v(&mut self, vd: T0, vs2: T1, vm: T2);
10635}
10636
10637/// RISC-V `vfcvt.f.xu.v` instruction.
10638///
10639/// # Forms
10640/// Assembly: `vfcvt.f.xu.v vm, vs2, vd`
10641/// Rust: `vfcvt_f_xu_v(vd, vs2, vm)`
10642///
10643/// # Arguments
10644/// - `vd` — Vector register operand.
10645/// - `vs2` — Vector register operand.
10646/// - `vm` — Vector mask control.
10647pub trait VfcvtFXuVEmitter<T0, T1, T2> {
10648 fn vfcvt_f_xu_v(&mut self, vd: T0, vs2: T1, vm: T2);
10649}
10650
10651/// RISC-V `vfcvt.rtz.x.f.v` instruction.
10652///
10653/// # Forms
10654/// Assembly: `vfcvt.rtz.x.f.v vm, vs2, vd`
10655/// Rust: `vfcvt_rtz_x_f_v(vd, vs2, vm)`
10656///
10657/// # Arguments
10658/// - `vd` — Vector register operand.
10659/// - `vs2` — Vector register operand.
10660/// - `vm` — Vector mask control.
10661pub trait VfcvtRtzXFVEmitter<T0, T1, T2> {
10662 fn vfcvt_rtz_x_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
10663}
10664
10665/// RISC-V `vfcvt.rtz.xu.f.v` instruction.
10666///
10667/// # Forms
10668/// Assembly: `vfcvt.rtz.xu.f.v vm, vs2, vd`
10669/// Rust: `vfcvt_rtz_xu_f_v(vd, vs2, vm)`
10670///
10671/// # Arguments
10672/// - `vd` — Vector register operand.
10673/// - `vs2` — Vector register operand.
10674/// - `vm` — Vector mask control.
10675pub trait VfcvtRtzXuFVEmitter<T0, T1, T2> {
10676 fn vfcvt_rtz_xu_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
10677}
10678
10679/// RISC-V `vfcvt.x.f.v` instruction.
10680///
10681/// # Forms
10682/// Assembly: `vfcvt.x.f.v vm, vs2, vd`
10683/// Rust: `vfcvt_x_f_v(vd, vs2, vm)`
10684///
10685/// # Arguments
10686/// - `vd` — Vector register operand.
10687/// - `vs2` — Vector register operand.
10688/// - `vm` — Vector mask control.
10689pub trait VfcvtXFVEmitter<T0, T1, T2> {
10690 fn vfcvt_x_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
10691}
10692
10693/// RISC-V `vfcvt.xu.f.v` instruction.
10694///
10695/// # Forms
10696/// Assembly: `vfcvt.xu.f.v vm, vs2, vd`
10697/// Rust: `vfcvt_xu_f_v(vd, vs2, vm)`
10698///
10699/// # Arguments
10700/// - `vd` — Vector register operand.
10701/// - `vs2` — Vector register operand.
10702/// - `vm` — Vector mask control.
10703pub trait VfcvtXuFVEmitter<T0, T1, T2> {
10704 fn vfcvt_xu_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
10705}
10706
10707/// RISC-V `vfdiv.vf` instruction.
10708///
10709/// # Forms
10710/// Assembly: `vfdiv.vf vm, vs2, xs1, vd`
10711/// Rust: `vfdiv_vf(vd, vs2, rs1, vm)`
10712///
10713/// # Arguments
10714/// - `vd` — Vector register operand.
10715/// - `vs2` — Vector register operand.
10716/// - `rs1` — Source register.
10717/// - `vm` — Vector mask control.
10718pub trait VfdivVfEmitter<T0, T1, T2, T3> {
10719 fn vfdiv_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10720}
10721
10722/// RISC-V `vfdiv.vv` instruction.
10723///
10724/// # Forms
10725/// Assembly: `vfdiv.vv vm, vs2, vs1, vd`
10726/// Rust: `vfdiv_vv(vd, vs1, vs2, vm)`
10727///
10728/// # Arguments
10729/// - `vd` — Vector register operand.
10730/// - `vs1` — Vector register operand.
10731/// - `vs2` — Vector register operand.
10732/// - `vm` — Vector mask control.
10733pub trait VfdivVvEmitter<T0, T1, T2, T3> {
10734 fn vfdiv_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10735}
10736
10737/// RISC-V `vfirst.m` instruction.
10738///
10739/// # Forms
10740/// Assembly: `vfirst.m vm, vs2, xd`
10741/// Rust: `vfirst_m(rd, vs2, vm)`
10742///
10743/// # Arguments
10744/// - `rd` — Destination register.
10745/// - `vs2` — Vector register operand.
10746/// - `vm` — Vector mask control.
10747pub trait VfirstMEmitter<T0, T1, T2> {
10748 fn vfirst_m(&mut self, rd: T0, vs2: T1, vm: T2);
10749}
10750
10751/// RISC-V `vfmacc.vf` instruction.
10752///
10753/// # Forms
10754/// Assembly: `vfmacc.vf vm, vs2, xs1, vd`
10755/// Rust: `vfmacc_vf(vd, vs2, rs1, vm)`
10756///
10757/// # Arguments
10758/// - `vd` — Vector register operand.
10759/// - `vs2` — Vector register operand.
10760/// - `rs1` — Source register.
10761/// - `vm` — Vector mask control.
10762pub trait VfmaccVfEmitter<T0, T1, T2, T3> {
10763 fn vfmacc_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10764}
10765
10766/// RISC-V `vfmacc.vv` instruction.
10767///
10768/// # Forms
10769/// Assembly: `vfmacc.vv vm, vs2, vs1, vd`
10770/// Rust: `vfmacc_vv(vd, vs1, vs2, vm)`
10771///
10772/// # Arguments
10773/// - `vd` — Vector register operand.
10774/// - `vs1` — Vector register operand.
10775/// - `vs2` — Vector register operand.
10776/// - `vm` — Vector mask control.
10777pub trait VfmaccVvEmitter<T0, T1, T2, T3> {
10778 fn vfmacc_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10779}
10780
10781/// RISC-V `vfmadd.vf` instruction.
10782///
10783/// # Forms
10784/// Assembly: `vfmadd.vf vm, vs2, xs1, vd`
10785/// Rust: `vfmadd_vf(vd, vs2, rs1, vm)`
10786///
10787/// # Arguments
10788/// - `vd` — Vector register operand.
10789/// - `vs2` — Vector register operand.
10790/// - `rs1` — Source register.
10791/// - `vm` — Vector mask control.
10792pub trait VfmaddVfEmitter<T0, T1, T2, T3> {
10793 fn vfmadd_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10794}
10795
10796/// RISC-V `vfmadd.vv` instruction.
10797///
10798/// # Forms
10799/// Assembly: `vfmadd.vv vm, vs2, vs1, vd`
10800/// Rust: `vfmadd_vv(vd, vs1, vs2, vm)`
10801///
10802/// # Arguments
10803/// - `vd` — Vector register operand.
10804/// - `vs1` — Vector register operand.
10805/// - `vs2` — Vector register operand.
10806/// - `vm` — Vector mask control.
10807pub trait VfmaddVvEmitter<T0, T1, T2, T3> {
10808 fn vfmadd_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10809}
10810
10811/// RISC-V `vfmax.vf` instruction.
10812///
10813/// # Forms
10814/// Assembly: `vfmax.vf vm, vs2, xs1, vd`
10815/// Rust: `vfmax_vf(vd, vs2, rs1, vm)`
10816///
10817/// # Arguments
10818/// - `vd` — Vector register operand.
10819/// - `vs2` — Vector register operand.
10820/// - `rs1` — Source register.
10821/// - `vm` — Vector mask control.
10822pub trait VfmaxVfEmitter<T0, T1, T2, T3> {
10823 fn vfmax_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10824}
10825
10826/// RISC-V `vfmax.vv` instruction.
10827///
10828/// # Forms
10829/// Assembly: `vfmax.vv vm, vs2, vs1, vd`
10830/// Rust: `vfmax_vv(vd, vs1, vs2, vm)`
10831///
10832/// # Arguments
10833/// - `vd` — Vector register operand.
10834/// - `vs1` — Vector register operand.
10835/// - `vs2` — Vector register operand.
10836/// - `vm` — Vector mask control.
10837pub trait VfmaxVvEmitter<T0, T1, T2, T3> {
10838 fn vfmax_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10839}
10840
10841/// RISC-V `vfmerge.vfm` instruction.
10842///
10843/// # Forms
10844/// Assembly: `vfmerge.vfm vs2, xs1, vd`
10845/// Rust: `vfmerge_vfm(vd, rs1, vs2)`
10846///
10847/// # Arguments
10848/// - `vd` — Vector register operand.
10849/// - `rs1` — Source register.
10850/// - `vs2` — Vector register operand.
10851pub trait VfmergeVfmEmitter<T0, T1, T2> {
10852 fn vfmerge_vfm(&mut self, vd: T0, rs1: T1, vs2: T2);
10853}
10854
10855/// RISC-V `vfmin.vf` instruction.
10856///
10857/// # Forms
10858/// Assembly: `vfmin.vf vm, vs2, xs1, vd`
10859/// Rust: `vfmin_vf(vd, vs2, rs1, vm)`
10860///
10861/// # Arguments
10862/// - `vd` — Vector register operand.
10863/// - `vs2` — Vector register operand.
10864/// - `rs1` — Source register.
10865/// - `vm` — Vector mask control.
10866pub trait VfminVfEmitter<T0, T1, T2, T3> {
10867 fn vfmin_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10868}
10869
10870/// RISC-V `vfmin.vv` instruction.
10871///
10872/// # Forms
10873/// Assembly: `vfmin.vv vm, vs2, vs1, vd`
10874/// Rust: `vfmin_vv(vd, vs1, vs2, vm)`
10875///
10876/// # Arguments
10877/// - `vd` — Vector register operand.
10878/// - `vs1` — Vector register operand.
10879/// - `vs2` — Vector register operand.
10880/// - `vm` — Vector mask control.
10881pub trait VfminVvEmitter<T0, T1, T2, T3> {
10882 fn vfmin_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10883}
10884
10885/// RISC-V `vfmsac.vf` instruction.
10886///
10887/// # Forms
10888/// Assembly: `vfmsac.vf vm, vs2, xs1, vd`
10889/// Rust: `vfmsac_vf(vd, vs2, rs1, vm)`
10890///
10891/// # Arguments
10892/// - `vd` — Vector register operand.
10893/// - `vs2` — Vector register operand.
10894/// - `rs1` — Source register.
10895/// - `vm` — Vector mask control.
10896pub trait VfmsacVfEmitter<T0, T1, T2, T3> {
10897 fn vfmsac_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10898}
10899
10900/// RISC-V `vfmsac.vv` instruction.
10901///
10902/// # Forms
10903/// Assembly: `vfmsac.vv vm, vs2, vs1, vd`
10904/// Rust: `vfmsac_vv(vd, vs1, vs2, vm)`
10905///
10906/// # Arguments
10907/// - `vd` — Vector register operand.
10908/// - `vs1` — Vector register operand.
10909/// - `vs2` — Vector register operand.
10910/// - `vm` — Vector mask control.
10911pub trait VfmsacVvEmitter<T0, T1, T2, T3> {
10912 fn vfmsac_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10913}
10914
10915/// RISC-V `vfmsub.vf` instruction.
10916///
10917/// # Forms
10918/// Assembly: `vfmsub.vf vm, vs2, xs1, vd`
10919/// Rust: `vfmsub_vf(vd, vs2, rs1, vm)`
10920///
10921/// # Arguments
10922/// - `vd` — Vector register operand.
10923/// - `vs2` — Vector register operand.
10924/// - `rs1` — Source register.
10925/// - `vm` — Vector mask control.
10926pub trait VfmsubVfEmitter<T0, T1, T2, T3> {
10927 fn vfmsub_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10928}
10929
10930/// RISC-V `vfmsub.vv` instruction.
10931///
10932/// # Forms
10933/// Assembly: `vfmsub.vv vm, vs2, vs1, vd`
10934/// Rust: `vfmsub_vv(vd, vs1, vs2, vm)`
10935///
10936/// # Arguments
10937/// - `vd` — Vector register operand.
10938/// - `vs1` — Vector register operand.
10939/// - `vs2` — Vector register operand.
10940/// - `vm` — Vector mask control.
10941pub trait VfmsubVvEmitter<T0, T1, T2, T3> {
10942 fn vfmsub_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10943}
10944
10945/// RISC-V `vfmul.vf` instruction.
10946///
10947/// # Forms
10948/// Assembly: `vfmul.vf vm, vs2, xs1, vd`
10949/// Rust: `vfmul_vf(vd, vs2, rs1, vm)`
10950///
10951/// # Arguments
10952/// - `vd` — Vector register operand.
10953/// - `vs2` — Vector register operand.
10954/// - `rs1` — Source register.
10955/// - `vm` — Vector mask control.
10956pub trait VfmulVfEmitter<T0, T1, T2, T3> {
10957 fn vfmul_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
10958}
10959
10960/// RISC-V `vfmul.vv` instruction.
10961///
10962/// # Forms
10963/// Assembly: `vfmul.vv vm, vs2, vs1, vd`
10964/// Rust: `vfmul_vv(vd, vs1, vs2, vm)`
10965///
10966/// # Arguments
10967/// - `vd` — Vector register operand.
10968/// - `vs1` — Vector register operand.
10969/// - `vs2` — Vector register operand.
10970/// - `vm` — Vector mask control.
10971pub trait VfmulVvEmitter<T0, T1, T2, T3> {
10972 fn vfmul_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
10973}
10974
10975/// RISC-V `vfmv.f.s` instruction.
10976///
10977/// # Forms
10978/// Assembly: `vfmv.f.s vs2, xd`
10979/// Rust: `vfmv_f_s(rd, vs2)`
10980///
10981/// # Arguments
10982/// - `rd` — Destination register.
10983/// - `vs2` — Vector register operand.
10984pub trait VfmvFSEmitter<T0, T1> {
10985 fn vfmv_f_s(&mut self, rd: T0, vs2: T1);
10986}
10987
10988/// RISC-V `vfmv.s.f` instruction.
10989///
10990/// # Forms
10991/// Assembly: `vfmv.s.f xs1, vd`
10992/// Rust: `vfmv_s_f(vd, rs1)`
10993///
10994/// # Arguments
10995/// - `vd` — Vector register operand.
10996/// - `rs1` — Source register.
10997pub trait VfmvSFEmitter<T0, T1> {
10998 fn vfmv_s_f(&mut self, vd: T0, rs1: T1);
10999}
11000
11001/// RISC-V `vfmv.v.f` instruction.
11002///
11003/// # Forms
11004/// Assembly: `vfmv.v.f xs1, vd`
11005/// Rust: `vfmv_v_f(vd, rs1)`
11006///
11007/// # Arguments
11008/// - `vd` — Vector register operand.
11009/// - `rs1` — Source register.
11010pub trait VfmvVFEmitter<T0, T1> {
11011 fn vfmv_v_f(&mut self, vd: T0, rs1: T1);
11012}
11013
11014/// RISC-V `vfncvt.f.f.w` instruction.
11015///
11016/// # Forms
11017/// Assembly: `vfncvt.f.f.w vm, vs2, vd`
11018/// Rust: `vfncvt_f_f_w(vd, vs2, vm)`
11019///
11020/// # Arguments
11021/// - `vd` — Vector register operand.
11022/// - `vs2` — Vector register operand.
11023/// - `vm` — Vector mask control.
11024pub trait VfncvtFFWEmitter<T0, T1, T2> {
11025 fn vfncvt_f_f_w(&mut self, vd: T0, vs2: T1, vm: T2);
11026}
11027
11028/// RISC-V `vfncvt.f.x.w` instruction.
11029///
11030/// # Forms
11031/// Assembly: `vfncvt.f.x.w vm, vs2, vd`
11032/// Rust: `vfncvt_f_x_w(vd, vs2, vm)`
11033///
11034/// # Arguments
11035/// - `vd` — Vector register operand.
11036/// - `vs2` — Vector register operand.
11037/// - `vm` — Vector mask control.
11038pub trait VfncvtFXWEmitter<T0, T1, T2> {
11039 fn vfncvt_f_x_w(&mut self, vd: T0, vs2: T1, vm: T2);
11040}
11041
11042/// RISC-V `vfncvt.f.xu.w` instruction.
11043///
11044/// # Forms
11045/// Assembly: `vfncvt.f.xu.w vm, vs2, vd`
11046/// Rust: `vfncvt_f_xu_w(vd, vs2, vm)`
11047///
11048/// # Arguments
11049/// - `vd` — Vector register operand.
11050/// - `vs2` — Vector register operand.
11051/// - `vm` — Vector mask control.
11052pub trait VfncvtFXuWEmitter<T0, T1, T2> {
11053 fn vfncvt_f_xu_w(&mut self, vd: T0, vs2: T1, vm: T2);
11054}
11055
11056/// RISC-V `vfncvt.rod.f.f.w` instruction.
11057///
11058/// # Forms
11059/// Assembly: `vfncvt.rod.f.f.w vm, vs2, vd`
11060/// Rust: `vfncvt_rod_f_f_w(vd, vs2, vm)`
11061///
11062/// # Arguments
11063/// - `vd` — Vector register operand.
11064/// - `vs2` — Vector register operand.
11065/// - `vm` — Vector mask control.
11066pub trait VfncvtRodFFWEmitter<T0, T1, T2> {
11067 fn vfncvt_rod_f_f_w(&mut self, vd: T0, vs2: T1, vm: T2);
11068}
11069
11070/// RISC-V `vfncvt.rtz.x.f.w` instruction.
11071///
11072/// # Forms
11073/// Assembly: `vfncvt.rtz.x.f.w vm, vs2, vd`
11074/// Rust: `vfncvt_rtz_x_f_w(vd, vs2, vm)`
11075///
11076/// # Arguments
11077/// - `vd` — Vector register operand.
11078/// - `vs2` — Vector register operand.
11079/// - `vm` — Vector mask control.
11080pub trait VfncvtRtzXFWEmitter<T0, T1, T2> {
11081 fn vfncvt_rtz_x_f_w(&mut self, vd: T0, vs2: T1, vm: T2);
11082}
11083
11084/// RISC-V `vfncvt.rtz.xu.f.w` instruction.
11085///
11086/// # Forms
11087/// Assembly: `vfncvt.rtz.xu.f.w vm, vs2, vd`
11088/// Rust: `vfncvt_rtz_xu_f_w(vd, vs2, vm)`
11089///
11090/// # Arguments
11091/// - `vd` — Vector register operand.
11092/// - `vs2` — Vector register operand.
11093/// - `vm` — Vector mask control.
11094pub trait VfncvtRtzXuFWEmitter<T0, T1, T2> {
11095 fn vfncvt_rtz_xu_f_w(&mut self, vd: T0, vs2: T1, vm: T2);
11096}
11097
11098/// RISC-V `vfncvt.x.f.w` instruction.
11099///
11100/// # Forms
11101/// Assembly: `vfncvt.x.f.w vm, vs2, vd`
11102/// Rust: `vfncvt_x_f_w(vd, vs2, vm)`
11103///
11104/// # Arguments
11105/// - `vd` — Vector register operand.
11106/// - `vs2` — Vector register operand.
11107/// - `vm` — Vector mask control.
11108pub trait VfncvtXFWEmitter<T0, T1, T2> {
11109 fn vfncvt_x_f_w(&mut self, vd: T0, vs2: T1, vm: T2);
11110}
11111
11112/// RISC-V `vfncvt.xu.f.w` instruction.
11113///
11114/// # Forms
11115/// Assembly: `vfncvt.xu.f.w vm, vs2, vd`
11116/// Rust: `vfncvt_xu_f_w(vd, vs2, vm)`
11117///
11118/// # Arguments
11119/// - `vd` — Vector register operand.
11120/// - `vs2` — Vector register operand.
11121/// - `vm` — Vector mask control.
11122pub trait VfncvtXuFWEmitter<T0, T1, T2> {
11123 fn vfncvt_xu_f_w(&mut self, vd: T0, vs2: T1, vm: T2);
11124}
11125
11126/// RISC-V `vfncvtbf16.f.f.w` instruction.
11127///
11128/// # Forms
11129/// Assembly: `vfncvtbf16.f.f.w vm, vs2, vd`
11130/// Rust: `vfncvtbf16_f_f_w(vd, vs2, vm)`
11131///
11132/// # Arguments
11133/// - `vd` — Vector register operand.
11134/// - `vs2` — Vector register operand.
11135/// - `vm` — Vector mask control.
11136pub trait Vfncvtbf16FFWEmitter<T0, T1, T2> {
11137 fn vfncvtbf16_f_f_w(&mut self, vd: T0, vs2: T1, vm: T2);
11138}
11139
11140/// RISC-V `vfnmacc.vf` instruction.
11141///
11142/// # Forms
11143/// Assembly: `vfnmacc.vf vm, vs2, xs1, vd`
11144/// Rust: `vfnmacc_vf(vd, vs2, rs1, vm)`
11145///
11146/// # Arguments
11147/// - `vd` — Vector register operand.
11148/// - `vs2` — Vector register operand.
11149/// - `rs1` — Source register.
11150/// - `vm` — Vector mask control.
11151pub trait VfnmaccVfEmitter<T0, T1, T2, T3> {
11152 fn vfnmacc_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11153}
11154
11155/// RISC-V `vfnmacc.vv` instruction.
11156///
11157/// # Forms
11158/// Assembly: `vfnmacc.vv vm, vs2, vs1, vd`
11159/// Rust: `vfnmacc_vv(vd, vs1, vs2, vm)`
11160///
11161/// # Arguments
11162/// - `vd` — Vector register operand.
11163/// - `vs1` — Vector register operand.
11164/// - `vs2` — Vector register operand.
11165/// - `vm` — Vector mask control.
11166pub trait VfnmaccVvEmitter<T0, T1, T2, T3> {
11167 fn vfnmacc_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11168}
11169
11170/// RISC-V `vfnmadd.vf` instruction.
11171///
11172/// # Forms
11173/// Assembly: `vfnmadd.vf vm, vs2, xs1, vd`
11174/// Rust: `vfnmadd_vf(vd, vs2, rs1, vm)`
11175///
11176/// # Arguments
11177/// - `vd` — Vector register operand.
11178/// - `vs2` — Vector register operand.
11179/// - `rs1` — Source register.
11180/// - `vm` — Vector mask control.
11181pub trait VfnmaddVfEmitter<T0, T1, T2, T3> {
11182 fn vfnmadd_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11183}
11184
11185/// RISC-V `vfnmadd.vv` instruction.
11186///
11187/// # Forms
11188/// Assembly: `vfnmadd.vv vm, vs2, vs1, vd`
11189/// Rust: `vfnmadd_vv(vd, vs1, vs2, vm)`
11190///
11191/// # Arguments
11192/// - `vd` — Vector register operand.
11193/// - `vs1` — Vector register operand.
11194/// - `vs2` — Vector register operand.
11195/// - `vm` — Vector mask control.
11196pub trait VfnmaddVvEmitter<T0, T1, T2, T3> {
11197 fn vfnmadd_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11198}
11199
11200/// RISC-V `vfnmsac.vf` instruction.
11201///
11202/// # Forms
11203/// Assembly: `vfnmsac.vf vm, vs2, xs1, vd`
11204/// Rust: `vfnmsac_vf(vd, vs2, rs1, vm)`
11205///
11206/// # Arguments
11207/// - `vd` — Vector register operand.
11208/// - `vs2` — Vector register operand.
11209/// - `rs1` — Source register.
11210/// - `vm` — Vector mask control.
11211pub trait VfnmsacVfEmitter<T0, T1, T2, T3> {
11212 fn vfnmsac_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11213}
11214
11215/// RISC-V `vfnmsac.vv` instruction.
11216///
11217/// # Forms
11218/// Assembly: `vfnmsac.vv vm, vs2, vs1, vd`
11219/// Rust: `vfnmsac_vv(vd, vs1, vs2, vm)`
11220///
11221/// # Arguments
11222/// - `vd` — Vector register operand.
11223/// - `vs1` — Vector register operand.
11224/// - `vs2` — Vector register operand.
11225/// - `vm` — Vector mask control.
11226pub trait VfnmsacVvEmitter<T0, T1, T2, T3> {
11227 fn vfnmsac_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11228}
11229
11230/// RISC-V `vfnmsub.vf` instruction.
11231///
11232/// # Forms
11233/// Assembly: `vfnmsub.vf vm, vs2, xs1, vd`
11234/// Rust: `vfnmsub_vf(vd, vs2, rs1, vm)`
11235///
11236/// # Arguments
11237/// - `vd` — Vector register operand.
11238/// - `vs2` — Vector register operand.
11239/// - `rs1` — Source register.
11240/// - `vm` — Vector mask control.
11241pub trait VfnmsubVfEmitter<T0, T1, T2, T3> {
11242 fn vfnmsub_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11243}
11244
11245/// RISC-V `vfnmsub.vv` instruction.
11246///
11247/// # Forms
11248/// Assembly: `vfnmsub.vv vm, vs2, vs1, vd`
11249/// Rust: `vfnmsub_vv(vd, vs1, vs2, vm)`
11250///
11251/// # Arguments
11252/// - `vd` — Vector register operand.
11253/// - `vs1` — Vector register operand.
11254/// - `vs2` — Vector register operand.
11255/// - `vm` — Vector mask control.
11256pub trait VfnmsubVvEmitter<T0, T1, T2, T3> {
11257 fn vfnmsub_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11258}
11259
11260/// RISC-V `vfrdiv.vf` instruction.
11261///
11262/// # Forms
11263/// Assembly: `vfrdiv.vf vm, vs2, xs1, vd`
11264/// Rust: `vfrdiv_vf(vd, vs2, rs1, vm)`
11265///
11266/// # Arguments
11267/// - `vd` — Vector register operand.
11268/// - `vs2` — Vector register operand.
11269/// - `rs1` — Source register.
11270/// - `vm` — Vector mask control.
11271pub trait VfrdivVfEmitter<T0, T1, T2, T3> {
11272 fn vfrdiv_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11273}
11274
11275/// RISC-V `vfrec7.v` instruction.
11276///
11277/// # Forms
11278/// Assembly: `vfrec7.v vm, vs2, vd`
11279/// Rust: `vfrec7_v(vd, vs2, vm)`
11280///
11281/// # Arguments
11282/// - `vd` — Vector register operand.
11283/// - `vs2` — Vector register operand.
11284/// - `vm` — Vector mask control.
11285pub trait Vfrec7VEmitter<T0, T1, T2> {
11286 fn vfrec7_v(&mut self, vd: T0, vs2: T1, vm: T2);
11287}
11288
11289/// RISC-V `vfredmax.vs` instruction.
11290///
11291/// # Forms
11292/// Assembly: `vfredmax.vs vm, vs2, vs1, vd`
11293/// Rust: `vfredmax_vs(vd, vs1, vs2, vm)`
11294///
11295/// # Arguments
11296/// - `vd` — Vector register operand.
11297/// - `vs1` — Vector register operand.
11298/// - `vs2` — Vector register operand.
11299/// - `vm` — Vector mask control.
11300pub trait VfredmaxVsEmitter<T0, T1, T2, T3> {
11301 fn vfredmax_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11302}
11303
11304/// RISC-V `vfredmin.vs` instruction.
11305///
11306/// # Forms
11307/// Assembly: `vfredmin.vs vm, vs2, vs1, vd`
11308/// Rust: `vfredmin_vs(vd, vs1, vs2, vm)`
11309///
11310/// # Arguments
11311/// - `vd` — Vector register operand.
11312/// - `vs1` — Vector register operand.
11313/// - `vs2` — Vector register operand.
11314/// - `vm` — Vector mask control.
11315pub trait VfredminVsEmitter<T0, T1, T2, T3> {
11316 fn vfredmin_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11317}
11318
11319/// RISC-V `vfredosum.vs` instruction.
11320///
11321/// # Forms
11322/// Assembly: `vfredosum.vs vm, vs2, vs1, vd`
11323/// Rust: `vfredosum_vs(vd, vs1, vs2, vm)`
11324///
11325/// # Arguments
11326/// - `vd` — Vector register operand.
11327/// - `vs1` — Vector register operand.
11328/// - `vs2` — Vector register operand.
11329/// - `vm` — Vector mask control.
11330pub trait VfredosumVsEmitter<T0, T1, T2, T3> {
11331 fn vfredosum_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11332}
11333
11334/// RISC-V `vfredsum.vs` instruction.
11335///
11336/// # Forms
11337/// Assembly: `vfredsum.vs vd vs1 vs2 vm`
11338/// Rust: `vfredsum_vs(vd, vs1, vs2, vm)`
11339///
11340/// # Arguments
11341/// - `vd` — Vector register operand.
11342/// - `vs1` — Vector register operand.
11343/// - `vs2` — Vector register operand.
11344/// - `vm` — Vector mask control.
11345pub trait VfredsumVsEmitter<T0, T1, T2, T3> {
11346 fn vfredsum_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11347}
11348
11349/// RISC-V `vfredusum.vs` instruction.
11350///
11351/// # Forms
11352/// Assembly: `vfredusum.vs vm, vs2, vs1, vd`
11353/// Rust: `vfredusum_vs(vd, vs1, vs2, vm)`
11354///
11355/// # Arguments
11356/// - `vd` — Vector register operand.
11357/// - `vs1` — Vector register operand.
11358/// - `vs2` — Vector register operand.
11359/// - `vm` — Vector mask control.
11360pub trait VfredusumVsEmitter<T0, T1, T2, T3> {
11361 fn vfredusum_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11362}
11363
11364/// RISC-V `vfrsqrt7.v` instruction.
11365///
11366/// # Forms
11367/// Assembly: `vfrsqrt7.v vm, vs2, vd`
11368/// Rust: `vfrsqrt7_v(vd, vs2, vm)`
11369///
11370/// # Arguments
11371/// - `vd` — Vector register operand.
11372/// - `vs2` — Vector register operand.
11373/// - `vm` — Vector mask control.
11374pub trait Vfrsqrt7VEmitter<T0, T1, T2> {
11375 fn vfrsqrt7_v(&mut self, vd: T0, vs2: T1, vm: T2);
11376}
11377
11378/// RISC-V `vfrsub.vf` instruction.
11379///
11380/// # Forms
11381/// Assembly: `vfrsub.vf vm, vs2, xs1, vd`
11382/// Rust: `vfrsub_vf(vd, vs2, rs1, vm)`
11383///
11384/// # Arguments
11385/// - `vd` — Vector register operand.
11386/// - `vs2` — Vector register operand.
11387/// - `rs1` — Source register.
11388/// - `vm` — Vector mask control.
11389pub trait VfrsubVfEmitter<T0, T1, T2, T3> {
11390 fn vfrsub_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11391}
11392
11393/// RISC-V `vfsgnj.vf` instruction.
11394///
11395/// # Forms
11396/// Assembly: `vfsgnj.vf vm, vs2, xs1, vd`
11397/// Rust: `vfsgnj_vf(vd, vs2, rs1, vm)`
11398///
11399/// # Arguments
11400/// - `vd` — Vector register operand.
11401/// - `vs2` — Vector register operand.
11402/// - `rs1` — Source register.
11403/// - `vm` — Vector mask control.
11404pub trait VfsgnjVfEmitter<T0, T1, T2, T3> {
11405 fn vfsgnj_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11406}
11407
11408/// RISC-V `vfsgnj.vv` instruction.
11409///
11410/// # Forms
11411/// Assembly: `vfsgnj.vv vm, vs2, vs1, vd`
11412/// Rust: `vfsgnj_vv(vd, vs1, vs2, vm)`
11413///
11414/// # Arguments
11415/// - `vd` — Vector register operand.
11416/// - `vs1` — Vector register operand.
11417/// - `vs2` — Vector register operand.
11418/// - `vm` — Vector mask control.
11419pub trait VfsgnjVvEmitter<T0, T1, T2, T3> {
11420 fn vfsgnj_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11421}
11422
11423/// RISC-V `vfsgnjn.vf` instruction.
11424///
11425/// # Forms
11426/// Assembly: `vfsgnjn.vf vm, vs2, xs1, vd`
11427/// Rust: `vfsgnjn_vf(vd, vs2, rs1, vm)`
11428///
11429/// # Arguments
11430/// - `vd` — Vector register operand.
11431/// - `vs2` — Vector register operand.
11432/// - `rs1` — Source register.
11433/// - `vm` — Vector mask control.
11434pub trait VfsgnjnVfEmitter<T0, T1, T2, T3> {
11435 fn vfsgnjn_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11436}
11437
11438/// RISC-V `vfsgnjn.vv` instruction.
11439///
11440/// # Forms
11441/// Assembly: `vfsgnjn.vv vm, vs2, vs1, vd`
11442/// Rust: `vfsgnjn_vv(vd, vs1, vs2, vm)`
11443///
11444/// # Arguments
11445/// - `vd` — Vector register operand.
11446/// - `vs1` — Vector register operand.
11447/// - `vs2` — Vector register operand.
11448/// - `vm` — Vector mask control.
11449pub trait VfsgnjnVvEmitter<T0, T1, T2, T3> {
11450 fn vfsgnjn_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11451}
11452
11453/// RISC-V `vfsgnjx.vf` instruction.
11454///
11455/// # Forms
11456/// Assembly: `vfsgnjx.vf vm, vs2, xs1, vd`
11457/// Rust: `vfsgnjx_vf(vd, vs2, rs1, vm)`
11458///
11459/// # Arguments
11460/// - `vd` — Vector register operand.
11461/// - `vs2` — Vector register operand.
11462/// - `rs1` — Source register.
11463/// - `vm` — Vector mask control.
11464pub trait VfsgnjxVfEmitter<T0, T1, T2, T3> {
11465 fn vfsgnjx_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11466}
11467
11468/// RISC-V `vfsgnjx.vv` instruction.
11469///
11470/// # Forms
11471/// Assembly: `vfsgnjx.vv vm, vs2, vs1, vd`
11472/// Rust: `vfsgnjx_vv(vd, vs1, vs2, vm)`
11473///
11474/// # Arguments
11475/// - `vd` — Vector register operand.
11476/// - `vs1` — Vector register operand.
11477/// - `vs2` — Vector register operand.
11478/// - `vm` — Vector mask control.
11479pub trait VfsgnjxVvEmitter<T0, T1, T2, T3> {
11480 fn vfsgnjx_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11481}
11482
11483/// RISC-V `vfslide1down.vf` instruction.
11484///
11485/// # Forms
11486/// Assembly: `vfslide1down.vf vm, vs2, xs1, vd`
11487/// Rust: `vfslide1down_vf(vd, vs2, rs1, vm)`
11488///
11489/// # Arguments
11490/// - `vd` — Vector register operand.
11491/// - `vs2` — Vector register operand.
11492/// - `rs1` — Source register.
11493/// - `vm` — Vector mask control.
11494pub trait Vfslide1DownVfEmitter<T0, T1, T2, T3> {
11495 fn vfslide1down_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11496}
11497
11498/// RISC-V `vfslide1up.vf` instruction.
11499///
11500/// # Forms
11501/// Assembly: `vfslide1up.vf vm, vs2, xs1, vd`
11502/// Rust: `vfslide1up_vf(vd, vs2, rs1, vm)`
11503///
11504/// # Arguments
11505/// - `vd` — Vector register operand.
11506/// - `vs2` — Vector register operand.
11507/// - `rs1` — Source register.
11508/// - `vm` — Vector mask control.
11509pub trait Vfslide1UpVfEmitter<T0, T1, T2, T3> {
11510 fn vfslide1up_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11511}
11512
11513/// RISC-V `vfsqrt.v` instruction.
11514///
11515/// # Forms
11516/// Assembly: `vfsqrt.v vm, vs2, vd`
11517/// Rust: `vfsqrt_v(vd, vs2, vm)`
11518///
11519/// # Arguments
11520/// - `vd` — Vector register operand.
11521/// - `vs2` — Vector register operand.
11522/// - `vm` — Vector mask control.
11523pub trait VfsqrtVEmitter<T0, T1, T2> {
11524 fn vfsqrt_v(&mut self, vd: T0, vs2: T1, vm: T2);
11525}
11526
11527/// RISC-V `vfsub.vf` instruction.
11528///
11529/// # Forms
11530/// Assembly: `vfsub.vf vm, vs2, xs1, vd`
11531/// Rust: `vfsub_vf(vd, vs2, rs1, vm)`
11532///
11533/// # Arguments
11534/// - `vd` — Vector register operand.
11535/// - `vs2` — Vector register operand.
11536/// - `rs1` — Source register.
11537/// - `vm` — Vector mask control.
11538pub trait VfsubVfEmitter<T0, T1, T2, T3> {
11539 fn vfsub_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11540}
11541
11542/// RISC-V `vfsub.vv` instruction.
11543///
11544/// # Forms
11545/// Assembly: `vfsub.vv vm, vs2, vs1, vd`
11546/// Rust: `vfsub_vv(vd, vs1, vs2, vm)`
11547///
11548/// # Arguments
11549/// - `vd` — Vector register operand.
11550/// - `vs1` — Vector register operand.
11551/// - `vs2` — Vector register operand.
11552/// - `vm` — Vector mask control.
11553pub trait VfsubVvEmitter<T0, T1, T2, T3> {
11554 fn vfsub_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11555}
11556
11557/// RISC-V `vfwadd.vf` instruction.
11558///
11559/// # Forms
11560/// Assembly: `vfwadd.vf vm, vs2, xs1, vd`
11561/// Rust: `vfwadd_vf(vd, vs2, rs1, vm)`
11562///
11563/// # Arguments
11564/// - `vd` — Vector register operand.
11565/// - `vs2` — Vector register operand.
11566/// - `rs1` — Source register.
11567/// - `vm` — Vector mask control.
11568pub trait VfwaddVfEmitter<T0, T1, T2, T3> {
11569 fn vfwadd_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11570}
11571
11572/// RISC-V `vfwadd.vv` instruction.
11573///
11574/// # Forms
11575/// Assembly: `vfwadd.vv vm, vs2, vs1, vd`
11576/// Rust: `vfwadd_vv(vd, vs1, vs2, vm)`
11577///
11578/// # Arguments
11579/// - `vd` — Vector register operand.
11580/// - `vs1` — Vector register operand.
11581/// - `vs2` — Vector register operand.
11582/// - `vm` — Vector mask control.
11583pub trait VfwaddVvEmitter<T0, T1, T2, T3> {
11584 fn vfwadd_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11585}
11586
11587/// RISC-V `vfwadd.wf` instruction.
11588///
11589/// # Forms
11590/// Assembly: `vfwadd.wf vm, vs2, xs1, vd`
11591/// Rust: `vfwadd_wf(vd, vs2, rs1, vm)`
11592///
11593/// # Arguments
11594/// - `vd` — Vector register operand.
11595/// - `vs2` — Vector register operand.
11596/// - `rs1` — Source register.
11597/// - `vm` — Vector mask control.
11598pub trait VfwaddWfEmitter<T0, T1, T2, T3> {
11599 fn vfwadd_wf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11600}
11601
11602/// RISC-V `vfwadd.wv` instruction.
11603///
11604/// # Forms
11605/// Assembly: `vfwadd.wv vm, vs2, vs1, vd`
11606/// Rust: `vfwadd_wv(vd, vs1, vs2, vm)`
11607///
11608/// # Arguments
11609/// - `vd` — Vector register operand.
11610/// - `vs1` — Vector register operand.
11611/// - `vs2` — Vector register operand.
11612/// - `vm` — Vector mask control.
11613pub trait VfwaddWvEmitter<T0, T1, T2, T3> {
11614 fn vfwadd_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11615}
11616
11617/// RISC-V `vfwcvt.f.f.v` instruction.
11618///
11619/// # Forms
11620/// Assembly: `vfwcvt.f.f.v vm, vs2, vd`
11621/// Rust: `vfwcvt_f_f_v(vd, vs2, vm)`
11622///
11623/// # Arguments
11624/// - `vd` — Vector register operand.
11625/// - `vs2` — Vector register operand.
11626/// - `vm` — Vector mask control.
11627pub trait VfwcvtFFVEmitter<T0, T1, T2> {
11628 fn vfwcvt_f_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
11629}
11630
11631/// RISC-V `vfwcvt.f.x.v` instruction.
11632///
11633/// # Forms
11634/// Assembly: `vfwcvt.f.x.v vm, vs2, vd`
11635/// Rust: `vfwcvt_f_x_v(vd, vs2, vm)`
11636///
11637/// # Arguments
11638/// - `vd` — Vector register operand.
11639/// - `vs2` — Vector register operand.
11640/// - `vm` — Vector mask control.
11641pub trait VfwcvtFXVEmitter<T0, T1, T2> {
11642 fn vfwcvt_f_x_v(&mut self, vd: T0, vs2: T1, vm: T2);
11643}
11644
11645/// RISC-V `vfwcvt.f.xu.v` instruction.
11646///
11647/// # Forms
11648/// Assembly: `vfwcvt.f.xu.v vm, vs2, vd`
11649/// Rust: `vfwcvt_f_xu_v(vd, vs2, vm)`
11650///
11651/// # Arguments
11652/// - `vd` — Vector register operand.
11653/// - `vs2` — Vector register operand.
11654/// - `vm` — Vector mask control.
11655pub trait VfwcvtFXuVEmitter<T0, T1, T2> {
11656 fn vfwcvt_f_xu_v(&mut self, vd: T0, vs2: T1, vm: T2);
11657}
11658
11659/// RISC-V `vfwcvt.rtz.x.f.v` instruction.
11660///
11661/// # Forms
11662/// Assembly: `vfwcvt.rtz.x.f.v vm, vs2, vd`
11663/// Rust: `vfwcvt_rtz_x_f_v(vd, vs2, vm)`
11664///
11665/// # Arguments
11666/// - `vd` — Vector register operand.
11667/// - `vs2` — Vector register operand.
11668/// - `vm` — Vector mask control.
11669pub trait VfwcvtRtzXFVEmitter<T0, T1, T2> {
11670 fn vfwcvt_rtz_x_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
11671}
11672
11673/// RISC-V `vfwcvt.rtz.xu.f.v` instruction.
11674///
11675/// # Forms
11676/// Assembly: `vfwcvt.rtz.xu.f.v vm, vs2, vd`
11677/// Rust: `vfwcvt_rtz_xu_f_v(vd, vs2, vm)`
11678///
11679/// # Arguments
11680/// - `vd` — Vector register operand.
11681/// - `vs2` — Vector register operand.
11682/// - `vm` — Vector mask control.
11683pub trait VfwcvtRtzXuFVEmitter<T0, T1, T2> {
11684 fn vfwcvt_rtz_xu_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
11685}
11686
11687/// RISC-V `vfwcvt.x.f.v` instruction.
11688///
11689/// # Forms
11690/// Assembly: `vfwcvt.x.f.v vm, vs2, vd`
11691/// Rust: `vfwcvt_x_f_v(vd, vs2, vm)`
11692///
11693/// # Arguments
11694/// - `vd` — Vector register operand.
11695/// - `vs2` — Vector register operand.
11696/// - `vm` — Vector mask control.
11697pub trait VfwcvtXFVEmitter<T0, T1, T2> {
11698 fn vfwcvt_x_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
11699}
11700
11701/// RISC-V `vfwcvt.xu.f.v` instruction.
11702///
11703/// # Forms
11704/// Assembly: `vfwcvt.xu.f.v vm, vs2, vd`
11705/// Rust: `vfwcvt_xu_f_v(vd, vs2, vm)`
11706///
11707/// # Arguments
11708/// - `vd` — Vector register operand.
11709/// - `vs2` — Vector register operand.
11710/// - `vm` — Vector mask control.
11711pub trait VfwcvtXuFVEmitter<T0, T1, T2> {
11712 fn vfwcvt_xu_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
11713}
11714
11715/// RISC-V `vfwcvtbf16.f.f.v` instruction.
11716///
11717/// # Forms
11718/// Assembly: `vfwcvtbf16.f.f.v vm, vs2, vd`
11719/// Rust: `vfwcvtbf16_f_f_v(vd, vs2, vm)`
11720///
11721/// # Arguments
11722/// - `vd` — Vector register operand.
11723/// - `vs2` — Vector register operand.
11724/// - `vm` — Vector mask control.
11725pub trait Vfwcvtbf16FFVEmitter<T0, T1, T2> {
11726 fn vfwcvtbf16_f_f_v(&mut self, vd: T0, vs2: T1, vm: T2);
11727}
11728
11729/// RISC-V `vfwmacc.vf` instruction.
11730///
11731/// # Forms
11732/// Assembly: `vfwmacc.vf vm, vs2, xs1, vd`
11733/// Rust: `vfwmacc_vf(vd, vs2, rs1, vm)`
11734///
11735/// # Arguments
11736/// - `vd` — Vector register operand.
11737/// - `vs2` — Vector register operand.
11738/// - `rs1` — Source register.
11739/// - `vm` — Vector mask control.
11740pub trait VfwmaccVfEmitter<T0, T1, T2, T3> {
11741 fn vfwmacc_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11742}
11743
11744/// RISC-V `vfwmacc.vv` instruction.
11745///
11746/// # Forms
11747/// Assembly: `vfwmacc.vv vm, vs2, vs1, vd`
11748/// Rust: `vfwmacc_vv(vd, vs1, vs2, vm)`
11749///
11750/// # Arguments
11751/// - `vd` — Vector register operand.
11752/// - `vs1` — Vector register operand.
11753/// - `vs2` — Vector register operand.
11754/// - `vm` — Vector mask control.
11755pub trait VfwmaccVvEmitter<T0, T1, T2, T3> {
11756 fn vfwmacc_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11757}
11758
11759/// RISC-V `vfwmaccbf16.vf` instruction.
11760///
11761/// # Forms
11762/// Assembly: `vfwmaccbf16.vf vm, vs2, xs1, vd`
11763/// Rust: `vfwmaccbf16_vf(vd, vs2, rs1, vm)`
11764///
11765/// # Arguments
11766/// - `vd` — Vector register operand.
11767/// - `vs2` — Vector register operand.
11768/// - `rs1` — Source register.
11769/// - `vm` — Vector mask control.
11770pub trait Vfwmaccbf16VfEmitter<T0, T1, T2, T3> {
11771 fn vfwmaccbf16_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11772}
11773
11774/// RISC-V `vfwmaccbf16.vv` instruction.
11775///
11776/// # Forms
11777/// Assembly: `vfwmaccbf16.vv vm, vs2, vs1, vd`
11778/// Rust: `vfwmaccbf16_vv(vd, vs1, vs2, vm)`
11779///
11780/// # Arguments
11781/// - `vd` — Vector register operand.
11782/// - `vs1` — Vector register operand.
11783/// - `vs2` — Vector register operand.
11784/// - `vm` — Vector mask control.
11785pub trait Vfwmaccbf16VvEmitter<T0, T1, T2, T3> {
11786 fn vfwmaccbf16_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11787}
11788
11789/// RISC-V `vfwmsac.vf` instruction.
11790///
11791/// # Forms
11792/// Assembly: `vfwmsac.vf vm, vs2, xs1, vd`
11793/// Rust: `vfwmsac_vf(vd, vs2, rs1, vm)`
11794///
11795/// # Arguments
11796/// - `vd` — Vector register operand.
11797/// - `vs2` — Vector register operand.
11798/// - `rs1` — Source register.
11799/// - `vm` — Vector mask control.
11800pub trait VfwmsacVfEmitter<T0, T1, T2, T3> {
11801 fn vfwmsac_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11802}
11803
11804/// RISC-V `vfwmsac.vv` instruction.
11805///
11806/// # Forms
11807/// Assembly: `vfwmsac.vv vm, vs2, vs1, vd`
11808/// Rust: `vfwmsac_vv(vd, vs1, vs2, vm)`
11809///
11810/// # Arguments
11811/// - `vd` — Vector register operand.
11812/// - `vs1` — Vector register operand.
11813/// - `vs2` — Vector register operand.
11814/// - `vm` — Vector mask control.
11815pub trait VfwmsacVvEmitter<T0, T1, T2, T3> {
11816 fn vfwmsac_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11817}
11818
11819/// RISC-V `vfwmul.vf` instruction.
11820///
11821/// # Forms
11822/// Assembly: `vfwmul.vf vm, vs2, xs1, vd`
11823/// Rust: `vfwmul_vf(vd, vs2, rs1, vm)`
11824///
11825/// # Arguments
11826/// - `vd` — Vector register operand.
11827/// - `vs2` — Vector register operand.
11828/// - `rs1` — Source register.
11829/// - `vm` — Vector mask control.
11830pub trait VfwmulVfEmitter<T0, T1, T2, T3> {
11831 fn vfwmul_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11832}
11833
11834/// RISC-V `vfwmul.vv` instruction.
11835///
11836/// # Forms
11837/// Assembly: `vfwmul.vv vm, vs2, vs1, vd`
11838/// Rust: `vfwmul_vv(vd, vs1, vs2, vm)`
11839///
11840/// # Arguments
11841/// - `vd` — Vector register operand.
11842/// - `vs1` — Vector register operand.
11843/// - `vs2` — Vector register operand.
11844/// - `vm` — Vector mask control.
11845pub trait VfwmulVvEmitter<T0, T1, T2, T3> {
11846 fn vfwmul_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11847}
11848
11849/// RISC-V `vfwnmacc.vf` instruction.
11850///
11851/// # Forms
11852/// Assembly: `vfwnmacc.vf vm, vs2, xs1, vd`
11853/// Rust: `vfwnmacc_vf(vd, vs2, rs1, vm)`
11854///
11855/// # Arguments
11856/// - `vd` — Vector register operand.
11857/// - `vs2` — Vector register operand.
11858/// - `rs1` — Source register.
11859/// - `vm` — Vector mask control.
11860pub trait VfwnmaccVfEmitter<T0, T1, T2, T3> {
11861 fn vfwnmacc_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11862}
11863
11864/// RISC-V `vfwnmacc.vv` instruction.
11865///
11866/// # Forms
11867/// Assembly: `vfwnmacc.vv vm, vs2, vs1, vd`
11868/// Rust: `vfwnmacc_vv(vd, vs1, vs2, vm)`
11869///
11870/// # Arguments
11871/// - `vd` — Vector register operand.
11872/// - `vs1` — Vector register operand.
11873/// - `vs2` — Vector register operand.
11874/// - `vm` — Vector mask control.
11875pub trait VfwnmaccVvEmitter<T0, T1, T2, T3> {
11876 fn vfwnmacc_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11877}
11878
11879/// RISC-V `vfwnmsac.vf` instruction.
11880///
11881/// # Forms
11882/// Assembly: `vfwnmsac.vf vm, vs2, xs1, vd`
11883/// Rust: `vfwnmsac_vf(vd, vs2, rs1, vm)`
11884///
11885/// # Arguments
11886/// - `vd` — Vector register operand.
11887/// - `vs2` — Vector register operand.
11888/// - `rs1` — Source register.
11889/// - `vm` — Vector mask control.
11890pub trait VfwnmsacVfEmitter<T0, T1, T2, T3> {
11891 fn vfwnmsac_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11892}
11893
11894/// RISC-V `vfwnmsac.vv` instruction.
11895///
11896/// # Forms
11897/// Assembly: `vfwnmsac.vv vm, vs2, vs1, vd`
11898/// Rust: `vfwnmsac_vv(vd, vs1, vs2, vm)`
11899///
11900/// # Arguments
11901/// - `vd` — Vector register operand.
11902/// - `vs1` — Vector register operand.
11903/// - `vs2` — Vector register operand.
11904/// - `vm` — Vector mask control.
11905pub trait VfwnmsacVvEmitter<T0, T1, T2, T3> {
11906 fn vfwnmsac_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11907}
11908
11909/// RISC-V `vfwredosum.vs` instruction.
11910///
11911/// # Forms
11912/// Assembly: `vfwredosum.vs vm, vs2, vs1, vd`
11913/// Rust: `vfwredosum_vs(vd, vs1, vs2, vm)`
11914///
11915/// # Arguments
11916/// - `vd` — Vector register operand.
11917/// - `vs1` — Vector register operand.
11918/// - `vs2` — Vector register operand.
11919/// - `vm` — Vector mask control.
11920pub trait VfwredosumVsEmitter<T0, T1, T2, T3> {
11921 fn vfwredosum_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11922}
11923
11924/// RISC-V `vfwredsum.vs` instruction.
11925///
11926/// # Forms
11927/// Assembly: `vfwredsum.vs vd vs1 vs2 vm`
11928/// Rust: `vfwredsum_vs(vd, vs1, vs2, vm)`
11929///
11930/// # Arguments
11931/// - `vd` — Vector register operand.
11932/// - `vs1` — Vector register operand.
11933/// - `vs2` — Vector register operand.
11934/// - `vm` — Vector mask control.
11935pub trait VfwredsumVsEmitter<T0, T1, T2, T3> {
11936 fn vfwredsum_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11937}
11938
11939/// RISC-V `vfwredusum.vs` instruction.
11940///
11941/// # Forms
11942/// Assembly: `vfwredusum.vs vm, vs2, vs1, vd`
11943/// Rust: `vfwredusum_vs(vd, vs1, vs2, vm)`
11944///
11945/// # Arguments
11946/// - `vd` — Vector register operand.
11947/// - `vs1` — Vector register operand.
11948/// - `vs2` — Vector register operand.
11949/// - `vm` — Vector mask control.
11950pub trait VfwredusumVsEmitter<T0, T1, T2, T3> {
11951 fn vfwredusum_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11952}
11953
11954/// RISC-V `vfwsub.vf` instruction.
11955///
11956/// # Forms
11957/// Assembly: `vfwsub.vf vm, vs2, xs1, vd`
11958/// Rust: `vfwsub_vf(vd, vs2, rs1, vm)`
11959///
11960/// # Arguments
11961/// - `vd` — Vector register operand.
11962/// - `vs2` — Vector register operand.
11963/// - `rs1` — Source register.
11964/// - `vm` — Vector mask control.
11965pub trait VfwsubVfEmitter<T0, T1, T2, T3> {
11966 fn vfwsub_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11967}
11968
11969/// RISC-V `vfwsub.vv` instruction.
11970///
11971/// # Forms
11972/// Assembly: `vfwsub.vv vm, vs2, vs1, vd`
11973/// Rust: `vfwsub_vv(vd, vs1, vs2, vm)`
11974///
11975/// # Arguments
11976/// - `vd` — Vector register operand.
11977/// - `vs1` — Vector register operand.
11978/// - `vs2` — Vector register operand.
11979/// - `vm` — Vector mask control.
11980pub trait VfwsubVvEmitter<T0, T1, T2, T3> {
11981 fn vfwsub_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
11982}
11983
11984/// RISC-V `vfwsub.wf` instruction.
11985///
11986/// # Forms
11987/// Assembly: `vfwsub.wf vm, vs2, xs1, vd`
11988/// Rust: `vfwsub_wf(vd, vs2, rs1, vm)`
11989///
11990/// # Arguments
11991/// - `vd` — Vector register operand.
11992/// - `vs2` — Vector register operand.
11993/// - `rs1` — Source register.
11994/// - `vm` — Vector mask control.
11995pub trait VfwsubWfEmitter<T0, T1, T2, T3> {
11996 fn vfwsub_wf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
11997}
11998
11999/// RISC-V `vfwsub.wv` instruction.
12000///
12001/// # Forms
12002/// Assembly: `vfwsub.wv vm, vs2, vs1, vd`
12003/// Rust: `vfwsub_wv(vd, vs1, vs2, vm)`
12004///
12005/// # Arguments
12006/// - `vd` — Vector register operand.
12007/// - `vs1` — Vector register operand.
12008/// - `vs2` — Vector register operand.
12009/// - `vm` — Vector mask control.
12010pub trait VfwsubWvEmitter<T0, T1, T2, T3> {
12011 fn vfwsub_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
12012}
12013
12014/// RISC-V `vghsh.vv` instruction.
12015///
12016/// # Forms
12017/// Assembly: `vghsh.vv vs2, vs1, vd`
12018/// Rust: `vghsh_vv(vd, vs1, vs2)`
12019///
12020/// # Arguments
12021/// - `vd` — Vector register operand.
12022/// - `vs1` — Vector register operand.
12023/// - `vs2` — Vector register operand.
12024pub trait VghshVvEmitter<T0, T1, T2> {
12025 fn vghsh_vv(&mut self, vd: T0, vs1: T1, vs2: T2);
12026}
12027
12028/// RISC-V `vgmul.vv` instruction.
12029///
12030/// # Forms
12031/// Assembly: `vgmul.vv vs2, vd`
12032/// Rust: `vgmul_vv(vd, vs2)`
12033///
12034/// # Arguments
12035/// - `vd` — Vector register operand.
12036/// - `vs2` — Vector register operand.
12037pub trait VgmulVvEmitter<T0, T1> {
12038 fn vgmul_vv(&mut self, vd: T0, vs2: T1);
12039}
12040
12041/// RISC-V `vid.v` instruction.
12042///
12043/// # Forms
12044/// Assembly: `vid.v vm, vd`
12045/// Rust: `vid_v(vd, vm)`
12046///
12047/// # Arguments
12048/// - `vd` — Vector register operand.
12049/// - `vm` — Vector mask control.
12050pub trait VidVEmitter<T0, T1> {
12051 fn vid_v(&mut self, vd: T0, vm: T1);
12052}
12053
12054/// RISC-V `viota.m` instruction.
12055///
12056/// # Forms
12057/// Assembly: `viota.m vm, vs2, vd`
12058/// Rust: `viota_m(vd, vs2, vm)`
12059///
12060/// # Arguments
12061/// - `vd` — Vector register operand.
12062/// - `vs2` — Vector register operand.
12063/// - `vm` — Vector mask control.
12064pub trait ViotaMEmitter<T0, T1, T2> {
12065 fn viota_m(&mut self, vd: T0, vs2: T1, vm: T2);
12066}
12067
12068/// RISC-V `vl1r.v` instruction.
12069///
12070/// # Forms
12071/// Assembly: `vl1r.v vd rs1`
12072/// Rust: `vl1r_v(vd, rs1)`
12073///
12074/// # Arguments
12075/// - `vd` — Vector register operand.
12076/// - `rs1` — Memory base register.
12077pub trait Vl1RVEmitter<T0, T1> {
12078 fn vl1r_v(&mut self, vd: T0, rs1: T1);
12079}
12080
12081/// RISC-V `vl1re16.v` instruction.
12082///
12083/// # Forms
12084/// Assembly: `vl1re16.v xs1, vd`
12085/// Rust: `vl1re16_v(vd, rs1)`
12086///
12087/// # Arguments
12088/// - `vd` — Vector register operand.
12089/// - `rs1` — Memory base register.
12090pub trait Vl1Re16VEmitter<T0, T1> {
12091 fn vl1re16_v(&mut self, vd: T0, rs1: T1);
12092}
12093
12094/// RISC-V `vl1re32.v` instruction.
12095///
12096/// # Forms
12097/// Assembly: `vl1re32.v xs1, vd`
12098/// Rust: `vl1re32_v(vd, rs1)`
12099///
12100/// # Arguments
12101/// - `vd` — Vector register operand.
12102/// - `rs1` — Memory base register.
12103pub trait Vl1Re32VEmitter<T0, T1> {
12104 fn vl1re32_v(&mut self, vd: T0, rs1: T1);
12105}
12106
12107/// RISC-V `vl1re64.v` instruction.
12108///
12109/// # Forms
12110/// Assembly: `vl1re64.v xs1, vd`
12111/// Rust: `vl1re64_v(vd, rs1)`
12112///
12113/// # Arguments
12114/// - `vd` — Vector register operand.
12115/// - `rs1` — Memory base register.
12116pub trait Vl1Re64VEmitter<T0, T1> {
12117 fn vl1re64_v(&mut self, vd: T0, rs1: T1);
12118}
12119
12120/// RISC-V `vl1re8.v` instruction.
12121///
12122/// # Forms
12123/// Assembly: `vl1re8.v xs1, vd`
12124/// Rust: `vl1re8_v(vd, rs1)`
12125///
12126/// # Arguments
12127/// - `vd` — Vector register operand.
12128/// - `rs1` — Memory base register.
12129pub trait Vl1Re8VEmitter<T0, T1> {
12130 fn vl1re8_v(&mut self, vd: T0, rs1: T1);
12131}
12132
12133/// RISC-V `vl2r.v` instruction.
12134///
12135/// # Forms
12136/// Assembly: `vl2r.v vd rs1`
12137/// Rust: `vl2r_v(vd, rs1)`
12138///
12139/// # Arguments
12140/// - `vd` — Vector register operand.
12141/// - `rs1` — Memory base register.
12142pub trait Vl2RVEmitter<T0, T1> {
12143 fn vl2r_v(&mut self, vd: T0, rs1: T1);
12144}
12145
12146/// RISC-V `vl2re16.v` instruction.
12147///
12148/// # Forms
12149/// Assembly: `vl2re16.v xs1, vd`
12150/// Rust: `vl2re16_v(vd, rs1)`
12151///
12152/// # Arguments
12153/// - `vd` — Vector register operand.
12154/// - `rs1` — Memory base register.
12155pub trait Vl2Re16VEmitter<T0, T1> {
12156 fn vl2re16_v(&mut self, vd: T0, rs1: T1);
12157}
12158
12159/// RISC-V `vl2re32.v` instruction.
12160///
12161/// # Forms
12162/// Assembly: `vl2re32.v xs1, vd`
12163/// Rust: `vl2re32_v(vd, rs1)`
12164///
12165/// # Arguments
12166/// - `vd` — Vector register operand.
12167/// - `rs1` — Memory base register.
12168pub trait Vl2Re32VEmitter<T0, T1> {
12169 fn vl2re32_v(&mut self, vd: T0, rs1: T1);
12170}
12171
12172/// RISC-V `vl2re64.v` instruction.
12173///
12174/// # Forms
12175/// Assembly: `vl2re64.v xs1, vd`
12176/// Rust: `vl2re64_v(vd, rs1)`
12177///
12178/// # Arguments
12179/// - `vd` — Vector register operand.
12180/// - `rs1` — Memory base register.
12181pub trait Vl2Re64VEmitter<T0, T1> {
12182 fn vl2re64_v(&mut self, vd: T0, rs1: T1);
12183}
12184
12185/// RISC-V `vl2re8.v` instruction.
12186///
12187/// # Forms
12188/// Assembly: `vl2re8.v xs1, vd`
12189/// Rust: `vl2re8_v(vd, rs1)`
12190///
12191/// # Arguments
12192/// - `vd` — Vector register operand.
12193/// - `rs1` — Memory base register.
12194pub trait Vl2Re8VEmitter<T0, T1> {
12195 fn vl2re8_v(&mut self, vd: T0, rs1: T1);
12196}
12197
12198/// RISC-V `vl4r.v` instruction.
12199///
12200/// # Forms
12201/// Assembly: `vl4r.v vd rs1`
12202/// Rust: `vl4r_v(vd, rs1)`
12203///
12204/// # Arguments
12205/// - `vd` — Vector register operand.
12206/// - `rs1` — Memory base register.
12207pub trait Vl4RVEmitter<T0, T1> {
12208 fn vl4r_v(&mut self, vd: T0, rs1: T1);
12209}
12210
12211/// RISC-V `vl4re16.v` instruction.
12212///
12213/// # Forms
12214/// Assembly: `vl4re16.v xs1, vd`
12215/// Rust: `vl4re16_v(vd, rs1)`
12216///
12217/// # Arguments
12218/// - `vd` — Vector register operand.
12219/// - `rs1` — Memory base register.
12220pub trait Vl4Re16VEmitter<T0, T1> {
12221 fn vl4re16_v(&mut self, vd: T0, rs1: T1);
12222}
12223
12224/// RISC-V `vl4re32.v` instruction.
12225///
12226/// # Forms
12227/// Assembly: `vl4re32.v xs1, vd`
12228/// Rust: `vl4re32_v(vd, rs1)`
12229///
12230/// # Arguments
12231/// - `vd` — Vector register operand.
12232/// - `rs1` — Memory base register.
12233pub trait Vl4Re32VEmitter<T0, T1> {
12234 fn vl4re32_v(&mut self, vd: T0, rs1: T1);
12235}
12236
12237/// RISC-V `vl4re64.v` instruction.
12238///
12239/// # Forms
12240/// Assembly: `vl4re64.v xs1, vd`
12241/// Rust: `vl4re64_v(vd, rs1)`
12242///
12243/// # Arguments
12244/// - `vd` — Vector register operand.
12245/// - `rs1` — Memory base register.
12246pub trait Vl4Re64VEmitter<T0, T1> {
12247 fn vl4re64_v(&mut self, vd: T0, rs1: T1);
12248}
12249
12250/// RISC-V `vl4re8.v` instruction.
12251///
12252/// # Forms
12253/// Assembly: `vl4re8.v xs1, vd`
12254/// Rust: `vl4re8_v(vd, rs1)`
12255///
12256/// # Arguments
12257/// - `vd` — Vector register operand.
12258/// - `rs1` — Memory base register.
12259pub trait Vl4Re8VEmitter<T0, T1> {
12260 fn vl4re8_v(&mut self, vd: T0, rs1: T1);
12261}
12262
12263/// RISC-V `vl8r.v` instruction.
12264///
12265/// # Forms
12266/// Assembly: `vl8r.v vd rs1`
12267/// Rust: `vl8r_v(vd, rs1)`
12268///
12269/// # Arguments
12270/// - `vd` — Vector register operand.
12271/// - `rs1` — Memory base register.
12272pub trait Vl8RVEmitter<T0, T1> {
12273 fn vl8r_v(&mut self, vd: T0, rs1: T1);
12274}
12275
12276/// RISC-V `vl8re16.v` instruction.
12277///
12278/// # Forms
12279/// Assembly: `vl8re16.v xs1, vd`
12280/// Rust: `vl8re16_v(vd, rs1)`
12281///
12282/// # Arguments
12283/// - `vd` — Vector register operand.
12284/// - `rs1` — Memory base register.
12285pub trait Vl8Re16VEmitter<T0, T1> {
12286 fn vl8re16_v(&mut self, vd: T0, rs1: T1);
12287}
12288
12289/// RISC-V `vl8re32.v` instruction.
12290///
12291/// # Forms
12292/// Assembly: `vl8re32.v xs1, vd`
12293/// Rust: `vl8re32_v(vd, rs1)`
12294///
12295/// # Arguments
12296/// - `vd` — Vector register operand.
12297/// - `rs1` — Memory base register.
12298pub trait Vl8Re32VEmitter<T0, T1> {
12299 fn vl8re32_v(&mut self, vd: T0, rs1: T1);
12300}
12301
12302/// RISC-V `vl8re64.v` instruction.
12303///
12304/// # Forms
12305/// Assembly: `vl8re64.v xs1, vd`
12306/// Rust: `vl8re64_v(vd, rs1)`
12307///
12308/// # Arguments
12309/// - `vd` — Vector register operand.
12310/// - `rs1` — Memory base register.
12311pub trait Vl8Re64VEmitter<T0, T1> {
12312 fn vl8re64_v(&mut self, vd: T0, rs1: T1);
12313}
12314
12315/// RISC-V `vl8re8.v` instruction.
12316///
12317/// # Forms
12318/// Assembly: `vl8re8.v xs1, vd`
12319/// Rust: `vl8re8_v(vd, rs1)`
12320///
12321/// # Arguments
12322/// - `vd` — Vector register operand.
12323/// - `rs1` — Memory base register.
12324pub trait Vl8Re8VEmitter<T0, T1> {
12325 fn vl8re8_v(&mut self, vd: T0, rs1: T1);
12326}
12327
12328/// RISC-V `vle16.v` instruction.
12329///
12330/// # Forms
12331/// Assembly: `vle16.v vm, xs1, vd`
12332/// Rust: `vle16_v(vd, rs1, vm, nf)`
12333///
12334/// # Arguments
12335/// - `vd` — Vector register operand.
12336/// - `rs1` — Memory base register.
12337/// - `vm` — Vector mask control.
12338/// - `nf` — Vector segment field count.
12339pub trait Vle16VEmitter<T0, T1, T2, T3> {
12340 fn vle16_v(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3);
12341}
12342
12343/// RISC-V `vle16ff.v` instruction.
12344///
12345/// # Forms
12346/// Assembly: `vle16ff.v vm, xs1, vd`
12347/// Rust: `vle16ff_v(vd, rs1, vm, nf)`
12348///
12349/// # Arguments
12350/// - `vd` — Vector register operand.
12351/// - `rs1` — Memory base register.
12352/// - `vm` — Vector mask control.
12353/// - `nf` — Vector segment field count.
12354pub trait Vle16FfVEmitter<T0, T1, T2, T3> {
12355 fn vle16ff_v(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3);
12356}
12357
12358/// RISC-V `vle1.v` instruction.
12359///
12360/// # Forms
12361/// Assembly: `vle1.v vd rs1`
12362/// Rust: `vle1_v(vd, rs1)`
12363///
12364/// # Arguments
12365/// - `vd` — Vector register operand.
12366/// - `rs1` — Memory base register.
12367pub trait Vle1VEmitter<T0, T1> {
12368 fn vle1_v(&mut self, vd: T0, rs1: T1);
12369}
12370
12371/// RISC-V `vle32.v` instruction.
12372///
12373/// # Forms
12374/// Assembly: `vle32.v vm, xs1, vd`
12375/// Rust: `vle32_v(vd, rs1, vm, nf)`
12376///
12377/// # Arguments
12378/// - `vd` — Vector register operand.
12379/// - `rs1` — Memory base register.
12380/// - `vm` — Vector mask control.
12381/// - `nf` — Vector segment field count.
12382pub trait Vle32VEmitter<T0, T1, T2, T3> {
12383 fn vle32_v(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3);
12384}
12385
12386/// RISC-V `vle32ff.v` instruction.
12387///
12388/// # Forms
12389/// Assembly: `vle32ff.v vm, xs1, vd`
12390/// Rust: `vle32ff_v(vd, rs1, vm, nf)`
12391///
12392/// # Arguments
12393/// - `vd` — Vector register operand.
12394/// - `rs1` — Memory base register.
12395/// - `vm` — Vector mask control.
12396/// - `nf` — Vector segment field count.
12397pub trait Vle32FfVEmitter<T0, T1, T2, T3> {
12398 fn vle32ff_v(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3);
12399}
12400
12401/// RISC-V `vle64.v` instruction.
12402///
12403/// # Forms
12404/// Assembly: `vle64.v vm, xs1, vd`
12405/// Rust: `vle64_v(vd, rs1, vm, nf)`
12406///
12407/// # Arguments
12408/// - `vd` — Vector register operand.
12409/// - `rs1` — Memory base register.
12410/// - `vm` — Vector mask control.
12411/// - `nf` — Vector segment field count.
12412pub trait Vle64VEmitter<T0, T1, T2, T3> {
12413 fn vle64_v(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3);
12414}
12415
12416/// RISC-V `vle64ff.v` instruction.
12417///
12418/// # Forms
12419/// Assembly: `vle64ff.v vm, xs1, vd`
12420/// Rust: `vle64ff_v(vd, rs1, vm, nf)`
12421///
12422/// # Arguments
12423/// - `vd` — Vector register operand.
12424/// - `rs1` — Memory base register.
12425/// - `vm` — Vector mask control.
12426/// - `nf` — Vector segment field count.
12427pub trait Vle64FfVEmitter<T0, T1, T2, T3> {
12428 fn vle64ff_v(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3);
12429}
12430
12431/// RISC-V `vle8.v` instruction.
12432///
12433/// # Forms
12434/// Assembly: `vle8.v vm, xs1, vd`
12435/// Rust: `vle8_v(vd, rs1, vm, nf)`
12436///
12437/// # Arguments
12438/// - `vd` — Vector register operand.
12439/// - `rs1` — Memory base register.
12440/// - `vm` — Vector mask control.
12441/// - `nf` — Vector segment field count.
12442pub trait Vle8VEmitter<T0, T1, T2, T3> {
12443 fn vle8_v(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3);
12444}
12445
12446/// RISC-V `vle8ff.v` instruction.
12447///
12448/// # Forms
12449/// Assembly: `vle8ff.v vm, xs1, vd`
12450/// Rust: `vle8ff_v(vd, rs1, vm, nf)`
12451///
12452/// # Arguments
12453/// - `vd` — Vector register operand.
12454/// - `rs1` — Memory base register.
12455/// - `vm` — Vector mask control.
12456/// - `nf` — Vector segment field count.
12457pub trait Vle8FfVEmitter<T0, T1, T2, T3> {
12458 fn vle8ff_v(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3);
12459}
12460
12461/// RISC-V `vlm.v` instruction.
12462///
12463/// # Forms
12464/// Assembly: `vlm.v xs1, vd`
12465/// Rust: `vlm_v(vd, rs1)`
12466///
12467/// # Arguments
12468/// - `vd` — Vector register operand.
12469/// - `rs1` — Memory base register.
12470pub trait VlmVEmitter<T0, T1> {
12471 fn vlm_v(&mut self, vd: T0, rs1: T1);
12472}
12473
12474/// RISC-V `vloxei16.v` instruction.
12475///
12476/// # Forms
12477/// Assembly: `vloxei16.v vm, vs2, xs1, vd`
12478/// Rust: `vloxei16_v(vd, rs1, vs2, vm, nf)`
12479///
12480/// # Arguments
12481/// - `vd` — Vector register operand.
12482/// - `rs1` — Memory base register.
12483/// - `vs2` — Vector register operand.
12484/// - `vm` — Vector mask control.
12485/// - `nf` — Vector segment field count.
12486pub trait Vloxei16VEmitter<T0, T1, T2, T3, T4> {
12487 fn vloxei16_v(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
12488}
12489
12490/// RISC-V `vloxei32.v` instruction.
12491///
12492/// # Forms
12493/// Assembly: `vloxei32.v vm, vs2, xs1, vd`
12494/// Rust: `vloxei32_v(vd, rs1, vs2, vm, nf)`
12495///
12496/// # Arguments
12497/// - `vd` — Vector register operand.
12498/// - `rs1` — Memory base register.
12499/// - `vs2` — Vector register operand.
12500/// - `vm` — Vector mask control.
12501/// - `nf` — Vector segment field count.
12502pub trait Vloxei32VEmitter<T0, T1, T2, T3, T4> {
12503 fn vloxei32_v(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
12504}
12505
12506/// RISC-V `vloxei64.v` instruction.
12507///
12508/// # Forms
12509/// Assembly: `vloxei64.v vm, vs2, xs1, vd`
12510/// Rust: `vloxei64_v(vd, rs1, vs2, vm, nf)`
12511///
12512/// # Arguments
12513/// - `vd` — Vector register operand.
12514/// - `rs1` — Memory base register.
12515/// - `vs2` — Vector register operand.
12516/// - `vm` — Vector mask control.
12517/// - `nf` — Vector segment field count.
12518pub trait Vloxei64VEmitter<T0, T1, T2, T3, T4> {
12519 fn vloxei64_v(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
12520}
12521
12522/// RISC-V `vloxei8.v` instruction.
12523///
12524/// # Forms
12525/// Assembly: `vloxei8.v vm, vs2, xs1, vd`
12526/// Rust: `vloxei8_v(vd, rs1, vs2, vm, nf)`
12527///
12528/// # Arguments
12529/// - `vd` — Vector register operand.
12530/// - `rs1` — Memory base register.
12531/// - `vs2` — Vector register operand.
12532/// - `vm` — Vector mask control.
12533/// - `nf` — Vector segment field count.
12534pub trait Vloxei8VEmitter<T0, T1, T2, T3, T4> {
12535 fn vloxei8_v(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
12536}
12537
12538/// RISC-V `vlse16.v` instruction.
12539///
12540/// # Forms
12541/// Assembly: `vlse16.v vm, xs2, xs1, vd`
12542/// Rust: `vlse16_v(vd, rs1, rs2, vm, nf)`
12543///
12544/// # Arguments
12545/// - `vd` — Vector register operand.
12546/// - `rs1` — Memory base register.
12547/// - `rs2` — Source register.
12548/// - `vm` — Vector mask control.
12549/// - `nf` — Vector segment field count.
12550pub trait Vlse16VEmitter<T0, T1, T2, T3, T4> {
12551 fn vlse16_v(&mut self, vd: T0, rs1: T1, rs2: T2, vm: T3, nf: T4);
12552}
12553
12554/// RISC-V `vlse32.v` instruction.
12555///
12556/// # Forms
12557/// Assembly: `vlse32.v vm, xs2, xs1, vd`
12558/// Rust: `vlse32_v(vd, rs1, rs2, vm, nf)`
12559///
12560/// # Arguments
12561/// - `vd` — Vector register operand.
12562/// - `rs1` — Memory base register.
12563/// - `rs2` — Source register.
12564/// - `vm` — Vector mask control.
12565/// - `nf` — Vector segment field count.
12566pub trait Vlse32VEmitter<T0, T1, T2, T3, T4> {
12567 fn vlse32_v(&mut self, vd: T0, rs1: T1, rs2: T2, vm: T3, nf: T4);
12568}
12569
12570/// RISC-V `vlse64.v` instruction.
12571///
12572/// # Forms
12573/// Assembly: `vlse64.v vm, xs2, xs1, vd`
12574/// Rust: `vlse64_v(vd, rs1, rs2, vm, nf)`
12575///
12576/// # Arguments
12577/// - `vd` — Vector register operand.
12578/// - `rs1` — Memory base register.
12579/// - `rs2` — Source register.
12580/// - `vm` — Vector mask control.
12581/// - `nf` — Vector segment field count.
12582pub trait Vlse64VEmitter<T0, T1, T2, T3, T4> {
12583 fn vlse64_v(&mut self, vd: T0, rs1: T1, rs2: T2, vm: T3, nf: T4);
12584}
12585
12586/// RISC-V `vlse8.v` instruction.
12587///
12588/// # Forms
12589/// Assembly: `vlse8.v vm, xs2, xs1, vd`
12590/// Rust: `vlse8_v(vd, rs1, rs2, vm, nf)`
12591///
12592/// # Arguments
12593/// - `vd` — Vector register operand.
12594/// - `rs1` — Memory base register.
12595/// - `rs2` — Source register.
12596/// - `vm` — Vector mask control.
12597/// - `nf` — Vector segment field count.
12598pub trait Vlse8VEmitter<T0, T1, T2, T3, T4> {
12599 fn vlse8_v(&mut self, vd: T0, rs1: T1, rs2: T2, vm: T3, nf: T4);
12600}
12601
12602/// RISC-V `vluxei16.v` instruction.
12603///
12604/// # Forms
12605/// Assembly: `vluxei16.v vm, vs2, xs1, vd`
12606/// Rust: `vluxei16_v(vd, rs1, vs2, vm, nf)`
12607///
12608/// # Arguments
12609/// - `vd` — Vector register operand.
12610/// - `rs1` — Memory base register.
12611/// - `vs2` — Vector register operand.
12612/// - `vm` — Vector mask control.
12613/// - `nf` — Vector segment field count.
12614pub trait Vluxei16VEmitter<T0, T1, T2, T3, T4> {
12615 fn vluxei16_v(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
12616}
12617
12618/// RISC-V `vluxei32.v` instruction.
12619///
12620/// # Forms
12621/// Assembly: `vluxei32.v vm, vs2, xs1, vd`
12622/// Rust: `vluxei32_v(vd, rs1, vs2, vm, nf)`
12623///
12624/// # Arguments
12625/// - `vd` — Vector register operand.
12626/// - `rs1` — Memory base register.
12627/// - `vs2` — Vector register operand.
12628/// - `vm` — Vector mask control.
12629/// - `nf` — Vector segment field count.
12630pub trait Vluxei32VEmitter<T0, T1, T2, T3, T4> {
12631 fn vluxei32_v(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
12632}
12633
12634/// RISC-V `vluxei64.v` instruction.
12635///
12636/// # Forms
12637/// Assembly: `vluxei64.v vm, vs2, xs1, vd`
12638/// Rust: `vluxei64_v(vd, rs1, vs2, vm, nf)`
12639///
12640/// # Arguments
12641/// - `vd` — Vector register operand.
12642/// - `rs1` — Memory base register.
12643/// - `vs2` — Vector register operand.
12644/// - `vm` — Vector mask control.
12645/// - `nf` — Vector segment field count.
12646pub trait Vluxei64VEmitter<T0, T1, T2, T3, T4> {
12647 fn vluxei64_v(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
12648}
12649
12650/// RISC-V `vluxei8.v` instruction.
12651///
12652/// # Forms
12653/// Assembly: `vluxei8.v vm, vs2, xs1, vd`
12654/// Rust: `vluxei8_v(vd, rs1, vs2, vm, nf)`
12655///
12656/// # Arguments
12657/// - `vd` — Vector register operand.
12658/// - `rs1` — Memory base register.
12659/// - `vs2` — Vector register operand.
12660/// - `vm` — Vector mask control.
12661/// - `nf` — Vector segment field count.
12662pub trait Vluxei8VEmitter<T0, T1, T2, T3, T4> {
12663 fn vluxei8_v(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
12664}
12665
12666/// RISC-V `vmacc.vv` instruction.
12667///
12668/// # Forms
12669/// Assembly: `vmacc.vv vm, vs2, vs1, vd`
12670/// Rust: `vmacc_vv(vd, vs1, vs2, vm)`
12671///
12672/// # Arguments
12673/// - `vd` — Vector register operand.
12674/// - `vs1` — Vector register operand.
12675/// - `vs2` — Vector register operand.
12676/// - `vm` — Vector mask control.
12677pub trait VmaccVvEmitter<T0, T1, T2, T3> {
12678 fn vmacc_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
12679}
12680
12681/// RISC-V `vmacc.vx` instruction.
12682///
12683/// # Forms
12684/// Assembly: `vmacc.vx vm, vs2, xs1, vd`
12685/// Rust: `vmacc_vx(vd, vs2, rs1, vm)`
12686///
12687/// # Arguments
12688/// - `vd` — Vector register operand.
12689/// - `vs2` — Vector register operand.
12690/// - `rs1` — Source register.
12691/// - `vm` — Vector mask control.
12692pub trait VmaccVxEmitter<T0, T1, T2, T3> {
12693 fn vmacc_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
12694}
12695
12696/// RISC-V `vmadc.vi` instruction.
12697///
12698/// # Forms
12699/// Assembly: `vmadc.vi vs2, vd, imm`
12700/// Rust: `vmadc_vi(vd, vs2, simm5)`
12701///
12702/// # Arguments
12703/// - `vd` — Vector register operand.
12704/// - `vs2` — Vector register operand.
12705/// - `simm5` — Immediate encoding value.
12706pub trait VmadcViEmitter<T0, T1, T2> {
12707 fn vmadc_vi(&mut self, vd: T0, vs2: T1, simm5: T2);
12708}
12709
12710/// RISC-V `vmadc.vim` instruction.
12711///
12712/// # Forms
12713/// Assembly: `vmadc.vim vs2, vd, imm`
12714/// Rust: `vmadc_vim(vd, vs2, simm5)`
12715///
12716/// # Arguments
12717/// - `vd` — Vector register operand.
12718/// - `vs2` — Vector register operand.
12719/// - `simm5` — Immediate encoding value.
12720pub trait VmadcVimEmitter<T0, T1, T2> {
12721 fn vmadc_vim(&mut self, vd: T0, vs2: T1, simm5: T2);
12722}
12723
12724/// RISC-V `vmadc.vv` instruction.
12725///
12726/// # Forms
12727/// Assembly: `vmadc.vv vs2, vs1, vd`
12728/// Rust: `vmadc_vv(vd, vs1, vs2)`
12729///
12730/// # Arguments
12731/// - `vd` — Vector register operand.
12732/// - `vs1` — Vector register operand.
12733/// - `vs2` — Vector register operand.
12734pub trait VmadcVvEmitter<T0, T1, T2> {
12735 fn vmadc_vv(&mut self, vd: T0, vs1: T1, vs2: T2);
12736}
12737
12738/// RISC-V `vmadc.vvm` instruction.
12739///
12740/// # Forms
12741/// Assembly: `vmadc.vvm vs2, vs1, vd`
12742/// Rust: `vmadc_vvm(vd, vs1, vs2)`
12743///
12744/// # Arguments
12745/// - `vd` — Vector register operand.
12746/// - `vs1` — Vector register operand.
12747/// - `vs2` — Vector register operand.
12748pub trait VmadcVvmEmitter<T0, T1, T2> {
12749 fn vmadc_vvm(&mut self, vd: T0, vs1: T1, vs2: T2);
12750}
12751
12752/// RISC-V `vmadc.vx` instruction.
12753///
12754/// # Forms
12755/// Assembly: `vmadc.vx vs2, xs1, vd`
12756/// Rust: `vmadc_vx(vd, rs1, vs2)`
12757///
12758/// # Arguments
12759/// - `vd` — Vector register operand.
12760/// - `rs1` — Source register.
12761/// - `vs2` — Vector register operand.
12762pub trait VmadcVxEmitter<T0, T1, T2> {
12763 fn vmadc_vx(&mut self, vd: T0, rs1: T1, vs2: T2);
12764}
12765
12766/// RISC-V `vmadc.vxm` instruction.
12767///
12768/// # Forms
12769/// Assembly: `vmadc.vxm vs2, xs1, vd`
12770/// Rust: `vmadc_vxm(vd, rs1, vs2)`
12771///
12772/// # Arguments
12773/// - `vd` — Vector register operand.
12774/// - `rs1` — Source register.
12775/// - `vs2` — Vector register operand.
12776pub trait VmadcVxmEmitter<T0, T1, T2> {
12777 fn vmadc_vxm(&mut self, vd: T0, rs1: T1, vs2: T2);
12778}
12779
12780/// RISC-V `vmadd.vv` instruction.
12781///
12782/// # Forms
12783/// Assembly: `vmadd.vv vm, vs2, vs1, vd`
12784/// Rust: `vmadd_vv(vd, vs1, vs2, vm)`
12785///
12786/// # Arguments
12787/// - `vd` — Vector register operand.
12788/// - `vs1` — Vector register operand.
12789/// - `vs2` — Vector register operand.
12790/// - `vm` — Vector mask control.
12791pub trait VmaddVvEmitter<T0, T1, T2, T3> {
12792 fn vmadd_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
12793}
12794
12795/// RISC-V `vmadd.vx` instruction.
12796///
12797/// # Forms
12798/// Assembly: `vmadd.vx vm, vs2, xs1, vd`
12799/// Rust: `vmadd_vx(vd, vs2, rs1, vm)`
12800///
12801/// # Arguments
12802/// - `vd` — Vector register operand.
12803/// - `vs2` — Vector register operand.
12804/// - `rs1` — Source register.
12805/// - `vm` — Vector mask control.
12806pub trait VmaddVxEmitter<T0, T1, T2, T3> {
12807 fn vmadd_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
12808}
12809
12810/// RISC-V `vmand.mm` instruction.
12811///
12812/// # Forms
12813/// Assembly: `vmand.mm vs2, vs1, vd`
12814/// Rust: `vmand_mm(vd, vs1, vs2)`
12815///
12816/// # Arguments
12817/// - `vd` — Vector register operand.
12818/// - `vs1` — Vector register operand.
12819/// - `vs2` — Vector register operand.
12820pub trait VmandMmEmitter<T0, T1, T2> {
12821 fn vmand_mm(&mut self, vd: T0, vs1: T1, vs2: T2);
12822}
12823
12824/// RISC-V `vmandn.mm` instruction.
12825///
12826/// # Forms
12827/// Assembly: `vmandn.mm vs2, vs1, vd`
12828/// Rust: `vmandn_mm(vd, vs1, vs2)`
12829///
12830/// # Arguments
12831/// - `vd` — Vector register operand.
12832/// - `vs1` — Vector register operand.
12833/// - `vs2` — Vector register operand.
12834pub trait VmandnMmEmitter<T0, T1, T2> {
12835 fn vmandn_mm(&mut self, vd: T0, vs1: T1, vs2: T2);
12836}
12837
12838/// RISC-V `vmandnot.mm` instruction.
12839///
12840/// # Forms
12841/// Assembly: `vmandnot.mm vd vs1 vs2 vm`
12842/// Rust: `vmandnot_mm(vd, vs1, vs2, vm)`
12843///
12844/// # Arguments
12845/// - `vd` — Vector register operand.
12846/// - `vs1` — Vector register operand.
12847/// - `vs2` — Vector register operand.
12848/// - `vm` — Vector mask control.
12849pub trait VmandnotMmEmitter<T0, T1, T2, T3> {
12850 fn vmandnot_mm(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
12851}
12852
12853/// RISC-V `vmax.vv` instruction.
12854///
12855/// # Forms
12856/// Assembly: `vmax.vv vm, vs2, vs1, vd`
12857/// Rust: `vmax_vv(vd, vs1, vs2, vm)`
12858///
12859/// # Arguments
12860/// - `vd` — Vector register operand.
12861/// - `vs1` — Vector register operand.
12862/// - `vs2` — Vector register operand.
12863/// - `vm` — Vector mask control.
12864pub trait VmaxVvEmitter<T0, T1, T2, T3> {
12865 fn vmax_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
12866}
12867
12868/// RISC-V `vmax.vx` instruction.
12869///
12870/// # Forms
12871/// Assembly: `vmax.vx vm, vs2, xs1, vd`
12872/// Rust: `vmax_vx(vd, vs2, rs1, vm)`
12873///
12874/// # Arguments
12875/// - `vd` — Vector register operand.
12876/// - `vs2` — Vector register operand.
12877/// - `rs1` — Source register.
12878/// - `vm` — Vector mask control.
12879pub trait VmaxVxEmitter<T0, T1, T2, T3> {
12880 fn vmax_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
12881}
12882
12883/// RISC-V `vmaxu.vv` instruction.
12884///
12885/// # Forms
12886/// Assembly: `vmaxu.vv vm, vs2, vs1, vd`
12887/// Rust: `vmaxu_vv(vd, vs1, vs2, vm)`
12888///
12889/// # Arguments
12890/// - `vd` — Vector register operand.
12891/// - `vs1` — Vector register operand.
12892/// - `vs2` — Vector register operand.
12893/// - `vm` — Vector mask control.
12894pub trait VmaxuVvEmitter<T0, T1, T2, T3> {
12895 fn vmaxu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
12896}
12897
12898/// RISC-V `vmaxu.vx` instruction.
12899///
12900/// # Forms
12901/// Assembly: `vmaxu.vx vm, vs2, xs1, vd`
12902/// Rust: `vmaxu_vx(vd, vs2, rs1, vm)`
12903///
12904/// # Arguments
12905/// - `vd` — Vector register operand.
12906/// - `vs2` — Vector register operand.
12907/// - `rs1` — Source register.
12908/// - `vm` — Vector mask control.
12909pub trait VmaxuVxEmitter<T0, T1, T2, T3> {
12910 fn vmaxu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
12911}
12912
12913/// RISC-V `vmerge.vim` instruction.
12914///
12915/// # Forms
12916/// Assembly: `vmerge.vim vs2, vd, imm`
12917/// Rust: `vmerge_vim(vd, vs2, simm5)`
12918///
12919/// # Arguments
12920/// - `vd` — Vector register operand.
12921/// - `vs2` — Vector register operand.
12922/// - `simm5` — Immediate encoding value.
12923pub trait VmergeVimEmitter<T0, T1, T2> {
12924 fn vmerge_vim(&mut self, vd: T0, vs2: T1, simm5: T2);
12925}
12926
12927/// RISC-V `vmerge.vvm` instruction.
12928///
12929/// # Forms
12930/// Assembly: `vmerge.vvm vs2, vs1, vd`
12931/// Rust: `vmerge_vvm(vd, vs1, vs2)`
12932///
12933/// # Arguments
12934/// - `vd` — Vector register operand.
12935/// - `vs1` — Vector register operand.
12936/// - `vs2` — Vector register operand.
12937pub trait VmergeVvmEmitter<T0, T1, T2> {
12938 fn vmerge_vvm(&mut self, vd: T0, vs1: T1, vs2: T2);
12939}
12940
12941/// RISC-V `vmerge.vxm` instruction.
12942///
12943/// # Forms
12944/// Assembly: `vmerge.vxm vs2, xs1, vd`
12945/// Rust: `vmerge_vxm(vd, rs1, vs2)`
12946///
12947/// # Arguments
12948/// - `vd` — Vector register operand.
12949/// - `rs1` — Source register.
12950/// - `vs2` — Vector register operand.
12951pub trait VmergeVxmEmitter<T0, T1, T2> {
12952 fn vmerge_vxm(&mut self, vd: T0, rs1: T1, vs2: T2);
12953}
12954
12955/// RISC-V `vmfeq.vf` instruction.
12956///
12957/// # Forms
12958/// Assembly: `vmfeq.vf vm, vs2, xs1, vd`
12959/// Rust: `vmfeq_vf(vd, vs2, rs1, vm)`
12960///
12961/// # Arguments
12962/// - `vd` — Vector register operand.
12963/// - `vs2` — Vector register operand.
12964/// - `rs1` — Source register.
12965/// - `vm` — Vector mask control.
12966pub trait VmfeqVfEmitter<T0, T1, T2, T3> {
12967 fn vmfeq_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
12968}
12969
12970/// RISC-V `vmfeq.vv` instruction.
12971///
12972/// # Forms
12973/// Assembly: `vmfeq.vv vm, vs2, vs1, vd`
12974/// Rust: `vmfeq_vv(vd, vs1, vs2, vm)`
12975///
12976/// # Arguments
12977/// - `vd` — Vector register operand.
12978/// - `vs1` — Vector register operand.
12979/// - `vs2` — Vector register operand.
12980/// - `vm` — Vector mask control.
12981pub trait VmfeqVvEmitter<T0, T1, T2, T3> {
12982 fn vmfeq_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
12983}
12984
12985/// RISC-V `vmfge.vf` instruction.
12986///
12987/// # Forms
12988/// Assembly: `vmfge.vf vm, vs2, xs1, vd`
12989/// Rust: `vmfge_vf(vd, vs2, rs1, vm)`
12990///
12991/// # Arguments
12992/// - `vd` — Vector register operand.
12993/// - `vs2` — Vector register operand.
12994/// - `rs1` — Source register.
12995/// - `vm` — Vector mask control.
12996pub trait VmfgeVfEmitter<T0, T1, T2, T3> {
12997 fn vmfge_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
12998}
12999
13000/// RISC-V `vmfgt.vf` instruction.
13001///
13002/// # Forms
13003/// Assembly: `vmfgt.vf vm, vs2, xs1, vd`
13004/// Rust: `vmfgt_vf(vd, vs2, rs1, vm)`
13005///
13006/// # Arguments
13007/// - `vd` — Vector register operand.
13008/// - `vs2` — Vector register operand.
13009/// - `rs1` — Source register.
13010/// - `vm` — Vector mask control.
13011pub trait VmfgtVfEmitter<T0, T1, T2, T3> {
13012 fn vmfgt_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13013}
13014
13015/// RISC-V `vmfle.vf` instruction.
13016///
13017/// # Forms
13018/// Assembly: `vmfle.vf vm, vs2, xs1, vd`
13019/// Rust: `vmfle_vf(vd, vs2, rs1, vm)`
13020///
13021/// # Arguments
13022/// - `vd` — Vector register operand.
13023/// - `vs2` — Vector register operand.
13024/// - `rs1` — Source register.
13025/// - `vm` — Vector mask control.
13026pub trait VmfleVfEmitter<T0, T1, T2, T3> {
13027 fn vmfle_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13028}
13029
13030/// RISC-V `vmfle.vv` instruction.
13031///
13032/// # Forms
13033/// Assembly: `vmfle.vv vm, vs2, vs1, vd`
13034/// Rust: `vmfle_vv(vd, vs1, vs2, vm)`
13035///
13036/// # Arguments
13037/// - `vd` — Vector register operand.
13038/// - `vs1` — Vector register operand.
13039/// - `vs2` — Vector register operand.
13040/// - `vm` — Vector mask control.
13041pub trait VmfleVvEmitter<T0, T1, T2, T3> {
13042 fn vmfle_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13043}
13044
13045/// RISC-V `vmflt.vf` instruction.
13046///
13047/// # Forms
13048/// Assembly: `vmflt.vf vm, vs2, xs1, vd`
13049/// Rust: `vmflt_vf(vd, vs2, rs1, vm)`
13050///
13051/// # Arguments
13052/// - `vd` — Vector register operand.
13053/// - `vs2` — Vector register operand.
13054/// - `rs1` — Source register.
13055/// - `vm` — Vector mask control.
13056pub trait VmfltVfEmitter<T0, T1, T2, T3> {
13057 fn vmflt_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13058}
13059
13060/// RISC-V `vmflt.vv` instruction.
13061///
13062/// # Forms
13063/// Assembly: `vmflt.vv vm, vs2, vs1, vd`
13064/// Rust: `vmflt_vv(vd, vs1, vs2, vm)`
13065///
13066/// # Arguments
13067/// - `vd` — Vector register operand.
13068/// - `vs1` — Vector register operand.
13069/// - `vs2` — Vector register operand.
13070/// - `vm` — Vector mask control.
13071pub trait VmfltVvEmitter<T0, T1, T2, T3> {
13072 fn vmflt_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13073}
13074
13075/// RISC-V `vmfne.vf` instruction.
13076///
13077/// # Forms
13078/// Assembly: `vmfne.vf vm, vs2, xs1, vd`
13079/// Rust: `vmfne_vf(vd, vs2, rs1, vm)`
13080///
13081/// # Arguments
13082/// - `vd` — Vector register operand.
13083/// - `vs2` — Vector register operand.
13084/// - `rs1` — Source register.
13085/// - `vm` — Vector mask control.
13086pub trait VmfneVfEmitter<T0, T1, T2, T3> {
13087 fn vmfne_vf(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13088}
13089
13090/// RISC-V `vmfne.vv` instruction.
13091///
13092/// # Forms
13093/// Assembly: `vmfne.vv vm, vs2, vs1, vd`
13094/// Rust: `vmfne_vv(vd, vs1, vs2, vm)`
13095///
13096/// # Arguments
13097/// - `vd` — Vector register operand.
13098/// - `vs1` — Vector register operand.
13099/// - `vs2` — Vector register operand.
13100/// - `vm` — Vector mask control.
13101pub trait VmfneVvEmitter<T0, T1, T2, T3> {
13102 fn vmfne_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13103}
13104
13105/// RISC-V `vmin.vv` instruction.
13106///
13107/// # Forms
13108/// Assembly: `vmin.vv vm, vs2, vs1, vd`
13109/// Rust: `vmin_vv(vd, vs1, vs2, vm)`
13110///
13111/// # Arguments
13112/// - `vd` — Vector register operand.
13113/// - `vs1` — Vector register operand.
13114/// - `vs2` — Vector register operand.
13115/// - `vm` — Vector mask control.
13116pub trait VminVvEmitter<T0, T1, T2, T3> {
13117 fn vmin_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13118}
13119
13120/// RISC-V `vmin.vx` instruction.
13121///
13122/// # Forms
13123/// Assembly: `vmin.vx vm, vs2, xs1, vd`
13124/// Rust: `vmin_vx(vd, vs2, rs1, vm)`
13125///
13126/// # Arguments
13127/// - `vd` — Vector register operand.
13128/// - `vs2` — Vector register operand.
13129/// - `rs1` — Source register.
13130/// - `vm` — Vector mask control.
13131pub trait VminVxEmitter<T0, T1, T2, T3> {
13132 fn vmin_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13133}
13134
13135/// RISC-V `vminu.vv` instruction.
13136///
13137/// # Forms
13138/// Assembly: `vminu.vv vm, vs2, vs1, vd`
13139/// Rust: `vminu_vv(vd, vs1, vs2, vm)`
13140///
13141/// # Arguments
13142/// - `vd` — Vector register operand.
13143/// - `vs1` — Vector register operand.
13144/// - `vs2` — Vector register operand.
13145/// - `vm` — Vector mask control.
13146pub trait VminuVvEmitter<T0, T1, T2, T3> {
13147 fn vminu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13148}
13149
13150/// RISC-V `vminu.vx` instruction.
13151///
13152/// # Forms
13153/// Assembly: `vminu.vx vm, vs2, xs1, vd`
13154/// Rust: `vminu_vx(vd, vs2, rs1, vm)`
13155///
13156/// # Arguments
13157/// - `vd` — Vector register operand.
13158/// - `vs2` — Vector register operand.
13159/// - `rs1` — Source register.
13160/// - `vm` — Vector mask control.
13161pub trait VminuVxEmitter<T0, T1, T2, T3> {
13162 fn vminu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13163}
13164
13165/// RISC-V `vmnand.mm` instruction.
13166///
13167/// # Forms
13168/// Assembly: `vmnand.mm vs2, vs1, vd`
13169/// Rust: `vmnand_mm(vd, vs1, vs2)`
13170///
13171/// # Arguments
13172/// - `vd` — Vector register operand.
13173/// - `vs1` — Vector register operand.
13174/// - `vs2` — Vector register operand.
13175pub trait VmnandMmEmitter<T0, T1, T2> {
13176 fn vmnand_mm(&mut self, vd: T0, vs1: T1, vs2: T2);
13177}
13178
13179/// RISC-V `vmnor.mm` instruction.
13180///
13181/// # Forms
13182/// Assembly: `vmnor.mm vs2, vs1, vd`
13183/// Rust: `vmnor_mm(vd, vs1, vs2)`
13184///
13185/// # Arguments
13186/// - `vd` — Vector register operand.
13187/// - `vs1` — Vector register operand.
13188/// - `vs2` — Vector register operand.
13189pub trait VmnorMmEmitter<T0, T1, T2> {
13190 fn vmnor_mm(&mut self, vd: T0, vs1: T1, vs2: T2);
13191}
13192
13193/// RISC-V `vmor.mm` instruction.
13194///
13195/// # Forms
13196/// Assembly: `vmor.mm vs2, vs1, vd`
13197/// Rust: `vmor_mm(vd, vs1, vs2)`
13198///
13199/// # Arguments
13200/// - `vd` — Vector register operand.
13201/// - `vs1` — Vector register operand.
13202/// - `vs2` — Vector register operand.
13203pub trait VmorMmEmitter<T0, T1, T2> {
13204 fn vmor_mm(&mut self, vd: T0, vs1: T1, vs2: T2);
13205}
13206
13207/// RISC-V `vmorn.mm` instruction.
13208///
13209/// # Forms
13210/// Assembly: `vmorn.mm vs2, vs1, vd`
13211/// Rust: `vmorn_mm(vd, vs1, vs2)`
13212///
13213/// # Arguments
13214/// - `vd` — Vector register operand.
13215/// - `vs1` — Vector register operand.
13216/// - `vs2` — Vector register operand.
13217pub trait VmornMmEmitter<T0, T1, T2> {
13218 fn vmorn_mm(&mut self, vd: T0, vs1: T1, vs2: T2);
13219}
13220
13221/// RISC-V `vmornot.mm` instruction.
13222///
13223/// # Forms
13224/// Assembly: `vmornot.mm vd vs1 vs2 vm`
13225/// Rust: `vmornot_mm(vd, vs1, vs2, vm)`
13226///
13227/// # Arguments
13228/// - `vd` — Vector register operand.
13229/// - `vs1` — Vector register operand.
13230/// - `vs2` — Vector register operand.
13231/// - `vm` — Vector mask control.
13232pub trait VmornotMmEmitter<T0, T1, T2, T3> {
13233 fn vmornot_mm(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13234}
13235
13236/// RISC-V `vmsbc.vv` instruction.
13237///
13238/// # Forms
13239/// Assembly: `vmsbc.vv vs2, vs1, vd`
13240/// Rust: `vmsbc_vv(vd, vs1, vs2)`
13241///
13242/// # Arguments
13243/// - `vd` — Vector register operand.
13244/// - `vs1` — Vector register operand.
13245/// - `vs2` — Vector register operand.
13246pub trait VmsbcVvEmitter<T0, T1, T2> {
13247 fn vmsbc_vv(&mut self, vd: T0, vs1: T1, vs2: T2);
13248}
13249
13250/// RISC-V `vmsbc.vvm` instruction.
13251///
13252/// # Forms
13253/// Assembly: `vmsbc.vvm vs2, vs1, vd`
13254/// Rust: `vmsbc_vvm(vd, vs1, vs2)`
13255///
13256/// # Arguments
13257/// - `vd` — Vector register operand.
13258/// - `vs1` — Vector register operand.
13259/// - `vs2` — Vector register operand.
13260pub trait VmsbcVvmEmitter<T0, T1, T2> {
13261 fn vmsbc_vvm(&mut self, vd: T0, vs1: T1, vs2: T2);
13262}
13263
13264/// RISC-V `vmsbc.vx` instruction.
13265///
13266/// # Forms
13267/// Assembly: `vmsbc.vx vs2, xs1, vd`
13268/// Rust: `vmsbc_vx(vd, rs1, vs2)`
13269///
13270/// # Arguments
13271/// - `vd` — Vector register operand.
13272/// - `rs1` — Source register.
13273/// - `vs2` — Vector register operand.
13274pub trait VmsbcVxEmitter<T0, T1, T2> {
13275 fn vmsbc_vx(&mut self, vd: T0, rs1: T1, vs2: T2);
13276}
13277
13278/// RISC-V `vmsbc.vxm` instruction.
13279///
13280/// # Forms
13281/// Assembly: `vmsbc.vxm vs2, xs1, vd`
13282/// Rust: `vmsbc_vxm(vd, rs1, vs2)`
13283///
13284/// # Arguments
13285/// - `vd` — Vector register operand.
13286/// - `rs1` — Source register.
13287/// - `vs2` — Vector register operand.
13288pub trait VmsbcVxmEmitter<T0, T1, T2> {
13289 fn vmsbc_vxm(&mut self, vd: T0, rs1: T1, vs2: T2);
13290}
13291
13292/// RISC-V `vmsbf.m` instruction.
13293///
13294/// # Forms
13295/// Assembly: `vmsbf.m vm, vs2, vd`
13296/// Rust: `vmsbf_m(vd, vs2, vm)`
13297///
13298/// # Arguments
13299/// - `vd` — Vector register operand.
13300/// - `vs2` — Vector register operand.
13301/// - `vm` — Vector mask control.
13302pub trait VmsbfMEmitter<T0, T1, T2> {
13303 fn vmsbf_m(&mut self, vd: T0, vs2: T1, vm: T2);
13304}
13305
13306/// RISC-V `vmseq.vi` instruction.
13307///
13308/// # Forms
13309/// Assembly: `vmseq.vi vm, vs2, vd, imm`
13310/// Rust: `vmseq_vi(vd, vs2, simm5, vm)`
13311///
13312/// # Arguments
13313/// - `vd` — Vector register operand.
13314/// - `vs2` — Vector register operand.
13315/// - `simm5` — Immediate encoding value.
13316/// - `vm` — Vector mask control.
13317pub trait VmseqViEmitter<T0, T1, T2, T3> {
13318 fn vmseq_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
13319}
13320
13321/// RISC-V `vmseq.vv` instruction.
13322///
13323/// # Forms
13324/// Assembly: `vmseq.vv vm, vs2, vs1, vd`
13325/// Rust: `vmseq_vv(vd, vs1, vs2, vm)`
13326///
13327/// # Arguments
13328/// - `vd` — Vector register operand.
13329/// - `vs1` — Vector register operand.
13330/// - `vs2` — Vector register operand.
13331/// - `vm` — Vector mask control.
13332pub trait VmseqVvEmitter<T0, T1, T2, T3> {
13333 fn vmseq_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13334}
13335
13336/// RISC-V `vmseq.vx` instruction.
13337///
13338/// # Forms
13339/// Assembly: `vmseq.vx vm, vs2, xs1, vd`
13340/// Rust: `vmseq_vx(vd, vs2, rs1, vm)`
13341///
13342/// # Arguments
13343/// - `vd` — Vector register operand.
13344/// - `vs2` — Vector register operand.
13345/// - `rs1` — Source register.
13346/// - `vm` — Vector mask control.
13347pub trait VmseqVxEmitter<T0, T1, T2, T3> {
13348 fn vmseq_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13349}
13350
13351/// RISC-V `vmsgt.vi` instruction.
13352///
13353/// # Forms
13354/// Assembly: `vmsgt.vi vm, vs2, vd, imm`
13355/// Rust: `vmsgt_vi(vd, vs2, simm5, vm)`
13356///
13357/// # Arguments
13358/// - `vd` — Vector register operand.
13359/// - `vs2` — Vector register operand.
13360/// - `simm5` — Immediate encoding value.
13361/// - `vm` — Vector mask control.
13362pub trait VmsgtViEmitter<T0, T1, T2, T3> {
13363 fn vmsgt_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
13364}
13365
13366/// RISC-V `vmsgt.vx` instruction.
13367///
13368/// # Forms
13369/// Assembly: `vmsgt.vx vm, vs2, xs1, vd`
13370/// Rust: `vmsgt_vx(vd, vs2, rs1, vm)`
13371///
13372/// # Arguments
13373/// - `vd` — Vector register operand.
13374/// - `vs2` — Vector register operand.
13375/// - `rs1` — Source register.
13376/// - `vm` — Vector mask control.
13377pub trait VmsgtVxEmitter<T0, T1, T2, T3> {
13378 fn vmsgt_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13379}
13380
13381/// RISC-V `vmsgtu.vi` instruction.
13382///
13383/// # Forms
13384/// Assembly: `vmsgtu.vi vm, vs2, vd, imm`
13385/// Rust: `vmsgtu_vi(vd, vs2, simm5, vm)`
13386///
13387/// # Arguments
13388/// - `vd` — Vector register operand.
13389/// - `vs2` — Vector register operand.
13390/// - `simm5` — Immediate encoding value.
13391/// - `vm` — Vector mask control.
13392pub trait VmsgtuViEmitter<T0, T1, T2, T3> {
13393 fn vmsgtu_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
13394}
13395
13396/// RISC-V `vmsgtu.vx` instruction.
13397///
13398/// # Forms
13399/// Assembly: `vmsgtu.vx vm, vs2, xs1, vd`
13400/// Rust: `vmsgtu_vx(vd, vs2, rs1, vm)`
13401///
13402/// # Arguments
13403/// - `vd` — Vector register operand.
13404/// - `vs2` — Vector register operand.
13405/// - `rs1` — Source register.
13406/// - `vm` — Vector mask control.
13407pub trait VmsgtuVxEmitter<T0, T1, T2, T3> {
13408 fn vmsgtu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13409}
13410
13411/// RISC-V `vmsif.m` instruction.
13412///
13413/// # Forms
13414/// Assembly: `vmsif.m vm, vs2, vd`
13415/// Rust: `vmsif_m(vd, vs2, vm)`
13416///
13417/// # Arguments
13418/// - `vd` — Vector register operand.
13419/// - `vs2` — Vector register operand.
13420/// - `vm` — Vector mask control.
13421pub trait VmsifMEmitter<T0, T1, T2> {
13422 fn vmsif_m(&mut self, vd: T0, vs2: T1, vm: T2);
13423}
13424
13425/// RISC-V `vmsle.vi` instruction.
13426///
13427/// # Forms
13428/// Assembly: `vmsle.vi vm, vs2, vd, imm`
13429/// Rust: `vmsle_vi(vd, vs2, simm5, vm)`
13430///
13431/// # Arguments
13432/// - `vd` — Vector register operand.
13433/// - `vs2` — Vector register operand.
13434/// - `simm5` — Immediate encoding value.
13435/// - `vm` — Vector mask control.
13436pub trait VmsleViEmitter<T0, T1, T2, T3> {
13437 fn vmsle_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
13438}
13439
13440/// RISC-V `vmsle.vv` instruction.
13441///
13442/// # Forms
13443/// Assembly: `vmsle.vv vm, vs2, vs1, vd`
13444/// Rust: `vmsle_vv(vd, vs1, vs2, vm)`
13445///
13446/// # Arguments
13447/// - `vd` — Vector register operand.
13448/// - `vs1` — Vector register operand.
13449/// - `vs2` — Vector register operand.
13450/// - `vm` — Vector mask control.
13451pub trait VmsleVvEmitter<T0, T1, T2, T3> {
13452 fn vmsle_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13453}
13454
13455/// RISC-V `vmsle.vx` instruction.
13456///
13457/// # Forms
13458/// Assembly: `vmsle.vx vm, vs2, xs1, vd`
13459/// Rust: `vmsle_vx(vd, vs2, rs1, vm)`
13460///
13461/// # Arguments
13462/// - `vd` — Vector register operand.
13463/// - `vs2` — Vector register operand.
13464/// - `rs1` — Source register.
13465/// - `vm` — Vector mask control.
13466pub trait VmsleVxEmitter<T0, T1, T2, T3> {
13467 fn vmsle_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13468}
13469
13470/// RISC-V `vmsleu.vi` instruction.
13471///
13472/// # Forms
13473/// Assembly: `vmsleu.vi vm, vs2, vd, imm`
13474/// Rust: `vmsleu_vi(vd, vs2, simm5, vm)`
13475///
13476/// # Arguments
13477/// - `vd` — Vector register operand.
13478/// - `vs2` — Vector register operand.
13479/// - `simm5` — Immediate encoding value.
13480/// - `vm` — Vector mask control.
13481pub trait VmsleuViEmitter<T0, T1, T2, T3> {
13482 fn vmsleu_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
13483}
13484
13485/// RISC-V `vmsleu.vv` instruction.
13486///
13487/// # Forms
13488/// Assembly: `vmsleu.vv vm, vs2, vs1, vd`
13489/// Rust: `vmsleu_vv(vd, vs1, vs2, vm)`
13490///
13491/// # Arguments
13492/// - `vd` — Vector register operand.
13493/// - `vs1` — Vector register operand.
13494/// - `vs2` — Vector register operand.
13495/// - `vm` — Vector mask control.
13496pub trait VmsleuVvEmitter<T0, T1, T2, T3> {
13497 fn vmsleu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13498}
13499
13500/// RISC-V `vmsleu.vx` instruction.
13501///
13502/// # Forms
13503/// Assembly: `vmsleu.vx vm, vs2, xs1, vd`
13504/// Rust: `vmsleu_vx(vd, vs2, rs1, vm)`
13505///
13506/// # Arguments
13507/// - `vd` — Vector register operand.
13508/// - `vs2` — Vector register operand.
13509/// - `rs1` — Source register.
13510/// - `vm` — Vector mask control.
13511pub trait VmsleuVxEmitter<T0, T1, T2, T3> {
13512 fn vmsleu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13513}
13514
13515/// RISC-V `vmslt.vv` instruction.
13516///
13517/// # Forms
13518/// Assembly: `vmslt.vv vm, vs2, vs1, vd`
13519/// Rust: `vmslt_vv(vd, vs1, vs2, vm)`
13520///
13521/// # Arguments
13522/// - `vd` — Vector register operand.
13523/// - `vs1` — Vector register operand.
13524/// - `vs2` — Vector register operand.
13525/// - `vm` — Vector mask control.
13526pub trait VmsltVvEmitter<T0, T1, T2, T3> {
13527 fn vmslt_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13528}
13529
13530/// RISC-V `vmslt.vx` instruction.
13531///
13532/// # Forms
13533/// Assembly: `vmslt.vx vm, vs2, xs1, vd`
13534/// Rust: `vmslt_vx(vd, vs2, rs1, vm)`
13535///
13536/// # Arguments
13537/// - `vd` — Vector register operand.
13538/// - `vs2` — Vector register operand.
13539/// - `rs1` — Source register.
13540/// - `vm` — Vector mask control.
13541pub trait VmsltVxEmitter<T0, T1, T2, T3> {
13542 fn vmslt_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13543}
13544
13545/// RISC-V `vmsltu.vv` instruction.
13546///
13547/// # Forms
13548/// Assembly: `vmsltu.vv vm, vs2, vs1, vd`
13549/// Rust: `vmsltu_vv(vd, vs1, vs2, vm)`
13550///
13551/// # Arguments
13552/// - `vd` — Vector register operand.
13553/// - `vs1` — Vector register operand.
13554/// - `vs2` — Vector register operand.
13555/// - `vm` — Vector mask control.
13556pub trait VmsltuVvEmitter<T0, T1, T2, T3> {
13557 fn vmsltu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13558}
13559
13560/// RISC-V `vmsltu.vx` instruction.
13561///
13562/// # Forms
13563/// Assembly: `vmsltu.vx vm, vs2, xs1, vd`
13564/// Rust: `vmsltu_vx(vd, vs2, rs1, vm)`
13565///
13566/// # Arguments
13567/// - `vd` — Vector register operand.
13568/// - `vs2` — Vector register operand.
13569/// - `rs1` — Source register.
13570/// - `vm` — Vector mask control.
13571pub trait VmsltuVxEmitter<T0, T1, T2, T3> {
13572 fn vmsltu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13573}
13574
13575/// RISC-V `vmsne.vi` instruction.
13576///
13577/// # Forms
13578/// Assembly: `vmsne.vi vm, vs2, vd, imm`
13579/// Rust: `vmsne_vi(vd, vs2, simm5, vm)`
13580///
13581/// # Arguments
13582/// - `vd` — Vector register operand.
13583/// - `vs2` — Vector register operand.
13584/// - `simm5` — Immediate encoding value.
13585/// - `vm` — Vector mask control.
13586pub trait VmsneViEmitter<T0, T1, T2, T3> {
13587 fn vmsne_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
13588}
13589
13590/// RISC-V `vmsne.vv` instruction.
13591///
13592/// # Forms
13593/// Assembly: `vmsne.vv vm, vs2, vs1, vd`
13594/// Rust: `vmsne_vv(vd, vs1, vs2, vm)`
13595///
13596/// # Arguments
13597/// - `vd` — Vector register operand.
13598/// - `vs1` — Vector register operand.
13599/// - `vs2` — Vector register operand.
13600/// - `vm` — Vector mask control.
13601pub trait VmsneVvEmitter<T0, T1, T2, T3> {
13602 fn vmsne_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13603}
13604
13605/// RISC-V `vmsne.vx` instruction.
13606///
13607/// # Forms
13608/// Assembly: `vmsne.vx vm, vs2, xs1, vd`
13609/// Rust: `vmsne_vx(vd, vs2, rs1, vm)`
13610///
13611/// # Arguments
13612/// - `vd` — Vector register operand.
13613/// - `vs2` — Vector register operand.
13614/// - `rs1` — Source register.
13615/// - `vm` — Vector mask control.
13616pub trait VmsneVxEmitter<T0, T1, T2, T3> {
13617 fn vmsne_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13618}
13619
13620/// RISC-V `vmsof.m` instruction.
13621///
13622/// # Forms
13623/// Assembly: `vmsof.m vm, vs2, vd`
13624/// Rust: `vmsof_m(vd, vs2, vm)`
13625///
13626/// # Arguments
13627/// - `vd` — Vector register operand.
13628/// - `vs2` — Vector register operand.
13629/// - `vm` — Vector mask control.
13630pub trait VmsofMEmitter<T0, T1, T2> {
13631 fn vmsof_m(&mut self, vd: T0, vs2: T1, vm: T2);
13632}
13633
13634/// RISC-V `vmul.vv` instruction.
13635///
13636/// # Forms
13637/// Assembly: `vmul.vv vm, vs2, vs1, vd`
13638/// Rust: `vmul_vv(vd, vs1, vs2, vm)`
13639///
13640/// # Arguments
13641/// - `vd` — Vector register operand.
13642/// - `vs1` — Vector register operand.
13643/// - `vs2` — Vector register operand.
13644/// - `vm` — Vector mask control.
13645pub trait VmulVvEmitter<T0, T1, T2, T3> {
13646 fn vmul_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13647}
13648
13649/// RISC-V `vmul.vx` instruction.
13650///
13651/// # Forms
13652/// Assembly: `vmul.vx vm, vs2, xs1, vd`
13653/// Rust: `vmul_vx(vd, vs2, rs1, vm)`
13654///
13655/// # Arguments
13656/// - `vd` — Vector register operand.
13657/// - `vs2` — Vector register operand.
13658/// - `rs1` — Source register.
13659/// - `vm` — Vector mask control.
13660pub trait VmulVxEmitter<T0, T1, T2, T3> {
13661 fn vmul_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13662}
13663
13664/// RISC-V `vmulh.vv` instruction.
13665///
13666/// # Forms
13667/// Assembly: `vmulh.vv vm, vs2, vs1, vd`
13668/// Rust: `vmulh_vv(vd, vs1, vs2, vm)`
13669///
13670/// # Arguments
13671/// - `vd` — Vector register operand.
13672/// - `vs1` — Vector register operand.
13673/// - `vs2` — Vector register operand.
13674/// - `vm` — Vector mask control.
13675pub trait VmulhVvEmitter<T0, T1, T2, T3> {
13676 fn vmulh_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13677}
13678
13679/// RISC-V `vmulh.vx` instruction.
13680///
13681/// # Forms
13682/// Assembly: `vmulh.vx vm, vs2, xs1, vd`
13683/// Rust: `vmulh_vx(vd, vs2, rs1, vm)`
13684///
13685/// # Arguments
13686/// - `vd` — Vector register operand.
13687/// - `vs2` — Vector register operand.
13688/// - `rs1` — Source register.
13689/// - `vm` — Vector mask control.
13690pub trait VmulhVxEmitter<T0, T1, T2, T3> {
13691 fn vmulh_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13692}
13693
13694/// RISC-V `vmulhsu.vv` instruction.
13695///
13696/// # Forms
13697/// Assembly: `vmulhsu.vv vm, vs2, vs1, vd`
13698/// Rust: `vmulhsu_vv(vd, vs1, vs2, vm)`
13699///
13700/// # Arguments
13701/// - `vd` — Vector register operand.
13702/// - `vs1` — Vector register operand.
13703/// - `vs2` — Vector register operand.
13704/// - `vm` — Vector mask control.
13705pub trait VmulhsuVvEmitter<T0, T1, T2, T3> {
13706 fn vmulhsu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13707}
13708
13709/// RISC-V `vmulhsu.vx` instruction.
13710///
13711/// # Forms
13712/// Assembly: `vmulhsu.vx vm, vs2, xs1, vd`
13713/// Rust: `vmulhsu_vx(vd, vs2, rs1, vm)`
13714///
13715/// # Arguments
13716/// - `vd` — Vector register operand.
13717/// - `vs2` — Vector register operand.
13718/// - `rs1` — Source register.
13719/// - `vm` — Vector mask control.
13720pub trait VmulhsuVxEmitter<T0, T1, T2, T3> {
13721 fn vmulhsu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13722}
13723
13724/// RISC-V `vmulhu.vv` instruction.
13725///
13726/// # Forms
13727/// Assembly: `vmulhu.vv vm, vs2, vs1, vd`
13728/// Rust: `vmulhu_vv(vd, vs1, vs2, vm)`
13729///
13730/// # Arguments
13731/// - `vd` — Vector register operand.
13732/// - `vs1` — Vector register operand.
13733/// - `vs2` — Vector register operand.
13734/// - `vm` — Vector mask control.
13735pub trait VmulhuVvEmitter<T0, T1, T2, T3> {
13736 fn vmulhu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13737}
13738
13739/// RISC-V `vmulhu.vx` instruction.
13740///
13741/// # Forms
13742/// Assembly: `vmulhu.vx vm, vs2, xs1, vd`
13743/// Rust: `vmulhu_vx(vd, vs2, rs1, vm)`
13744///
13745/// # Arguments
13746/// - `vd` — Vector register operand.
13747/// - `vs2` — Vector register operand.
13748/// - `rs1` — Source register.
13749/// - `vm` — Vector mask control.
13750pub trait VmulhuVxEmitter<T0, T1, T2, T3> {
13751 fn vmulhu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13752}
13753
13754/// RISC-V `vmv1r.v` instruction.
13755///
13756/// # Forms
13757/// Assembly: `vmv1r.v vs2, vd`
13758/// Rust: `vmv1r_v(vd, vs2)`
13759///
13760/// # Arguments
13761/// - `vd` — Vector register operand.
13762/// - `vs2` — Vector register operand.
13763pub trait Vmv1RVEmitter<T0, T1> {
13764 fn vmv1r_v(&mut self, vd: T0, vs2: T1);
13765}
13766
13767/// RISC-V `vmv2r.v` instruction.
13768///
13769/// # Forms
13770/// Assembly: `vmv2r.v vs2, vd`
13771/// Rust: `vmv2r_v(vd, vs2)`
13772///
13773/// # Arguments
13774/// - `vd` — Vector register operand.
13775/// - `vs2` — Vector register operand.
13776pub trait Vmv2RVEmitter<T0, T1> {
13777 fn vmv2r_v(&mut self, vd: T0, vs2: T1);
13778}
13779
13780/// RISC-V `vmv4r.v` instruction.
13781///
13782/// # Forms
13783/// Assembly: `vmv4r.v vs2, vd`
13784/// Rust: `vmv4r_v(vd, vs2)`
13785///
13786/// # Arguments
13787/// - `vd` — Vector register operand.
13788/// - `vs2` — Vector register operand.
13789pub trait Vmv4RVEmitter<T0, T1> {
13790 fn vmv4r_v(&mut self, vd: T0, vs2: T1);
13791}
13792
13793/// RISC-V `vmv8r.v` instruction.
13794///
13795/// # Forms
13796/// Assembly: `vmv8r.v vs2, vd`
13797/// Rust: `vmv8r_v(vd, vs2)`
13798///
13799/// # Arguments
13800/// - `vd` — Vector register operand.
13801/// - `vs2` — Vector register operand.
13802pub trait Vmv8RVEmitter<T0, T1> {
13803 fn vmv8r_v(&mut self, vd: T0, vs2: T1);
13804}
13805
13806/// RISC-V `vmv.s.x` instruction.
13807///
13808/// # Forms
13809/// Assembly: `vmv.s.x xs1, vd`
13810/// Rust: `vmv_s_x(vd, rs1)`
13811///
13812/// # Arguments
13813/// - `vd` — Vector register operand.
13814/// - `rs1` — Source register.
13815pub trait VmvSXEmitter<T0, T1> {
13816 fn vmv_s_x(&mut self, vd: T0, rs1: T1);
13817}
13818
13819/// RISC-V `vmv.v.i` instruction.
13820///
13821/// # Forms
13822/// Assembly: `vmv.v.i vd, imm`
13823/// Rust: `vmv_v_i(vd, simm5)`
13824///
13825/// # Arguments
13826/// - `vd` — Vector register operand.
13827/// - `simm5` — Immediate encoding value.
13828pub trait VmvVIEmitter<T0, T1> {
13829 fn vmv_v_i(&mut self, vd: T0, simm5: T1);
13830}
13831
13832/// RISC-V `vmv.v.v` instruction.
13833///
13834/// # Forms
13835/// Assembly: `vmv.v.v vs1, vd`
13836/// Rust: `vmv_v_v(vd, vs1)`
13837///
13838/// # Arguments
13839/// - `vd` — Vector register operand.
13840/// - `vs1` — Vector register operand.
13841pub trait VmvVVEmitter<T0, T1> {
13842 fn vmv_v_v(&mut self, vd: T0, vs1: T1);
13843}
13844
13845/// RISC-V `vmv.v.x` instruction.
13846///
13847/// # Forms
13848/// Assembly: `vmv.v.x xs1, vd`
13849/// Rust: `vmv_v_x(vd, rs1)`
13850///
13851/// # Arguments
13852/// - `vd` — Vector register operand.
13853/// - `rs1` — Source register.
13854pub trait VmvVXEmitter<T0, T1> {
13855 fn vmv_v_x(&mut self, vd: T0, rs1: T1);
13856}
13857
13858/// RISC-V `vmv.x.s` instruction.
13859///
13860/// # Forms
13861/// Assembly: `vmv.x.s vs2, xd`
13862/// Rust: `vmv_x_s(rd, vs2)`
13863///
13864/// # Arguments
13865/// - `rd` — Destination register.
13866/// - `vs2` — Vector register operand.
13867pub trait VmvXSEmitter<T0, T1> {
13868 fn vmv_x_s(&mut self, rd: T0, vs2: T1);
13869}
13870
13871/// RISC-V `vmxnor.mm` instruction.
13872///
13873/// # Forms
13874/// Assembly: `vmxnor.mm vs2, vs1, vd`
13875/// Rust: `vmxnor_mm(vd, vs1, vs2)`
13876///
13877/// # Arguments
13878/// - `vd` — Vector register operand.
13879/// - `vs1` — Vector register operand.
13880/// - `vs2` — Vector register operand.
13881pub trait VmxnorMmEmitter<T0, T1, T2> {
13882 fn vmxnor_mm(&mut self, vd: T0, vs1: T1, vs2: T2);
13883}
13884
13885/// RISC-V `vmxor.mm` instruction.
13886///
13887/// # Forms
13888/// Assembly: `vmxor.mm vs2, vs1, vd`
13889/// Rust: `vmxor_mm(vd, vs1, vs2)`
13890///
13891/// # Arguments
13892/// - `vd` — Vector register operand.
13893/// - `vs1` — Vector register operand.
13894/// - `vs2` — Vector register operand.
13895pub trait VmxorMmEmitter<T0, T1, T2> {
13896 fn vmxor_mm(&mut self, vd: T0, vs1: T1, vs2: T2);
13897}
13898
13899/// RISC-V `vnclip.wi` instruction.
13900///
13901/// # Forms
13902/// Assembly: `vnclip.wi vm, vs2, vd, imm`
13903/// Rust: `vnclip_wi(vd, vs2, zimm5, vm)`
13904///
13905/// # Arguments
13906/// - `vd` — Vector register operand.
13907/// - `vs2` — Vector register operand.
13908/// - `zimm5` — Immediate encoding value.
13909/// - `vm` — Vector mask control.
13910pub trait VnclipWiEmitter<T0, T1, T2, T3> {
13911 fn vnclip_wi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
13912}
13913
13914/// RISC-V `vnclip.wv` instruction.
13915///
13916/// # Forms
13917/// Assembly: `vnclip.wv vm, vs2, vs1, vd`
13918/// Rust: `vnclip_wv(vd, vs1, vs2, vm)`
13919///
13920/// # Arguments
13921/// - `vd` — Vector register operand.
13922/// - `vs1` — Vector register operand.
13923/// - `vs2` — Vector register operand.
13924/// - `vm` — Vector mask control.
13925pub trait VnclipWvEmitter<T0, T1, T2, T3> {
13926 fn vnclip_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13927}
13928
13929/// RISC-V `vnclip.wx` instruction.
13930///
13931/// # Forms
13932/// Assembly: `vnclip.wx vm, vs2, xs1, vd`
13933/// Rust: `vnclip_wx(vd, vs2, rs1, vm)`
13934///
13935/// # Arguments
13936/// - `vd` — Vector register operand.
13937/// - `vs2` — Vector register operand.
13938/// - `rs1` — Source register.
13939/// - `vm` — Vector mask control.
13940pub trait VnclipWxEmitter<T0, T1, T2, T3> {
13941 fn vnclip_wx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13942}
13943
13944/// RISC-V `vnclipu.wi` instruction.
13945///
13946/// # Forms
13947/// Assembly: `vnclipu.wi vm, vs2, vd, imm`
13948/// Rust: `vnclipu_wi(vd, vs2, zimm5, vm)`
13949///
13950/// # Arguments
13951/// - `vd` — Vector register operand.
13952/// - `vs2` — Vector register operand.
13953/// - `zimm5` — Immediate encoding value.
13954/// - `vm` — Vector mask control.
13955pub trait VnclipuWiEmitter<T0, T1, T2, T3> {
13956 fn vnclipu_wi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
13957}
13958
13959/// RISC-V `vnclipu.wv` instruction.
13960///
13961/// # Forms
13962/// Assembly: `vnclipu.wv vm, vs2, vs1, vd`
13963/// Rust: `vnclipu_wv(vd, vs1, vs2, vm)`
13964///
13965/// # Arguments
13966/// - `vd` — Vector register operand.
13967/// - `vs1` — Vector register operand.
13968/// - `vs2` — Vector register operand.
13969/// - `vm` — Vector mask control.
13970pub trait VnclipuWvEmitter<T0, T1, T2, T3> {
13971 fn vnclipu_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
13972}
13973
13974/// RISC-V `vnclipu.wx` instruction.
13975///
13976/// # Forms
13977/// Assembly: `vnclipu.wx vm, vs2, xs1, vd`
13978/// Rust: `vnclipu_wx(vd, vs2, rs1, vm)`
13979///
13980/// # Arguments
13981/// - `vd` — Vector register operand.
13982/// - `vs2` — Vector register operand.
13983/// - `rs1` — Source register.
13984/// - `vm` — Vector mask control.
13985pub trait VnclipuWxEmitter<T0, T1, T2, T3> {
13986 fn vnclipu_wx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
13987}
13988
13989/// RISC-V `vnmsac.vv` instruction.
13990///
13991/// # Forms
13992/// Assembly: `vnmsac.vv vm, vs2, vs1, vd`
13993/// Rust: `vnmsac_vv(vd, vs1, vs2, vm)`
13994///
13995/// # Arguments
13996/// - `vd` — Vector register operand.
13997/// - `vs1` — Vector register operand.
13998/// - `vs2` — Vector register operand.
13999/// - `vm` — Vector mask control.
14000pub trait VnmsacVvEmitter<T0, T1, T2, T3> {
14001 fn vnmsac_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14002}
14003
14004/// RISC-V `vnmsac.vx` instruction.
14005///
14006/// # Forms
14007/// Assembly: `vnmsac.vx vm, vs2, xs1, vd`
14008/// Rust: `vnmsac_vx(vd, vs2, rs1, vm)`
14009///
14010/// # Arguments
14011/// - `vd` — Vector register operand.
14012/// - `vs2` — Vector register operand.
14013/// - `rs1` — Source register.
14014/// - `vm` — Vector mask control.
14015pub trait VnmsacVxEmitter<T0, T1, T2, T3> {
14016 fn vnmsac_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14017}
14018
14019/// RISC-V `vnmsub.vv` instruction.
14020///
14021/// # Forms
14022/// Assembly: `vnmsub.vv vm, vs2, vs1, vd`
14023/// Rust: `vnmsub_vv(vd, vs1, vs2, vm)`
14024///
14025/// # Arguments
14026/// - `vd` — Vector register operand.
14027/// - `vs1` — Vector register operand.
14028/// - `vs2` — Vector register operand.
14029/// - `vm` — Vector mask control.
14030pub trait VnmsubVvEmitter<T0, T1, T2, T3> {
14031 fn vnmsub_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14032}
14033
14034/// RISC-V `vnmsub.vx` instruction.
14035///
14036/// # Forms
14037/// Assembly: `vnmsub.vx vm, vs2, xs1, vd`
14038/// Rust: `vnmsub_vx(vd, vs2, rs1, vm)`
14039///
14040/// # Arguments
14041/// - `vd` — Vector register operand.
14042/// - `vs2` — Vector register operand.
14043/// - `rs1` — Source register.
14044/// - `vm` — Vector mask control.
14045pub trait VnmsubVxEmitter<T0, T1, T2, T3> {
14046 fn vnmsub_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14047}
14048
14049/// RISC-V `vnsra.wi` instruction.
14050///
14051/// # Forms
14052/// Assembly: `vnsra.wi vm, vs2, vd, imm`
14053/// Rust: `vnsra_wi(vd, vs2, zimm5, vm)`
14054///
14055/// # Arguments
14056/// - `vd` — Vector register operand.
14057/// - `vs2` — Vector register operand.
14058/// - `zimm5` — Immediate encoding value.
14059/// - `vm` — Vector mask control.
14060pub trait VnsraWiEmitter<T0, T1, T2, T3> {
14061 fn vnsra_wi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
14062}
14063
14064/// RISC-V `vnsra.wv` instruction.
14065///
14066/// # Forms
14067/// Assembly: `vnsra.wv vm, vs2, vs1, vd`
14068/// Rust: `vnsra_wv(vd, vs1, vs2, vm)`
14069///
14070/// # Arguments
14071/// - `vd` — Vector register operand.
14072/// - `vs1` — Vector register operand.
14073/// - `vs2` — Vector register operand.
14074/// - `vm` — Vector mask control.
14075pub trait VnsraWvEmitter<T0, T1, T2, T3> {
14076 fn vnsra_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14077}
14078
14079/// RISC-V `vnsra.wx` instruction.
14080///
14081/// # Forms
14082/// Assembly: `vnsra.wx vm, vs2, xs1, vd`
14083/// Rust: `vnsra_wx(vd, vs2, rs1, vm)`
14084///
14085/// # Arguments
14086/// - `vd` — Vector register operand.
14087/// - `vs2` — Vector register operand.
14088/// - `rs1` — Source register.
14089/// - `vm` — Vector mask control.
14090pub trait VnsraWxEmitter<T0, T1, T2, T3> {
14091 fn vnsra_wx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14092}
14093
14094/// RISC-V `vnsrl.wi` instruction.
14095///
14096/// # Forms
14097/// Assembly: `vnsrl.wi vm, vs2, vd, imm`
14098/// Rust: `vnsrl_wi(vd, vs2, zimm5, vm)`
14099///
14100/// # Arguments
14101/// - `vd` — Vector register operand.
14102/// - `vs2` — Vector register operand.
14103/// - `zimm5` — Immediate encoding value.
14104/// - `vm` — Vector mask control.
14105pub trait VnsrlWiEmitter<T0, T1, T2, T3> {
14106 fn vnsrl_wi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
14107}
14108
14109/// RISC-V `vnsrl.wv` instruction.
14110///
14111/// # Forms
14112/// Assembly: `vnsrl.wv vm, vs2, vs1, vd`
14113/// Rust: `vnsrl_wv(vd, vs1, vs2, vm)`
14114///
14115/// # Arguments
14116/// - `vd` — Vector register operand.
14117/// - `vs1` — Vector register operand.
14118/// - `vs2` — Vector register operand.
14119/// - `vm` — Vector mask control.
14120pub trait VnsrlWvEmitter<T0, T1, T2, T3> {
14121 fn vnsrl_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14122}
14123
14124/// RISC-V `vnsrl.wx` instruction.
14125///
14126/// # Forms
14127/// Assembly: `vnsrl.wx vm, vs2, xs1, vd`
14128/// Rust: `vnsrl_wx(vd, vs2, rs1, vm)`
14129///
14130/// # Arguments
14131/// - `vd` — Vector register operand.
14132/// - `vs2` — Vector register operand.
14133/// - `rs1` — Source register.
14134/// - `vm` — Vector mask control.
14135pub trait VnsrlWxEmitter<T0, T1, T2, T3> {
14136 fn vnsrl_wx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14137}
14138
14139/// RISC-V `vor.vi` instruction.
14140///
14141/// # Forms
14142/// Assembly: `vor.vi vm, vs2, vd, imm`
14143/// Rust: `vor_vi(vd, vs2, simm5, vm)`
14144///
14145/// # Arguments
14146/// - `vd` — Vector register operand.
14147/// - `vs2` — Vector register operand.
14148/// - `simm5` — Immediate encoding value.
14149/// - `vm` — Vector mask control.
14150pub trait VorViEmitter<T0, T1, T2, T3> {
14151 fn vor_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
14152}
14153
14154/// RISC-V `vor.vv` instruction.
14155///
14156/// # Forms
14157/// Assembly: `vor.vv vm, vs2, vs1, vd`
14158/// Rust: `vor_vv(vd, vs1, vs2, vm)`
14159///
14160/// # Arguments
14161/// - `vd` — Vector register operand.
14162/// - `vs1` — Vector register operand.
14163/// - `vs2` — Vector register operand.
14164/// - `vm` — Vector mask control.
14165pub trait VorVvEmitter<T0, T1, T2, T3> {
14166 fn vor_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14167}
14168
14169/// RISC-V `vor.vx` instruction.
14170///
14171/// # Forms
14172/// Assembly: `vor.vx vm, vs2, xs1, vd`
14173/// Rust: `vor_vx(vd, vs2, rs1, vm)`
14174///
14175/// # Arguments
14176/// - `vd` — Vector register operand.
14177/// - `vs2` — Vector register operand.
14178/// - `rs1` — Source register.
14179/// - `vm` — Vector mask control.
14180pub trait VorVxEmitter<T0, T1, T2, T3> {
14181 fn vor_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14182}
14183
14184/// RISC-V `vpopc.m` instruction.
14185///
14186/// # Forms
14187/// Assembly: `vpopc.m rd vs2 vm`
14188/// Rust: `vpopc_m(rd, vs2, vm)`
14189///
14190/// # Arguments
14191/// - `rd` — Destination register.
14192/// - `vs2` — Vector register operand.
14193/// - `vm` — Vector mask control.
14194pub trait VpopcMEmitter<T0, T1, T2> {
14195 fn vpopc_m(&mut self, rd: T0, vs2: T1, vm: T2);
14196}
14197
14198/// RISC-V `vredand.vs` instruction.
14199///
14200/// # Forms
14201/// Assembly: `vredand.vs vm, vs2, vs1, vd`
14202/// Rust: `vredand_vs(vd, vs1, vs2, vm)`
14203///
14204/// # Arguments
14205/// - `vd` — Vector register operand.
14206/// - `vs1` — Vector register operand.
14207/// - `vs2` — Vector register operand.
14208/// - `vm` — Vector mask control.
14209pub trait VredandVsEmitter<T0, T1, T2, T3> {
14210 fn vredand_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14211}
14212
14213/// RISC-V `vredmax.vs` instruction.
14214///
14215/// # Forms
14216/// Assembly: `vredmax.vs vm, vs2, vs1, vd`
14217/// Rust: `vredmax_vs(vd, vs1, vs2, vm)`
14218///
14219/// # Arguments
14220/// - `vd` — Vector register operand.
14221/// - `vs1` — Vector register operand.
14222/// - `vs2` — Vector register operand.
14223/// - `vm` — Vector mask control.
14224pub trait VredmaxVsEmitter<T0, T1, T2, T3> {
14225 fn vredmax_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14226}
14227
14228/// RISC-V `vredmaxu.vs` instruction.
14229///
14230/// # Forms
14231/// Assembly: `vredmaxu.vs vm, vs2, vs1, vd`
14232/// Rust: `vredmaxu_vs(vd, vs1, vs2, vm)`
14233///
14234/// # Arguments
14235/// - `vd` — Vector register operand.
14236/// - `vs1` — Vector register operand.
14237/// - `vs2` — Vector register operand.
14238/// - `vm` — Vector mask control.
14239pub trait VredmaxuVsEmitter<T0, T1, T2, T3> {
14240 fn vredmaxu_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14241}
14242
14243/// RISC-V `vredmin.vs` instruction.
14244///
14245/// # Forms
14246/// Assembly: `vredmin.vs vm, vs2, vs1, vd`
14247/// Rust: `vredmin_vs(vd, vs1, vs2, vm)`
14248///
14249/// # Arguments
14250/// - `vd` — Vector register operand.
14251/// - `vs1` — Vector register operand.
14252/// - `vs2` — Vector register operand.
14253/// - `vm` — Vector mask control.
14254pub trait VredminVsEmitter<T0, T1, T2, T3> {
14255 fn vredmin_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14256}
14257
14258/// RISC-V `vredminu.vs` instruction.
14259///
14260/// # Forms
14261/// Assembly: `vredminu.vs vm, vs2, vs1, vd`
14262/// Rust: `vredminu_vs(vd, vs1, vs2, vm)`
14263///
14264/// # Arguments
14265/// - `vd` — Vector register operand.
14266/// - `vs1` — Vector register operand.
14267/// - `vs2` — Vector register operand.
14268/// - `vm` — Vector mask control.
14269pub trait VredminuVsEmitter<T0, T1, T2, T3> {
14270 fn vredminu_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14271}
14272
14273/// RISC-V `vredor.vs` instruction.
14274///
14275/// # Forms
14276/// Assembly: `vredor.vs vm, vs2, vs1, vd`
14277/// Rust: `vredor_vs(vd, vs1, vs2, vm)`
14278///
14279/// # Arguments
14280/// - `vd` — Vector register operand.
14281/// - `vs1` — Vector register operand.
14282/// - `vs2` — Vector register operand.
14283/// - `vm` — Vector mask control.
14284pub trait VredorVsEmitter<T0, T1, T2, T3> {
14285 fn vredor_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14286}
14287
14288/// RISC-V `vredsum.vs` instruction.
14289///
14290/// # Forms
14291/// Assembly: `vredsum.vs vm, vs2, vs1, vd`
14292/// Rust: `vredsum_vs(vd, vs1, vs2, vm)`
14293///
14294/// # Arguments
14295/// - `vd` — Vector register operand.
14296/// - `vs1` — Vector register operand.
14297/// - `vs2` — Vector register operand.
14298/// - `vm` — Vector mask control.
14299pub trait VredsumVsEmitter<T0, T1, T2, T3> {
14300 fn vredsum_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14301}
14302
14303/// RISC-V `vredxor.vs` instruction.
14304///
14305/// # Forms
14306/// Assembly: `vredxor.vs vm, vs2, vs1, vd`
14307/// Rust: `vredxor_vs(vd, vs1, vs2, vm)`
14308///
14309/// # Arguments
14310/// - `vd` — Vector register operand.
14311/// - `vs1` — Vector register operand.
14312/// - `vs2` — Vector register operand.
14313/// - `vm` — Vector mask control.
14314pub trait VredxorVsEmitter<T0, T1, T2, T3> {
14315 fn vredxor_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14316}
14317
14318/// RISC-V `vrem.vv` instruction.
14319///
14320/// # Forms
14321/// Assembly: `vrem.vv vm, vs2, vs1, vd`
14322/// Rust: `vrem_vv(vd, vs1, vs2, vm)`
14323///
14324/// # Arguments
14325/// - `vd` — Vector register operand.
14326/// - `vs1` — Vector register operand.
14327/// - `vs2` — Vector register operand.
14328/// - `vm` — Vector mask control.
14329pub trait VremVvEmitter<T0, T1, T2, T3> {
14330 fn vrem_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14331}
14332
14333/// RISC-V `vrem.vx` instruction.
14334///
14335/// # Forms
14336/// Assembly: `vrem.vx vm, vs2, xs1, vd`
14337/// Rust: `vrem_vx(vd, vs2, rs1, vm)`
14338///
14339/// # Arguments
14340/// - `vd` — Vector register operand.
14341/// - `vs2` — Vector register operand.
14342/// - `rs1` — Source register.
14343/// - `vm` — Vector mask control.
14344pub trait VremVxEmitter<T0, T1, T2, T3> {
14345 fn vrem_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14346}
14347
14348/// RISC-V `vremu.vv` instruction.
14349///
14350/// # Forms
14351/// Assembly: `vremu.vv vm, vs2, vs1, vd`
14352/// Rust: `vremu_vv(vd, vs1, vs2, vm)`
14353///
14354/// # Arguments
14355/// - `vd` — Vector register operand.
14356/// - `vs1` — Vector register operand.
14357/// - `vs2` — Vector register operand.
14358/// - `vm` — Vector mask control.
14359pub trait VremuVvEmitter<T0, T1, T2, T3> {
14360 fn vremu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14361}
14362
14363/// RISC-V `vremu.vx` instruction.
14364///
14365/// # Forms
14366/// Assembly: `vremu.vx vm, vs2, xs1, vd`
14367/// Rust: `vremu_vx(vd, vs2, rs1, vm)`
14368///
14369/// # Arguments
14370/// - `vd` — Vector register operand.
14371/// - `vs2` — Vector register operand.
14372/// - `rs1` — Source register.
14373/// - `vm` — Vector mask control.
14374pub trait VremuVxEmitter<T0, T1, T2, T3> {
14375 fn vremu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14376}
14377
14378/// RISC-V `vrev8.v` instruction.
14379///
14380/// # Forms
14381/// Assembly: `vrev8.v vm, vs2, vd`
14382/// Rust: `vrev8_v(vd, vs2, vm)`
14383///
14384/// # Arguments
14385/// - `vd` — Vector register operand.
14386/// - `vs2` — Vector register operand.
14387/// - `vm` — Vector mask control.
14388pub trait Vrev8VEmitter<T0, T1, T2> {
14389 fn vrev8_v(&mut self, vd: T0, vs2: T1, vm: T2);
14390}
14391
14392/// RISC-V `vrgather.vi` instruction.
14393///
14394/// # Forms
14395/// Assembly: `vrgather.vi vm, vs2, vd, imm`
14396/// Rust: `vrgather_vi(vd, vs2, zimm5, vm)`
14397///
14398/// # Arguments
14399/// - `vd` — Vector register operand.
14400/// - `vs2` — Vector register operand.
14401/// - `zimm5` — Immediate encoding value.
14402/// - `vm` — Vector mask control.
14403pub trait VrgatherViEmitter<T0, T1, T2, T3> {
14404 fn vrgather_vi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
14405}
14406
14407/// RISC-V `vrgather.vv` instruction.
14408///
14409/// # Forms
14410/// Assembly: `vrgather.vv vm, vs2, vs1, vd`
14411/// Rust: `vrgather_vv(vd, vs1, vs2, vm)`
14412///
14413/// # Arguments
14414/// - `vd` — Vector register operand.
14415/// - `vs1` — Vector register operand.
14416/// - `vs2` — Vector register operand.
14417/// - `vm` — Vector mask control.
14418pub trait VrgatherVvEmitter<T0, T1, T2, T3> {
14419 fn vrgather_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14420}
14421
14422/// RISC-V `vrgather.vx` instruction.
14423///
14424/// # Forms
14425/// Assembly: `vrgather.vx vm, vs2, xs1, vd`
14426/// Rust: `vrgather_vx(vd, vs2, rs1, vm)`
14427///
14428/// # Arguments
14429/// - `vd` — Vector register operand.
14430/// - `vs2` — Vector register operand.
14431/// - `rs1` — Source register.
14432/// - `vm` — Vector mask control.
14433pub trait VrgatherVxEmitter<T0, T1, T2, T3> {
14434 fn vrgather_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14435}
14436
14437/// RISC-V `vrgatherei16.vv` instruction.
14438///
14439/// # Forms
14440/// Assembly: `vrgatherei16.vv vm, vs2, vs1, vd`
14441/// Rust: `vrgatherei16_vv(vd, vs1, vs2, vm)`
14442///
14443/// # Arguments
14444/// - `vd` — Vector register operand.
14445/// - `vs1` — Vector register operand.
14446/// - `vs2` — Vector register operand.
14447/// - `vm` — Vector mask control.
14448pub trait Vrgatherei16VvEmitter<T0, T1, T2, T3> {
14449 fn vrgatherei16_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14450}
14451
14452/// RISC-V `vrol.vv` instruction.
14453///
14454/// # Forms
14455/// Assembly: `vrol.vv vm, vs2, vs1, vd`
14456/// Rust: `vrol_vv(vd, vs1, vs2, vm)`
14457///
14458/// # Arguments
14459/// - `vd` — Vector register operand.
14460/// - `vs1` — Vector register operand.
14461/// - `vs2` — Vector register operand.
14462/// - `vm` — Vector mask control.
14463pub trait VrolVvEmitter<T0, T1, T2, T3> {
14464 fn vrol_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14465}
14466
14467/// RISC-V `vrol.vx` instruction.
14468///
14469/// # Forms
14470/// Assembly: `vrol.vx vm, vs2, xs1, vd`
14471/// Rust: `vrol_vx(vd, vs2, rs1, vm)`
14472///
14473/// # Arguments
14474/// - `vd` — Vector register operand.
14475/// - `vs2` — Vector register operand.
14476/// - `rs1` — Source register.
14477/// - `vm` — Vector mask control.
14478pub trait VrolVxEmitter<T0, T1, T2, T3> {
14479 fn vrol_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14480}
14481
14482/// RISC-V `vror.vi` instruction.
14483///
14484/// # Forms
14485/// Assembly: `vror.vi vm, vs2, vd, imm`
14486/// Rust: `vror_vi(vd, vs2, zimm6lohi, vm)`
14487///
14488/// # Arguments
14489/// - `vd` — Vector register operand.
14490/// - `vs2` — Vector register operand.
14491/// - `zimm6lohi` — Immediate encoding value.
14492/// - `vm` — Vector mask control.
14493pub trait VrorViEmitter<T0, T1, T2, T3> {
14494 fn vror_vi(&mut self, vd: T0, vs2: T1, zimm6lohi: T2, vm: T3);
14495}
14496
14497/// RISC-V `vror.vv` instruction.
14498///
14499/// # Forms
14500/// Assembly: `vror.vv vm, vs2, vs1, vd`
14501/// Rust: `vror_vv(vd, vs1, vs2, vm)`
14502///
14503/// # Arguments
14504/// - `vd` — Vector register operand.
14505/// - `vs1` — Vector register operand.
14506/// - `vs2` — Vector register operand.
14507/// - `vm` — Vector mask control.
14508pub trait VrorVvEmitter<T0, T1, T2, T3> {
14509 fn vror_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14510}
14511
14512/// RISC-V `vror.vx` instruction.
14513///
14514/// # Forms
14515/// Assembly: `vror.vx vm, vs2, xs1, vd`
14516/// Rust: `vror_vx(vd, vs2, rs1, vm)`
14517///
14518/// # Arguments
14519/// - `vd` — Vector register operand.
14520/// - `vs2` — Vector register operand.
14521/// - `rs1` — Source register.
14522/// - `vm` — Vector mask control.
14523pub trait VrorVxEmitter<T0, T1, T2, T3> {
14524 fn vror_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14525}
14526
14527/// RISC-V `vrsub.vi` instruction.
14528///
14529/// # Forms
14530/// Assembly: `vrsub.vi vm, vs2, vd, imm`
14531/// Rust: `vrsub_vi(vd, vs2, simm5, vm)`
14532///
14533/// # Arguments
14534/// - `vd` — Vector register operand.
14535/// - `vs2` — Vector register operand.
14536/// - `simm5` — Immediate encoding value.
14537/// - `vm` — Vector mask control.
14538pub trait VrsubViEmitter<T0, T1, T2, T3> {
14539 fn vrsub_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
14540}
14541
14542/// RISC-V `vrsub.vx` instruction.
14543///
14544/// # Forms
14545/// Assembly: `vrsub.vx vm, vs2, xs1, vd`
14546/// Rust: `vrsub_vx(vd, vs2, rs1, vm)`
14547///
14548/// # Arguments
14549/// - `vd` — Vector register operand.
14550/// - `vs2` — Vector register operand.
14551/// - `rs1` — Source register.
14552/// - `vm` — Vector mask control.
14553pub trait VrsubVxEmitter<T0, T1, T2, T3> {
14554 fn vrsub_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14555}
14556
14557/// RISC-V `vs1r.v` instruction.
14558///
14559/// # Forms
14560/// Assembly: `vs1r.v xs1, vs3`
14561/// Rust: `vs1r_v(vs3, rs1)`
14562///
14563/// # Arguments
14564/// - `vs3` — Vector register operand.
14565/// - `rs1` — Memory base register.
14566pub trait Vs1RVEmitter<T0, T1> {
14567 fn vs1r_v(&mut self, vs3: T0, rs1: T1);
14568}
14569
14570/// RISC-V `vs2r.v` instruction.
14571///
14572/// # Forms
14573/// Assembly: `vs2r.v xs1, vs3`
14574/// Rust: `vs2r_v(vs3, rs1)`
14575///
14576/// # Arguments
14577/// - `vs3` — Vector register operand.
14578/// - `rs1` — Memory base register.
14579pub trait Vs2RVEmitter<T0, T1> {
14580 fn vs2r_v(&mut self, vs3: T0, rs1: T1);
14581}
14582
14583/// RISC-V `vs4r.v` instruction.
14584///
14585/// # Forms
14586/// Assembly: `vs4r.v xs1, vs3`
14587/// Rust: `vs4r_v(vs3, rs1)`
14588///
14589/// # Arguments
14590/// - `vs3` — Vector register operand.
14591/// - `rs1` — Memory base register.
14592pub trait Vs4RVEmitter<T0, T1> {
14593 fn vs4r_v(&mut self, vs3: T0, rs1: T1);
14594}
14595
14596/// RISC-V `vs8r.v` instruction.
14597///
14598/// # Forms
14599/// Assembly: `vs8r.v xs1, vs3`
14600/// Rust: `vs8r_v(vs3, rs1)`
14601///
14602/// # Arguments
14603/// - `vs3` — Vector register operand.
14604/// - `rs1` — Memory base register.
14605pub trait Vs8RVEmitter<T0, T1> {
14606 fn vs8r_v(&mut self, vs3: T0, rs1: T1);
14607}
14608
14609/// RISC-V `vsadd.vi` instruction.
14610///
14611/// # Forms
14612/// Assembly: `vsadd.vi vm, vs2, vd, imm`
14613/// Rust: `vsadd_vi(vd, vs2, simm5, vm)`
14614///
14615/// # Arguments
14616/// - `vd` — Vector register operand.
14617/// - `vs2` — Vector register operand.
14618/// - `simm5` — Immediate encoding value.
14619/// - `vm` — Vector mask control.
14620pub trait VsaddViEmitter<T0, T1, T2, T3> {
14621 fn vsadd_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
14622}
14623
14624/// RISC-V `vsadd.vv` instruction.
14625///
14626/// # Forms
14627/// Assembly: `vsadd.vv vm, vs2, vs1, vd`
14628/// Rust: `vsadd_vv(vd, vs1, vs2, vm)`
14629///
14630/// # Arguments
14631/// - `vd` — Vector register operand.
14632/// - `vs1` — Vector register operand.
14633/// - `vs2` — Vector register operand.
14634/// - `vm` — Vector mask control.
14635pub trait VsaddVvEmitter<T0, T1, T2, T3> {
14636 fn vsadd_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14637}
14638
14639/// RISC-V `vsadd.vx` instruction.
14640///
14641/// # Forms
14642/// Assembly: `vsadd.vx vm, vs2, xs1, vd`
14643/// Rust: `vsadd_vx(vd, vs2, rs1, vm)`
14644///
14645/// # Arguments
14646/// - `vd` — Vector register operand.
14647/// - `vs2` — Vector register operand.
14648/// - `rs1` — Source register.
14649/// - `vm` — Vector mask control.
14650pub trait VsaddVxEmitter<T0, T1, T2, T3> {
14651 fn vsadd_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14652}
14653
14654/// RISC-V `vsaddu.vi` instruction.
14655///
14656/// # Forms
14657/// Assembly: `vsaddu.vi vm, vs2, vd, imm`
14658/// Rust: `vsaddu_vi(vd, vs2, simm5, vm)`
14659///
14660/// # Arguments
14661/// - `vd` — Vector register operand.
14662/// - `vs2` — Vector register operand.
14663/// - `simm5` — Immediate encoding value.
14664/// - `vm` — Vector mask control.
14665pub trait VsadduViEmitter<T0, T1, T2, T3> {
14666 fn vsaddu_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
14667}
14668
14669/// RISC-V `vsaddu.vv` instruction.
14670///
14671/// # Forms
14672/// Assembly: `vsaddu.vv vm, vs2, vs1, vd`
14673/// Rust: `vsaddu_vv(vd, vs1, vs2, vm)`
14674///
14675/// # Arguments
14676/// - `vd` — Vector register operand.
14677/// - `vs1` — Vector register operand.
14678/// - `vs2` — Vector register operand.
14679/// - `vm` — Vector mask control.
14680pub trait VsadduVvEmitter<T0, T1, T2, T3> {
14681 fn vsaddu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
14682}
14683
14684/// RISC-V `vsaddu.vx` instruction.
14685///
14686/// # Forms
14687/// Assembly: `vsaddu.vx vm, vs2, xs1, vd`
14688/// Rust: `vsaddu_vx(vd, vs2, rs1, vm)`
14689///
14690/// # Arguments
14691/// - `vd` — Vector register operand.
14692/// - `vs2` — Vector register operand.
14693/// - `rs1` — Source register.
14694/// - `vm` — Vector mask control.
14695pub trait VsadduVxEmitter<T0, T1, T2, T3> {
14696 fn vsaddu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14697}
14698
14699/// RISC-V `vsbc.vvm` instruction.
14700///
14701/// # Forms
14702/// Assembly: `vsbc.vvm vs2, vs1, vd`
14703/// Rust: `vsbc_vvm(vd, vs1, vs2)`
14704///
14705/// # Arguments
14706/// - `vd` — Vector register operand.
14707/// - `vs1` — Vector register operand.
14708/// - `vs2` — Vector register operand.
14709pub trait VsbcVvmEmitter<T0, T1, T2> {
14710 fn vsbc_vvm(&mut self, vd: T0, vs1: T1, vs2: T2);
14711}
14712
14713/// RISC-V `vsbc.vxm` instruction.
14714///
14715/// # Forms
14716/// Assembly: `vsbc.vxm vs2, xs1, vd`
14717/// Rust: `vsbc_vxm(vd, rs1, vs2)`
14718///
14719/// # Arguments
14720/// - `vd` — Vector register operand.
14721/// - `rs1` — Source register.
14722/// - `vs2` — Vector register operand.
14723pub trait VsbcVxmEmitter<T0, T1, T2> {
14724 fn vsbc_vxm(&mut self, vd: T0, rs1: T1, vs2: T2);
14725}
14726
14727/// RISC-V `vse16.v` instruction.
14728///
14729/// # Forms
14730/// Assembly: `vse16.v vm, xs1, vs3`
14731/// Rust: `vse16_v(vs3, rs1, vm, nf)`
14732///
14733/// # Arguments
14734/// - `vs3` — Vector register operand.
14735/// - `rs1` — Memory base register.
14736/// - `vm` — Vector mask control.
14737/// - `nf` — Vector segment field count.
14738pub trait Vse16VEmitter<T0, T1, T2, T3> {
14739 fn vse16_v(&mut self, vs3: T0, rs1: T1, vm: T2, nf: T3);
14740}
14741
14742/// RISC-V `vse1.v` instruction.
14743///
14744/// # Forms
14745/// Assembly: `vse1.v vs3 rs1`
14746/// Rust: `vse1_v(vs3, rs1)`
14747///
14748/// # Arguments
14749/// - `vs3` — Vector register operand.
14750/// - `rs1` — Memory base register.
14751pub trait Vse1VEmitter<T0, T1> {
14752 fn vse1_v(&mut self, vs3: T0, rs1: T1);
14753}
14754
14755/// RISC-V `vse32.v` instruction.
14756///
14757/// # Forms
14758/// Assembly: `vse32.v vm, xs1, vs3`
14759/// Rust: `vse32_v(vs3, rs1, vm, nf)`
14760///
14761/// # Arguments
14762/// - `vs3` — Vector register operand.
14763/// - `rs1` — Memory base register.
14764/// - `vm` — Vector mask control.
14765/// - `nf` — Vector segment field count.
14766pub trait Vse32VEmitter<T0, T1, T2, T3> {
14767 fn vse32_v(&mut self, vs3: T0, rs1: T1, vm: T2, nf: T3);
14768}
14769
14770/// RISC-V `vse64.v` instruction.
14771///
14772/// # Forms
14773/// Assembly: `vse64.v vm, xs1, vs3`
14774/// Rust: `vse64_v(vs3, rs1, vm, nf)`
14775///
14776/// # Arguments
14777/// - `vs3` — Vector register operand.
14778/// - `rs1` — Memory base register.
14779/// - `vm` — Vector mask control.
14780/// - `nf` — Vector segment field count.
14781pub trait Vse64VEmitter<T0, T1, T2, T3> {
14782 fn vse64_v(&mut self, vs3: T0, rs1: T1, vm: T2, nf: T3);
14783}
14784
14785/// RISC-V `vse8.v` instruction.
14786///
14787/// # Forms
14788/// Assembly: `vse8.v vm, xs1, vs3`
14789/// Rust: `vse8_v(vs3, rs1, vm, nf)`
14790///
14791/// # Arguments
14792/// - `vs3` — Vector register operand.
14793/// - `rs1` — Memory base register.
14794/// - `vm` — Vector mask control.
14795/// - `nf` — Vector segment field count.
14796pub trait Vse8VEmitter<T0, T1, T2, T3> {
14797 fn vse8_v(&mut self, vs3: T0, rs1: T1, vm: T2, nf: T3);
14798}
14799
14800/// RISC-V `vsetivli` instruction.
14801///
14802/// # Forms
14803/// Assembly: `vsetivli xd, imm`
14804/// Rust: `vsetivli(rd, zimm5, zimm10)`
14805///
14806/// # Arguments
14807/// - `rd` — Destination register.
14808/// - `zimm5` — Immediate encoding value.
14809/// - `zimm10` — Immediate encoding value.
14810pub trait VsetivliEmitter<T0, T1, T2> {
14811 fn vsetivli(&mut self, rd: T0, zimm5: T1, zimm10: T2);
14812}
14813
14814/// RISC-V `vsetvl` instruction.
14815///
14816/// # Forms
14817/// Assembly: `vsetvl xs2, xs1, xd`
14818/// Rust: `vsetvl(rd, rs1, rs2)`
14819///
14820/// # Arguments
14821/// - `rd` — Destination register.
14822/// - `rs1` — Source register.
14823/// - `rs2` — Source register.
14824pub trait VsetvlEmitter<T0, T1, T2> {
14825 fn vsetvl(&mut self, rd: T0, rs1: T1, rs2: T2);
14826}
14827
14828/// RISC-V `vsetvli` instruction.
14829///
14830/// # Forms
14831/// Assembly: `vsetvli xs1, xd, imm`
14832/// Rust: `vsetvli(rd, rs1, zimm11)`
14833///
14834/// # Arguments
14835/// - `rd` — Destination register.
14836/// - `rs1` — Source register.
14837/// - `zimm11` — Immediate encoding value.
14838pub trait VsetvliEmitter<T0, T1, T2> {
14839 fn vsetvli(&mut self, rd: T0, rs1: T1, zimm11: T2);
14840}
14841
14842/// RISC-V `vsext.vf2` instruction.
14843///
14844/// # Forms
14845/// Assembly: `vsext.vf2 vm, vs2, vd`
14846/// Rust: `vsext_vf2(vd, vs2, vm)`
14847///
14848/// # Arguments
14849/// - `vd` — Vector register operand.
14850/// - `vs2` — Vector register operand.
14851/// - `vm` — Vector mask control.
14852pub trait VsextVf2Emitter<T0, T1, T2> {
14853 fn vsext_vf2(&mut self, vd: T0, vs2: T1, vm: T2);
14854}
14855
14856/// RISC-V `vsext.vf4` instruction.
14857///
14858/// # Forms
14859/// Assembly: `vsext.vf4 vm, vs2, vd`
14860/// Rust: `vsext_vf4(vd, vs2, vm)`
14861///
14862/// # Arguments
14863/// - `vd` — Vector register operand.
14864/// - `vs2` — Vector register operand.
14865/// - `vm` — Vector mask control.
14866pub trait VsextVf4Emitter<T0, T1, T2> {
14867 fn vsext_vf4(&mut self, vd: T0, vs2: T1, vm: T2);
14868}
14869
14870/// RISC-V `vsext.vf8` instruction.
14871///
14872/// # Forms
14873/// Assembly: `vsext.vf8 vm, vs2, vd`
14874/// Rust: `vsext_vf8(vd, vs2, vm)`
14875///
14876/// # Arguments
14877/// - `vd` — Vector register operand.
14878/// - `vs2` — Vector register operand.
14879/// - `vm` — Vector mask control.
14880pub trait VsextVf8Emitter<T0, T1, T2> {
14881 fn vsext_vf8(&mut self, vd: T0, vs2: T1, vm: T2);
14882}
14883
14884/// RISC-V `vsha2ch.vv` instruction.
14885///
14886/// # Forms
14887/// Assembly: `vsha2ch.vv vs2, vs1, vd`
14888/// Rust: `vsha2ch_vv(vd, vs1, vs2)`
14889///
14890/// # Arguments
14891/// - `vd` — Vector register operand.
14892/// - `vs1` — Vector register operand.
14893/// - `vs2` — Vector register operand.
14894pub trait Vsha2ChVvEmitter<T0, T1, T2> {
14895 fn vsha2ch_vv(&mut self, vd: T0, vs1: T1, vs2: T2);
14896}
14897
14898/// RISC-V `vsha2cl.vv` instruction.
14899///
14900/// # Forms
14901/// Assembly: `vsha2cl.vv vs2, vs1, vd`
14902/// Rust: `vsha2cl_vv(vd, vs1, vs2)`
14903///
14904/// # Arguments
14905/// - `vd` — Vector register operand.
14906/// - `vs1` — Vector register operand.
14907/// - `vs2` — Vector register operand.
14908pub trait Vsha2ClVvEmitter<T0, T1, T2> {
14909 fn vsha2cl_vv(&mut self, vd: T0, vs1: T1, vs2: T2);
14910}
14911
14912/// RISC-V `vsha2ms.vv` instruction.
14913///
14914/// # Forms
14915/// Assembly: `vsha2ms.vv vs2, vs1, vd`
14916/// Rust: `vsha2ms_vv(vd, vs1, vs2)`
14917///
14918/// # Arguments
14919/// - `vd` — Vector register operand.
14920/// - `vs1` — Vector register operand.
14921/// - `vs2` — Vector register operand.
14922pub trait Vsha2MsVvEmitter<T0, T1, T2> {
14923 fn vsha2ms_vv(&mut self, vd: T0, vs1: T1, vs2: T2);
14924}
14925
14926/// RISC-V `vslide1down.vx` instruction.
14927///
14928/// # Forms
14929/// Assembly: `vslide1down.vx vm, vs2, xs1, vd`
14930/// Rust: `vslide1down_vx(vd, vs2, rs1, vm)`
14931///
14932/// # Arguments
14933/// - `vd` — Vector register operand.
14934/// - `vs2` — Vector register operand.
14935/// - `rs1` — Source register.
14936/// - `vm` — Vector mask control.
14937pub trait Vslide1DownVxEmitter<T0, T1, T2, T3> {
14938 fn vslide1down_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14939}
14940
14941/// RISC-V `vslide1up.vx` instruction.
14942///
14943/// # Forms
14944/// Assembly: `vslide1up.vx vm, vs2, xs1, vd`
14945/// Rust: `vslide1up_vx(vd, vs2, rs1, vm)`
14946///
14947/// # Arguments
14948/// - `vd` — Vector register operand.
14949/// - `vs2` — Vector register operand.
14950/// - `rs1` — Source register.
14951/// - `vm` — Vector mask control.
14952pub trait Vslide1UpVxEmitter<T0, T1, T2, T3> {
14953 fn vslide1up_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14954}
14955
14956/// RISC-V `vslidedown.vi` instruction.
14957///
14958/// # Forms
14959/// Assembly: `vslidedown.vi vm, vs2, vd, imm`
14960/// Rust: `vslidedown_vi(vd, vs2, zimm5, vm)`
14961///
14962/// # Arguments
14963/// - `vd` — Vector register operand.
14964/// - `vs2` — Vector register operand.
14965/// - `zimm5` — Immediate encoding value.
14966/// - `vm` — Vector mask control.
14967pub trait VslidedownViEmitter<T0, T1, T2, T3> {
14968 fn vslidedown_vi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
14969}
14970
14971/// RISC-V `vslidedown.vx` instruction.
14972///
14973/// # Forms
14974/// Assembly: `vslidedown.vx vm, vs2, xs1, vd`
14975/// Rust: `vslidedown_vx(vd, vs2, rs1, vm)`
14976///
14977/// # Arguments
14978/// - `vd` — Vector register operand.
14979/// - `vs2` — Vector register operand.
14980/// - `rs1` — Source register.
14981/// - `vm` — Vector mask control.
14982pub trait VslidedownVxEmitter<T0, T1, T2, T3> {
14983 fn vslidedown_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
14984}
14985
14986/// RISC-V `vslideup.vi` instruction.
14987///
14988/// # Forms
14989/// Assembly: `vslideup.vi vm, vs2, vd, imm`
14990/// Rust: `vslideup_vi(vd, vs2, zimm5, vm)`
14991///
14992/// # Arguments
14993/// - `vd` — Vector register operand.
14994/// - `vs2` — Vector register operand.
14995/// - `zimm5` — Immediate encoding value.
14996/// - `vm` — Vector mask control.
14997pub trait VslideupViEmitter<T0, T1, T2, T3> {
14998 fn vslideup_vi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
14999}
15000
15001/// RISC-V `vslideup.vx` instruction.
15002///
15003/// # Forms
15004/// Assembly: `vslideup.vx vm, vs2, xs1, vd`
15005/// Rust: `vslideup_vx(vd, vs2, rs1, vm)`
15006///
15007/// # Arguments
15008/// - `vd` — Vector register operand.
15009/// - `vs2` — Vector register operand.
15010/// - `rs1` — Source register.
15011/// - `vm` — Vector mask control.
15012pub trait VslideupVxEmitter<T0, T1, T2, T3> {
15013 fn vslideup_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15014}
15015
15016/// RISC-V `vsll.vi` instruction.
15017///
15018/// # Forms
15019/// Assembly: `vsll.vi vm, vs2, vd, imm`
15020/// Rust: `vsll_vi(vd, vs2, zimm5, vm)`
15021///
15022/// # Arguments
15023/// - `vd` — Vector register operand.
15024/// - `vs2` — Vector register operand.
15025/// - `zimm5` — Immediate encoding value.
15026/// - `vm` — Vector mask control.
15027pub trait VsllViEmitter<T0, T1, T2, T3> {
15028 fn vsll_vi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
15029}
15030
15031/// RISC-V `vsll.vv` instruction.
15032///
15033/// # Forms
15034/// Assembly: `vsll.vv vm, vs2, vs1, vd`
15035/// Rust: `vsll_vv(vd, vs1, vs2, vm)`
15036///
15037/// # Arguments
15038/// - `vd` — Vector register operand.
15039/// - `vs1` — Vector register operand.
15040/// - `vs2` — Vector register operand.
15041/// - `vm` — Vector mask control.
15042pub trait VsllVvEmitter<T0, T1, T2, T3> {
15043 fn vsll_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15044}
15045
15046/// RISC-V `vsll.vx` instruction.
15047///
15048/// # Forms
15049/// Assembly: `vsll.vx vm, vs2, xs1, vd`
15050/// Rust: `vsll_vx(vd, vs2, rs1, vm)`
15051///
15052/// # Arguments
15053/// - `vd` — Vector register operand.
15054/// - `vs2` — Vector register operand.
15055/// - `rs1` — Source register.
15056/// - `vm` — Vector mask control.
15057pub trait VsllVxEmitter<T0, T1, T2, T3> {
15058 fn vsll_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15059}
15060
15061/// RISC-V `vsm3c.vi` instruction.
15062///
15063/// # Forms
15064/// Assembly: `vsm3c.vi vs2, vd, imm`
15065/// Rust: `vsm3c_vi(vd, vs2, zimm5)`
15066///
15067/// # Arguments
15068/// - `vd` — Vector register operand.
15069/// - `vs2` — Vector register operand.
15070/// - `zimm5` — Immediate encoding value.
15071pub trait Vsm3CViEmitter<T0, T1, T2> {
15072 fn vsm3c_vi(&mut self, vd: T0, vs2: T1, zimm5: T2);
15073}
15074
15075/// RISC-V `vsm3me.vv` instruction.
15076///
15077/// # Forms
15078/// Assembly: `vsm3me.vv vs2, vs1, vd`
15079/// Rust: `vsm3me_vv(vd, vs1, vs2)`
15080///
15081/// # Arguments
15082/// - `vd` — Vector register operand.
15083/// - `vs1` — Vector register operand.
15084/// - `vs2` — Vector register operand.
15085pub trait Vsm3MeVvEmitter<T0, T1, T2> {
15086 fn vsm3me_vv(&mut self, vd: T0, vs1: T1, vs2: T2);
15087}
15088
15089/// RISC-V `vsm4k.vi` instruction.
15090///
15091/// # Forms
15092/// Assembly: `vsm4k.vi vs2, vd, imm`
15093/// Rust: `vsm4k_vi(vd, vs2, zimm5)`
15094///
15095/// # Arguments
15096/// - `vd` — Vector register operand.
15097/// - `vs2` — Vector register operand.
15098/// - `zimm5` — Immediate encoding value.
15099pub trait Vsm4KViEmitter<T0, T1, T2> {
15100 fn vsm4k_vi(&mut self, vd: T0, vs2: T1, zimm5: T2);
15101}
15102
15103/// RISC-V `vsm4r.vs` instruction.
15104///
15105/// # Forms
15106/// Assembly: `vsm4r.vs vs2, vd`
15107/// Rust: `vsm4r_vs(vd, vs2)`
15108///
15109/// # Arguments
15110/// - `vd` — Vector register operand.
15111/// - `vs2` — Vector register operand.
15112pub trait Vsm4RVsEmitter<T0, T1> {
15113 fn vsm4r_vs(&mut self, vd: T0, vs2: T1);
15114}
15115
15116/// RISC-V `vsm4r.vv` instruction.
15117///
15118/// # Forms
15119/// Assembly: `vsm4r.vv vs2, vd`
15120/// Rust: `vsm4r_vv(vd, vs2)`
15121///
15122/// # Arguments
15123/// - `vd` — Vector register operand.
15124/// - `vs2` — Vector register operand.
15125pub trait Vsm4RVvEmitter<T0, T1> {
15126 fn vsm4r_vv(&mut self, vd: T0, vs2: T1);
15127}
15128
15129/// RISC-V `vsm.v` instruction.
15130///
15131/// # Forms
15132/// Assembly: `vsm.v xs1, vs3`
15133/// Rust: `vsm_v(vs3, rs1)`
15134///
15135/// # Arguments
15136/// - `vs3` — Vector register operand.
15137/// - `rs1` — Memory base register.
15138pub trait VsmVEmitter<T0, T1> {
15139 fn vsm_v(&mut self, vs3: T0, rs1: T1);
15140}
15141
15142/// RISC-V `vsmul.vv` instruction.
15143///
15144/// # Forms
15145/// Assembly: `vsmul.vv vm, vs2, vs1, vd`
15146/// Rust: `vsmul_vv(vd, vs1, vs2, vm)`
15147///
15148/// # Arguments
15149/// - `vd` — Vector register operand.
15150/// - `vs1` — Vector register operand.
15151/// - `vs2` — Vector register operand.
15152/// - `vm` — Vector mask control.
15153pub trait VsmulVvEmitter<T0, T1, T2, T3> {
15154 fn vsmul_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15155}
15156
15157/// RISC-V `vsmul.vx` instruction.
15158///
15159/// # Forms
15160/// Assembly: `vsmul.vx vm, vs2, xs1, vd`
15161/// Rust: `vsmul_vx(vd, vs2, rs1, vm)`
15162///
15163/// # Arguments
15164/// - `vd` — Vector register operand.
15165/// - `vs2` — Vector register operand.
15166/// - `rs1` — Source register.
15167/// - `vm` — Vector mask control.
15168pub trait VsmulVxEmitter<T0, T1, T2, T3> {
15169 fn vsmul_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15170}
15171
15172/// RISC-V `vsoxei16.v` instruction.
15173///
15174/// # Forms
15175/// Assembly: `vsoxei16.v vm, vs2, xs1, vs3`
15176/// Rust: `vsoxei16_v(vs3, rs1, vs2, vm, nf)`
15177///
15178/// # Arguments
15179/// - `vs3` — Vector register operand.
15180/// - `rs1` — Memory base register.
15181/// - `vs2` — Vector register operand.
15182/// - `vm` — Vector mask control.
15183/// - `nf` — Vector segment field count.
15184pub trait Vsoxei16VEmitter<T0, T1, T2, T3, T4> {
15185 fn vsoxei16_v(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
15186}
15187
15188/// RISC-V `vsoxei32.v` instruction.
15189///
15190/// # Forms
15191/// Assembly: `vsoxei32.v vm, vs2, xs1, vs3`
15192/// Rust: `vsoxei32_v(vs3, rs1, vs2, vm, nf)`
15193///
15194/// # Arguments
15195/// - `vs3` — Vector register operand.
15196/// - `rs1` — Memory base register.
15197/// - `vs2` — Vector register operand.
15198/// - `vm` — Vector mask control.
15199/// - `nf` — Vector segment field count.
15200pub trait Vsoxei32VEmitter<T0, T1, T2, T3, T4> {
15201 fn vsoxei32_v(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
15202}
15203
15204/// RISC-V `vsoxei64.v` instruction.
15205///
15206/// # Forms
15207/// Assembly: `vsoxei64.v vm, vs2, xs1, vs3`
15208/// Rust: `vsoxei64_v(vs3, rs1, vs2, vm, nf)`
15209///
15210/// # Arguments
15211/// - `vs3` — Vector register operand.
15212/// - `rs1` — Memory base register.
15213/// - `vs2` — Vector register operand.
15214/// - `vm` — Vector mask control.
15215/// - `nf` — Vector segment field count.
15216pub trait Vsoxei64VEmitter<T0, T1, T2, T3, T4> {
15217 fn vsoxei64_v(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
15218}
15219
15220/// RISC-V `vsoxei8.v` instruction.
15221///
15222/// # Forms
15223/// Assembly: `vsoxei8.v vm, vs2, xs1, vs3`
15224/// Rust: `vsoxei8_v(vs3, rs1, vs2, vm, nf)`
15225///
15226/// # Arguments
15227/// - `vs3` — Vector register operand.
15228/// - `rs1` — Memory base register.
15229/// - `vs2` — Vector register operand.
15230/// - `vm` — Vector mask control.
15231/// - `nf` — Vector segment field count.
15232pub trait Vsoxei8VEmitter<T0, T1, T2, T3, T4> {
15233 fn vsoxei8_v(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
15234}
15235
15236/// RISC-V `vsra.vi` instruction.
15237///
15238/// # Forms
15239/// Assembly: `vsra.vi vm, vs2, vd, imm`
15240/// Rust: `vsra_vi(vd, vs2, zimm5, vm)`
15241///
15242/// # Arguments
15243/// - `vd` — Vector register operand.
15244/// - `vs2` — Vector register operand.
15245/// - `zimm5` — Immediate encoding value.
15246/// - `vm` — Vector mask control.
15247pub trait VsraViEmitter<T0, T1, T2, T3> {
15248 fn vsra_vi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
15249}
15250
15251/// RISC-V `vsra.vv` instruction.
15252///
15253/// # Forms
15254/// Assembly: `vsra.vv vm, vs2, vs1, vd`
15255/// Rust: `vsra_vv(vd, vs1, vs2, vm)`
15256///
15257/// # Arguments
15258/// - `vd` — Vector register operand.
15259/// - `vs1` — Vector register operand.
15260/// - `vs2` — Vector register operand.
15261/// - `vm` — Vector mask control.
15262pub trait VsraVvEmitter<T0, T1, T2, T3> {
15263 fn vsra_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15264}
15265
15266/// RISC-V `vsra.vx` instruction.
15267///
15268/// # Forms
15269/// Assembly: `vsra.vx vm, vs2, xs1, vd`
15270/// Rust: `vsra_vx(vd, vs2, rs1, vm)`
15271///
15272/// # Arguments
15273/// - `vd` — Vector register operand.
15274/// - `vs2` — Vector register operand.
15275/// - `rs1` — Source register.
15276/// - `vm` — Vector mask control.
15277pub trait VsraVxEmitter<T0, T1, T2, T3> {
15278 fn vsra_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15279}
15280
15281/// RISC-V `vsrl.vi` instruction.
15282///
15283/// # Forms
15284/// Assembly: `vsrl.vi vm, vs2, vd, imm`
15285/// Rust: `vsrl_vi(vd, vs2, zimm5, vm)`
15286///
15287/// # Arguments
15288/// - `vd` — Vector register operand.
15289/// - `vs2` — Vector register operand.
15290/// - `zimm5` — Immediate encoding value.
15291/// - `vm` — Vector mask control.
15292pub trait VsrlViEmitter<T0, T1, T2, T3> {
15293 fn vsrl_vi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
15294}
15295
15296/// RISC-V `vsrl.vv` instruction.
15297///
15298/// # Forms
15299/// Assembly: `vsrl.vv vm, vs2, vs1, vd`
15300/// Rust: `vsrl_vv(vd, vs1, vs2, vm)`
15301///
15302/// # Arguments
15303/// - `vd` — Vector register operand.
15304/// - `vs1` — Vector register operand.
15305/// - `vs2` — Vector register operand.
15306/// - `vm` — Vector mask control.
15307pub trait VsrlVvEmitter<T0, T1, T2, T3> {
15308 fn vsrl_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15309}
15310
15311/// RISC-V `vsrl.vx` instruction.
15312///
15313/// # Forms
15314/// Assembly: `vsrl.vx vm, vs2, xs1, vd`
15315/// Rust: `vsrl_vx(vd, vs2, rs1, vm)`
15316///
15317/// # Arguments
15318/// - `vd` — Vector register operand.
15319/// - `vs2` — Vector register operand.
15320/// - `rs1` — Source register.
15321/// - `vm` — Vector mask control.
15322pub trait VsrlVxEmitter<T0, T1, T2, T3> {
15323 fn vsrl_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15324}
15325
15326/// RISC-V `vsse16.v` instruction.
15327///
15328/// # Forms
15329/// Assembly: `vsse16.v vm, xs2, xs1, vs3`
15330/// Rust: `vsse16_v(vs3, rs1, rs2, vm, nf)`
15331///
15332/// # Arguments
15333/// - `vs3` — Vector register operand.
15334/// - `rs1` — Memory base register.
15335/// - `rs2` — Source register.
15336/// - `vm` — Vector mask control.
15337/// - `nf` — Vector segment field count.
15338pub trait Vsse16VEmitter<T0, T1, T2, T3, T4> {
15339 fn vsse16_v(&mut self, vs3: T0, rs1: T1, rs2: T2, vm: T3, nf: T4);
15340}
15341
15342/// RISC-V `vsse32.v` instruction.
15343///
15344/// # Forms
15345/// Assembly: `vsse32.v vm, xs2, xs1, vs3`
15346/// Rust: `vsse32_v(vs3, rs1, rs2, vm, nf)`
15347///
15348/// # Arguments
15349/// - `vs3` — Vector register operand.
15350/// - `rs1` — Memory base register.
15351/// - `rs2` — Source register.
15352/// - `vm` — Vector mask control.
15353/// - `nf` — Vector segment field count.
15354pub trait Vsse32VEmitter<T0, T1, T2, T3, T4> {
15355 fn vsse32_v(&mut self, vs3: T0, rs1: T1, rs2: T2, vm: T3, nf: T4);
15356}
15357
15358/// RISC-V `vsse64.v` instruction.
15359///
15360/// # Forms
15361/// Assembly: `vsse64.v vm, xs2, xs1, vs3`
15362/// Rust: `vsse64_v(vs3, rs1, rs2, vm, nf)`
15363///
15364/// # Arguments
15365/// - `vs3` — Vector register operand.
15366/// - `rs1` — Memory base register.
15367/// - `rs2` — Source register.
15368/// - `vm` — Vector mask control.
15369/// - `nf` — Vector segment field count.
15370pub trait Vsse64VEmitter<T0, T1, T2, T3, T4> {
15371 fn vsse64_v(&mut self, vs3: T0, rs1: T1, rs2: T2, vm: T3, nf: T4);
15372}
15373
15374/// RISC-V `vsse8.v` instruction.
15375///
15376/// # Forms
15377/// Assembly: `vsse8.v vm, xs2, xs1, vs3`
15378/// Rust: `vsse8_v(vs3, rs1, rs2, vm, nf)`
15379///
15380/// # Arguments
15381/// - `vs3` — Vector register operand.
15382/// - `rs1` — Memory base register.
15383/// - `rs2` — Source register.
15384/// - `vm` — Vector mask control.
15385/// - `nf` — Vector segment field count.
15386pub trait Vsse8VEmitter<T0, T1, T2, T3, T4> {
15387 fn vsse8_v(&mut self, vs3: T0, rs1: T1, rs2: T2, vm: T3, nf: T4);
15388}
15389
15390/// RISC-V `vssra.vi` instruction.
15391///
15392/// # Forms
15393/// Assembly: `vssra.vi vm, vs2, vd, imm`
15394/// Rust: `vssra_vi(vd, vs2, zimm5, vm)`
15395///
15396/// # Arguments
15397/// - `vd` — Vector register operand.
15398/// - `vs2` — Vector register operand.
15399/// - `zimm5` — Immediate encoding value.
15400/// - `vm` — Vector mask control.
15401pub trait VssraViEmitter<T0, T1, T2, T3> {
15402 fn vssra_vi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
15403}
15404
15405/// RISC-V `vssra.vv` instruction.
15406///
15407/// # Forms
15408/// Assembly: `vssra.vv vm, vs2, vs1, vd`
15409/// Rust: `vssra_vv(vd, vs1, vs2, vm)`
15410///
15411/// # Arguments
15412/// - `vd` — Vector register operand.
15413/// - `vs1` — Vector register operand.
15414/// - `vs2` — Vector register operand.
15415/// - `vm` — Vector mask control.
15416pub trait VssraVvEmitter<T0, T1, T2, T3> {
15417 fn vssra_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15418}
15419
15420/// RISC-V `vssra.vx` instruction.
15421///
15422/// # Forms
15423/// Assembly: `vssra.vx vm, vs2, xs1, vd`
15424/// Rust: `vssra_vx(vd, vs2, rs1, vm)`
15425///
15426/// # Arguments
15427/// - `vd` — Vector register operand.
15428/// - `vs2` — Vector register operand.
15429/// - `rs1` — Source register.
15430/// - `vm` — Vector mask control.
15431pub trait VssraVxEmitter<T0, T1, T2, T3> {
15432 fn vssra_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15433}
15434
15435/// RISC-V `vssrl.vi` instruction.
15436///
15437/// # Forms
15438/// Assembly: `vssrl.vi vm, vs2, vd, imm`
15439/// Rust: `vssrl_vi(vd, vs2, zimm5, vm)`
15440///
15441/// # Arguments
15442/// - `vd` — Vector register operand.
15443/// - `vs2` — Vector register operand.
15444/// - `zimm5` — Immediate encoding value.
15445/// - `vm` — Vector mask control.
15446pub trait VssrlViEmitter<T0, T1, T2, T3> {
15447 fn vssrl_vi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
15448}
15449
15450/// RISC-V `vssrl.vv` instruction.
15451///
15452/// # Forms
15453/// Assembly: `vssrl.vv vm, vs2, vs1, vd`
15454/// Rust: `vssrl_vv(vd, vs1, vs2, vm)`
15455///
15456/// # Arguments
15457/// - `vd` — Vector register operand.
15458/// - `vs1` — Vector register operand.
15459/// - `vs2` — Vector register operand.
15460/// - `vm` — Vector mask control.
15461pub trait VssrlVvEmitter<T0, T1, T2, T3> {
15462 fn vssrl_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15463}
15464
15465/// RISC-V `vssrl.vx` instruction.
15466///
15467/// # Forms
15468/// Assembly: `vssrl.vx vm, vs2, xs1, vd`
15469/// Rust: `vssrl_vx(vd, vs2, rs1, vm)`
15470///
15471/// # Arguments
15472/// - `vd` — Vector register operand.
15473/// - `vs2` — Vector register operand.
15474/// - `rs1` — Source register.
15475/// - `vm` — Vector mask control.
15476pub trait VssrlVxEmitter<T0, T1, T2, T3> {
15477 fn vssrl_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15478}
15479
15480/// RISC-V `vssub.vv` instruction.
15481///
15482/// # Forms
15483/// Assembly: `vssub.vv vm, vs2, vs1, vd`
15484/// Rust: `vssub_vv(vd, vs1, vs2, vm)`
15485///
15486/// # Arguments
15487/// - `vd` — Vector register operand.
15488/// - `vs1` — Vector register operand.
15489/// - `vs2` — Vector register operand.
15490/// - `vm` — Vector mask control.
15491pub trait VssubVvEmitter<T0, T1, T2, T3> {
15492 fn vssub_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15493}
15494
15495/// RISC-V `vssub.vx` instruction.
15496///
15497/// # Forms
15498/// Assembly: `vssub.vx vm, vs2, xs1, vd`
15499/// Rust: `vssub_vx(vd, vs2, rs1, vm)`
15500///
15501/// # Arguments
15502/// - `vd` — Vector register operand.
15503/// - `vs2` — Vector register operand.
15504/// - `rs1` — Source register.
15505/// - `vm` — Vector mask control.
15506pub trait VssubVxEmitter<T0, T1, T2, T3> {
15507 fn vssub_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15508}
15509
15510/// RISC-V `vssubu.vv` instruction.
15511///
15512/// # Forms
15513/// Assembly: `vssubu.vv vm, vs2, vs1, vd`
15514/// Rust: `vssubu_vv(vd, vs1, vs2, vm)`
15515///
15516/// # Arguments
15517/// - `vd` — Vector register operand.
15518/// - `vs1` — Vector register operand.
15519/// - `vs2` — Vector register operand.
15520/// - `vm` — Vector mask control.
15521pub trait VssubuVvEmitter<T0, T1, T2, T3> {
15522 fn vssubu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15523}
15524
15525/// RISC-V `vssubu.vx` instruction.
15526///
15527/// # Forms
15528/// Assembly: `vssubu.vx vm, vs2, xs1, vd`
15529/// Rust: `vssubu_vx(vd, vs2, rs1, vm)`
15530///
15531/// # Arguments
15532/// - `vd` — Vector register operand.
15533/// - `vs2` — Vector register operand.
15534/// - `rs1` — Source register.
15535/// - `vm` — Vector mask control.
15536pub trait VssubuVxEmitter<T0, T1, T2, T3> {
15537 fn vssubu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15538}
15539
15540/// RISC-V `vsub.vv` instruction.
15541///
15542/// # Forms
15543/// Assembly: `vsub.vv vm, vs2, vs1, vd`
15544/// Rust: `vsub_vv(vd, vs1, vs2, vm)`
15545///
15546/// # Arguments
15547/// - `vd` — Vector register operand.
15548/// - `vs1` — Vector register operand.
15549/// - `vs2` — Vector register operand.
15550/// - `vm` — Vector mask control.
15551pub trait VsubVvEmitter<T0, T1, T2, T3> {
15552 fn vsub_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15553}
15554
15555/// RISC-V `vsub.vx` instruction.
15556///
15557/// # Forms
15558/// Assembly: `vsub.vx vm, vs2, xs1, vd`
15559/// Rust: `vsub_vx(vd, vs2, rs1, vm)`
15560///
15561/// # Arguments
15562/// - `vd` — Vector register operand.
15563/// - `vs2` — Vector register operand.
15564/// - `rs1` — Source register.
15565/// - `vm` — Vector mask control.
15566pub trait VsubVxEmitter<T0, T1, T2, T3> {
15567 fn vsub_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15568}
15569
15570/// RISC-V `vsuxei16.v` instruction.
15571///
15572/// # Forms
15573/// Assembly: `vsuxei16.v vm, vs2, xs1, vs3`
15574/// Rust: `vsuxei16_v(vs3, rs1, vs2, vm, nf)`
15575///
15576/// # Arguments
15577/// - `vs3` — Vector register operand.
15578/// - `rs1` — Memory base register.
15579/// - `vs2` — Vector register operand.
15580/// - `vm` — Vector mask control.
15581/// - `nf` — Vector segment field count.
15582pub trait Vsuxei16VEmitter<T0, T1, T2, T3, T4> {
15583 fn vsuxei16_v(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
15584}
15585
15586/// RISC-V `vsuxei32.v` instruction.
15587///
15588/// # Forms
15589/// Assembly: `vsuxei32.v vm, vs2, xs1, vs3`
15590/// Rust: `vsuxei32_v(vs3, rs1, vs2, vm, nf)`
15591///
15592/// # Arguments
15593/// - `vs3` — Vector register operand.
15594/// - `rs1` — Memory base register.
15595/// - `vs2` — Vector register operand.
15596/// - `vm` — Vector mask control.
15597/// - `nf` — Vector segment field count.
15598pub trait Vsuxei32VEmitter<T0, T1, T2, T3, T4> {
15599 fn vsuxei32_v(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
15600}
15601
15602/// RISC-V `vsuxei64.v` instruction.
15603///
15604/// # Forms
15605/// Assembly: `vsuxei64.v vm, vs2, xs1, vs3`
15606/// Rust: `vsuxei64_v(vs3, rs1, vs2, vm, nf)`
15607///
15608/// # Arguments
15609/// - `vs3` — Vector register operand.
15610/// - `rs1` — Memory base register.
15611/// - `vs2` — Vector register operand.
15612/// - `vm` — Vector mask control.
15613/// - `nf` — Vector segment field count.
15614pub trait Vsuxei64VEmitter<T0, T1, T2, T3, T4> {
15615 fn vsuxei64_v(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
15616}
15617
15618/// RISC-V `vsuxei8.v` instruction.
15619///
15620/// # Forms
15621/// Assembly: `vsuxei8.v vm, vs2, xs1, vs3`
15622/// Rust: `vsuxei8_v(vs3, rs1, vs2, vm, nf)`
15623///
15624/// # Arguments
15625/// - `vs3` — Vector register operand.
15626/// - `rs1` — Memory base register.
15627/// - `vs2` — Vector register operand.
15628/// - `vm` — Vector mask control.
15629/// - `nf` — Vector segment field count.
15630pub trait Vsuxei8VEmitter<T0, T1, T2, T3, T4> {
15631 fn vsuxei8_v(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4);
15632}
15633
15634/// RISC-V `vwadd.vv` instruction.
15635///
15636/// # Forms
15637/// Assembly: `vwadd.vv vm, vs2, vs1, vd`
15638/// Rust: `vwadd_vv(vd, vs1, vs2, vm)`
15639///
15640/// # Arguments
15641/// - `vd` — Vector register operand.
15642/// - `vs1` — Vector register operand.
15643/// - `vs2` — Vector register operand.
15644/// - `vm` — Vector mask control.
15645pub trait VwaddVvEmitter<T0, T1, T2, T3> {
15646 fn vwadd_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15647}
15648
15649/// RISC-V `vwadd.vx` instruction.
15650///
15651/// # Forms
15652/// Assembly: `vwadd.vx vm, vs2, xs1, vd`
15653/// Rust: `vwadd_vx(vd, vs2, rs1, vm)`
15654///
15655/// # Arguments
15656/// - `vd` — Vector register operand.
15657/// - `vs2` — Vector register operand.
15658/// - `rs1` — Source register.
15659/// - `vm` — Vector mask control.
15660pub trait VwaddVxEmitter<T0, T1, T2, T3> {
15661 fn vwadd_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15662}
15663
15664/// RISC-V `vwadd.wv` instruction.
15665///
15666/// # Forms
15667/// Assembly: `vwadd.wv vm, vs2, vs1, vd`
15668/// Rust: `vwadd_wv(vd, vs1, vs2, vm)`
15669///
15670/// # Arguments
15671/// - `vd` — Vector register operand.
15672/// - `vs1` — Vector register operand.
15673/// - `vs2` — Vector register operand.
15674/// - `vm` — Vector mask control.
15675pub trait VwaddWvEmitter<T0, T1, T2, T3> {
15676 fn vwadd_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15677}
15678
15679/// RISC-V `vwadd.wx` instruction.
15680///
15681/// # Forms
15682/// Assembly: `vwadd.wx vm, vs2, xs1, vd`
15683/// Rust: `vwadd_wx(vd, vs2, rs1, vm)`
15684///
15685/// # Arguments
15686/// - `vd` — Vector register operand.
15687/// - `vs2` — Vector register operand.
15688/// - `rs1` — Source register.
15689/// - `vm` — Vector mask control.
15690pub trait VwaddWxEmitter<T0, T1, T2, T3> {
15691 fn vwadd_wx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15692}
15693
15694/// RISC-V `vwaddu.vv` instruction.
15695///
15696/// # Forms
15697/// Assembly: `vwaddu.vv vm, vs2, vs1, vd`
15698/// Rust: `vwaddu_vv(vd, vs1, vs2, vm)`
15699///
15700/// # Arguments
15701/// - `vd` — Vector register operand.
15702/// - `vs1` — Vector register operand.
15703/// - `vs2` — Vector register operand.
15704/// - `vm` — Vector mask control.
15705pub trait VwadduVvEmitter<T0, T1, T2, T3> {
15706 fn vwaddu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15707}
15708
15709/// RISC-V `vwaddu.vx` instruction.
15710///
15711/// # Forms
15712/// Assembly: `vwaddu.vx vm, vs2, xs1, vd`
15713/// Rust: `vwaddu_vx(vd, vs2, rs1, vm)`
15714///
15715/// # Arguments
15716/// - `vd` — Vector register operand.
15717/// - `vs2` — Vector register operand.
15718/// - `rs1` — Source register.
15719/// - `vm` — Vector mask control.
15720pub trait VwadduVxEmitter<T0, T1, T2, T3> {
15721 fn vwaddu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15722}
15723
15724/// RISC-V `vwaddu.wv` instruction.
15725///
15726/// # Forms
15727/// Assembly: `vwaddu.wv vm, vs2, vs1, vd`
15728/// Rust: `vwaddu_wv(vd, vs1, vs2, vm)`
15729///
15730/// # Arguments
15731/// - `vd` — Vector register operand.
15732/// - `vs1` — Vector register operand.
15733/// - `vs2` — Vector register operand.
15734/// - `vm` — Vector mask control.
15735pub trait VwadduWvEmitter<T0, T1, T2, T3> {
15736 fn vwaddu_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15737}
15738
15739/// RISC-V `vwaddu.wx` instruction.
15740///
15741/// # Forms
15742/// Assembly: `vwaddu.wx vm, vs2, xs1, vd`
15743/// Rust: `vwaddu_wx(vd, vs2, rs1, vm)`
15744///
15745/// # Arguments
15746/// - `vd` — Vector register operand.
15747/// - `vs2` — Vector register operand.
15748/// - `rs1` — Source register.
15749/// - `vm` — Vector mask control.
15750pub trait VwadduWxEmitter<T0, T1, T2, T3> {
15751 fn vwaddu_wx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15752}
15753
15754/// RISC-V `vwmacc.vv` instruction.
15755///
15756/// # Forms
15757/// Assembly: `vwmacc.vv vm, vs2, vs1, vd`
15758/// Rust: `vwmacc_vv(vd, vs1, vs2, vm)`
15759///
15760/// # Arguments
15761/// - `vd` — Vector register operand.
15762/// - `vs1` — Vector register operand.
15763/// - `vs2` — Vector register operand.
15764/// - `vm` — Vector mask control.
15765pub trait VwmaccVvEmitter<T0, T1, T2, T3> {
15766 fn vwmacc_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15767}
15768
15769/// RISC-V `vwmacc.vx` instruction.
15770///
15771/// # Forms
15772/// Assembly: `vwmacc.vx vm, vs2, xs1, vd`
15773/// Rust: `vwmacc_vx(vd, vs2, rs1, vm)`
15774///
15775/// # Arguments
15776/// - `vd` — Vector register operand.
15777/// - `vs2` — Vector register operand.
15778/// - `rs1` — Source register.
15779/// - `vm` — Vector mask control.
15780pub trait VwmaccVxEmitter<T0, T1, T2, T3> {
15781 fn vwmacc_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15782}
15783
15784/// RISC-V `vwmaccsu.vv` instruction.
15785///
15786/// # Forms
15787/// Assembly: `vwmaccsu.vv vm, vs2, vs1, vd`
15788/// Rust: `vwmaccsu_vv(vd, vs1, vs2, vm)`
15789///
15790/// # Arguments
15791/// - `vd` — Vector register operand.
15792/// - `vs1` — Vector register operand.
15793/// - `vs2` — Vector register operand.
15794/// - `vm` — Vector mask control.
15795pub trait VwmaccsuVvEmitter<T0, T1, T2, T3> {
15796 fn vwmaccsu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15797}
15798
15799/// RISC-V `vwmaccsu.vx` instruction.
15800///
15801/// # Forms
15802/// Assembly: `vwmaccsu.vx vm, vs2, xs1, vd`
15803/// Rust: `vwmaccsu_vx(vd, vs2, rs1, vm)`
15804///
15805/// # Arguments
15806/// - `vd` — Vector register operand.
15807/// - `vs2` — Vector register operand.
15808/// - `rs1` — Source register.
15809/// - `vm` — Vector mask control.
15810pub trait VwmaccsuVxEmitter<T0, T1, T2, T3> {
15811 fn vwmaccsu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15812}
15813
15814/// RISC-V `vwmaccu.vv` instruction.
15815///
15816/// # Forms
15817/// Assembly: `vwmaccu.vv vm, vs2, vs1, vd`
15818/// Rust: `vwmaccu_vv(vd, vs1, vs2, vm)`
15819///
15820/// # Arguments
15821/// - `vd` — Vector register operand.
15822/// - `vs1` — Vector register operand.
15823/// - `vs2` — Vector register operand.
15824/// - `vm` — Vector mask control.
15825pub trait VwmaccuVvEmitter<T0, T1, T2, T3> {
15826 fn vwmaccu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15827}
15828
15829/// RISC-V `vwmaccu.vx` instruction.
15830///
15831/// # Forms
15832/// Assembly: `vwmaccu.vx vm, vs2, xs1, vd`
15833/// Rust: `vwmaccu_vx(vd, vs2, rs1, vm)`
15834///
15835/// # Arguments
15836/// - `vd` — Vector register operand.
15837/// - `vs2` — Vector register operand.
15838/// - `rs1` — Source register.
15839/// - `vm` — Vector mask control.
15840pub trait VwmaccuVxEmitter<T0, T1, T2, T3> {
15841 fn vwmaccu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15842}
15843
15844/// RISC-V `vwmaccus.vx` instruction.
15845///
15846/// # Forms
15847/// Assembly: `vwmaccus.vx vm, vs2, xs1, vd`
15848/// Rust: `vwmaccus_vx(vd, vs2, rs1, vm)`
15849///
15850/// # Arguments
15851/// - `vd` — Vector register operand.
15852/// - `vs2` — Vector register operand.
15853/// - `rs1` — Source register.
15854/// - `vm` — Vector mask control.
15855pub trait VwmaccusVxEmitter<T0, T1, T2, T3> {
15856 fn vwmaccus_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15857}
15858
15859/// RISC-V `vwmul.vv` instruction.
15860///
15861/// # Forms
15862/// Assembly: `vwmul.vv vm, vs2, vs1, vd`
15863/// Rust: `vwmul_vv(vd, vs1, vs2, vm)`
15864///
15865/// # Arguments
15866/// - `vd` — Vector register operand.
15867/// - `vs1` — Vector register operand.
15868/// - `vs2` — Vector register operand.
15869/// - `vm` — Vector mask control.
15870pub trait VwmulVvEmitter<T0, T1, T2, T3> {
15871 fn vwmul_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15872}
15873
15874/// RISC-V `vwmul.vx` instruction.
15875///
15876/// # Forms
15877/// Assembly: `vwmul.vx vm, vs2, xs1, vd`
15878/// Rust: `vwmul_vx(vd, vs2, rs1, vm)`
15879///
15880/// # Arguments
15881/// - `vd` — Vector register operand.
15882/// - `vs2` — Vector register operand.
15883/// - `rs1` — Source register.
15884/// - `vm` — Vector mask control.
15885pub trait VwmulVxEmitter<T0, T1, T2, T3> {
15886 fn vwmul_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15887}
15888
15889/// RISC-V `vwmulsu.vv` instruction.
15890///
15891/// # Forms
15892/// Assembly: `vwmulsu.vv vm, vs2, vs1, vd`
15893/// Rust: `vwmulsu_vv(vd, vs1, vs2, vm)`
15894///
15895/// # Arguments
15896/// - `vd` — Vector register operand.
15897/// - `vs1` — Vector register operand.
15898/// - `vs2` — Vector register operand.
15899/// - `vm` — Vector mask control.
15900pub trait VwmulsuVvEmitter<T0, T1, T2, T3> {
15901 fn vwmulsu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15902}
15903
15904/// RISC-V `vwmulsu.vx` instruction.
15905///
15906/// # Forms
15907/// Assembly: `vwmulsu.vx vm, vs2, xs1, vd`
15908/// Rust: `vwmulsu_vx(vd, vs2, rs1, vm)`
15909///
15910/// # Arguments
15911/// - `vd` — Vector register operand.
15912/// - `vs2` — Vector register operand.
15913/// - `rs1` — Source register.
15914/// - `vm` — Vector mask control.
15915pub trait VwmulsuVxEmitter<T0, T1, T2, T3> {
15916 fn vwmulsu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15917}
15918
15919/// RISC-V `vwmulu.vv` instruction.
15920///
15921/// # Forms
15922/// Assembly: `vwmulu.vv vm, vs2, vs1, vd`
15923/// Rust: `vwmulu_vv(vd, vs1, vs2, vm)`
15924///
15925/// # Arguments
15926/// - `vd` — Vector register operand.
15927/// - `vs1` — Vector register operand.
15928/// - `vs2` — Vector register operand.
15929/// - `vm` — Vector mask control.
15930pub trait VwmuluVvEmitter<T0, T1, T2, T3> {
15931 fn vwmulu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15932}
15933
15934/// RISC-V `vwmulu.vx` instruction.
15935///
15936/// # Forms
15937/// Assembly: `vwmulu.vx vm, vs2, xs1, vd`
15938/// Rust: `vwmulu_vx(vd, vs2, rs1, vm)`
15939///
15940/// # Arguments
15941/// - `vd` — Vector register operand.
15942/// - `vs2` — Vector register operand.
15943/// - `rs1` — Source register.
15944/// - `vm` — Vector mask control.
15945pub trait VwmuluVxEmitter<T0, T1, T2, T3> {
15946 fn vwmulu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
15947}
15948
15949/// RISC-V `vwredsum.vs` instruction.
15950///
15951/// # Forms
15952/// Assembly: `vwredsum.vs vm, vs2, vs1, vd`
15953/// Rust: `vwredsum_vs(vd, vs1, vs2, vm)`
15954///
15955/// # Arguments
15956/// - `vd` — Vector register operand.
15957/// - `vs1` — Vector register operand.
15958/// - `vs2` — Vector register operand.
15959/// - `vm` — Vector mask control.
15960pub trait VwredsumVsEmitter<T0, T1, T2, T3> {
15961 fn vwredsum_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15962}
15963
15964/// RISC-V `vwredsumu.vs` instruction.
15965///
15966/// # Forms
15967/// Assembly: `vwredsumu.vs vm, vs2, vs1, vd`
15968/// Rust: `vwredsumu_vs(vd, vs1, vs2, vm)`
15969///
15970/// # Arguments
15971/// - `vd` — Vector register operand.
15972/// - `vs1` — Vector register operand.
15973/// - `vs2` — Vector register operand.
15974/// - `vm` — Vector mask control.
15975pub trait VwredsumuVsEmitter<T0, T1, T2, T3> {
15976 fn vwredsumu_vs(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
15977}
15978
15979/// RISC-V `vwsll.vi` instruction.
15980///
15981/// # Forms
15982/// Assembly: `vwsll.vi vm, vs2, vd, imm`
15983/// Rust: `vwsll_vi(vd, vs2, zimm5, vm)`
15984///
15985/// # Arguments
15986/// - `vd` — Vector register operand.
15987/// - `vs2` — Vector register operand.
15988/// - `zimm5` — Immediate encoding value.
15989/// - `vm` — Vector mask control.
15990pub trait VwsllViEmitter<T0, T1, T2, T3> {
15991 fn vwsll_vi(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3);
15992}
15993
15994/// RISC-V `vwsll.vv` instruction.
15995///
15996/// # Forms
15997/// Assembly: `vwsll.vv vm, vs2, vs1, vd`
15998/// Rust: `vwsll_vv(vd, vs1, vs2, vm)`
15999///
16000/// # Arguments
16001/// - `vd` — Vector register operand.
16002/// - `vs1` — Vector register operand.
16003/// - `vs2` — Vector register operand.
16004/// - `vm` — Vector mask control.
16005pub trait VwsllVvEmitter<T0, T1, T2, T3> {
16006 fn vwsll_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
16007}
16008
16009/// RISC-V `vwsll.vx` instruction.
16010///
16011/// # Forms
16012/// Assembly: `vwsll.vx vm, vs2, xs1, vd`
16013/// Rust: `vwsll_vx(vd, vs2, rs1, vm)`
16014///
16015/// # Arguments
16016/// - `vd` — Vector register operand.
16017/// - `vs2` — Vector register operand.
16018/// - `rs1` — Source register.
16019/// - `vm` — Vector mask control.
16020pub trait VwsllVxEmitter<T0, T1, T2, T3> {
16021 fn vwsll_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
16022}
16023
16024/// RISC-V `vwsub.vv` instruction.
16025///
16026/// # Forms
16027/// Assembly: `vwsub.vv vm, vs2, vs1, vd`
16028/// Rust: `vwsub_vv(vd, vs1, vs2, vm)`
16029///
16030/// # Arguments
16031/// - `vd` — Vector register operand.
16032/// - `vs1` — Vector register operand.
16033/// - `vs2` — Vector register operand.
16034/// - `vm` — Vector mask control.
16035pub trait VwsubVvEmitter<T0, T1, T2, T3> {
16036 fn vwsub_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
16037}
16038
16039/// RISC-V `vwsub.vx` instruction.
16040///
16041/// # Forms
16042/// Assembly: `vwsub.vx vm, vs2, xs1, vd`
16043/// Rust: `vwsub_vx(vd, vs2, rs1, vm)`
16044///
16045/// # Arguments
16046/// - `vd` — Vector register operand.
16047/// - `vs2` — Vector register operand.
16048/// - `rs1` — Source register.
16049/// - `vm` — Vector mask control.
16050pub trait VwsubVxEmitter<T0, T1, T2, T3> {
16051 fn vwsub_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
16052}
16053
16054/// RISC-V `vwsub.wv` instruction.
16055///
16056/// # Forms
16057/// Assembly: `vwsub.wv vm, vs2, vs1, vd`
16058/// Rust: `vwsub_wv(vd, vs1, vs2, vm)`
16059///
16060/// # Arguments
16061/// - `vd` — Vector register operand.
16062/// - `vs1` — Vector register operand.
16063/// - `vs2` — Vector register operand.
16064/// - `vm` — Vector mask control.
16065pub trait VwsubWvEmitter<T0, T1, T2, T3> {
16066 fn vwsub_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
16067}
16068
16069/// RISC-V `vwsub.wx` instruction.
16070///
16071/// # Forms
16072/// Assembly: `vwsub.wx vm, vs2, xs1, vd`
16073/// Rust: `vwsub_wx(vd, vs2, rs1, vm)`
16074///
16075/// # Arguments
16076/// - `vd` — Vector register operand.
16077/// - `vs2` — Vector register operand.
16078/// - `rs1` — Source register.
16079/// - `vm` — Vector mask control.
16080pub trait VwsubWxEmitter<T0, T1, T2, T3> {
16081 fn vwsub_wx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
16082}
16083
16084/// RISC-V `vwsubu.vv` instruction.
16085///
16086/// # Forms
16087/// Assembly: `vwsubu.vv vm, vs2, vs1, vd`
16088/// Rust: `vwsubu_vv(vd, vs1, vs2, vm)`
16089///
16090/// # Arguments
16091/// - `vd` — Vector register operand.
16092/// - `vs1` — Vector register operand.
16093/// - `vs2` — Vector register operand.
16094/// - `vm` — Vector mask control.
16095pub trait VwsubuVvEmitter<T0, T1, T2, T3> {
16096 fn vwsubu_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
16097}
16098
16099/// RISC-V `vwsubu.vx` instruction.
16100///
16101/// # Forms
16102/// Assembly: `vwsubu.vx vm, vs2, xs1, vd`
16103/// Rust: `vwsubu_vx(vd, vs2, rs1, vm)`
16104///
16105/// # Arguments
16106/// - `vd` — Vector register operand.
16107/// - `vs2` — Vector register operand.
16108/// - `rs1` — Source register.
16109/// - `vm` — Vector mask control.
16110pub trait VwsubuVxEmitter<T0, T1, T2, T3> {
16111 fn vwsubu_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
16112}
16113
16114/// RISC-V `vwsubu.wv` instruction.
16115///
16116/// # Forms
16117/// Assembly: `vwsubu.wv vm, vs2, vs1, vd`
16118/// Rust: `vwsubu_wv(vd, vs1, vs2, vm)`
16119///
16120/// # Arguments
16121/// - `vd` — Vector register operand.
16122/// - `vs1` — Vector register operand.
16123/// - `vs2` — Vector register operand.
16124/// - `vm` — Vector mask control.
16125pub trait VwsubuWvEmitter<T0, T1, T2, T3> {
16126 fn vwsubu_wv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
16127}
16128
16129/// RISC-V `vwsubu.wx` instruction.
16130///
16131/// # Forms
16132/// Assembly: `vwsubu.wx vm, vs2, xs1, vd`
16133/// Rust: `vwsubu_wx(vd, vs2, rs1, vm)`
16134///
16135/// # Arguments
16136/// - `vd` — Vector register operand.
16137/// - `vs2` — Vector register operand.
16138/// - `rs1` — Source register.
16139/// - `vm` — Vector mask control.
16140pub trait VwsubuWxEmitter<T0, T1, T2, T3> {
16141 fn vwsubu_wx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
16142}
16143
16144/// RISC-V `vxor.vi` instruction.
16145///
16146/// # Forms
16147/// Assembly: `vxor.vi vm, vs2, vd, imm`
16148/// Rust: `vxor_vi(vd, vs2, simm5, vm)`
16149///
16150/// # Arguments
16151/// - `vd` — Vector register operand.
16152/// - `vs2` — Vector register operand.
16153/// - `simm5` — Immediate encoding value.
16154/// - `vm` — Vector mask control.
16155pub trait VxorViEmitter<T0, T1, T2, T3> {
16156 fn vxor_vi(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3);
16157}
16158
16159/// RISC-V `vxor.vv` instruction.
16160///
16161/// # Forms
16162/// Assembly: `vxor.vv vm, vs2, vs1, vd`
16163/// Rust: `vxor_vv(vd, vs1, vs2, vm)`
16164///
16165/// # Arguments
16166/// - `vd` — Vector register operand.
16167/// - `vs1` — Vector register operand.
16168/// - `vs2` — Vector register operand.
16169/// - `vm` — Vector mask control.
16170pub trait VxorVvEmitter<T0, T1, T2, T3> {
16171 fn vxor_vv(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3);
16172}
16173
16174/// RISC-V `vxor.vx` instruction.
16175///
16176/// # Forms
16177/// Assembly: `vxor.vx vm, vs2, xs1, vd`
16178/// Rust: `vxor_vx(vd, vs2, rs1, vm)`
16179///
16180/// # Arguments
16181/// - `vd` — Vector register operand.
16182/// - `vs2` — Vector register operand.
16183/// - `rs1` — Source register.
16184/// - `vm` — Vector mask control.
16185pub trait VxorVxEmitter<T0, T1, T2, T3> {
16186 fn vxor_vx(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3);
16187}
16188
16189/// RISC-V `vzext.vf2` instruction.
16190///
16191/// # Forms
16192/// Assembly: `vzext.vf2 vm, vs2, vd`
16193/// Rust: `vzext_vf2(vd, vs2, vm)`
16194///
16195/// # Arguments
16196/// - `vd` — Vector register operand.
16197/// - `vs2` — Vector register operand.
16198/// - `vm` — Vector mask control.
16199pub trait VzextVf2Emitter<T0, T1, T2> {
16200 fn vzext_vf2(&mut self, vd: T0, vs2: T1, vm: T2);
16201}
16202
16203/// RISC-V `vzext.vf4` instruction.
16204///
16205/// # Forms
16206/// Assembly: `vzext.vf4 vm, vs2, vd`
16207/// Rust: `vzext_vf4(vd, vs2, vm)`
16208///
16209/// # Arguments
16210/// - `vd` — Vector register operand.
16211/// - `vs2` — Vector register operand.
16212/// - `vm` — Vector mask control.
16213pub trait VzextVf4Emitter<T0, T1, T2> {
16214 fn vzext_vf4(&mut self, vd: T0, vs2: T1, vm: T2);
16215}
16216
16217/// RISC-V `vzext.vf8` instruction.
16218///
16219/// # Forms
16220/// Assembly: `vzext.vf8 vm, vs2, vd`
16221/// Rust: `vzext_vf8(vd, vs2, vm)`
16222///
16223/// # Arguments
16224/// - `vd` — Vector register operand.
16225/// - `vs2` — Vector register operand.
16226/// - `vm` — Vector mask control.
16227pub trait VzextVf8Emitter<T0, T1, T2> {
16228 fn vzext_vf8(&mut self, vd: T0, vs2: T1, vm: T2);
16229}
16230
16231/// Wait for interrupt
16232///
16233/// Can causes the processor to enter a low-power state until the next interrupt occurs.
16234///
16235/// <%- if ext?(:H) -%>
16236/// The behavior of `wfi` is affected by the `mstatus.TW`
16237/// and `hstatus.VTW` bits, as summarized below.
16238///
16239/// \[%autowidth,%footer\]
16240/// |===
16241/// .2+| \[.rotate\]#`mstatus.TW`# .2+| \[.rotate\]#`hstatus.VTW`# 4+^.>| `wfi` behavior
16242/// h| HS-mode h| U-mode h| VS-mode h| in VU-mode
16243///
16244/// | 0 | 0 | Wait | Trap (I) | Wait | Trap (V)
16245/// | 0 | 1 | Wait | Trap (I) | Trap (V) | Trap (V)
16246/// | 1 | - | Trap (I) | Trap (I) | Trap (I) | Trap (I)
16247///
16248/// 6+| Trap (I) - Trap with `Illegal Instruction` code +
16249/// Trap (V) - Trap with `Virtual Instruction` code
16250/// |===
16251///
16252/// <%- else -%>
16253/// The `wfi` instruction is also affected by `mstatus.TW`, as shown below:
16254///
16255/// \[%autowidth,%footer\]
16256/// |===
16257/// .2+| \[.rotate\]#`mstatus.TW`# 2+^.>| `wfi` behavior
16258/// h| S-mode h| U-mode
16259///
16260/// | 0 | Wait | Trap (I)
16261/// | 1 | Trap (I) | Trap (I)
16262///
16263/// 3+| Trap (I) - Trap with `Illegal Instruction` code
16264/// |===
16265///
16266/// <%- end -%>
16267///
16268/// When `wfi` is marked as causing a trap above, the implementation is allowed to wait
16269/// for an unspecified period of time to see if an interrupt occurs before raising the trap.
16270/// That period of time can be zero (_i.e._, `wfi` always causes a trap in the cases identified
16271/// above).
16272///
16273/// # Forms
16274/// Assembly: `wfi ""`
16275/// Rust: `wfi()`
16276///
16277/// # Arguments
16278pub trait WfiEmitter {
16279 fn wfi(&mut self);
16280}
16281
16282/// RISC-V `wrs.nto` instruction.
16283///
16284/// # Forms
16285/// Assembly: `wrs.nto wrs_nto`
16286/// Rust: `wrs_nto()`
16287///
16288/// # Arguments
16289pub trait WrsNtoEmitter {
16290 fn wrs_nto(&mut self);
16291}
16292
16293/// RISC-V `wrs.sto` instruction.
16294///
16295/// # Forms
16296/// Assembly: `wrs.sto wrs_sto`
16297/// Rust: `wrs_sto()`
16298///
16299/// # Arguments
16300pub trait WrsStoEmitter {
16301 fn wrs_sto(&mut self);
16302}
16303
16304/// Exclusive NOR
16305///
16306/// This instruction performs the bit-wise exclusive-NOR operation on rs1 and rs2.
16307///
16308/// # Forms
16309/// Assembly: `xnor xd, xs1, xs2`
16310/// Rust: `xnor(rd, rs1, rs2)`
16311///
16312/// # Arguments
16313/// - `rd` — Destination register.
16314/// - `rs1` — Source register.
16315/// - `rs2` — Source register.
16316pub trait XnorEmitter<T0, T1, T2> {
16317 fn xnor(&mut self, rd: T0, rs1: T1, rs2: T2);
16318}
16319
16320/// Exclusive Or
16321///
16322/// Exclusive or rs1 with rs2, and store the result in rd
16323///
16324/// # Forms
16325/// Assembly: `xor xd, xs1, xs2`
16326/// Rust: `xor(rd, rs1, rs2)`
16327///
16328/// # Arguments
16329/// - `rd` — Destination register.
16330/// - `rs1` — Source register.
16331/// - `rs2` — Source register.
16332pub trait XorEmitter<T0, T1, T2> {
16333 fn xor(&mut self, rd: T0, rs1: T1, rs2: T2);
16334}
16335
16336/// Exclusive Or immediate
16337///
16338/// Exclusive or an immediate to the value in rs1, and store the result in rd
16339///
16340/// # Forms
16341/// Assembly: `xori xd, xs1, imm`
16342/// Rust: `xori(rd, rs1, imm)`
16343///
16344/// # Arguments
16345/// - `rd` — Destination register.
16346/// - `rs1` — Source register.
16347/// - `imm` — Immediate encoding value.
16348pub trait XoriEmitter<T0, T1, T2> {
16349 fn xori(&mut self, rd: T0, rs1: T1, imm: T2);
16350}
16351
16352/// Crossbar permutation (nibbles)
16353///
16354/// The xperm4 instruction operates on nibbles. The rs1 register contains a vector of XLEN/4 4-bit
16355/// elements. The rs2 register contains a vector of XLEN/4 4-bit indexes. The result is each element in
16356/// rs2 replaced by the indexed element in rs1, or zero if the index into rs2 is out of bounds.
16357///
16358/// # Forms
16359/// Assembly: `xperm4 xd, xs1, xs2`
16360/// Rust: `xperm4(rd, rs1, rs2)`
16361///
16362/// # Arguments
16363/// - `rd` — Destination register.
16364/// - `rs1` — Source register.
16365/// - `rs2` — Source register.
16366pub trait Xperm4Emitter<T0, T1, T2> {
16367 fn xperm4(&mut self, rd: T0, rs1: T1, rs2: T2);
16368}
16369
16370/// Crossbar permutation (bytes)
16371///
16372/// The xperm8 instruction operates on bytes. The rs1 register contains a vector of XLEN/8 8-bit
16373/// elements. The rs2 register contains a vector of XLEN/8 8-bit indexes. The result is each element in
16374/// rs2 replaced by the indexed element in rs1, or zero if the index into rs2 is out of bounds.
16375///
16376/// # Forms
16377/// Assembly: `xperm8 xd, xs1, xs2`
16378/// Rust: `xperm8(rd, rs1, rs2)`
16379///
16380/// # Arguments
16381/// - `rd` — Destination register.
16382/// - `rs1` — Source register.
16383/// - `rs2` — Source register.
16384pub trait Xperm8Emitter<T0, T1, T2> {
16385 fn xperm8(&mut self, rd: T0, rs1: T1, rs2: T2);
16386}
16387
16388/// RISC-V `zext.b` instruction.
16389///
16390/// # Forms
16391/// Assembly: `zext.b rd rs1`
16392/// Rust: `zext_b(rd, rs1)`
16393///
16394/// # Arguments
16395/// - `rd` — Destination register.
16396/// - `rs1` — Source register.
16397pub trait ZextBEmitter<T0, T1> {
16398 fn zext_b(&mut self, rd: T0, rs1: T1);
16399}
16400
16401/// Zero-extend halfword
16402///
16403/// This instruction zero-extends the least-significant halfword of the source to XLEN by inserting
16404/// 0's into all of the bits more significant than 15.
16405///
16406/// \[NOTE\]
16407/// The *zext.h* instruction is a pseudo-op for `pack` when `Zbkb` is implemented and XLEN == 32.
16408///
16409/// \[NOTE\]
16410/// The *zext.h* instruction is a pseudo-op for `packw` when `Zbkb` is implemented and XLEN == 64.
16411///
16412/// # Forms
16413/// Assembly: `zext.h xd, xs1`
16414/// Rust: `zext_h(rd, rs1)`
16415///
16416/// # Arguments
16417/// - `rd` — Destination register.
16418/// - `rs1` — Source register.
16419pub trait ZextHEmitter<T0, T1> {
16420 fn zext_h(&mut self, rd: T0, rs1: T1);
16421}
16422
16423/// Zero-extend halfword
16424///
16425/// This instruction zero-extends the least-significant halfword of the source to XLEN by inserting
16426/// 0's into all of the bits more significant than 15.
16427///
16428/// \[NOTE\]
16429/// The *zext.h* instruction is a pseudo-op for `pack` when `Zbkb` is implemented and XLEN == 32.
16430///
16431/// \[NOTE\]
16432/// The *zext.h* instruction is a pseudo-op for `packw` when `Zbkb` is implemented and XLEN == 64.
16433///
16434/// # Forms
16435/// Assembly: `zext.h.rv32 xd, xs1`
16436/// Rust: `zext_h_rv32(rd, rs1)`
16437///
16438/// # Arguments
16439/// - `rd` — Destination register.
16440/// - `rs1` — Source register.
16441pub trait ZextHRv32Emitter<T0, T1> {
16442 fn zext_h_rv32(&mut self, rd: T0, rs1: T1);
16443}
16444
16445/// RISC-V `zext.w` instruction.
16446///
16447/// # Forms
16448/// Assembly: `zext.w rd rs1`
16449/// Rust: `zext_w(rd, rs1)`
16450///
16451/// # Arguments
16452/// - `rd` — Destination register.
16453/// - `rs1` — Source register.
16454pub trait ZextWEmitter<T0, T1> {
16455 fn zext_w(&mut self, rd: T0, rs1: T1);
16456}
16457
16458/// Bit interleave
16459///
16460/// This instruction scatters all of the odd and even bits of a source word into the high and low halves
16461/// of a destination word. It is the inverse of the unzip instruction. This instruction is available only on
16462/// RV32.
16463///
16464/// # Forms
16465/// Assembly: `zip xd, xs1`
16466/// Rust: `zip(rd, rs1)`
16467///
16468/// # Arguments
16469/// - `rd` — Destination register.
16470/// - `rs1` — Source register.
16471pub trait ZipEmitter<T0, T1> {
16472 fn zip(&mut self, rd: T0, rs1: T1);
16473}
16474
16475impl AddEmitter<Gp, Gp, Gp> for Assembler<'_> {
16476 fn add(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
16477 self.emit_n(
16478 Opcode::ADD as i64,
16479 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
16480 );
16481 }
16482}
16483
16484impl AddUwEmitter<Gp, Gp, Gp> for Assembler<'_> {
16485 fn add_uw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
16486 self.emit_n(
16487 Opcode::ADDUW as i64,
16488 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
16489 );
16490 }
16491}
16492
16493impl<U2: Into<Imm>> AddiEmitter<Gp, Gp, U2> for Assembler<'_> {
16494 fn addi(&mut self, rd: Gp, rs1: Gp, imm: U2) {
16495 self.emit_n(
16496 Opcode::ADDI as i64,
16497 &[
16498 rd.as_operand(),
16499 rs1.as_operand(),
16500 Into::<Imm>::into(imm).as_operand(),
16501 ],
16502 );
16503 }
16504}
16505
16506impl<U2: Into<Imm>> AddiwEmitter<Gp, Gp, U2> for Assembler<'_> {
16507 fn addiw(&mut self, rd: Gp, rs1: Gp, imm: U2) {
16508 self.emit_n(
16509 Opcode::ADDIW as i64,
16510 &[
16511 rd.as_operand(),
16512 rs1.as_operand(),
16513 Into::<Imm>::into(imm).as_operand(),
16514 ],
16515 );
16516 }
16517}
16518
16519impl AddwEmitter<Gp, Gp, Gp> for Assembler<'_> {
16520 fn addw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
16521 self.emit_n(
16522 Opcode::ADDW as i64,
16523 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
16524 );
16525 }
16526}
16527
16528impl<U3: Into<Imm>> Aes32DsiEmitter<Gp, Gp, Gp, U3> for Assembler<'_> {
16529 fn aes32dsi(&mut self, rd: Gp, rs1: Gp, rs2: Gp, bs: U3) {
16530 self.emit_n(
16531 Opcode::AES32DSI as i64,
16532 &[
16533 rd.as_operand(),
16534 rs1.as_operand(),
16535 rs2.as_operand(),
16536 Into::<Imm>::into(bs).as_operand(),
16537 ],
16538 );
16539 }
16540}
16541
16542impl<U3: Into<Imm>> Aes32DsmiEmitter<Gp, Gp, Gp, U3> for Assembler<'_> {
16543 fn aes32dsmi(&mut self, rd: Gp, rs1: Gp, rs2: Gp, bs: U3) {
16544 self.emit_n(
16545 Opcode::AES32DSMI as i64,
16546 &[
16547 rd.as_operand(),
16548 rs1.as_operand(),
16549 rs2.as_operand(),
16550 Into::<Imm>::into(bs).as_operand(),
16551 ],
16552 );
16553 }
16554}
16555
16556impl<U3: Into<Imm>> Aes32EsiEmitter<Gp, Gp, Gp, U3> for Assembler<'_> {
16557 fn aes32esi(&mut self, rd: Gp, rs1: Gp, rs2: Gp, bs: U3) {
16558 self.emit_n(
16559 Opcode::AES32ESI as i64,
16560 &[
16561 rd.as_operand(),
16562 rs1.as_operand(),
16563 rs2.as_operand(),
16564 Into::<Imm>::into(bs).as_operand(),
16565 ],
16566 );
16567 }
16568}
16569
16570impl<U3: Into<Imm>> Aes32EsmiEmitter<Gp, Gp, Gp, U3> for Assembler<'_> {
16571 fn aes32esmi(&mut self, rd: Gp, rs1: Gp, rs2: Gp, bs: U3) {
16572 self.emit_n(
16573 Opcode::AES32ESMI as i64,
16574 &[
16575 rd.as_operand(),
16576 rs1.as_operand(),
16577 rs2.as_operand(),
16578 Into::<Imm>::into(bs).as_operand(),
16579 ],
16580 );
16581 }
16582}
16583
16584impl Aes64DsEmitter<Gp, Gp, Gp> for Assembler<'_> {
16585 fn aes64ds(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
16586 self.emit_n(
16587 Opcode::AES64DS as i64,
16588 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
16589 );
16590 }
16591}
16592
16593impl Aes64DsmEmitter<Gp, Gp, Gp> for Assembler<'_> {
16594 fn aes64dsm(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
16595 self.emit_n(
16596 Opcode::AES64DSM as i64,
16597 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
16598 );
16599 }
16600}
16601
16602impl Aes64EsEmitter<Gp, Gp, Gp> for Assembler<'_> {
16603 fn aes64es(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
16604 self.emit_n(
16605 Opcode::AES64ES as i64,
16606 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
16607 );
16608 }
16609}
16610
16611impl Aes64EsmEmitter<Gp, Gp, Gp> for Assembler<'_> {
16612 fn aes64esm(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
16613 self.emit_n(
16614 Opcode::AES64ESM as i64,
16615 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
16616 );
16617 }
16618}
16619
16620impl Aes64ImEmitter<Gp, Gp> for Assembler<'_> {
16621 fn aes64im(&mut self, rd: Gp, rs1: Gp) {
16622 self.emit_n(Opcode::AES64IM as i64, &[rd.as_operand(), rs1.as_operand()]);
16623 }
16624}
16625
16626impl<U2: Into<Imm>> Aes64Ks1IEmitter<Gp, Gp, U2> for Assembler<'_> {
16627 fn aes64ks1i(&mut self, rd: Gp, rs1: Gp, rnum: U2) {
16628 self.emit_n(
16629 Opcode::AES64KS1I as i64,
16630 &[
16631 rd.as_operand(),
16632 rs1.as_operand(),
16633 Into::<Imm>::into(rnum).as_operand(),
16634 ],
16635 );
16636 }
16637}
16638
16639impl Aes64Ks2Emitter<Gp, Gp, Gp> for Assembler<'_> {
16640 fn aes64ks2(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
16641 self.emit_n(
16642 Opcode::AES64KS2 as i64,
16643 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
16644 );
16645 }
16646}
16647
16648impl<U3: Into<Imm>, U4: Into<Imm>> AmoaddBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16649 fn amoadd_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16650 self.emit_n(
16651 Opcode::AMOADDB as i64,
16652 &[
16653 rd.as_operand(),
16654 rs1.as_operand(),
16655 rs2.as_operand(),
16656 Into::<Imm>::into(aq).as_operand(),
16657 Into::<Imm>::into(rl).as_operand(),
16658 ],
16659 );
16660 }
16661}
16662
16663impl<U3: Into<Imm>, U4: Into<Imm>> AmoaddDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16664 fn amoadd_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16665 self.emit_n(
16666 Opcode::AMOADDD as i64,
16667 &[
16668 rd.as_operand(),
16669 rs1.as_operand(),
16670 rs2.as_operand(),
16671 Into::<Imm>::into(aq).as_operand(),
16672 Into::<Imm>::into(rl).as_operand(),
16673 ],
16674 );
16675 }
16676}
16677
16678impl<U3: Into<Imm>, U4: Into<Imm>> AmoaddHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16679 fn amoadd_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16680 self.emit_n(
16681 Opcode::AMOADDH as i64,
16682 &[
16683 rd.as_operand(),
16684 rs1.as_operand(),
16685 rs2.as_operand(),
16686 Into::<Imm>::into(aq).as_operand(),
16687 Into::<Imm>::into(rl).as_operand(),
16688 ],
16689 );
16690 }
16691}
16692
16693impl<U3: Into<Imm>, U4: Into<Imm>> AmoaddWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16694 fn amoadd_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16695 self.emit_n(
16696 Opcode::AMOADDW as i64,
16697 &[
16698 rd.as_operand(),
16699 rs1.as_operand(),
16700 rs2.as_operand(),
16701 Into::<Imm>::into(aq).as_operand(),
16702 Into::<Imm>::into(rl).as_operand(),
16703 ],
16704 );
16705 }
16706}
16707
16708impl<U3: Into<Imm>, U4: Into<Imm>> AmoandBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16709 fn amoand_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16710 self.emit_n(
16711 Opcode::AMOANDB as i64,
16712 &[
16713 rd.as_operand(),
16714 rs1.as_operand(),
16715 rs2.as_operand(),
16716 Into::<Imm>::into(aq).as_operand(),
16717 Into::<Imm>::into(rl).as_operand(),
16718 ],
16719 );
16720 }
16721}
16722
16723impl<U3: Into<Imm>, U4: Into<Imm>> AmoandDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16724 fn amoand_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16725 self.emit_n(
16726 Opcode::AMOANDD as i64,
16727 &[
16728 rd.as_operand(),
16729 rs1.as_operand(),
16730 rs2.as_operand(),
16731 Into::<Imm>::into(aq).as_operand(),
16732 Into::<Imm>::into(rl).as_operand(),
16733 ],
16734 );
16735 }
16736}
16737
16738impl<U3: Into<Imm>, U4: Into<Imm>> AmoandHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16739 fn amoand_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16740 self.emit_n(
16741 Opcode::AMOANDH as i64,
16742 &[
16743 rd.as_operand(),
16744 rs1.as_operand(),
16745 rs2.as_operand(),
16746 Into::<Imm>::into(aq).as_operand(),
16747 Into::<Imm>::into(rl).as_operand(),
16748 ],
16749 );
16750 }
16751}
16752
16753impl<U3: Into<Imm>, U4: Into<Imm>> AmoandWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16754 fn amoand_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16755 self.emit_n(
16756 Opcode::AMOANDW as i64,
16757 &[
16758 rd.as_operand(),
16759 rs1.as_operand(),
16760 rs2.as_operand(),
16761 Into::<Imm>::into(aq).as_operand(),
16762 Into::<Imm>::into(rl).as_operand(),
16763 ],
16764 );
16765 }
16766}
16767
16768impl<U3: Into<Imm>, U4: Into<Imm>> AmocasBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16769 fn amocas_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16770 self.emit_n(
16771 Opcode::AMOCASB as i64,
16772 &[
16773 rd.as_operand(),
16774 rs1.as_operand(),
16775 rs2.as_operand(),
16776 Into::<Imm>::into(aq).as_operand(),
16777 Into::<Imm>::into(rl).as_operand(),
16778 ],
16779 );
16780 }
16781}
16782
16783impl<U3: Into<Imm>, U4: Into<Imm>> AmocasDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16784 fn amocas_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16785 self.emit_n(
16786 Opcode::AMOCASD as i64,
16787 &[
16788 rd.as_operand(),
16789 rs1.as_operand(),
16790 rs2.as_operand(),
16791 Into::<Imm>::into(aq).as_operand(),
16792 Into::<Imm>::into(rl).as_operand(),
16793 ],
16794 );
16795 }
16796}
16797
16798impl<U3: Into<Imm>, U4: Into<Imm>> AmocasHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16799 fn amocas_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16800 self.emit_n(
16801 Opcode::AMOCASH as i64,
16802 &[
16803 rd.as_operand(),
16804 rs1.as_operand(),
16805 rs2.as_operand(),
16806 Into::<Imm>::into(aq).as_operand(),
16807 Into::<Imm>::into(rl).as_operand(),
16808 ],
16809 );
16810 }
16811}
16812
16813impl<U3: Into<Imm>, U4: Into<Imm>> AmocasQEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16814 fn amocas_q(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16815 self.emit_n(
16816 Opcode::AMOCASQ as i64,
16817 &[
16818 rd.as_operand(),
16819 rs1.as_operand(),
16820 rs2.as_operand(),
16821 Into::<Imm>::into(aq).as_operand(),
16822 Into::<Imm>::into(rl).as_operand(),
16823 ],
16824 );
16825 }
16826}
16827
16828impl<U3: Into<Imm>, U4: Into<Imm>> AmocasWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16829 fn amocas_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16830 self.emit_n(
16831 Opcode::AMOCASW as i64,
16832 &[
16833 rd.as_operand(),
16834 rs1.as_operand(),
16835 rs2.as_operand(),
16836 Into::<Imm>::into(aq).as_operand(),
16837 Into::<Imm>::into(rl).as_operand(),
16838 ],
16839 );
16840 }
16841}
16842
16843impl<U3: Into<Imm>, U4: Into<Imm>> AmomaxBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16844 fn amomax_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16845 self.emit_n(
16846 Opcode::AMOMAXB as i64,
16847 &[
16848 rd.as_operand(),
16849 rs1.as_operand(),
16850 rs2.as_operand(),
16851 Into::<Imm>::into(aq).as_operand(),
16852 Into::<Imm>::into(rl).as_operand(),
16853 ],
16854 );
16855 }
16856}
16857
16858impl<U3: Into<Imm>, U4: Into<Imm>> AmomaxDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16859 fn amomax_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16860 self.emit_n(
16861 Opcode::AMOMAXD as i64,
16862 &[
16863 rd.as_operand(),
16864 rs1.as_operand(),
16865 rs2.as_operand(),
16866 Into::<Imm>::into(aq).as_operand(),
16867 Into::<Imm>::into(rl).as_operand(),
16868 ],
16869 );
16870 }
16871}
16872
16873impl<U3: Into<Imm>, U4: Into<Imm>> AmomaxHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16874 fn amomax_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16875 self.emit_n(
16876 Opcode::AMOMAXH as i64,
16877 &[
16878 rd.as_operand(),
16879 rs1.as_operand(),
16880 rs2.as_operand(),
16881 Into::<Imm>::into(aq).as_operand(),
16882 Into::<Imm>::into(rl).as_operand(),
16883 ],
16884 );
16885 }
16886}
16887
16888impl<U3: Into<Imm>, U4: Into<Imm>> AmomaxWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16889 fn amomax_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16890 self.emit_n(
16891 Opcode::AMOMAXW as i64,
16892 &[
16893 rd.as_operand(),
16894 rs1.as_operand(),
16895 rs2.as_operand(),
16896 Into::<Imm>::into(aq).as_operand(),
16897 Into::<Imm>::into(rl).as_operand(),
16898 ],
16899 );
16900 }
16901}
16902
16903impl<U3: Into<Imm>, U4: Into<Imm>> AmomaxuBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16904 fn amomaxu_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16905 self.emit_n(
16906 Opcode::AMOMAXUB as i64,
16907 &[
16908 rd.as_operand(),
16909 rs1.as_operand(),
16910 rs2.as_operand(),
16911 Into::<Imm>::into(aq).as_operand(),
16912 Into::<Imm>::into(rl).as_operand(),
16913 ],
16914 );
16915 }
16916}
16917
16918impl<U3: Into<Imm>, U4: Into<Imm>> AmomaxuDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16919 fn amomaxu_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16920 self.emit_n(
16921 Opcode::AMOMAXUD as i64,
16922 &[
16923 rd.as_operand(),
16924 rs1.as_operand(),
16925 rs2.as_operand(),
16926 Into::<Imm>::into(aq).as_operand(),
16927 Into::<Imm>::into(rl).as_operand(),
16928 ],
16929 );
16930 }
16931}
16932
16933impl<U3: Into<Imm>, U4: Into<Imm>> AmomaxuHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16934 fn amomaxu_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16935 self.emit_n(
16936 Opcode::AMOMAXUH as i64,
16937 &[
16938 rd.as_operand(),
16939 rs1.as_operand(),
16940 rs2.as_operand(),
16941 Into::<Imm>::into(aq).as_operand(),
16942 Into::<Imm>::into(rl).as_operand(),
16943 ],
16944 );
16945 }
16946}
16947
16948impl<U3: Into<Imm>, U4: Into<Imm>> AmomaxuWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16949 fn amomaxu_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16950 self.emit_n(
16951 Opcode::AMOMAXUW as i64,
16952 &[
16953 rd.as_operand(),
16954 rs1.as_operand(),
16955 rs2.as_operand(),
16956 Into::<Imm>::into(aq).as_operand(),
16957 Into::<Imm>::into(rl).as_operand(),
16958 ],
16959 );
16960 }
16961}
16962
16963impl<U3: Into<Imm>, U4: Into<Imm>> AmominBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16964 fn amomin_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16965 self.emit_n(
16966 Opcode::AMOMINB as i64,
16967 &[
16968 rd.as_operand(),
16969 rs1.as_operand(),
16970 rs2.as_operand(),
16971 Into::<Imm>::into(aq).as_operand(),
16972 Into::<Imm>::into(rl).as_operand(),
16973 ],
16974 );
16975 }
16976}
16977
16978impl<U3: Into<Imm>, U4: Into<Imm>> AmominDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16979 fn amomin_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16980 self.emit_n(
16981 Opcode::AMOMIND as i64,
16982 &[
16983 rd.as_operand(),
16984 rs1.as_operand(),
16985 rs2.as_operand(),
16986 Into::<Imm>::into(aq).as_operand(),
16987 Into::<Imm>::into(rl).as_operand(),
16988 ],
16989 );
16990 }
16991}
16992
16993impl<U3: Into<Imm>, U4: Into<Imm>> AmominHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
16994 fn amomin_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
16995 self.emit_n(
16996 Opcode::AMOMINH as i64,
16997 &[
16998 rd.as_operand(),
16999 rs1.as_operand(),
17000 rs2.as_operand(),
17001 Into::<Imm>::into(aq).as_operand(),
17002 Into::<Imm>::into(rl).as_operand(),
17003 ],
17004 );
17005 }
17006}
17007
17008impl<U3: Into<Imm>, U4: Into<Imm>> AmominWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17009 fn amomin_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17010 self.emit_n(
17011 Opcode::AMOMINW as i64,
17012 &[
17013 rd.as_operand(),
17014 rs1.as_operand(),
17015 rs2.as_operand(),
17016 Into::<Imm>::into(aq).as_operand(),
17017 Into::<Imm>::into(rl).as_operand(),
17018 ],
17019 );
17020 }
17021}
17022
17023impl<U3: Into<Imm>, U4: Into<Imm>> AmominuBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17024 fn amominu_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17025 self.emit_n(
17026 Opcode::AMOMINUB as i64,
17027 &[
17028 rd.as_operand(),
17029 rs1.as_operand(),
17030 rs2.as_operand(),
17031 Into::<Imm>::into(aq).as_operand(),
17032 Into::<Imm>::into(rl).as_operand(),
17033 ],
17034 );
17035 }
17036}
17037
17038impl<U3: Into<Imm>, U4: Into<Imm>> AmominuDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17039 fn amominu_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17040 self.emit_n(
17041 Opcode::AMOMINUD as i64,
17042 &[
17043 rd.as_operand(),
17044 rs1.as_operand(),
17045 rs2.as_operand(),
17046 Into::<Imm>::into(aq).as_operand(),
17047 Into::<Imm>::into(rl).as_operand(),
17048 ],
17049 );
17050 }
17051}
17052
17053impl<U3: Into<Imm>, U4: Into<Imm>> AmominuHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17054 fn amominu_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17055 self.emit_n(
17056 Opcode::AMOMINUH as i64,
17057 &[
17058 rd.as_operand(),
17059 rs1.as_operand(),
17060 rs2.as_operand(),
17061 Into::<Imm>::into(aq).as_operand(),
17062 Into::<Imm>::into(rl).as_operand(),
17063 ],
17064 );
17065 }
17066}
17067
17068impl<U3: Into<Imm>, U4: Into<Imm>> AmominuWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17069 fn amominu_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17070 self.emit_n(
17071 Opcode::AMOMINUW as i64,
17072 &[
17073 rd.as_operand(),
17074 rs1.as_operand(),
17075 rs2.as_operand(),
17076 Into::<Imm>::into(aq).as_operand(),
17077 Into::<Imm>::into(rl).as_operand(),
17078 ],
17079 );
17080 }
17081}
17082
17083impl<U3: Into<Imm>, U4: Into<Imm>> AmoorBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17084 fn amoor_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17085 self.emit_n(
17086 Opcode::AMOORB as i64,
17087 &[
17088 rd.as_operand(),
17089 rs1.as_operand(),
17090 rs2.as_operand(),
17091 Into::<Imm>::into(aq).as_operand(),
17092 Into::<Imm>::into(rl).as_operand(),
17093 ],
17094 );
17095 }
17096}
17097
17098impl<U3: Into<Imm>, U4: Into<Imm>> AmoorDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17099 fn amoor_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17100 self.emit_n(
17101 Opcode::AMOORD as i64,
17102 &[
17103 rd.as_operand(),
17104 rs1.as_operand(),
17105 rs2.as_operand(),
17106 Into::<Imm>::into(aq).as_operand(),
17107 Into::<Imm>::into(rl).as_operand(),
17108 ],
17109 );
17110 }
17111}
17112
17113impl<U3: Into<Imm>, U4: Into<Imm>> AmoorHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17114 fn amoor_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17115 self.emit_n(
17116 Opcode::AMOORH as i64,
17117 &[
17118 rd.as_operand(),
17119 rs1.as_operand(),
17120 rs2.as_operand(),
17121 Into::<Imm>::into(aq).as_operand(),
17122 Into::<Imm>::into(rl).as_operand(),
17123 ],
17124 );
17125 }
17126}
17127
17128impl<U3: Into<Imm>, U4: Into<Imm>> AmoorWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17129 fn amoor_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17130 self.emit_n(
17131 Opcode::AMOORW as i64,
17132 &[
17133 rd.as_operand(),
17134 rs1.as_operand(),
17135 rs2.as_operand(),
17136 Into::<Imm>::into(aq).as_operand(),
17137 Into::<Imm>::into(rl).as_operand(),
17138 ],
17139 );
17140 }
17141}
17142
17143impl<U3: Into<Imm>, U4: Into<Imm>> AmoswapBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17144 fn amoswap_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17145 self.emit_n(
17146 Opcode::AMOSWAPB as i64,
17147 &[
17148 rd.as_operand(),
17149 rs1.as_operand(),
17150 rs2.as_operand(),
17151 Into::<Imm>::into(aq).as_operand(),
17152 Into::<Imm>::into(rl).as_operand(),
17153 ],
17154 );
17155 }
17156}
17157
17158impl<U3: Into<Imm>, U4: Into<Imm>> AmoswapDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17159 fn amoswap_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17160 self.emit_n(
17161 Opcode::AMOSWAPD as i64,
17162 &[
17163 rd.as_operand(),
17164 rs1.as_operand(),
17165 rs2.as_operand(),
17166 Into::<Imm>::into(aq).as_operand(),
17167 Into::<Imm>::into(rl).as_operand(),
17168 ],
17169 );
17170 }
17171}
17172
17173impl<U3: Into<Imm>, U4: Into<Imm>> AmoswapHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17174 fn amoswap_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17175 self.emit_n(
17176 Opcode::AMOSWAPH as i64,
17177 &[
17178 rd.as_operand(),
17179 rs1.as_operand(),
17180 rs2.as_operand(),
17181 Into::<Imm>::into(aq).as_operand(),
17182 Into::<Imm>::into(rl).as_operand(),
17183 ],
17184 );
17185 }
17186}
17187
17188impl<U3: Into<Imm>, U4: Into<Imm>> AmoswapWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17189 fn amoswap_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17190 self.emit_n(
17191 Opcode::AMOSWAPW as i64,
17192 &[
17193 rd.as_operand(),
17194 rs1.as_operand(),
17195 rs2.as_operand(),
17196 Into::<Imm>::into(aq).as_operand(),
17197 Into::<Imm>::into(rl).as_operand(),
17198 ],
17199 );
17200 }
17201}
17202
17203impl<U3: Into<Imm>, U4: Into<Imm>> AmoxorBEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17204 fn amoxor_b(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17205 self.emit_n(
17206 Opcode::AMOXORB as i64,
17207 &[
17208 rd.as_operand(),
17209 rs1.as_operand(),
17210 rs2.as_operand(),
17211 Into::<Imm>::into(aq).as_operand(),
17212 Into::<Imm>::into(rl).as_operand(),
17213 ],
17214 );
17215 }
17216}
17217
17218impl<U3: Into<Imm>, U4: Into<Imm>> AmoxorDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17219 fn amoxor_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17220 self.emit_n(
17221 Opcode::AMOXORD as i64,
17222 &[
17223 rd.as_operand(),
17224 rs1.as_operand(),
17225 rs2.as_operand(),
17226 Into::<Imm>::into(aq).as_operand(),
17227 Into::<Imm>::into(rl).as_operand(),
17228 ],
17229 );
17230 }
17231}
17232
17233impl<U3: Into<Imm>, U4: Into<Imm>> AmoxorHEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17234 fn amoxor_h(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17235 self.emit_n(
17236 Opcode::AMOXORH as i64,
17237 &[
17238 rd.as_operand(),
17239 rs1.as_operand(),
17240 rs2.as_operand(),
17241 Into::<Imm>::into(aq).as_operand(),
17242 Into::<Imm>::into(rl).as_operand(),
17243 ],
17244 );
17245 }
17246}
17247
17248impl<U3: Into<Imm>, U4: Into<Imm>> AmoxorWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
17249 fn amoxor_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
17250 self.emit_n(
17251 Opcode::AMOXORW as i64,
17252 &[
17253 rd.as_operand(),
17254 rs1.as_operand(),
17255 rs2.as_operand(),
17256 Into::<Imm>::into(aq).as_operand(),
17257 Into::<Imm>::into(rl).as_operand(),
17258 ],
17259 );
17260 }
17261}
17262
17263impl AndEmitter<Gp, Gp, Gp> for Assembler<'_> {
17264 fn and(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
17265 self.emit_n(
17266 Opcode::AND as i64,
17267 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
17268 );
17269 }
17270}
17271
17272impl<U2: Into<Imm>> AndiEmitter<Gp, Gp, U2> for Assembler<'_> {
17273 fn andi(&mut self, rd: Gp, rs1: Gp, imm: U2) {
17274 self.emit_n(
17275 Opcode::ANDI as i64,
17276 &[
17277 rd.as_operand(),
17278 rs1.as_operand(),
17279 Into::<Imm>::into(imm).as_operand(),
17280 ],
17281 );
17282 }
17283}
17284
17285impl AndnEmitter<Gp, Gp, Gp> for Assembler<'_> {
17286 fn andn(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
17287 self.emit_n(
17288 Opcode::ANDN as i64,
17289 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
17290 );
17291 }
17292}
17293
17294impl<U1: Into<Imm>> AuipcEmitter<Gp, U1> for Assembler<'_> {
17295 fn auipc(&mut self, rd: Gp, imm: U1) {
17296 self.emit_n(
17297 Opcode::AUIPC as i64,
17298 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
17299 );
17300 }
17301}
17302
17303impl AuipcEmitter<Gp, Label> for Assembler<'_> {
17304 fn auipc(&mut self, rd: Gp, imm: Label) {
17305 self.emit_n(Opcode::AUIPC as i64, &[rd.as_operand(), imm.as_operand()]);
17306 }
17307}
17308
17309impl BclrEmitter<Gp, Gp, Gp> for Assembler<'_> {
17310 fn bclr(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
17311 self.emit_n(
17312 Opcode::BCLR as i64,
17313 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
17314 );
17315 }
17316}
17317
17318impl<U2: Into<Imm>> BclriEmitter<Gp, Gp, U2> for Assembler<'_> {
17319 fn bclri(&mut self, rd: Gp, rs1: Gp, shamtd: U2) {
17320 self.emit_n(
17321 Opcode::BCLRI as i64,
17322 &[
17323 rd.as_operand(),
17324 rs1.as_operand(),
17325 Into::<Imm>::into(shamtd).as_operand(),
17326 ],
17327 );
17328 }
17329}
17330
17331impl<U2: Into<Imm>> BclriRv32Emitter<Gp, Gp, U2> for Assembler<'_> {
17332 fn bclri_rv32(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
17333 self.emit_n(
17334 Opcode::BCLRIRV32 as i64,
17335 &[
17336 rd.as_operand(),
17337 rs1.as_operand(),
17338 Into::<Imm>::into(shamtw).as_operand(),
17339 ],
17340 );
17341 }
17342}
17343
17344impl<U2: Into<Imm>> BeqEmitter<Gp, Gp, U2> for Assembler<'_> {
17345 fn beq(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17346 self.emit_n(
17347 Opcode::BEQ as i64,
17348 &[
17349 rs1.as_operand(),
17350 rs2.as_operand(),
17351 Into::<Imm>::into(imm).as_operand(),
17352 ],
17353 );
17354 }
17355}
17356
17357impl BeqEmitter<Gp, Gp, Label> for Assembler<'_> {
17358 fn beq(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17359 self.emit_n(
17360 Opcode::BEQ as i64,
17361 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17362 );
17363 }
17364}
17365
17366impl<U1: Into<Imm>> BeqzEmitter<Gp, U1> for Assembler<'_> {
17367 fn beqz(&mut self, rs1: Gp, imm: U1) {
17368 self.emit_n(
17369 Opcode::BEQZ as i64,
17370 &[rs1.as_operand(), Into::<Imm>::into(imm).as_operand()],
17371 );
17372 }
17373}
17374
17375impl BeqzEmitter<Gp, Label> for Assembler<'_> {
17376 fn beqz(&mut self, rs1: Gp, imm: Label) {
17377 self.emit_n(Opcode::BEQZ as i64, &[rs1.as_operand(), imm.as_operand()]);
17378 }
17379}
17380
17381impl BextEmitter<Gp, Gp, Gp> for Assembler<'_> {
17382 fn bext(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
17383 self.emit_n(
17384 Opcode::BEXT as i64,
17385 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
17386 );
17387 }
17388}
17389
17390impl<U2: Into<Imm>> BextiEmitter<Gp, Gp, U2> for Assembler<'_> {
17391 fn bexti(&mut self, rd: Gp, rs1: Gp, shamtd: U2) {
17392 self.emit_n(
17393 Opcode::BEXTI as i64,
17394 &[
17395 rd.as_operand(),
17396 rs1.as_operand(),
17397 Into::<Imm>::into(shamtd).as_operand(),
17398 ],
17399 );
17400 }
17401}
17402
17403impl<U2: Into<Imm>> BextiRv32Emitter<Gp, Gp, U2> for Assembler<'_> {
17404 fn bexti_rv32(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
17405 self.emit_n(
17406 Opcode::BEXTIRV32 as i64,
17407 &[
17408 rd.as_operand(),
17409 rs1.as_operand(),
17410 Into::<Imm>::into(shamtw).as_operand(),
17411 ],
17412 );
17413 }
17414}
17415
17416impl<U2: Into<Imm>> BgeEmitter<Gp, Gp, U2> for Assembler<'_> {
17417 fn bge(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17418 self.emit_n(
17419 Opcode::BGE as i64,
17420 &[
17421 rs1.as_operand(),
17422 rs2.as_operand(),
17423 Into::<Imm>::into(imm).as_operand(),
17424 ],
17425 );
17426 }
17427}
17428
17429impl BgeEmitter<Gp, Gp, Label> for Assembler<'_> {
17430 fn bge(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17431 self.emit_n(
17432 Opcode::BGE as i64,
17433 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17434 );
17435 }
17436}
17437
17438impl<U2: Into<Imm>> BgeuEmitter<Gp, Gp, U2> for Assembler<'_> {
17439 fn bgeu(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17440 self.emit_n(
17441 Opcode::BGEU as i64,
17442 &[
17443 rs1.as_operand(),
17444 rs2.as_operand(),
17445 Into::<Imm>::into(imm).as_operand(),
17446 ],
17447 );
17448 }
17449}
17450
17451impl BgeuEmitter<Gp, Gp, Label> for Assembler<'_> {
17452 fn bgeu(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17453 self.emit_n(
17454 Opcode::BGEU as i64,
17455 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17456 );
17457 }
17458}
17459
17460impl<U1: Into<Imm>> BgezEmitter<Gp, U1> for Assembler<'_> {
17461 fn bgez(&mut self, rs1: Gp, imm: U1) {
17462 self.emit_n(
17463 Opcode::BGEZ as i64,
17464 &[rs1.as_operand(), Into::<Imm>::into(imm).as_operand()],
17465 );
17466 }
17467}
17468
17469impl BgezEmitter<Gp, Label> for Assembler<'_> {
17470 fn bgez(&mut self, rs1: Gp, imm: Label) {
17471 self.emit_n(Opcode::BGEZ as i64, &[rs1.as_operand(), imm.as_operand()]);
17472 }
17473}
17474
17475impl<U2: Into<Imm>> BgtEmitter<Gp, Gp, U2> for Assembler<'_> {
17476 fn bgt(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17477 self.emit_n(
17478 Opcode::BGT as i64,
17479 &[
17480 rs1.as_operand(),
17481 rs2.as_operand(),
17482 Into::<Imm>::into(imm).as_operand(),
17483 ],
17484 );
17485 }
17486}
17487
17488impl BgtEmitter<Gp, Gp, Label> for Assembler<'_> {
17489 fn bgt(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17490 self.emit_n(
17491 Opcode::BGT as i64,
17492 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17493 );
17494 }
17495}
17496
17497impl<U2: Into<Imm>> BgtuEmitter<Gp, Gp, U2> for Assembler<'_> {
17498 fn bgtu(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17499 self.emit_n(
17500 Opcode::BGTU as i64,
17501 &[
17502 rs1.as_operand(),
17503 rs2.as_operand(),
17504 Into::<Imm>::into(imm).as_operand(),
17505 ],
17506 );
17507 }
17508}
17509
17510impl BgtuEmitter<Gp, Gp, Label> for Assembler<'_> {
17511 fn bgtu(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17512 self.emit_n(
17513 Opcode::BGTU as i64,
17514 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17515 );
17516 }
17517}
17518
17519impl<U1: Into<Imm>> BgtzEmitter<Gp, U1> for Assembler<'_> {
17520 fn bgtz(&mut self, rs2: Gp, imm: U1) {
17521 self.emit_n(
17522 Opcode::BGTZ as i64,
17523 &[rs2.as_operand(), Into::<Imm>::into(imm).as_operand()],
17524 );
17525 }
17526}
17527
17528impl BgtzEmitter<Gp, Label> for Assembler<'_> {
17529 fn bgtz(&mut self, rs2: Gp, imm: Label) {
17530 self.emit_n(Opcode::BGTZ as i64, &[rs2.as_operand(), imm.as_operand()]);
17531 }
17532}
17533
17534impl BinvEmitter<Gp, Gp, Gp> for Assembler<'_> {
17535 fn binv(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
17536 self.emit_n(
17537 Opcode::BINV as i64,
17538 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
17539 );
17540 }
17541}
17542
17543impl<U2: Into<Imm>> BinviEmitter<Gp, Gp, U2> for Assembler<'_> {
17544 fn binvi(&mut self, rd: Gp, rs1: Gp, shamtd: U2) {
17545 self.emit_n(
17546 Opcode::BINVI as i64,
17547 &[
17548 rd.as_operand(),
17549 rs1.as_operand(),
17550 Into::<Imm>::into(shamtd).as_operand(),
17551 ],
17552 );
17553 }
17554}
17555
17556impl<U2: Into<Imm>> BinviRv32Emitter<Gp, Gp, U2> for Assembler<'_> {
17557 fn binvi_rv32(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
17558 self.emit_n(
17559 Opcode::BINVIRV32 as i64,
17560 &[
17561 rd.as_operand(),
17562 rs1.as_operand(),
17563 Into::<Imm>::into(shamtw).as_operand(),
17564 ],
17565 );
17566 }
17567}
17568
17569impl<U2: Into<Imm>> BleEmitter<Gp, Gp, U2> for Assembler<'_> {
17570 fn ble(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17571 self.emit_n(
17572 Opcode::BLE as i64,
17573 &[
17574 rs1.as_operand(),
17575 rs2.as_operand(),
17576 Into::<Imm>::into(imm).as_operand(),
17577 ],
17578 );
17579 }
17580}
17581
17582impl BleEmitter<Gp, Gp, Label> for Assembler<'_> {
17583 fn ble(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17584 self.emit_n(
17585 Opcode::BLE as i64,
17586 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17587 );
17588 }
17589}
17590
17591impl<U2: Into<Imm>> BleuEmitter<Gp, Gp, U2> for Assembler<'_> {
17592 fn bleu(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17593 self.emit_n(
17594 Opcode::BLEU as i64,
17595 &[
17596 rs1.as_operand(),
17597 rs2.as_operand(),
17598 Into::<Imm>::into(imm).as_operand(),
17599 ],
17600 );
17601 }
17602}
17603
17604impl BleuEmitter<Gp, Gp, Label> for Assembler<'_> {
17605 fn bleu(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17606 self.emit_n(
17607 Opcode::BLEU as i64,
17608 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17609 );
17610 }
17611}
17612
17613impl<U1: Into<Imm>> BlezEmitter<Gp, U1> for Assembler<'_> {
17614 fn blez(&mut self, rs2: Gp, imm: U1) {
17615 self.emit_n(
17616 Opcode::BLEZ as i64,
17617 &[rs2.as_operand(), Into::<Imm>::into(imm).as_operand()],
17618 );
17619 }
17620}
17621
17622impl BlezEmitter<Gp, Label> for Assembler<'_> {
17623 fn blez(&mut self, rs2: Gp, imm: Label) {
17624 self.emit_n(Opcode::BLEZ as i64, &[rs2.as_operand(), imm.as_operand()]);
17625 }
17626}
17627
17628impl<U2: Into<Imm>> BltEmitter<Gp, Gp, U2> for Assembler<'_> {
17629 fn blt(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17630 self.emit_n(
17631 Opcode::BLT as i64,
17632 &[
17633 rs1.as_operand(),
17634 rs2.as_operand(),
17635 Into::<Imm>::into(imm).as_operand(),
17636 ],
17637 );
17638 }
17639}
17640
17641impl BltEmitter<Gp, Gp, Label> for Assembler<'_> {
17642 fn blt(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17643 self.emit_n(
17644 Opcode::BLT as i64,
17645 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17646 );
17647 }
17648}
17649
17650impl<U2: Into<Imm>> BltuEmitter<Gp, Gp, U2> for Assembler<'_> {
17651 fn bltu(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17652 self.emit_n(
17653 Opcode::BLTU as i64,
17654 &[
17655 rs1.as_operand(),
17656 rs2.as_operand(),
17657 Into::<Imm>::into(imm).as_operand(),
17658 ],
17659 );
17660 }
17661}
17662
17663impl BltuEmitter<Gp, Gp, Label> for Assembler<'_> {
17664 fn bltu(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17665 self.emit_n(
17666 Opcode::BLTU as i64,
17667 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17668 );
17669 }
17670}
17671
17672impl<U1: Into<Imm>> BltzEmitter<Gp, U1> for Assembler<'_> {
17673 fn bltz(&mut self, rs1: Gp, imm: U1) {
17674 self.emit_n(
17675 Opcode::BLTZ as i64,
17676 &[rs1.as_operand(), Into::<Imm>::into(imm).as_operand()],
17677 );
17678 }
17679}
17680
17681impl BltzEmitter<Gp, Label> for Assembler<'_> {
17682 fn bltz(&mut self, rs1: Gp, imm: Label) {
17683 self.emit_n(Opcode::BLTZ as i64, &[rs1.as_operand(), imm.as_operand()]);
17684 }
17685}
17686
17687impl<U2: Into<Imm>> BneEmitter<Gp, Gp, U2> for Assembler<'_> {
17688 fn bne(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
17689 self.emit_n(
17690 Opcode::BNE as i64,
17691 &[
17692 rs1.as_operand(),
17693 rs2.as_operand(),
17694 Into::<Imm>::into(imm).as_operand(),
17695 ],
17696 );
17697 }
17698}
17699
17700impl BneEmitter<Gp, Gp, Label> for Assembler<'_> {
17701 fn bne(&mut self, rs1: Gp, rs2: Gp, imm: Label) {
17702 self.emit_n(
17703 Opcode::BNE as i64,
17704 &[rs1.as_operand(), rs2.as_operand(), imm.as_operand()],
17705 );
17706 }
17707}
17708
17709impl<U1: Into<Imm>> BnezEmitter<Gp, U1> for Assembler<'_> {
17710 fn bnez(&mut self, rs1: Gp, imm: U1) {
17711 self.emit_n(
17712 Opcode::BNEZ as i64,
17713 &[rs1.as_operand(), Into::<Imm>::into(imm).as_operand()],
17714 );
17715 }
17716}
17717
17718impl BnezEmitter<Gp, Label> for Assembler<'_> {
17719 fn bnez(&mut self, rs1: Gp, imm: Label) {
17720 self.emit_n(Opcode::BNEZ as i64, &[rs1.as_operand(), imm.as_operand()]);
17721 }
17722}
17723
17724impl Brev8Emitter<Gp, Gp> for Assembler<'_> {
17725 fn brev8(&mut self, rd: Gp, rs1: Gp) {
17726 self.emit_n(Opcode::BREV8 as i64, &[rd.as_operand(), rs1.as_operand()]);
17727 }
17728}
17729
17730impl BsetEmitter<Gp, Gp, Gp> for Assembler<'_> {
17731 fn bset(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
17732 self.emit_n(
17733 Opcode::BSET as i64,
17734 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
17735 );
17736 }
17737}
17738
17739impl<U2: Into<Imm>> BsetiEmitter<Gp, Gp, U2> for Assembler<'_> {
17740 fn bseti(&mut self, rd: Gp, rs1: Gp, shamtd: U2) {
17741 self.emit_n(
17742 Opcode::BSETI as i64,
17743 &[
17744 rd.as_operand(),
17745 rs1.as_operand(),
17746 Into::<Imm>::into(shamtd).as_operand(),
17747 ],
17748 );
17749 }
17750}
17751
17752impl<U2: Into<Imm>> BsetiRv32Emitter<Gp, Gp, U2> for Assembler<'_> {
17753 fn bseti_rv32(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
17754 self.emit_n(
17755 Opcode::BSETIRV32 as i64,
17756 &[
17757 rd.as_operand(),
17758 rs1.as_operand(),
17759 Into::<Imm>::into(shamtw).as_operand(),
17760 ],
17761 );
17762 }
17763}
17764
17765impl CAddEmitter<Gp, Gp> for Assembler<'_> {
17766 fn c_add(&mut self, rd: Gp, rs2: Gp) {
17767 self.emit_n(Opcode::CADD as i64, &[rd.as_operand(), rs2.as_operand()]);
17768 }
17769}
17770
17771impl<U1: Into<Imm>> CAddiEmitter<Gp, U1> for Assembler<'_> {
17772 fn c_addi(&mut self, rd: Gp, imm: U1) {
17773 self.emit_n(
17774 Opcode::CADDI as i64,
17775 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
17776 );
17777 }
17778}
17779
17780impl<U0: Into<Imm>> CAddi16spEmitter<U0> for Assembler<'_> {
17781 fn c_addi16sp(&mut self, imm: U0) {
17782 self.emit_n(
17783 Opcode::CADDI16SP as i64,
17784 &[Into::<Imm>::into(imm).as_operand()],
17785 );
17786 }
17787}
17788
17789impl<U1: Into<Imm>> CAddi4spnEmitter<Gp, U1> for Assembler<'_> {
17790 fn c_addi4spn(&mut self, rd: Gp, imm: U1) {
17791 self.emit_n(
17792 Opcode::CADDI4SPN as i64,
17793 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
17794 );
17795 }
17796}
17797
17798impl<U1: Into<Imm>> CAddiwEmitter<Gp, U1> for Assembler<'_> {
17799 fn c_addiw(&mut self, rd: Gp, imm: U1) {
17800 self.emit_n(
17801 Opcode::CADDIW as i64,
17802 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
17803 );
17804 }
17805}
17806
17807impl CAddwEmitter<Gp, Gp> for Assembler<'_> {
17808 fn c_addw(&mut self, rd: Gp, rs2: Gp) {
17809 self.emit_n(Opcode::CADDW as i64, &[rd.as_operand(), rs2.as_operand()]);
17810 }
17811}
17812
17813impl CAndEmitter<Gp, Gp> for Assembler<'_> {
17814 fn c_and(&mut self, rd: Gp, rs2: Gp) {
17815 self.emit_n(Opcode::CAND as i64, &[rd.as_operand(), rs2.as_operand()]);
17816 }
17817}
17818
17819impl<U1: Into<Imm>> CAndiEmitter<Gp, U1> for Assembler<'_> {
17820 fn c_andi(&mut self, rd: Gp, imm: U1) {
17821 self.emit_n(
17822 Opcode::CANDI as i64,
17823 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
17824 );
17825 }
17826}
17827
17828impl<U1: Into<Imm>> CBeqzEmitter<Gp, U1> for Assembler<'_> {
17829 fn c_beqz(&mut self, rs1: Gp, bimm9lohi: U1) {
17830 self.emit_n(
17831 Opcode::CBEQZ as i64,
17832 &[rs1.as_operand(), Into::<Imm>::into(bimm9lohi).as_operand()],
17833 );
17834 }
17835}
17836
17837impl CBeqzEmitter<Gp, Label> for Assembler<'_> {
17838 fn c_beqz(&mut self, rs1: Gp, bimm9lohi: Label) {
17839 self.emit_n(
17840 Opcode::CBEQZ as i64,
17841 &[rs1.as_operand(), bimm9lohi.as_operand()],
17842 );
17843 }
17844}
17845
17846impl<U1: Into<Imm>> CBnezEmitter<Gp, U1> for Assembler<'_> {
17847 fn c_bnez(&mut self, rs1: Gp, bimm9lohi: U1) {
17848 self.emit_n(
17849 Opcode::CBNEZ as i64,
17850 &[rs1.as_operand(), Into::<Imm>::into(bimm9lohi).as_operand()],
17851 );
17852 }
17853}
17854
17855impl CBnezEmitter<Gp, Label> for Assembler<'_> {
17856 fn c_bnez(&mut self, rs1: Gp, bimm9lohi: Label) {
17857 self.emit_n(
17858 Opcode::CBNEZ as i64,
17859 &[rs1.as_operand(), bimm9lohi.as_operand()],
17860 );
17861 }
17862}
17863
17864impl CEbreakEmitter for Assembler<'_> {
17865 fn c_ebreak(&mut self) {
17866 self.emit_n(Opcode::CEBREAK as i64, &[]);
17867 }
17868}
17869
17870impl<U2: Into<Imm>> CFldEmitter<Fp, Gp, U2> for Assembler<'_> {
17871 fn c_fld(&mut self, rd: Fp, rs1: Gp, imm: U2) {
17872 self.emit_n(
17873 Opcode::CFLD as i64,
17874 &[
17875 rd.as_operand(),
17876 rs1.as_operand(),
17877 Into::<Imm>::into(imm).as_operand(),
17878 ],
17879 );
17880 }
17881}
17882
17883impl<U1: Into<Imm>> CFldspEmitter<Fp, U1> for Assembler<'_> {
17884 fn c_fldsp(&mut self, rd: Fp, imm: U1) {
17885 self.emit_n(
17886 Opcode::CFLDSP as i64,
17887 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
17888 );
17889 }
17890}
17891
17892impl<U2: Into<Imm>> CFlwEmitter<Fp, Gp, U2> for Assembler<'_> {
17893 fn c_flw(&mut self, rd: Fp, rs1: Gp, imm: U2) {
17894 self.emit_n(
17895 Opcode::CFLW as i64,
17896 &[
17897 rd.as_operand(),
17898 rs1.as_operand(),
17899 Into::<Imm>::into(imm).as_operand(),
17900 ],
17901 );
17902 }
17903}
17904
17905impl<U1: Into<Imm>> CFlwspEmitter<Fp, U1> for Assembler<'_> {
17906 fn c_flwsp(&mut self, rd: Fp, imm: U1) {
17907 self.emit_n(
17908 Opcode::CFLWSP as i64,
17909 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
17910 );
17911 }
17912}
17913
17914impl<U2: Into<Imm>> CFsdEmitter<Gp, Fp, U2> for Assembler<'_> {
17915 fn c_fsd(&mut self, rs1: Gp, rs2: Fp, imm: U2) {
17916 self.emit_n(
17917 Opcode::CFSD as i64,
17918 &[
17919 rs1.as_operand(),
17920 rs2.as_operand(),
17921 Into::<Imm>::into(imm).as_operand(),
17922 ],
17923 );
17924 }
17925}
17926
17927impl<U1: Into<Imm>> CFsdspEmitter<Fp, U1> for Assembler<'_> {
17928 fn c_fsdsp(&mut self, rs2: Fp, imm: U1) {
17929 self.emit_n(
17930 Opcode::CFSDSP as i64,
17931 &[rs2.as_operand(), Into::<Imm>::into(imm).as_operand()],
17932 );
17933 }
17934}
17935
17936impl<U2: Into<Imm>> CFswEmitter<Gp, Fp, U2> for Assembler<'_> {
17937 fn c_fsw(&mut self, rs1: Gp, rs2: Fp, imm: U2) {
17938 self.emit_n(
17939 Opcode::CFSW as i64,
17940 &[
17941 rs1.as_operand(),
17942 rs2.as_operand(),
17943 Into::<Imm>::into(imm).as_operand(),
17944 ],
17945 );
17946 }
17947}
17948
17949impl<U1: Into<Imm>> CFswspEmitter<Fp, U1> for Assembler<'_> {
17950 fn c_fswsp(&mut self, rs2: Fp, imm: U1) {
17951 self.emit_n(
17952 Opcode::CFSWSP as i64,
17953 &[rs2.as_operand(), Into::<Imm>::into(imm).as_operand()],
17954 );
17955 }
17956}
17957
17958impl<U0: Into<Imm>> CJEmitter<U0> for Assembler<'_> {
17959 fn c_j(&mut self, imm: U0) {
17960 self.emit_n(Opcode::CJ as i64, &[Into::<Imm>::into(imm).as_operand()]);
17961 }
17962}
17963
17964impl CJEmitter<Label> for Assembler<'_> {
17965 fn c_j(&mut self, imm: Label) {
17966 self.emit_n(Opcode::CJ as i64, &[imm.as_operand()]);
17967 }
17968}
17969
17970impl<U0: Into<Imm>> CJalEmitter<U0> for Assembler<'_> {
17971 fn c_jal(&mut self, imm: U0) {
17972 self.emit_n(Opcode::CJAL as i64, &[Into::<Imm>::into(imm).as_operand()]);
17973 }
17974}
17975
17976impl CJalEmitter<Label> for Assembler<'_> {
17977 fn c_jal(&mut self, imm: Label) {
17978 self.emit_n(Opcode::CJAL as i64, &[imm.as_operand()]);
17979 }
17980}
17981
17982impl CJalrEmitter<Gp> for Assembler<'_> {
17983 fn c_jalr(&mut self, rs1: Gp) {
17984 self.emit_n(Opcode::CJALR as i64, &[rs1.as_operand()]);
17985 }
17986}
17987
17988impl CJrEmitter<Gp> for Assembler<'_> {
17989 fn c_jr(&mut self, rs1: Gp) {
17990 self.emit_n(Opcode::CJR as i64, &[rs1.as_operand()]);
17991 }
17992}
17993
17994impl<U2: Into<Imm>> CLbuEmitter<Gp, Gp, U2> for Assembler<'_> {
17995 fn c_lbu(&mut self, rd: Gp, rs1: Gp, imm: U2) {
17996 self.emit_n(
17997 Opcode::CLBU as i64,
17998 &[
17999 rd.as_operand(),
18000 rs1.as_operand(),
18001 Into::<Imm>::into(imm).as_operand(),
18002 ],
18003 );
18004 }
18005}
18006
18007impl<U2: Into<Imm>> CLdEmitter<Gp, Gp, U2> for Assembler<'_> {
18008 fn c_ld(&mut self, rd: Gp, rs1: Gp, imm: U2) {
18009 self.emit_n(
18010 Opcode::CLD as i64,
18011 &[
18012 rd.as_operand(),
18013 rs1.as_operand(),
18014 Into::<Imm>::into(imm).as_operand(),
18015 ],
18016 );
18017 }
18018}
18019
18020impl<U1: Into<Imm>> CLdspEmitter<Gp, U1> for Assembler<'_> {
18021 fn c_ldsp(&mut self, rd: Gp, imm: U1) {
18022 self.emit_n(
18023 Opcode::CLDSP as i64,
18024 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18025 );
18026 }
18027}
18028
18029impl<U2: Into<Imm>> CLhEmitter<Gp, Gp, U2> for Assembler<'_> {
18030 fn c_lh(&mut self, rd: Gp, rs1: Gp, imm: U2) {
18031 self.emit_n(
18032 Opcode::CLH as i64,
18033 &[
18034 rd.as_operand(),
18035 rs1.as_operand(),
18036 Into::<Imm>::into(imm).as_operand(),
18037 ],
18038 );
18039 }
18040}
18041
18042impl<U2: Into<Imm>> CLhuEmitter<Gp, Gp, U2> for Assembler<'_> {
18043 fn c_lhu(&mut self, rd: Gp, rs1: Gp, imm: U2) {
18044 self.emit_n(
18045 Opcode::CLHU as i64,
18046 &[
18047 rd.as_operand(),
18048 rs1.as_operand(),
18049 Into::<Imm>::into(imm).as_operand(),
18050 ],
18051 );
18052 }
18053}
18054
18055impl<U1: Into<Imm>> CLiEmitter<Gp, U1> for Assembler<'_> {
18056 fn c_li(&mut self, rd: Gp, imm: U1) {
18057 self.emit_n(
18058 Opcode::CLI as i64,
18059 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18060 );
18061 }
18062}
18063
18064impl<U1: Into<Imm>> CLuiEmitter<Gp, U1> for Assembler<'_> {
18065 fn c_lui(&mut self, rd: Gp, imm: U1) {
18066 self.emit_n(
18067 Opcode::CLUI as i64,
18068 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18069 );
18070 }
18071}
18072
18073impl<U2: Into<Imm>> CLwEmitter<Gp, Gp, U2> for Assembler<'_> {
18074 fn c_lw(&mut self, rd: Gp, rs1: Gp, imm: U2) {
18075 self.emit_n(
18076 Opcode::CLW as i64,
18077 &[
18078 rd.as_operand(),
18079 rs1.as_operand(),
18080 Into::<Imm>::into(imm).as_operand(),
18081 ],
18082 );
18083 }
18084}
18085
18086impl<U1: Into<Imm>> CLwspEmitter<Gp, U1> for Assembler<'_> {
18087 fn c_lwsp(&mut self, rd: Gp, imm: U1) {
18088 self.emit_n(
18089 Opcode::CLWSP as i64,
18090 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18091 );
18092 }
18093}
18094
18095impl CMop1Emitter for Assembler<'_> {
18096 fn c_mop_1(&mut self) {
18097 self.emit_n(Opcode::CMOP1 as i64, &[]);
18098 }
18099}
18100
18101impl CMop11Emitter for Assembler<'_> {
18102 fn c_mop_11(&mut self) {
18103 self.emit_n(Opcode::CMOP11 as i64, &[]);
18104 }
18105}
18106
18107impl CMop13Emitter for Assembler<'_> {
18108 fn c_mop_13(&mut self) {
18109 self.emit_n(Opcode::CMOP13 as i64, &[]);
18110 }
18111}
18112
18113impl CMop15Emitter for Assembler<'_> {
18114 fn c_mop_15(&mut self) {
18115 self.emit_n(Opcode::CMOP15 as i64, &[]);
18116 }
18117}
18118
18119impl CMop3Emitter for Assembler<'_> {
18120 fn c_mop_3(&mut self) {
18121 self.emit_n(Opcode::CMOP3 as i64, &[]);
18122 }
18123}
18124
18125impl CMop5Emitter for Assembler<'_> {
18126 fn c_mop_5(&mut self) {
18127 self.emit_n(Opcode::CMOP5 as i64, &[]);
18128 }
18129}
18130
18131impl CMop7Emitter for Assembler<'_> {
18132 fn c_mop_7(&mut self) {
18133 self.emit_n(Opcode::CMOP7 as i64, &[]);
18134 }
18135}
18136
18137impl CMop9Emitter for Assembler<'_> {
18138 fn c_mop_9(&mut self) {
18139 self.emit_n(Opcode::CMOP9 as i64, &[]);
18140 }
18141}
18142
18143impl<U0: Into<Imm>> CMopNEmitter<U0> for Assembler<'_> {
18144 fn c_mop_n(&mut self, mop_t: U0) {
18145 self.emit_n(
18146 Opcode::CMOPN as i64,
18147 &[Into::<Imm>::into(mop_t).as_operand()],
18148 );
18149 }
18150}
18151
18152impl CMulEmitter<Gp, Gp> for Assembler<'_> {
18153 fn c_mul(&mut self, rd: Gp, rs2: Gp) {
18154 self.emit_n(Opcode::CMUL as i64, &[rd.as_operand(), rs2.as_operand()]);
18155 }
18156}
18157
18158impl CMvEmitter<Gp, Gp> for Assembler<'_> {
18159 fn c_mv(&mut self, rd: Gp, rs2: Gp) {
18160 self.emit_n(Opcode::CMV as i64, &[rd.as_operand(), rs2.as_operand()]);
18161 }
18162}
18163
18164impl<U0: Into<Imm>> CNopEmitter<U0> for Assembler<'_> {
18165 fn c_nop(&mut self, imm: U0) {
18166 self.emit_n(Opcode::CNOP as i64, &[Into::<Imm>::into(imm).as_operand()]);
18167 }
18168}
18169
18170impl CNotEmitter<Gp> for Assembler<'_> {
18171 fn c_not(&mut self, rd: Gp) {
18172 self.emit_n(Opcode::CNOT as i64, &[rd.as_operand()]);
18173 }
18174}
18175
18176impl CNtlAllEmitter for Assembler<'_> {
18177 fn c_ntl_all(&mut self) {
18178 self.emit_n(Opcode::CNTLALL as i64, &[]);
18179 }
18180}
18181
18182impl CNtlP1Emitter for Assembler<'_> {
18183 fn c_ntl_p1(&mut self) {
18184 self.emit_n(Opcode::CNTLP1 as i64, &[]);
18185 }
18186}
18187
18188impl CNtlPallEmitter for Assembler<'_> {
18189 fn c_ntl_pall(&mut self) {
18190 self.emit_n(Opcode::CNTLPALL as i64, &[]);
18191 }
18192}
18193
18194impl CNtlS1Emitter for Assembler<'_> {
18195 fn c_ntl_s1(&mut self) {
18196 self.emit_n(Opcode::CNTLS1 as i64, &[]);
18197 }
18198}
18199
18200impl COrEmitter<Gp, Gp> for Assembler<'_> {
18201 fn c_or(&mut self, rd: Gp, rs2: Gp) {
18202 self.emit_n(Opcode::COR as i64, &[rd.as_operand(), rs2.as_operand()]);
18203 }
18204}
18205
18206impl<U2: Into<Imm>> CSbEmitter<Gp, Gp, U2> for Assembler<'_> {
18207 fn c_sb(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
18208 self.emit_n(
18209 Opcode::CSB as i64,
18210 &[
18211 rs1.as_operand(),
18212 rs2.as_operand(),
18213 Into::<Imm>::into(imm).as_operand(),
18214 ],
18215 );
18216 }
18217}
18218
18219impl<U2: Into<Imm>> CSdEmitter<Gp, Gp, U2> for Assembler<'_> {
18220 fn c_sd(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
18221 self.emit_n(
18222 Opcode::CSD as i64,
18223 &[
18224 rs1.as_operand(),
18225 rs2.as_operand(),
18226 Into::<Imm>::into(imm).as_operand(),
18227 ],
18228 );
18229 }
18230}
18231
18232impl<U1: Into<Imm>> CSdspEmitter<Gp, U1> for Assembler<'_> {
18233 fn c_sdsp(&mut self, rs2: Gp, imm: U1) {
18234 self.emit_n(
18235 Opcode::CSDSP as i64,
18236 &[rs2.as_operand(), Into::<Imm>::into(imm).as_operand()],
18237 );
18238 }
18239}
18240
18241impl CSextBEmitter<Gp> for Assembler<'_> {
18242 fn c_sext_b(&mut self, rd: Gp) {
18243 self.emit_n(Opcode::CSEXTB as i64, &[rd.as_operand()]);
18244 }
18245}
18246
18247impl CSextHEmitter<Gp> for Assembler<'_> {
18248 fn c_sext_h(&mut self, rd: Gp) {
18249 self.emit_n(Opcode::CSEXTH as i64, &[rd.as_operand()]);
18250 }
18251}
18252
18253impl<U2: Into<Imm>> CShEmitter<Gp, Gp, U2> for Assembler<'_> {
18254 fn c_sh(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
18255 self.emit_n(
18256 Opcode::CSH as i64,
18257 &[
18258 rs1.as_operand(),
18259 rs2.as_operand(),
18260 Into::<Imm>::into(imm).as_operand(),
18261 ],
18262 );
18263 }
18264}
18265
18266impl<U1: Into<Imm>> CSlliEmitter<Gp, U1> for Assembler<'_> {
18267 fn c_slli(&mut self, rd: Gp, imm: U1) {
18268 self.emit_n(
18269 Opcode::CSLLI as i64,
18270 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18271 );
18272 }
18273}
18274
18275impl<U1: Into<Imm>> CSlliRv32Emitter<Gp, U1> for Assembler<'_> {
18276 fn c_slli_rv32(&mut self, rd: Gp, imm: U1) {
18277 self.emit_n(
18278 Opcode::CSLLIRV32 as i64,
18279 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18280 );
18281 }
18282}
18283
18284impl<U1: Into<Imm>> CSraiEmitter<Gp, U1> for Assembler<'_> {
18285 fn c_srai(&mut self, rd: Gp, imm: U1) {
18286 self.emit_n(
18287 Opcode::CSRAI as i64,
18288 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18289 );
18290 }
18291}
18292
18293impl<U1: Into<Imm>> CSraiRv32Emitter<Gp, U1> for Assembler<'_> {
18294 fn c_srai_rv32(&mut self, rd: Gp, imm: U1) {
18295 self.emit_n(
18296 Opcode::CSRAIRV32 as i64,
18297 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18298 );
18299 }
18300}
18301
18302impl<U1: Into<Imm>> CSrliEmitter<Gp, U1> for Assembler<'_> {
18303 fn c_srli(&mut self, rd: Gp, imm: U1) {
18304 self.emit_n(
18305 Opcode::CSRLI as i64,
18306 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18307 );
18308 }
18309}
18310
18311impl<U1: Into<Imm>> CSrliRv32Emitter<Gp, U1> for Assembler<'_> {
18312 fn c_srli_rv32(&mut self, rd: Gp, imm: U1) {
18313 self.emit_n(
18314 Opcode::CSRLIRV32 as i64,
18315 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
18316 );
18317 }
18318}
18319
18320impl CSspopchkX5Emitter for Assembler<'_> {
18321 fn c_sspopchk_x5(&mut self) {
18322 self.emit_n(Opcode::CSSPOPCHKX5 as i64, &[]);
18323 }
18324}
18325
18326impl CSspushX1Emitter for Assembler<'_> {
18327 fn c_sspush_x1(&mut self) {
18328 self.emit_n(Opcode::CSSPUSHX1 as i64, &[]);
18329 }
18330}
18331
18332impl CSubEmitter<Gp, Gp> for Assembler<'_> {
18333 fn c_sub(&mut self, rd: Gp, rs2: Gp) {
18334 self.emit_n(Opcode::CSUB as i64, &[rd.as_operand(), rs2.as_operand()]);
18335 }
18336}
18337
18338impl CSubwEmitter<Gp, Gp> for Assembler<'_> {
18339 fn c_subw(&mut self, rd: Gp, rs2: Gp) {
18340 self.emit_n(Opcode::CSUBW as i64, &[rd.as_operand(), rs2.as_operand()]);
18341 }
18342}
18343
18344impl<U2: Into<Imm>> CSwEmitter<Gp, Gp, U2> for Assembler<'_> {
18345 fn c_sw(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
18346 self.emit_n(
18347 Opcode::CSW as i64,
18348 &[
18349 rs1.as_operand(),
18350 rs2.as_operand(),
18351 Into::<Imm>::into(imm).as_operand(),
18352 ],
18353 );
18354 }
18355}
18356
18357impl<U1: Into<Imm>> CSwspEmitter<Gp, U1> for Assembler<'_> {
18358 fn c_swsp(&mut self, rs2: Gp, imm: U1) {
18359 self.emit_n(
18360 Opcode::CSWSP as i64,
18361 &[rs2.as_operand(), Into::<Imm>::into(imm).as_operand()],
18362 );
18363 }
18364}
18365
18366impl CXorEmitter<Gp, Gp> for Assembler<'_> {
18367 fn c_xor(&mut self, rd: Gp, rs2: Gp) {
18368 self.emit_n(Opcode::CXOR as i64, &[rd.as_operand(), rs2.as_operand()]);
18369 }
18370}
18371
18372impl CZextBEmitter<Gp> for Assembler<'_> {
18373 fn c_zext_b(&mut self, rd: Gp) {
18374 self.emit_n(Opcode::CZEXTB as i64, &[rd.as_operand()]);
18375 }
18376}
18377
18378impl CZextHEmitter<Gp> for Assembler<'_> {
18379 fn c_zext_h(&mut self, rd: Gp) {
18380 self.emit_n(Opcode::CZEXTH as i64, &[rd.as_operand()]);
18381 }
18382}
18383
18384impl CZextWEmitter<Gp> for Assembler<'_> {
18385 fn c_zext_w(&mut self, rd: Gp) {
18386 self.emit_n(Opcode::CZEXTW as i64, &[rd.as_operand()]);
18387 }
18388}
18389
18390impl CboCleanEmitter<Gp> for Assembler<'_> {
18391 fn cbo_clean(&mut self, rs1: Gp) {
18392 self.emit_n(Opcode::CBOCLEAN as i64, &[rs1.as_operand()]);
18393 }
18394}
18395
18396impl CboFlushEmitter<Gp> for Assembler<'_> {
18397 fn cbo_flush(&mut self, rs1: Gp) {
18398 self.emit_n(Opcode::CBOFLUSH as i64, &[rs1.as_operand()]);
18399 }
18400}
18401
18402impl CboInvalEmitter<Gp> for Assembler<'_> {
18403 fn cbo_inval(&mut self, rs1: Gp) {
18404 self.emit_n(Opcode::CBOINVAL as i64, &[rs1.as_operand()]);
18405 }
18406}
18407
18408impl CboZeroEmitter<Gp> for Assembler<'_> {
18409 fn cbo_zero(&mut self, rs1: Gp) {
18410 self.emit_n(Opcode::CBOZERO as i64, &[rs1.as_operand()]);
18411 }
18412}
18413
18414impl ClmulEmitter<Gp, Gp, Gp> for Assembler<'_> {
18415 fn clmul(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
18416 self.emit_n(
18417 Opcode::CLMUL as i64,
18418 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18419 );
18420 }
18421}
18422
18423impl ClmulhEmitter<Gp, Gp, Gp> for Assembler<'_> {
18424 fn clmulh(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
18425 self.emit_n(
18426 Opcode::CLMULH as i64,
18427 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18428 );
18429 }
18430}
18431
18432impl ClmulrEmitter<Gp, Gp, Gp> for Assembler<'_> {
18433 fn clmulr(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
18434 self.emit_n(
18435 Opcode::CLMULR as i64,
18436 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18437 );
18438 }
18439}
18440
18441impl ClzEmitter<Gp, Gp> for Assembler<'_> {
18442 fn clz(&mut self, rd: Gp, rs1: Gp) {
18443 self.emit_n(Opcode::CLZ as i64, &[rd.as_operand(), rs1.as_operand()]);
18444 }
18445}
18446
18447impl ClzwEmitter<Gp, Gp> for Assembler<'_> {
18448 fn clzw(&mut self, rd: Gp, rs1: Gp) {
18449 self.emit_n(Opcode::CLZW as i64, &[rd.as_operand(), rs1.as_operand()]);
18450 }
18451}
18452
18453impl<U0: Into<Imm>> CmJaltEmitter<U0> for Assembler<'_> {
18454 fn cm_jalt(&mut self, index: U0) {
18455 self.emit_n(
18456 Opcode::CMJALT as i64,
18457 &[Into::<Imm>::into(index).as_operand()],
18458 );
18459 }
18460}
18461
18462impl CpopEmitter<Gp, Gp> for Assembler<'_> {
18463 fn cpop(&mut self, rd: Gp, rs1: Gp) {
18464 self.emit_n(Opcode::CPOP as i64, &[rd.as_operand(), rs1.as_operand()]);
18465 }
18466}
18467
18468impl CpopwEmitter<Gp, Gp> for Assembler<'_> {
18469 fn cpopw(&mut self, rd: Gp, rs1: Gp) {
18470 self.emit_n(Opcode::CPOPW as i64, &[rd.as_operand(), rs1.as_operand()]);
18471 }
18472}
18473
18474impl<U1: Into<Imm>> CsrcEmitter<Gp, U1> for Assembler<'_> {
18475 fn csrc(&mut self, rs1: Gp, csr: U1) {
18476 self.emit_n(
18477 Opcode::CSRC as i64,
18478 &[rs1.as_operand(), Into::<Imm>::into(csr).as_operand()],
18479 );
18480 }
18481}
18482
18483impl<U0: Into<Imm>, U1: Into<Imm>> CsrciEmitter<U0, U1> for Assembler<'_> {
18484 fn csrci(&mut self, csr: U0, zimm5: U1) {
18485 self.emit_n(
18486 Opcode::CSRCI as i64,
18487 &[
18488 Into::<Imm>::into(csr).as_operand(),
18489 Into::<Imm>::into(zimm5).as_operand(),
18490 ],
18491 );
18492 }
18493}
18494
18495impl<U1: Into<Imm>> CsrrEmitter<Gp, U1> for Assembler<'_> {
18496 fn csrr(&mut self, rd: Gp, csr: U1) {
18497 self.emit_n(
18498 Opcode::CSRR as i64,
18499 &[rd.as_operand(), Into::<Imm>::into(csr).as_operand()],
18500 );
18501 }
18502}
18503
18504impl<U2: Into<Imm>> CsrrcEmitter<Gp, Gp, U2> for Assembler<'_> {
18505 fn csrrc(&mut self, rd: Gp, rs1: Gp, csr: U2) {
18506 self.emit_n(
18507 Opcode::CSRRC as i64,
18508 &[
18509 rd.as_operand(),
18510 rs1.as_operand(),
18511 Into::<Imm>::into(csr).as_operand(),
18512 ],
18513 );
18514 }
18515}
18516
18517impl<U1: Into<Imm>, U2: Into<Imm>> CsrrciEmitter<Gp, U1, U2> for Assembler<'_> {
18518 fn csrrci(&mut self, rd: Gp, csr: U1, zimm5: U2) {
18519 self.emit_n(
18520 Opcode::CSRRCI as i64,
18521 &[
18522 rd.as_operand(),
18523 Into::<Imm>::into(csr).as_operand(),
18524 Into::<Imm>::into(zimm5).as_operand(),
18525 ],
18526 );
18527 }
18528}
18529
18530impl<U2: Into<Imm>> CsrrsEmitter<Gp, Gp, U2> for Assembler<'_> {
18531 fn csrrs(&mut self, rd: Gp, rs1: Gp, csr: U2) {
18532 self.emit_n(
18533 Opcode::CSRRS as i64,
18534 &[
18535 rd.as_operand(),
18536 rs1.as_operand(),
18537 Into::<Imm>::into(csr).as_operand(),
18538 ],
18539 );
18540 }
18541}
18542
18543impl<U1: Into<Imm>, U2: Into<Imm>> CsrrsiEmitter<Gp, U1, U2> for Assembler<'_> {
18544 fn csrrsi(&mut self, rd: Gp, csr: U1, zimm5: U2) {
18545 self.emit_n(
18546 Opcode::CSRRSI as i64,
18547 &[
18548 rd.as_operand(),
18549 Into::<Imm>::into(csr).as_operand(),
18550 Into::<Imm>::into(zimm5).as_operand(),
18551 ],
18552 );
18553 }
18554}
18555
18556impl<U2: Into<Imm>> CsrrwEmitter<Gp, Gp, U2> for Assembler<'_> {
18557 fn csrrw(&mut self, rd: Gp, rs1: Gp, csr: U2) {
18558 self.emit_n(
18559 Opcode::CSRRW as i64,
18560 &[
18561 rd.as_operand(),
18562 rs1.as_operand(),
18563 Into::<Imm>::into(csr).as_operand(),
18564 ],
18565 );
18566 }
18567}
18568
18569impl<U1: Into<Imm>, U2: Into<Imm>> CsrrwiEmitter<Gp, U1, U2> for Assembler<'_> {
18570 fn csrrwi(&mut self, rd: Gp, csr: U1, zimm5: U2) {
18571 self.emit_n(
18572 Opcode::CSRRWI as i64,
18573 &[
18574 rd.as_operand(),
18575 Into::<Imm>::into(csr).as_operand(),
18576 Into::<Imm>::into(zimm5).as_operand(),
18577 ],
18578 );
18579 }
18580}
18581
18582impl<U1: Into<Imm>> CsrsEmitter<Gp, U1> for Assembler<'_> {
18583 fn csrs(&mut self, rs1: Gp, csr: U1) {
18584 self.emit_n(
18585 Opcode::CSRS as i64,
18586 &[rs1.as_operand(), Into::<Imm>::into(csr).as_operand()],
18587 );
18588 }
18589}
18590
18591impl<U0: Into<Imm>, U1: Into<Imm>> CsrsiEmitter<U0, U1> for Assembler<'_> {
18592 fn csrsi(&mut self, csr: U0, zimm5: U1) {
18593 self.emit_n(
18594 Opcode::CSRSI as i64,
18595 &[
18596 Into::<Imm>::into(csr).as_operand(),
18597 Into::<Imm>::into(zimm5).as_operand(),
18598 ],
18599 );
18600 }
18601}
18602
18603impl<U1: Into<Imm>> CsrwEmitter<Gp, U1> for Assembler<'_> {
18604 fn csrw(&mut self, rs1: Gp, csr: U1) {
18605 self.emit_n(
18606 Opcode::CSRW as i64,
18607 &[rs1.as_operand(), Into::<Imm>::into(csr).as_operand()],
18608 );
18609 }
18610}
18611
18612impl<U0: Into<Imm>, U1: Into<Imm>> CsrwiEmitter<U0, U1> for Assembler<'_> {
18613 fn csrwi(&mut self, csr: U0, zimm5: U1) {
18614 self.emit_n(
18615 Opcode::CSRWI as i64,
18616 &[
18617 Into::<Imm>::into(csr).as_operand(),
18618 Into::<Imm>::into(zimm5).as_operand(),
18619 ],
18620 );
18621 }
18622}
18623
18624impl CtzEmitter<Gp, Gp> for Assembler<'_> {
18625 fn ctz(&mut self, rd: Gp, rs1: Gp) {
18626 self.emit_n(Opcode::CTZ as i64, &[rd.as_operand(), rs1.as_operand()]);
18627 }
18628}
18629
18630impl CtzwEmitter<Gp, Gp> for Assembler<'_> {
18631 fn ctzw(&mut self, rd: Gp, rs1: Gp) {
18632 self.emit_n(Opcode::CTZW as i64, &[rd.as_operand(), rs1.as_operand()]);
18633 }
18634}
18635
18636impl CzeroEqzEmitter<Gp, Gp, Gp> for Assembler<'_> {
18637 fn czero_eqz(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
18638 self.emit_n(
18639 Opcode::CZEROEQZ as i64,
18640 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18641 );
18642 }
18643}
18644
18645impl CzeroNezEmitter<Gp, Gp, Gp> for Assembler<'_> {
18646 fn czero_nez(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
18647 self.emit_n(
18648 Opcode::CZERONEZ as i64,
18649 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18650 );
18651 }
18652}
18653
18654impl DivEmitter<Gp, Gp, Gp> for Assembler<'_> {
18655 fn div(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
18656 self.emit_n(
18657 Opcode::DIV as i64,
18658 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18659 );
18660 }
18661}
18662
18663impl DivuEmitter<Gp, Gp, Gp> for Assembler<'_> {
18664 fn divu(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
18665 self.emit_n(
18666 Opcode::DIVU as i64,
18667 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18668 );
18669 }
18670}
18671
18672impl DivuwEmitter<Gp, Gp, Gp> for Assembler<'_> {
18673 fn divuw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
18674 self.emit_n(
18675 Opcode::DIVUW as i64,
18676 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18677 );
18678 }
18679}
18680
18681impl DivwEmitter<Gp, Gp, Gp> for Assembler<'_> {
18682 fn divw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
18683 self.emit_n(
18684 Opcode::DIVW as i64,
18685 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18686 );
18687 }
18688}
18689
18690impl DretEmitter for Assembler<'_> {
18691 fn dret(&mut self) {
18692 self.emit_n(Opcode::DRET as i64, &[]);
18693 }
18694}
18695
18696impl EbreakEmitter for Assembler<'_> {
18697 fn ebreak(&mut self) {
18698 self.emit_n(Opcode::EBREAK as i64, &[]);
18699 }
18700}
18701
18702impl EcallEmitter for Assembler<'_> {
18703 fn ecall(&mut self) {
18704 self.emit_n(Opcode::ECALL as i64, &[]);
18705 }
18706}
18707
18708impl FabsDEmitter<Fp, Fp, Fp> for Assembler<'_> {
18709 fn fabs_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
18710 self.emit_n(
18711 Opcode::FABSD as i64,
18712 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18713 );
18714 }
18715}
18716
18717impl FabsHEmitter<Fp, Fp, Fp> for Assembler<'_> {
18718 fn fabs_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
18719 self.emit_n(
18720 Opcode::FABSH as i64,
18721 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18722 );
18723 }
18724}
18725
18726impl FabsQEmitter<Fp, Fp, Fp> for Assembler<'_> {
18727 fn fabs_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
18728 self.emit_n(
18729 Opcode::FABSQ as i64,
18730 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18731 );
18732 }
18733}
18734
18735impl FabsSEmitter<Fp, Fp, Fp> for Assembler<'_> {
18736 fn fabs_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
18737 self.emit_n(
18738 Opcode::FABSS as i64,
18739 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
18740 );
18741 }
18742}
18743
18744impl<U3: Into<Imm>> FaddDEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
18745 fn fadd_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
18746 self.emit_n(
18747 Opcode::FADDD as i64,
18748 &[
18749 rd.as_operand(),
18750 rs1.as_operand(),
18751 rs2.as_operand(),
18752 Into::<Imm>::into(rm).as_operand(),
18753 ],
18754 );
18755 }
18756}
18757
18758impl<U3: Into<Imm>> FaddHEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
18759 fn fadd_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
18760 self.emit_n(
18761 Opcode::FADDH as i64,
18762 &[
18763 rd.as_operand(),
18764 rs1.as_operand(),
18765 rs2.as_operand(),
18766 Into::<Imm>::into(rm).as_operand(),
18767 ],
18768 );
18769 }
18770}
18771
18772impl<U3: Into<Imm>> FaddQEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
18773 fn fadd_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
18774 self.emit_n(
18775 Opcode::FADDQ as i64,
18776 &[
18777 rd.as_operand(),
18778 rs1.as_operand(),
18779 rs2.as_operand(),
18780 Into::<Imm>::into(rm).as_operand(),
18781 ],
18782 );
18783 }
18784}
18785
18786impl<U3: Into<Imm>> FaddSEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
18787 fn fadd_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
18788 self.emit_n(
18789 Opcode::FADDS as i64,
18790 &[
18791 rd.as_operand(),
18792 rs1.as_operand(),
18793 rs2.as_operand(),
18794 Into::<Imm>::into(rm).as_operand(),
18795 ],
18796 );
18797 }
18798}
18799
18800impl FclassDEmitter<Gp, Fp> for Assembler<'_> {
18801 fn fclass_d(&mut self, rd: Gp, rs1: Fp) {
18802 self.emit_n(Opcode::FCLASSD as i64, &[rd.as_operand(), rs1.as_operand()]);
18803 }
18804}
18805
18806impl FclassHEmitter<Gp, Fp> for Assembler<'_> {
18807 fn fclass_h(&mut self, rd: Gp, rs1: Fp) {
18808 self.emit_n(Opcode::FCLASSH as i64, &[rd.as_operand(), rs1.as_operand()]);
18809 }
18810}
18811
18812impl FclassQEmitter<Gp, Fp> for Assembler<'_> {
18813 fn fclass_q(&mut self, rd: Gp, rs1: Fp) {
18814 self.emit_n(Opcode::FCLASSQ as i64, &[rd.as_operand(), rs1.as_operand()]);
18815 }
18816}
18817
18818impl FclassSEmitter<Gp, Fp> for Assembler<'_> {
18819 fn fclass_s(&mut self, rd: Gp, rs1: Fp) {
18820 self.emit_n(Opcode::FCLASSS as i64, &[rd.as_operand(), rs1.as_operand()]);
18821 }
18822}
18823
18824impl<U2: Into<Imm>> FcvtBf16SEmitter<Fp, Fp, U2> for Assembler<'_> {
18825 fn fcvt_bf16_s(&mut self, rd: Fp, rs1: Fp, rm: U2) {
18826 self.emit_n(
18827 Opcode::FCVTBF16S as i64,
18828 &[
18829 rd.as_operand(),
18830 rs1.as_operand(),
18831 Into::<Imm>::into(rm).as_operand(),
18832 ],
18833 );
18834 }
18835}
18836
18837impl<U2: Into<Imm>> FcvtDHEmitter<Fp, Fp, U2> for Assembler<'_> {
18838 fn fcvt_d_h(&mut self, rd: Fp, rs1: Fp, rm: U2) {
18839 self.emit_n(
18840 Opcode::FCVTDH as i64,
18841 &[
18842 rd.as_operand(),
18843 rs1.as_operand(),
18844 Into::<Imm>::into(rm).as_operand(),
18845 ],
18846 );
18847 }
18848}
18849
18850impl<U2: Into<Imm>> FcvtDLEmitter<Fp, Gp, U2> for Assembler<'_> {
18851 fn fcvt_d_l(&mut self, rd: Fp, rs1: Gp, rm: U2) {
18852 self.emit_n(
18853 Opcode::FCVTDL as i64,
18854 &[
18855 rd.as_operand(),
18856 rs1.as_operand(),
18857 Into::<Imm>::into(rm).as_operand(),
18858 ],
18859 );
18860 }
18861}
18862
18863impl<U2: Into<Imm>> FcvtDLuEmitter<Fp, Gp, U2> for Assembler<'_> {
18864 fn fcvt_d_lu(&mut self, rd: Fp, rs1: Gp, rm: U2) {
18865 self.emit_n(
18866 Opcode::FCVTDLU as i64,
18867 &[
18868 rd.as_operand(),
18869 rs1.as_operand(),
18870 Into::<Imm>::into(rm).as_operand(),
18871 ],
18872 );
18873 }
18874}
18875
18876impl<U2: Into<Imm>> FcvtDQEmitter<Fp, Fp, U2> for Assembler<'_> {
18877 fn fcvt_d_q(&mut self, rd: Fp, rs1: Fp, rm: U2) {
18878 self.emit_n(
18879 Opcode::FCVTDQ as i64,
18880 &[
18881 rd.as_operand(),
18882 rs1.as_operand(),
18883 Into::<Imm>::into(rm).as_operand(),
18884 ],
18885 );
18886 }
18887}
18888
18889impl<U2: Into<Imm>> FcvtDSEmitter<Fp, Fp, U2> for Assembler<'_> {
18890 fn fcvt_d_s(&mut self, rd: Fp, rs1: Fp, rm: U2) {
18891 self.emit_n(
18892 Opcode::FCVTDS as i64,
18893 &[
18894 rd.as_operand(),
18895 rs1.as_operand(),
18896 Into::<Imm>::into(rm).as_operand(),
18897 ],
18898 );
18899 }
18900}
18901
18902impl<U2: Into<Imm>> FcvtDWEmitter<Fp, Gp, U2> for Assembler<'_> {
18903 fn fcvt_d_w(&mut self, rd: Fp, rs1: Gp, rm: U2) {
18904 self.emit_n(
18905 Opcode::FCVTDW as i64,
18906 &[
18907 rd.as_operand(),
18908 rs1.as_operand(),
18909 Into::<Imm>::into(rm).as_operand(),
18910 ],
18911 );
18912 }
18913}
18914
18915impl<U2: Into<Imm>> FcvtDWuEmitter<Fp, Gp, U2> for Assembler<'_> {
18916 fn fcvt_d_wu(&mut self, rd: Fp, rs1: Gp, rm: U2) {
18917 self.emit_n(
18918 Opcode::FCVTDWU as i64,
18919 &[
18920 rd.as_operand(),
18921 rs1.as_operand(),
18922 Into::<Imm>::into(rm).as_operand(),
18923 ],
18924 );
18925 }
18926}
18927
18928impl<U2: Into<Imm>> FcvtHDEmitter<Fp, Fp, U2> for Assembler<'_> {
18929 fn fcvt_h_d(&mut self, rd: Fp, rs1: Fp, rm: U2) {
18930 self.emit_n(
18931 Opcode::FCVTHD as i64,
18932 &[
18933 rd.as_operand(),
18934 rs1.as_operand(),
18935 Into::<Imm>::into(rm).as_operand(),
18936 ],
18937 );
18938 }
18939}
18940
18941impl<U2: Into<Imm>> FcvtHLEmitter<Fp, Gp, U2> for Assembler<'_> {
18942 fn fcvt_h_l(&mut self, rd: Fp, rs1: Gp, rm: U2) {
18943 self.emit_n(
18944 Opcode::FCVTHL as i64,
18945 &[
18946 rd.as_operand(),
18947 rs1.as_operand(),
18948 Into::<Imm>::into(rm).as_operand(),
18949 ],
18950 );
18951 }
18952}
18953
18954impl<U2: Into<Imm>> FcvtHLuEmitter<Fp, Gp, U2> for Assembler<'_> {
18955 fn fcvt_h_lu(&mut self, rd: Fp, rs1: Gp, rm: U2) {
18956 self.emit_n(
18957 Opcode::FCVTHLU as i64,
18958 &[
18959 rd.as_operand(),
18960 rs1.as_operand(),
18961 Into::<Imm>::into(rm).as_operand(),
18962 ],
18963 );
18964 }
18965}
18966
18967impl<U2: Into<Imm>> FcvtHQEmitter<Fp, Fp, U2> for Assembler<'_> {
18968 fn fcvt_h_q(&mut self, rd: Fp, rs1: Fp, rm: U2) {
18969 self.emit_n(
18970 Opcode::FCVTHQ as i64,
18971 &[
18972 rd.as_operand(),
18973 rs1.as_operand(),
18974 Into::<Imm>::into(rm).as_operand(),
18975 ],
18976 );
18977 }
18978}
18979
18980impl<U2: Into<Imm>> FcvtHSEmitter<Fp, Fp, U2> for Assembler<'_> {
18981 fn fcvt_h_s(&mut self, rd: Fp, rs1: Fp, rm: U2) {
18982 self.emit_n(
18983 Opcode::FCVTHS as i64,
18984 &[
18985 rd.as_operand(),
18986 rs1.as_operand(),
18987 Into::<Imm>::into(rm).as_operand(),
18988 ],
18989 );
18990 }
18991}
18992
18993impl<U2: Into<Imm>> FcvtHWEmitter<Fp, Gp, U2> for Assembler<'_> {
18994 fn fcvt_h_w(&mut self, rd: Fp, rs1: Gp, rm: U2) {
18995 self.emit_n(
18996 Opcode::FCVTHW as i64,
18997 &[
18998 rd.as_operand(),
18999 rs1.as_operand(),
19000 Into::<Imm>::into(rm).as_operand(),
19001 ],
19002 );
19003 }
19004}
19005
19006impl<U2: Into<Imm>> FcvtHWuEmitter<Fp, Gp, U2> for Assembler<'_> {
19007 fn fcvt_h_wu(&mut self, rd: Fp, rs1: Gp, rm: U2) {
19008 self.emit_n(
19009 Opcode::FCVTHWU as i64,
19010 &[
19011 rd.as_operand(),
19012 rs1.as_operand(),
19013 Into::<Imm>::into(rm).as_operand(),
19014 ],
19015 );
19016 }
19017}
19018
19019impl<U2: Into<Imm>> FcvtLDEmitter<Gp, Fp, U2> for Assembler<'_> {
19020 fn fcvt_l_d(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19021 self.emit_n(
19022 Opcode::FCVTLD as i64,
19023 &[
19024 rd.as_operand(),
19025 rs1.as_operand(),
19026 Into::<Imm>::into(rm).as_operand(),
19027 ],
19028 );
19029 }
19030}
19031
19032impl<U2: Into<Imm>> FcvtLHEmitter<Gp, Fp, U2> for Assembler<'_> {
19033 fn fcvt_l_h(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19034 self.emit_n(
19035 Opcode::FCVTLH as i64,
19036 &[
19037 rd.as_operand(),
19038 rs1.as_operand(),
19039 Into::<Imm>::into(rm).as_operand(),
19040 ],
19041 );
19042 }
19043}
19044
19045impl<U2: Into<Imm>> FcvtLQEmitter<Gp, Fp, U2> for Assembler<'_> {
19046 fn fcvt_l_q(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19047 self.emit_n(
19048 Opcode::FCVTLQ as i64,
19049 &[
19050 rd.as_operand(),
19051 rs1.as_operand(),
19052 Into::<Imm>::into(rm).as_operand(),
19053 ],
19054 );
19055 }
19056}
19057
19058impl<U2: Into<Imm>> FcvtLSEmitter<Gp, Fp, U2> for Assembler<'_> {
19059 fn fcvt_l_s(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19060 self.emit_n(
19061 Opcode::FCVTLS as i64,
19062 &[
19063 rd.as_operand(),
19064 rs1.as_operand(),
19065 Into::<Imm>::into(rm).as_operand(),
19066 ],
19067 );
19068 }
19069}
19070
19071impl<U2: Into<Imm>> FcvtLuDEmitter<Gp, Fp, U2> for Assembler<'_> {
19072 fn fcvt_lu_d(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19073 self.emit_n(
19074 Opcode::FCVTLUD as i64,
19075 &[
19076 rd.as_operand(),
19077 rs1.as_operand(),
19078 Into::<Imm>::into(rm).as_operand(),
19079 ],
19080 );
19081 }
19082}
19083
19084impl<U2: Into<Imm>> FcvtLuHEmitter<Gp, Fp, U2> for Assembler<'_> {
19085 fn fcvt_lu_h(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19086 self.emit_n(
19087 Opcode::FCVTLUH as i64,
19088 &[
19089 rd.as_operand(),
19090 rs1.as_operand(),
19091 Into::<Imm>::into(rm).as_operand(),
19092 ],
19093 );
19094 }
19095}
19096
19097impl<U2: Into<Imm>> FcvtLuQEmitter<Gp, Fp, U2> for Assembler<'_> {
19098 fn fcvt_lu_q(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19099 self.emit_n(
19100 Opcode::FCVTLUQ as i64,
19101 &[
19102 rd.as_operand(),
19103 rs1.as_operand(),
19104 Into::<Imm>::into(rm).as_operand(),
19105 ],
19106 );
19107 }
19108}
19109
19110impl<U2: Into<Imm>> FcvtLuSEmitter<Gp, Fp, U2> for Assembler<'_> {
19111 fn fcvt_lu_s(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19112 self.emit_n(
19113 Opcode::FCVTLUS as i64,
19114 &[
19115 rd.as_operand(),
19116 rs1.as_operand(),
19117 Into::<Imm>::into(rm).as_operand(),
19118 ],
19119 );
19120 }
19121}
19122
19123impl<U2: Into<Imm>> FcvtQDEmitter<Fp, Fp, U2> for Assembler<'_> {
19124 fn fcvt_q_d(&mut self, rd: Fp, rs1: Fp, rm: U2) {
19125 self.emit_n(
19126 Opcode::FCVTQD as i64,
19127 &[
19128 rd.as_operand(),
19129 rs1.as_operand(),
19130 Into::<Imm>::into(rm).as_operand(),
19131 ],
19132 );
19133 }
19134}
19135
19136impl<U2: Into<Imm>> FcvtQHEmitter<Fp, Fp, U2> for Assembler<'_> {
19137 fn fcvt_q_h(&mut self, rd: Fp, rs1: Fp, rm: U2) {
19138 self.emit_n(
19139 Opcode::FCVTQH as i64,
19140 &[
19141 rd.as_operand(),
19142 rs1.as_operand(),
19143 Into::<Imm>::into(rm).as_operand(),
19144 ],
19145 );
19146 }
19147}
19148
19149impl<U2: Into<Imm>> FcvtQLEmitter<Fp, Gp, U2> for Assembler<'_> {
19150 fn fcvt_q_l(&mut self, rd: Fp, rs1: Gp, rm: U2) {
19151 self.emit_n(
19152 Opcode::FCVTQL as i64,
19153 &[
19154 rd.as_operand(),
19155 rs1.as_operand(),
19156 Into::<Imm>::into(rm).as_operand(),
19157 ],
19158 );
19159 }
19160}
19161
19162impl<U2: Into<Imm>> FcvtQLuEmitter<Fp, Gp, U2> for Assembler<'_> {
19163 fn fcvt_q_lu(&mut self, rd: Fp, rs1: Gp, rm: U2) {
19164 self.emit_n(
19165 Opcode::FCVTQLU as i64,
19166 &[
19167 rd.as_operand(),
19168 rs1.as_operand(),
19169 Into::<Imm>::into(rm).as_operand(),
19170 ],
19171 );
19172 }
19173}
19174
19175impl<U2: Into<Imm>> FcvtQSEmitter<Fp, Fp, U2> for Assembler<'_> {
19176 fn fcvt_q_s(&mut self, rd: Fp, rs1: Fp, rm: U2) {
19177 self.emit_n(
19178 Opcode::FCVTQS as i64,
19179 &[
19180 rd.as_operand(),
19181 rs1.as_operand(),
19182 Into::<Imm>::into(rm).as_operand(),
19183 ],
19184 );
19185 }
19186}
19187
19188impl<U2: Into<Imm>> FcvtQWEmitter<Fp, Gp, U2> for Assembler<'_> {
19189 fn fcvt_q_w(&mut self, rd: Fp, rs1: Gp, rm: U2) {
19190 self.emit_n(
19191 Opcode::FCVTQW as i64,
19192 &[
19193 rd.as_operand(),
19194 rs1.as_operand(),
19195 Into::<Imm>::into(rm).as_operand(),
19196 ],
19197 );
19198 }
19199}
19200
19201impl<U2: Into<Imm>> FcvtQWuEmitter<Fp, Gp, U2> for Assembler<'_> {
19202 fn fcvt_q_wu(&mut self, rd: Fp, rs1: Gp, rm: U2) {
19203 self.emit_n(
19204 Opcode::FCVTQWU as i64,
19205 &[
19206 rd.as_operand(),
19207 rs1.as_operand(),
19208 Into::<Imm>::into(rm).as_operand(),
19209 ],
19210 );
19211 }
19212}
19213
19214impl<U2: Into<Imm>> FcvtSBf16Emitter<Fp, Fp, U2> for Assembler<'_> {
19215 fn fcvt_s_bf16(&mut self, rd: Fp, rs1: Fp, rm: U2) {
19216 self.emit_n(
19217 Opcode::FCVTSBF16 as i64,
19218 &[
19219 rd.as_operand(),
19220 rs1.as_operand(),
19221 Into::<Imm>::into(rm).as_operand(),
19222 ],
19223 );
19224 }
19225}
19226
19227impl<U2: Into<Imm>> FcvtSDEmitter<Fp, Fp, U2> for Assembler<'_> {
19228 fn fcvt_s_d(&mut self, rd: Fp, rs1: Fp, rm: U2) {
19229 self.emit_n(
19230 Opcode::FCVTSD as i64,
19231 &[
19232 rd.as_operand(),
19233 rs1.as_operand(),
19234 Into::<Imm>::into(rm).as_operand(),
19235 ],
19236 );
19237 }
19238}
19239
19240impl<U2: Into<Imm>> FcvtSHEmitter<Fp, Fp, U2> for Assembler<'_> {
19241 fn fcvt_s_h(&mut self, rd: Fp, rs1: Fp, rm: U2) {
19242 self.emit_n(
19243 Opcode::FCVTSH as i64,
19244 &[
19245 rd.as_operand(),
19246 rs1.as_operand(),
19247 Into::<Imm>::into(rm).as_operand(),
19248 ],
19249 );
19250 }
19251}
19252
19253impl<U2: Into<Imm>> FcvtSLEmitter<Fp, Gp, U2> for Assembler<'_> {
19254 fn fcvt_s_l(&mut self, rd: Fp, rs1: Gp, rm: U2) {
19255 self.emit_n(
19256 Opcode::FCVTSL as i64,
19257 &[
19258 rd.as_operand(),
19259 rs1.as_operand(),
19260 Into::<Imm>::into(rm).as_operand(),
19261 ],
19262 );
19263 }
19264}
19265
19266impl<U2: Into<Imm>> FcvtSLuEmitter<Fp, Gp, U2> for Assembler<'_> {
19267 fn fcvt_s_lu(&mut self, rd: Fp, rs1: Gp, rm: U2) {
19268 self.emit_n(
19269 Opcode::FCVTSLU as i64,
19270 &[
19271 rd.as_operand(),
19272 rs1.as_operand(),
19273 Into::<Imm>::into(rm).as_operand(),
19274 ],
19275 );
19276 }
19277}
19278
19279impl<U2: Into<Imm>> FcvtSQEmitter<Fp, Fp, U2> for Assembler<'_> {
19280 fn fcvt_s_q(&mut self, rd: Fp, rs1: Fp, rm: U2) {
19281 self.emit_n(
19282 Opcode::FCVTSQ as i64,
19283 &[
19284 rd.as_operand(),
19285 rs1.as_operand(),
19286 Into::<Imm>::into(rm).as_operand(),
19287 ],
19288 );
19289 }
19290}
19291
19292impl<U2: Into<Imm>> FcvtSWEmitter<Fp, Gp, U2> for Assembler<'_> {
19293 fn fcvt_s_w(&mut self, rd: Fp, rs1: Gp, rm: U2) {
19294 self.emit_n(
19295 Opcode::FCVTSW as i64,
19296 &[
19297 rd.as_operand(),
19298 rs1.as_operand(),
19299 Into::<Imm>::into(rm).as_operand(),
19300 ],
19301 );
19302 }
19303}
19304
19305impl<U2: Into<Imm>> FcvtSWuEmitter<Fp, Gp, U2> for Assembler<'_> {
19306 fn fcvt_s_wu(&mut self, rd: Fp, rs1: Gp, rm: U2) {
19307 self.emit_n(
19308 Opcode::FCVTSWU as i64,
19309 &[
19310 rd.as_operand(),
19311 rs1.as_operand(),
19312 Into::<Imm>::into(rm).as_operand(),
19313 ],
19314 );
19315 }
19316}
19317
19318impl<U2: Into<Imm>> FcvtWDEmitter<Gp, Fp, U2> for Assembler<'_> {
19319 fn fcvt_w_d(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19320 self.emit_n(
19321 Opcode::FCVTWD as i64,
19322 &[
19323 rd.as_operand(),
19324 rs1.as_operand(),
19325 Into::<Imm>::into(rm).as_operand(),
19326 ],
19327 );
19328 }
19329}
19330
19331impl<U2: Into<Imm>> FcvtWHEmitter<Gp, Fp, U2> for Assembler<'_> {
19332 fn fcvt_w_h(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19333 self.emit_n(
19334 Opcode::FCVTWH as i64,
19335 &[
19336 rd.as_operand(),
19337 rs1.as_operand(),
19338 Into::<Imm>::into(rm).as_operand(),
19339 ],
19340 );
19341 }
19342}
19343
19344impl<U2: Into<Imm>> FcvtWQEmitter<Gp, Fp, U2> for Assembler<'_> {
19345 fn fcvt_w_q(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19346 self.emit_n(
19347 Opcode::FCVTWQ as i64,
19348 &[
19349 rd.as_operand(),
19350 rs1.as_operand(),
19351 Into::<Imm>::into(rm).as_operand(),
19352 ],
19353 );
19354 }
19355}
19356
19357impl<U2: Into<Imm>> FcvtWSEmitter<Gp, Fp, U2> for Assembler<'_> {
19358 fn fcvt_w_s(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19359 self.emit_n(
19360 Opcode::FCVTWS as i64,
19361 &[
19362 rd.as_operand(),
19363 rs1.as_operand(),
19364 Into::<Imm>::into(rm).as_operand(),
19365 ],
19366 );
19367 }
19368}
19369
19370impl<U2: Into<Imm>> FcvtWuDEmitter<Gp, Fp, U2> for Assembler<'_> {
19371 fn fcvt_wu_d(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19372 self.emit_n(
19373 Opcode::FCVTWUD as i64,
19374 &[
19375 rd.as_operand(),
19376 rs1.as_operand(),
19377 Into::<Imm>::into(rm).as_operand(),
19378 ],
19379 );
19380 }
19381}
19382
19383impl<U2: Into<Imm>> FcvtWuHEmitter<Gp, Fp, U2> for Assembler<'_> {
19384 fn fcvt_wu_h(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19385 self.emit_n(
19386 Opcode::FCVTWUH as i64,
19387 &[
19388 rd.as_operand(),
19389 rs1.as_operand(),
19390 Into::<Imm>::into(rm).as_operand(),
19391 ],
19392 );
19393 }
19394}
19395
19396impl<U2: Into<Imm>> FcvtWuQEmitter<Gp, Fp, U2> for Assembler<'_> {
19397 fn fcvt_wu_q(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19398 self.emit_n(
19399 Opcode::FCVTWUQ as i64,
19400 &[
19401 rd.as_operand(),
19402 rs1.as_operand(),
19403 Into::<Imm>::into(rm).as_operand(),
19404 ],
19405 );
19406 }
19407}
19408
19409impl<U2: Into<Imm>> FcvtWuSEmitter<Gp, Fp, U2> for Assembler<'_> {
19410 fn fcvt_wu_s(&mut self, rd: Gp, rs1: Fp, rm: U2) {
19411 self.emit_n(
19412 Opcode::FCVTWUS as i64,
19413 &[
19414 rd.as_operand(),
19415 rs1.as_operand(),
19416 Into::<Imm>::into(rm).as_operand(),
19417 ],
19418 );
19419 }
19420}
19421
19422impl FcvtmodWDEmitter<Gp, Fp> for Assembler<'_> {
19423 fn fcvtmod_w_d(&mut self, rd: Gp, rs1: Fp) {
19424 self.emit_n(
19425 Opcode::FCVTMODWD as i64,
19426 &[rd.as_operand(), rs1.as_operand()],
19427 );
19428 }
19429}
19430
19431impl<U3: Into<Imm>> FdivDEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
19432 fn fdiv_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
19433 self.emit_n(
19434 Opcode::FDIVD as i64,
19435 &[
19436 rd.as_operand(),
19437 rs1.as_operand(),
19438 rs2.as_operand(),
19439 Into::<Imm>::into(rm).as_operand(),
19440 ],
19441 );
19442 }
19443}
19444
19445impl<U3: Into<Imm>> FdivHEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
19446 fn fdiv_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
19447 self.emit_n(
19448 Opcode::FDIVH as i64,
19449 &[
19450 rd.as_operand(),
19451 rs1.as_operand(),
19452 rs2.as_operand(),
19453 Into::<Imm>::into(rm).as_operand(),
19454 ],
19455 );
19456 }
19457}
19458
19459impl<U3: Into<Imm>> FdivQEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
19460 fn fdiv_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
19461 self.emit_n(
19462 Opcode::FDIVQ as i64,
19463 &[
19464 rd.as_operand(),
19465 rs1.as_operand(),
19466 rs2.as_operand(),
19467 Into::<Imm>::into(rm).as_operand(),
19468 ],
19469 );
19470 }
19471}
19472
19473impl<U3: Into<Imm>> FdivSEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
19474 fn fdiv_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
19475 self.emit_n(
19476 Opcode::FDIVS as i64,
19477 &[
19478 rd.as_operand(),
19479 rs1.as_operand(),
19480 rs2.as_operand(),
19481 Into::<Imm>::into(rm).as_operand(),
19482 ],
19483 );
19484 }
19485}
19486
19487impl<U0: Into<Imm>, U1: Into<Imm>, U2: Into<Imm>, U3: Into<Imm>, U4: Into<Imm>>
19488 FenceEmitter<U0, U1, U2, U3, U4> for Assembler<'_>
19489{
19490 fn fence(&mut self, fm: U0, pred: U1, succ: U2, rs1: U3, rd: U4) {
19491 self.emit_n(
19492 Opcode::FENCE as i64,
19493 &[
19494 Into::<Imm>::into(fm).as_operand(),
19495 Into::<Imm>::into(pred).as_operand(),
19496 Into::<Imm>::into(succ).as_operand(),
19497 Into::<Imm>::into(rs1).as_operand(),
19498 Into::<Imm>::into(rd).as_operand(),
19499 ],
19500 );
19501 }
19502}
19503
19504impl FenceIEmitter for Assembler<'_> {
19505 fn fence_i(&mut self) {
19506 self.emit_n(Opcode::FENCEI as i64, &[]);
19507 }
19508}
19509
19510impl FenceTsoEmitter for Assembler<'_> {
19511 fn fence_tso(&mut self) {
19512 self.emit_n(Opcode::FENCETSO as i64, &[]);
19513 }
19514}
19515
19516impl FeqDEmitter<Gp, Fp, Fp> for Assembler<'_> {
19517 fn feq_d(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19518 self.emit_n(
19519 Opcode::FEQD as i64,
19520 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19521 );
19522 }
19523}
19524
19525impl FeqHEmitter<Gp, Fp, Fp> for Assembler<'_> {
19526 fn feq_h(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19527 self.emit_n(
19528 Opcode::FEQH as i64,
19529 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19530 );
19531 }
19532}
19533
19534impl FeqQEmitter<Gp, Fp, Fp> for Assembler<'_> {
19535 fn feq_q(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19536 self.emit_n(
19537 Opcode::FEQQ as i64,
19538 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19539 );
19540 }
19541}
19542
19543impl FeqSEmitter<Gp, Fp, Fp> for Assembler<'_> {
19544 fn feq_s(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19545 self.emit_n(
19546 Opcode::FEQS as i64,
19547 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19548 );
19549 }
19550}
19551
19552impl<U2: Into<Imm>> FldEmitter<Fp, Gp, U2> for Assembler<'_> {
19553 fn fld(&mut self, rd: Fp, rs1: Gp, imm: U2) {
19554 self.emit_n(
19555 Opcode::FLD as i64,
19556 &[
19557 rd.as_operand(),
19558 rs1.as_operand(),
19559 Into::<Imm>::into(imm).as_operand(),
19560 ],
19561 );
19562 }
19563}
19564
19565impl FleDEmitter<Gp, Fp, Fp> for Assembler<'_> {
19566 fn fle_d(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19567 self.emit_n(
19568 Opcode::FLED as i64,
19569 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19570 );
19571 }
19572}
19573
19574impl FleHEmitter<Gp, Fp, Fp> for Assembler<'_> {
19575 fn fle_h(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19576 self.emit_n(
19577 Opcode::FLEH as i64,
19578 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19579 );
19580 }
19581}
19582
19583impl FleQEmitter<Gp, Fp, Fp> for Assembler<'_> {
19584 fn fle_q(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19585 self.emit_n(
19586 Opcode::FLEQ as i64,
19587 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19588 );
19589 }
19590}
19591
19592impl FleSEmitter<Gp, Fp, Fp> for Assembler<'_> {
19593 fn fle_s(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19594 self.emit_n(
19595 Opcode::FLES as i64,
19596 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19597 );
19598 }
19599}
19600
19601impl FleqDEmitter<Fp, Fp, Fp> for Assembler<'_> {
19602 fn fleq_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19603 self.emit_n(
19604 Opcode::FLEQD as i64,
19605 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19606 );
19607 }
19608}
19609
19610impl FleqHEmitter<Fp, Fp, Fp> for Assembler<'_> {
19611 fn fleq_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19612 self.emit_n(
19613 Opcode::FLEQH as i64,
19614 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19615 );
19616 }
19617}
19618
19619impl FleqQEmitter<Fp, Fp, Fp> for Assembler<'_> {
19620 fn fleq_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19621 self.emit_n(
19622 Opcode::FLEQQ as i64,
19623 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19624 );
19625 }
19626}
19627
19628impl FleqSEmitter<Fp, Fp, Fp> for Assembler<'_> {
19629 fn fleq_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19630 self.emit_n(
19631 Opcode::FLEQS as i64,
19632 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19633 );
19634 }
19635}
19636
19637impl<U2: Into<Imm>> FlhEmitter<Fp, Gp, U2> for Assembler<'_> {
19638 fn flh(&mut self, rd: Fp, rs1: Gp, imm: U2) {
19639 self.emit_n(
19640 Opcode::FLH as i64,
19641 &[
19642 rd.as_operand(),
19643 rs1.as_operand(),
19644 Into::<Imm>::into(imm).as_operand(),
19645 ],
19646 );
19647 }
19648}
19649
19650impl FliDEmitter<Fp, Fp> for Assembler<'_> {
19651 fn fli_d(&mut self, rd: Fp, rs1: Fp) {
19652 self.emit_n(Opcode::FLID as i64, &[rd.as_operand(), rs1.as_operand()]);
19653 }
19654}
19655
19656impl FliHEmitter<Fp, Fp> for Assembler<'_> {
19657 fn fli_h(&mut self, rd: Fp, rs1: Fp) {
19658 self.emit_n(Opcode::FLIH as i64, &[rd.as_operand(), rs1.as_operand()]);
19659 }
19660}
19661
19662impl FliQEmitter<Fp, Fp> for Assembler<'_> {
19663 fn fli_q(&mut self, rd: Fp, rs1: Fp) {
19664 self.emit_n(Opcode::FLIQ as i64, &[rd.as_operand(), rs1.as_operand()]);
19665 }
19666}
19667
19668impl FliSEmitter<Fp, Fp> for Assembler<'_> {
19669 fn fli_s(&mut self, rd: Fp, rs1: Fp) {
19670 self.emit_n(Opcode::FLIS as i64, &[rd.as_operand(), rs1.as_operand()]);
19671 }
19672}
19673
19674impl<U2: Into<Imm>> FlqEmitter<Fp, Gp, U2> for Assembler<'_> {
19675 fn flq(&mut self, rd: Fp, rs1: Gp, imm: U2) {
19676 self.emit_n(
19677 Opcode::FLQ as i64,
19678 &[
19679 rd.as_operand(),
19680 rs1.as_operand(),
19681 Into::<Imm>::into(imm).as_operand(),
19682 ],
19683 );
19684 }
19685}
19686
19687impl FltDEmitter<Gp, Fp, Fp> for Assembler<'_> {
19688 fn flt_d(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19689 self.emit_n(
19690 Opcode::FLTD as i64,
19691 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19692 );
19693 }
19694}
19695
19696impl FltHEmitter<Gp, Fp, Fp> for Assembler<'_> {
19697 fn flt_h(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19698 self.emit_n(
19699 Opcode::FLTH as i64,
19700 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19701 );
19702 }
19703}
19704
19705impl FltQEmitter<Gp, Fp, Fp> for Assembler<'_> {
19706 fn flt_q(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19707 self.emit_n(
19708 Opcode::FLTQ as i64,
19709 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19710 );
19711 }
19712}
19713
19714impl FltSEmitter<Gp, Fp, Fp> for Assembler<'_> {
19715 fn flt_s(&mut self, rd: Gp, rs1: Fp, rs2: Fp) {
19716 self.emit_n(
19717 Opcode::FLTS as i64,
19718 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19719 );
19720 }
19721}
19722
19723impl FltqDEmitter<Fp, Fp, Fp> for Assembler<'_> {
19724 fn fltq_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19725 self.emit_n(
19726 Opcode::FLTQD as i64,
19727 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19728 );
19729 }
19730}
19731
19732impl FltqHEmitter<Fp, Fp, Fp> for Assembler<'_> {
19733 fn fltq_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19734 self.emit_n(
19735 Opcode::FLTQH as i64,
19736 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19737 );
19738 }
19739}
19740
19741impl FltqQEmitter<Fp, Fp, Fp> for Assembler<'_> {
19742 fn fltq_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19743 self.emit_n(
19744 Opcode::FLTQQ as i64,
19745 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19746 );
19747 }
19748}
19749
19750impl FltqSEmitter<Fp, Fp, Fp> for Assembler<'_> {
19751 fn fltq_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19752 self.emit_n(
19753 Opcode::FLTQS as i64,
19754 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19755 );
19756 }
19757}
19758
19759impl<U2: Into<Imm>> FlwEmitter<Fp, Gp, U2> for Assembler<'_> {
19760 fn flw(&mut self, rd: Fp, rs1: Gp, imm: U2) {
19761 self.emit_n(
19762 Opcode::FLW as i64,
19763 &[
19764 rd.as_operand(),
19765 rs1.as_operand(),
19766 Into::<Imm>::into(imm).as_operand(),
19767 ],
19768 );
19769 }
19770}
19771
19772impl<U4: Into<Imm>> FmaddDEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
19773 fn fmadd_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
19774 self.emit_n(
19775 Opcode::FMADDD as i64,
19776 &[
19777 rd.as_operand(),
19778 rs1.as_operand(),
19779 rs2.as_operand(),
19780 rs3.as_operand(),
19781 Into::<Imm>::into(rm).as_operand(),
19782 ],
19783 );
19784 }
19785}
19786
19787impl<U4: Into<Imm>> FmaddHEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
19788 fn fmadd_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
19789 self.emit_n(
19790 Opcode::FMADDH as i64,
19791 &[
19792 rd.as_operand(),
19793 rs1.as_operand(),
19794 rs2.as_operand(),
19795 rs3.as_operand(),
19796 Into::<Imm>::into(rm).as_operand(),
19797 ],
19798 );
19799 }
19800}
19801
19802impl<U4: Into<Imm>> FmaddQEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
19803 fn fmadd_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
19804 self.emit_n(
19805 Opcode::FMADDQ as i64,
19806 &[
19807 rd.as_operand(),
19808 rs1.as_operand(),
19809 rs2.as_operand(),
19810 rs3.as_operand(),
19811 Into::<Imm>::into(rm).as_operand(),
19812 ],
19813 );
19814 }
19815}
19816
19817impl<U4: Into<Imm>> FmaddSEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
19818 fn fmadd_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
19819 self.emit_n(
19820 Opcode::FMADDS as i64,
19821 &[
19822 rd.as_operand(),
19823 rs1.as_operand(),
19824 rs2.as_operand(),
19825 rs3.as_operand(),
19826 Into::<Imm>::into(rm).as_operand(),
19827 ],
19828 );
19829 }
19830}
19831
19832impl FmaxDEmitter<Fp, Fp, Fp> for Assembler<'_> {
19833 fn fmax_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19834 self.emit_n(
19835 Opcode::FMAXD as i64,
19836 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19837 );
19838 }
19839}
19840
19841impl FmaxHEmitter<Fp, Fp, Fp> for Assembler<'_> {
19842 fn fmax_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19843 self.emit_n(
19844 Opcode::FMAXH as i64,
19845 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19846 );
19847 }
19848}
19849
19850impl FmaxQEmitter<Fp, Fp, Fp> for Assembler<'_> {
19851 fn fmax_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19852 self.emit_n(
19853 Opcode::FMAXQ as i64,
19854 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19855 );
19856 }
19857}
19858
19859impl FmaxSEmitter<Fp, Fp, Fp> for Assembler<'_> {
19860 fn fmax_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19861 self.emit_n(
19862 Opcode::FMAXS as i64,
19863 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19864 );
19865 }
19866}
19867
19868impl FmaxmDEmitter<Fp, Fp, Fp> for Assembler<'_> {
19869 fn fmaxm_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19870 self.emit_n(
19871 Opcode::FMAXMD as i64,
19872 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19873 );
19874 }
19875}
19876
19877impl FmaxmHEmitter<Fp, Fp, Fp> for Assembler<'_> {
19878 fn fmaxm_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19879 self.emit_n(
19880 Opcode::FMAXMH as i64,
19881 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19882 );
19883 }
19884}
19885
19886impl FmaxmQEmitter<Fp, Fp, Fp> for Assembler<'_> {
19887 fn fmaxm_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19888 self.emit_n(
19889 Opcode::FMAXMQ as i64,
19890 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19891 );
19892 }
19893}
19894
19895impl FmaxmSEmitter<Fp, Fp, Fp> for Assembler<'_> {
19896 fn fmaxm_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19897 self.emit_n(
19898 Opcode::FMAXMS as i64,
19899 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19900 );
19901 }
19902}
19903
19904impl FminDEmitter<Fp, Fp, Fp> for Assembler<'_> {
19905 fn fmin_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19906 self.emit_n(
19907 Opcode::FMIND as i64,
19908 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19909 );
19910 }
19911}
19912
19913impl FminHEmitter<Fp, Fp, Fp> for Assembler<'_> {
19914 fn fmin_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19915 self.emit_n(
19916 Opcode::FMINH as i64,
19917 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19918 );
19919 }
19920}
19921
19922impl FminQEmitter<Fp, Fp, Fp> for Assembler<'_> {
19923 fn fmin_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19924 self.emit_n(
19925 Opcode::FMINQ as i64,
19926 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19927 );
19928 }
19929}
19930
19931impl FminSEmitter<Fp, Fp, Fp> for Assembler<'_> {
19932 fn fmin_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19933 self.emit_n(
19934 Opcode::FMINS as i64,
19935 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19936 );
19937 }
19938}
19939
19940impl FminmDEmitter<Fp, Fp, Fp> for Assembler<'_> {
19941 fn fminm_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19942 self.emit_n(
19943 Opcode::FMINMD as i64,
19944 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19945 );
19946 }
19947}
19948
19949impl FminmHEmitter<Fp, Fp, Fp> for Assembler<'_> {
19950 fn fminm_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19951 self.emit_n(
19952 Opcode::FMINMH as i64,
19953 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19954 );
19955 }
19956}
19957
19958impl FminmQEmitter<Fp, Fp, Fp> for Assembler<'_> {
19959 fn fminm_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19960 self.emit_n(
19961 Opcode::FMINMQ as i64,
19962 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19963 );
19964 }
19965}
19966
19967impl FminmSEmitter<Fp, Fp, Fp> for Assembler<'_> {
19968 fn fminm_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
19969 self.emit_n(
19970 Opcode::FMINMS as i64,
19971 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
19972 );
19973 }
19974}
19975
19976impl<U4: Into<Imm>> FmsubDEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
19977 fn fmsub_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
19978 self.emit_n(
19979 Opcode::FMSUBD as i64,
19980 &[
19981 rd.as_operand(),
19982 rs1.as_operand(),
19983 rs2.as_operand(),
19984 rs3.as_operand(),
19985 Into::<Imm>::into(rm).as_operand(),
19986 ],
19987 );
19988 }
19989}
19990
19991impl<U4: Into<Imm>> FmsubHEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
19992 fn fmsub_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
19993 self.emit_n(
19994 Opcode::FMSUBH as i64,
19995 &[
19996 rd.as_operand(),
19997 rs1.as_operand(),
19998 rs2.as_operand(),
19999 rs3.as_operand(),
20000 Into::<Imm>::into(rm).as_operand(),
20001 ],
20002 );
20003 }
20004}
20005
20006impl<U4: Into<Imm>> FmsubQEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20007 fn fmsub_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20008 self.emit_n(
20009 Opcode::FMSUBQ as i64,
20010 &[
20011 rd.as_operand(),
20012 rs1.as_operand(),
20013 rs2.as_operand(),
20014 rs3.as_operand(),
20015 Into::<Imm>::into(rm).as_operand(),
20016 ],
20017 );
20018 }
20019}
20020
20021impl<U4: Into<Imm>> FmsubSEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20022 fn fmsub_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20023 self.emit_n(
20024 Opcode::FMSUBS as i64,
20025 &[
20026 rd.as_operand(),
20027 rs1.as_operand(),
20028 rs2.as_operand(),
20029 rs3.as_operand(),
20030 Into::<Imm>::into(rm).as_operand(),
20031 ],
20032 );
20033 }
20034}
20035
20036impl<U3: Into<Imm>> FmulDEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
20037 fn fmul_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
20038 self.emit_n(
20039 Opcode::FMULD as i64,
20040 &[
20041 rd.as_operand(),
20042 rs1.as_operand(),
20043 rs2.as_operand(),
20044 Into::<Imm>::into(rm).as_operand(),
20045 ],
20046 );
20047 }
20048}
20049
20050impl<U3: Into<Imm>> FmulHEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
20051 fn fmul_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
20052 self.emit_n(
20053 Opcode::FMULH as i64,
20054 &[
20055 rd.as_operand(),
20056 rs1.as_operand(),
20057 rs2.as_operand(),
20058 Into::<Imm>::into(rm).as_operand(),
20059 ],
20060 );
20061 }
20062}
20063
20064impl<U3: Into<Imm>> FmulQEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
20065 fn fmul_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
20066 self.emit_n(
20067 Opcode::FMULQ as i64,
20068 &[
20069 rd.as_operand(),
20070 rs1.as_operand(),
20071 rs2.as_operand(),
20072 Into::<Imm>::into(rm).as_operand(),
20073 ],
20074 );
20075 }
20076}
20077
20078impl<U3: Into<Imm>> FmulSEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
20079 fn fmul_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
20080 self.emit_n(
20081 Opcode::FMULS as i64,
20082 &[
20083 rd.as_operand(),
20084 rs1.as_operand(),
20085 rs2.as_operand(),
20086 Into::<Imm>::into(rm).as_operand(),
20087 ],
20088 );
20089 }
20090}
20091
20092impl FmvDEmitter<Fp, Fp, Fp> for Assembler<'_> {
20093 fn fmv_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20094 self.emit_n(
20095 Opcode::FMVD as i64,
20096 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20097 );
20098 }
20099}
20100
20101impl FmvDXEmitter<Fp, Gp> for Assembler<'_> {
20102 fn fmv_d_x(&mut self, rd: Fp, rs1: Gp) {
20103 self.emit_n(Opcode::FMVDX as i64, &[rd.as_operand(), rs1.as_operand()]);
20104 }
20105}
20106
20107impl FmvHEmitter<Fp, Fp, Fp> for Assembler<'_> {
20108 fn fmv_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20109 self.emit_n(
20110 Opcode::FMVH as i64,
20111 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20112 );
20113 }
20114}
20115
20116impl FmvHXEmitter<Fp, Gp> for Assembler<'_> {
20117 fn fmv_h_x(&mut self, rd: Fp, rs1: Gp) {
20118 self.emit_n(Opcode::FMVHX as i64, &[rd.as_operand(), rs1.as_operand()]);
20119 }
20120}
20121
20122impl FmvQEmitter<Fp, Fp, Fp> for Assembler<'_> {
20123 fn fmv_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20124 self.emit_n(
20125 Opcode::FMVQ as i64,
20126 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20127 );
20128 }
20129}
20130
20131impl FmvSEmitter<Fp, Fp, Fp> for Assembler<'_> {
20132 fn fmv_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20133 self.emit_n(
20134 Opcode::FMVS as i64,
20135 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20136 );
20137 }
20138}
20139
20140impl FmvSXEmitter<Fp, Gp> for Assembler<'_> {
20141 fn fmv_s_x(&mut self, rd: Fp, rs1: Gp) {
20142 self.emit_n(Opcode::FMVSX as i64, &[rd.as_operand(), rs1.as_operand()]);
20143 }
20144}
20145
20146impl FmvWXEmitter<Fp, Gp> for Assembler<'_> {
20147 fn fmv_w_x(&mut self, rd: Fp, rs1: Gp) {
20148 self.emit_n(Opcode::FMVWX as i64, &[rd.as_operand(), rs1.as_operand()]);
20149 }
20150}
20151
20152impl FmvXDEmitter<Gp, Fp> for Assembler<'_> {
20153 fn fmv_x_d(&mut self, rd: Gp, rs1: Fp) {
20154 self.emit_n(Opcode::FMVXD as i64, &[rd.as_operand(), rs1.as_operand()]);
20155 }
20156}
20157
20158impl FmvXHEmitter<Gp, Fp> for Assembler<'_> {
20159 fn fmv_x_h(&mut self, rd: Gp, rs1: Fp) {
20160 self.emit_n(Opcode::FMVXH as i64, &[rd.as_operand(), rs1.as_operand()]);
20161 }
20162}
20163
20164impl FmvXSEmitter<Gp, Fp> for Assembler<'_> {
20165 fn fmv_x_s(&mut self, rd: Gp, rs1: Fp) {
20166 self.emit_n(Opcode::FMVXS as i64, &[rd.as_operand(), rs1.as_operand()]);
20167 }
20168}
20169
20170impl FmvXWEmitter<Gp, Fp> for Assembler<'_> {
20171 fn fmv_x_w(&mut self, rd: Gp, rs1: Fp) {
20172 self.emit_n(Opcode::FMVXW as i64, &[rd.as_operand(), rs1.as_operand()]);
20173 }
20174}
20175
20176impl FmvhXDEmitter<Gp, Fp> for Assembler<'_> {
20177 fn fmvh_x_d(&mut self, rd: Gp, rs1: Fp) {
20178 self.emit_n(Opcode::FMVHXD as i64, &[rd.as_operand(), rs1.as_operand()]);
20179 }
20180}
20181
20182impl FmvhXQEmitter<Gp, Fp> for Assembler<'_> {
20183 fn fmvh_x_q(&mut self, rd: Gp, rs1: Fp) {
20184 self.emit_n(Opcode::FMVHXQ as i64, &[rd.as_operand(), rs1.as_operand()]);
20185 }
20186}
20187
20188impl FmvpDXEmitter<Fp, Gp, Gp> for Assembler<'_> {
20189 fn fmvp_d_x(&mut self, rd: Fp, rs1: Gp, rs2: Gp) {
20190 self.emit_n(
20191 Opcode::FMVPDX as i64,
20192 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20193 );
20194 }
20195}
20196
20197impl FmvpQXEmitter<Fp, Gp, Gp> for Assembler<'_> {
20198 fn fmvp_q_x(&mut self, rd: Fp, rs1: Gp, rs2: Gp) {
20199 self.emit_n(
20200 Opcode::FMVPQX as i64,
20201 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20202 );
20203 }
20204}
20205
20206impl FnegDEmitter<Fp, Fp, Fp> for Assembler<'_> {
20207 fn fneg_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20208 self.emit_n(
20209 Opcode::FNEGD as i64,
20210 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20211 );
20212 }
20213}
20214
20215impl FnegHEmitter<Fp, Fp, Fp> for Assembler<'_> {
20216 fn fneg_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20217 self.emit_n(
20218 Opcode::FNEGH as i64,
20219 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20220 );
20221 }
20222}
20223
20224impl FnegQEmitter<Fp, Fp, Fp> for Assembler<'_> {
20225 fn fneg_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20226 self.emit_n(
20227 Opcode::FNEGQ as i64,
20228 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20229 );
20230 }
20231}
20232
20233impl FnegSEmitter<Fp, Fp, Fp> for Assembler<'_> {
20234 fn fneg_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20235 self.emit_n(
20236 Opcode::FNEGS as i64,
20237 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20238 );
20239 }
20240}
20241
20242impl<U4: Into<Imm>> FnmaddDEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20243 fn fnmadd_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20244 self.emit_n(
20245 Opcode::FNMADDD as i64,
20246 &[
20247 rd.as_operand(),
20248 rs1.as_operand(),
20249 rs2.as_operand(),
20250 rs3.as_operand(),
20251 Into::<Imm>::into(rm).as_operand(),
20252 ],
20253 );
20254 }
20255}
20256
20257impl<U4: Into<Imm>> FnmaddHEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20258 fn fnmadd_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20259 self.emit_n(
20260 Opcode::FNMADDH as i64,
20261 &[
20262 rd.as_operand(),
20263 rs1.as_operand(),
20264 rs2.as_operand(),
20265 rs3.as_operand(),
20266 Into::<Imm>::into(rm).as_operand(),
20267 ],
20268 );
20269 }
20270}
20271
20272impl<U4: Into<Imm>> FnmaddQEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20273 fn fnmadd_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20274 self.emit_n(
20275 Opcode::FNMADDQ as i64,
20276 &[
20277 rd.as_operand(),
20278 rs1.as_operand(),
20279 rs2.as_operand(),
20280 rs3.as_operand(),
20281 Into::<Imm>::into(rm).as_operand(),
20282 ],
20283 );
20284 }
20285}
20286
20287impl<U4: Into<Imm>> FnmaddSEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20288 fn fnmadd_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20289 self.emit_n(
20290 Opcode::FNMADDS as i64,
20291 &[
20292 rd.as_operand(),
20293 rs1.as_operand(),
20294 rs2.as_operand(),
20295 rs3.as_operand(),
20296 Into::<Imm>::into(rm).as_operand(),
20297 ],
20298 );
20299 }
20300}
20301
20302impl<U4: Into<Imm>> FnmsubDEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20303 fn fnmsub_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20304 self.emit_n(
20305 Opcode::FNMSUBD as i64,
20306 &[
20307 rd.as_operand(),
20308 rs1.as_operand(),
20309 rs2.as_operand(),
20310 rs3.as_operand(),
20311 Into::<Imm>::into(rm).as_operand(),
20312 ],
20313 );
20314 }
20315}
20316
20317impl<U4: Into<Imm>> FnmsubHEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20318 fn fnmsub_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20319 self.emit_n(
20320 Opcode::FNMSUBH as i64,
20321 &[
20322 rd.as_operand(),
20323 rs1.as_operand(),
20324 rs2.as_operand(),
20325 rs3.as_operand(),
20326 Into::<Imm>::into(rm).as_operand(),
20327 ],
20328 );
20329 }
20330}
20331
20332impl<U4: Into<Imm>> FnmsubQEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20333 fn fnmsub_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20334 self.emit_n(
20335 Opcode::FNMSUBQ as i64,
20336 &[
20337 rd.as_operand(),
20338 rs1.as_operand(),
20339 rs2.as_operand(),
20340 rs3.as_operand(),
20341 Into::<Imm>::into(rm).as_operand(),
20342 ],
20343 );
20344 }
20345}
20346
20347impl<U4: Into<Imm>> FnmsubSEmitter<Fp, Fp, Fp, Fp, U4> for Assembler<'_> {
20348 fn fnmsub_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rs3: Fp, rm: U4) {
20349 self.emit_n(
20350 Opcode::FNMSUBS as i64,
20351 &[
20352 rd.as_operand(),
20353 rs1.as_operand(),
20354 rs2.as_operand(),
20355 rs3.as_operand(),
20356 Into::<Imm>::into(rm).as_operand(),
20357 ],
20358 );
20359 }
20360}
20361
20362impl FrcsrEmitter<Gp> for Assembler<'_> {
20363 fn frcsr(&mut self, rd: Gp) {
20364 self.emit_n(Opcode::FRCSR as i64, &[rd.as_operand()]);
20365 }
20366}
20367
20368impl FrflagsEmitter<Gp> for Assembler<'_> {
20369 fn frflags(&mut self, rd: Gp) {
20370 self.emit_n(Opcode::FRFLAGS as i64, &[rd.as_operand()]);
20371 }
20372}
20373
20374impl<U2: Into<Imm>> FroundDEmitter<Fp, Fp, U2> for Assembler<'_> {
20375 fn fround_d(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20376 self.emit_n(
20377 Opcode::FROUNDD as i64,
20378 &[
20379 rd.as_operand(),
20380 rs1.as_operand(),
20381 Into::<Imm>::into(rm).as_operand(),
20382 ],
20383 );
20384 }
20385}
20386
20387impl<U2: Into<Imm>> FroundHEmitter<Fp, Fp, U2> for Assembler<'_> {
20388 fn fround_h(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20389 self.emit_n(
20390 Opcode::FROUNDH as i64,
20391 &[
20392 rd.as_operand(),
20393 rs1.as_operand(),
20394 Into::<Imm>::into(rm).as_operand(),
20395 ],
20396 );
20397 }
20398}
20399
20400impl<U2: Into<Imm>> FroundQEmitter<Fp, Fp, U2> for Assembler<'_> {
20401 fn fround_q(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20402 self.emit_n(
20403 Opcode::FROUNDQ as i64,
20404 &[
20405 rd.as_operand(),
20406 rs1.as_operand(),
20407 Into::<Imm>::into(rm).as_operand(),
20408 ],
20409 );
20410 }
20411}
20412
20413impl<U2: Into<Imm>> FroundSEmitter<Fp, Fp, U2> for Assembler<'_> {
20414 fn fround_s(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20415 self.emit_n(
20416 Opcode::FROUNDS as i64,
20417 &[
20418 rd.as_operand(),
20419 rs1.as_operand(),
20420 Into::<Imm>::into(rm).as_operand(),
20421 ],
20422 );
20423 }
20424}
20425
20426impl<U2: Into<Imm>> FroundnxDEmitter<Fp, Fp, U2> for Assembler<'_> {
20427 fn froundnx_d(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20428 self.emit_n(
20429 Opcode::FROUNDNXD as i64,
20430 &[
20431 rd.as_operand(),
20432 rs1.as_operand(),
20433 Into::<Imm>::into(rm).as_operand(),
20434 ],
20435 );
20436 }
20437}
20438
20439impl<U2: Into<Imm>> FroundnxHEmitter<Fp, Fp, U2> for Assembler<'_> {
20440 fn froundnx_h(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20441 self.emit_n(
20442 Opcode::FROUNDNXH as i64,
20443 &[
20444 rd.as_operand(),
20445 rs1.as_operand(),
20446 Into::<Imm>::into(rm).as_operand(),
20447 ],
20448 );
20449 }
20450}
20451
20452impl<U2: Into<Imm>> FroundnxQEmitter<Fp, Fp, U2> for Assembler<'_> {
20453 fn froundnx_q(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20454 self.emit_n(
20455 Opcode::FROUNDNXQ as i64,
20456 &[
20457 rd.as_operand(),
20458 rs1.as_operand(),
20459 Into::<Imm>::into(rm).as_operand(),
20460 ],
20461 );
20462 }
20463}
20464
20465impl<U2: Into<Imm>> FroundnxSEmitter<Fp, Fp, U2> for Assembler<'_> {
20466 fn froundnx_s(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20467 self.emit_n(
20468 Opcode::FROUNDNXS as i64,
20469 &[
20470 rd.as_operand(),
20471 rs1.as_operand(),
20472 Into::<Imm>::into(rm).as_operand(),
20473 ],
20474 );
20475 }
20476}
20477
20478impl FrrmEmitter<Gp> for Assembler<'_> {
20479 fn frrm(&mut self, rd: Gp) {
20480 self.emit_n(Opcode::FRRM as i64, &[rd.as_operand()]);
20481 }
20482}
20483
20484impl FscsrEmitter<Gp, Gp> for Assembler<'_> {
20485 fn fscsr(&mut self, rd: Gp, rs1: Gp) {
20486 self.emit_n(Opcode::FSCSR as i64, &[rd.as_operand(), rs1.as_operand()]);
20487 }
20488}
20489
20490impl<U2: Into<Imm>> FsdEmitter<Gp, Fp, U2> for Assembler<'_> {
20491 fn fsd(&mut self, rs1: Gp, rs2: Fp, imm: U2) {
20492 self.emit_n(
20493 Opcode::FSD as i64,
20494 &[
20495 rs1.as_operand(),
20496 rs2.as_operand(),
20497 Into::<Imm>::into(imm).as_operand(),
20498 ],
20499 );
20500 }
20501}
20502
20503impl FsflagsEmitter<Gp, Gp> for Assembler<'_> {
20504 fn fsflags(&mut self, rd: Gp, rs1: Gp) {
20505 self.emit_n(Opcode::FSFLAGS as i64, &[rd.as_operand(), rs1.as_operand()]);
20506 }
20507}
20508
20509impl<U1: Into<Imm>> FsflagsiEmitter<Gp, U1> for Assembler<'_> {
20510 fn fsflagsi(&mut self, rd: Gp, zimm5: U1) {
20511 self.emit_n(
20512 Opcode::FSFLAGSI as i64,
20513 &[rd.as_operand(), Into::<Imm>::into(zimm5).as_operand()],
20514 );
20515 }
20516}
20517
20518impl FsgnjDEmitter<Fp, Fp, Fp> for Assembler<'_> {
20519 fn fsgnj_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20520 self.emit_n(
20521 Opcode::FSGNJD as i64,
20522 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20523 );
20524 }
20525}
20526
20527impl FsgnjHEmitter<Fp, Fp, Fp> for Assembler<'_> {
20528 fn fsgnj_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20529 self.emit_n(
20530 Opcode::FSGNJH as i64,
20531 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20532 );
20533 }
20534}
20535
20536impl FsgnjQEmitter<Fp, Fp, Fp> for Assembler<'_> {
20537 fn fsgnj_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20538 self.emit_n(
20539 Opcode::FSGNJQ as i64,
20540 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20541 );
20542 }
20543}
20544
20545impl FsgnjSEmitter<Fp, Fp, Fp> for Assembler<'_> {
20546 fn fsgnj_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20547 self.emit_n(
20548 Opcode::FSGNJS as i64,
20549 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20550 );
20551 }
20552}
20553
20554impl FsgnjnDEmitter<Fp, Fp, Fp> for Assembler<'_> {
20555 fn fsgnjn_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20556 self.emit_n(
20557 Opcode::FSGNJND as i64,
20558 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20559 );
20560 }
20561}
20562
20563impl FsgnjnHEmitter<Fp, Fp, Fp> for Assembler<'_> {
20564 fn fsgnjn_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20565 self.emit_n(
20566 Opcode::FSGNJNH as i64,
20567 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20568 );
20569 }
20570}
20571
20572impl FsgnjnQEmitter<Fp, Fp, Fp> for Assembler<'_> {
20573 fn fsgnjn_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20574 self.emit_n(
20575 Opcode::FSGNJNQ as i64,
20576 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20577 );
20578 }
20579}
20580
20581impl FsgnjnSEmitter<Fp, Fp, Fp> for Assembler<'_> {
20582 fn fsgnjn_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20583 self.emit_n(
20584 Opcode::FSGNJNS as i64,
20585 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20586 );
20587 }
20588}
20589
20590impl FsgnjxDEmitter<Fp, Fp, Fp> for Assembler<'_> {
20591 fn fsgnjx_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20592 self.emit_n(
20593 Opcode::FSGNJXD as i64,
20594 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20595 );
20596 }
20597}
20598
20599impl FsgnjxHEmitter<Fp, Fp, Fp> for Assembler<'_> {
20600 fn fsgnjx_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20601 self.emit_n(
20602 Opcode::FSGNJXH as i64,
20603 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20604 );
20605 }
20606}
20607
20608impl FsgnjxQEmitter<Fp, Fp, Fp> for Assembler<'_> {
20609 fn fsgnjx_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20610 self.emit_n(
20611 Opcode::FSGNJXQ as i64,
20612 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20613 );
20614 }
20615}
20616
20617impl FsgnjxSEmitter<Fp, Fp, Fp> for Assembler<'_> {
20618 fn fsgnjx_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp) {
20619 self.emit_n(
20620 Opcode::FSGNJXS as i64,
20621 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
20622 );
20623 }
20624}
20625
20626impl<U2: Into<Imm>> FshEmitter<Gp, Fp, U2> for Assembler<'_> {
20627 fn fsh(&mut self, rs1: Gp, rs2: Fp, imm: U2) {
20628 self.emit_n(
20629 Opcode::FSH as i64,
20630 &[
20631 rs1.as_operand(),
20632 rs2.as_operand(),
20633 Into::<Imm>::into(imm).as_operand(),
20634 ],
20635 );
20636 }
20637}
20638
20639impl<U2: Into<Imm>> FsqEmitter<Gp, Fp, U2> for Assembler<'_> {
20640 fn fsq(&mut self, rs1: Gp, rs2: Fp, imm: U2) {
20641 self.emit_n(
20642 Opcode::FSQ as i64,
20643 &[
20644 rs1.as_operand(),
20645 rs2.as_operand(),
20646 Into::<Imm>::into(imm).as_operand(),
20647 ],
20648 );
20649 }
20650}
20651
20652impl<U2: Into<Imm>> FsqrtDEmitter<Fp, Fp, U2> for Assembler<'_> {
20653 fn fsqrt_d(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20654 self.emit_n(
20655 Opcode::FSQRTD as i64,
20656 &[
20657 rd.as_operand(),
20658 rs1.as_operand(),
20659 Into::<Imm>::into(rm).as_operand(),
20660 ],
20661 );
20662 }
20663}
20664
20665impl<U2: Into<Imm>> FsqrtHEmitter<Fp, Fp, U2> for Assembler<'_> {
20666 fn fsqrt_h(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20667 self.emit_n(
20668 Opcode::FSQRTH as i64,
20669 &[
20670 rd.as_operand(),
20671 rs1.as_operand(),
20672 Into::<Imm>::into(rm).as_operand(),
20673 ],
20674 );
20675 }
20676}
20677
20678impl<U2: Into<Imm>> FsqrtQEmitter<Fp, Fp, U2> for Assembler<'_> {
20679 fn fsqrt_q(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20680 self.emit_n(
20681 Opcode::FSQRTQ as i64,
20682 &[
20683 rd.as_operand(),
20684 rs1.as_operand(),
20685 Into::<Imm>::into(rm).as_operand(),
20686 ],
20687 );
20688 }
20689}
20690
20691impl<U2: Into<Imm>> FsqrtSEmitter<Fp, Fp, U2> for Assembler<'_> {
20692 fn fsqrt_s(&mut self, rd: Fp, rs1: Fp, rm: U2) {
20693 self.emit_n(
20694 Opcode::FSQRTS as i64,
20695 &[
20696 rd.as_operand(),
20697 rs1.as_operand(),
20698 Into::<Imm>::into(rm).as_operand(),
20699 ],
20700 );
20701 }
20702}
20703
20704impl FsrmEmitter<Gp, Gp> for Assembler<'_> {
20705 fn fsrm(&mut self, rd: Gp, rs1: Gp) {
20706 self.emit_n(Opcode::FSRM as i64, &[rd.as_operand(), rs1.as_operand()]);
20707 }
20708}
20709
20710impl<U1: Into<Imm>> FsrmiEmitter<Gp, U1> for Assembler<'_> {
20711 fn fsrmi(&mut self, rd: Gp, zimm5: U1) {
20712 self.emit_n(
20713 Opcode::FSRMI as i64,
20714 &[rd.as_operand(), Into::<Imm>::into(zimm5).as_operand()],
20715 );
20716 }
20717}
20718
20719impl<U3: Into<Imm>> FsubDEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
20720 fn fsub_d(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
20721 self.emit_n(
20722 Opcode::FSUBD as i64,
20723 &[
20724 rd.as_operand(),
20725 rs1.as_operand(),
20726 rs2.as_operand(),
20727 Into::<Imm>::into(rm).as_operand(),
20728 ],
20729 );
20730 }
20731}
20732
20733impl<U3: Into<Imm>> FsubHEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
20734 fn fsub_h(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
20735 self.emit_n(
20736 Opcode::FSUBH as i64,
20737 &[
20738 rd.as_operand(),
20739 rs1.as_operand(),
20740 rs2.as_operand(),
20741 Into::<Imm>::into(rm).as_operand(),
20742 ],
20743 );
20744 }
20745}
20746
20747impl<U3: Into<Imm>> FsubQEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
20748 fn fsub_q(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
20749 self.emit_n(
20750 Opcode::FSUBQ as i64,
20751 &[
20752 rd.as_operand(),
20753 rs1.as_operand(),
20754 rs2.as_operand(),
20755 Into::<Imm>::into(rm).as_operand(),
20756 ],
20757 );
20758 }
20759}
20760
20761impl<U3: Into<Imm>> FsubSEmitter<Fp, Fp, Fp, U3> for Assembler<'_> {
20762 fn fsub_s(&mut self, rd: Fp, rs1: Fp, rs2: Fp, rm: U3) {
20763 self.emit_n(
20764 Opcode::FSUBS as i64,
20765 &[
20766 rd.as_operand(),
20767 rs1.as_operand(),
20768 rs2.as_operand(),
20769 Into::<Imm>::into(rm).as_operand(),
20770 ],
20771 );
20772 }
20773}
20774
20775impl<U2: Into<Imm>> FswEmitter<Gp, Fp, U2> for Assembler<'_> {
20776 fn fsw(&mut self, rs1: Gp, rs2: Fp, imm: U2) {
20777 self.emit_n(
20778 Opcode::FSW as i64,
20779 &[
20780 rs1.as_operand(),
20781 rs2.as_operand(),
20782 Into::<Imm>::into(imm).as_operand(),
20783 ],
20784 );
20785 }
20786}
20787
20788impl HfenceGvmaEmitter<Gp, Gp> for Assembler<'_> {
20789 fn hfence_gvma(&mut self, rs1: Gp, rs2: Gp) {
20790 self.emit_n(
20791 Opcode::HFENCEGVMA as i64,
20792 &[rs1.as_operand(), rs2.as_operand()],
20793 );
20794 }
20795}
20796
20797impl HfenceVvmaEmitter<Gp, Gp> for Assembler<'_> {
20798 fn hfence_vvma(&mut self, rs1: Gp, rs2: Gp) {
20799 self.emit_n(
20800 Opcode::HFENCEVVMA as i64,
20801 &[rs1.as_operand(), rs2.as_operand()],
20802 );
20803 }
20804}
20805
20806impl HinvalGvmaEmitter<Gp, Gp> for Assembler<'_> {
20807 fn hinval_gvma(&mut self, rs1: Gp, rs2: Gp) {
20808 self.emit_n(
20809 Opcode::HINVALGVMA as i64,
20810 &[rs1.as_operand(), rs2.as_operand()],
20811 );
20812 }
20813}
20814
20815impl HinvalVvmaEmitter<Gp, Gp> for Assembler<'_> {
20816 fn hinval_vvma(&mut self, rs1: Gp, rs2: Gp) {
20817 self.emit_n(
20818 Opcode::HINVALVVMA as i64,
20819 &[rs1.as_operand(), rs2.as_operand()],
20820 );
20821 }
20822}
20823
20824impl HlvBEmitter<Gp, Gp> for Assembler<'_> {
20825 fn hlv_b(&mut self, rd: Gp, rs1: Gp) {
20826 self.emit_n(Opcode::HLVB as i64, &[rd.as_operand(), rs1.as_operand()]);
20827 }
20828}
20829
20830impl HlvBuEmitter<Gp, Gp> for Assembler<'_> {
20831 fn hlv_bu(&mut self, rd: Gp, rs1: Gp) {
20832 self.emit_n(Opcode::HLVBU as i64, &[rd.as_operand(), rs1.as_operand()]);
20833 }
20834}
20835
20836impl HlvDEmitter<Gp, Gp> for Assembler<'_> {
20837 fn hlv_d(&mut self, rd: Gp, rs1: Gp) {
20838 self.emit_n(Opcode::HLVD as i64, &[rd.as_operand(), rs1.as_operand()]);
20839 }
20840}
20841
20842impl HlvHEmitter<Gp, Gp> for Assembler<'_> {
20843 fn hlv_h(&mut self, rd: Gp, rs1: Gp) {
20844 self.emit_n(Opcode::HLVH as i64, &[rd.as_operand(), rs1.as_operand()]);
20845 }
20846}
20847
20848impl HlvHuEmitter<Gp, Gp> for Assembler<'_> {
20849 fn hlv_hu(&mut self, rd: Gp, rs1: Gp) {
20850 self.emit_n(Opcode::HLVHU as i64, &[rd.as_operand(), rs1.as_operand()]);
20851 }
20852}
20853
20854impl HlvWEmitter<Gp, Gp> for Assembler<'_> {
20855 fn hlv_w(&mut self, rd: Gp, rs1: Gp) {
20856 self.emit_n(Opcode::HLVW as i64, &[rd.as_operand(), rs1.as_operand()]);
20857 }
20858}
20859
20860impl HlvWuEmitter<Gp, Gp> for Assembler<'_> {
20861 fn hlv_wu(&mut self, rd: Gp, rs1: Gp) {
20862 self.emit_n(Opcode::HLVWU as i64, &[rd.as_operand(), rs1.as_operand()]);
20863 }
20864}
20865
20866impl HlvxHuEmitter<Gp, Gp> for Assembler<'_> {
20867 fn hlvx_hu(&mut self, rd: Gp, rs1: Gp) {
20868 self.emit_n(Opcode::HLVXHU as i64, &[rd.as_operand(), rs1.as_operand()]);
20869 }
20870}
20871
20872impl HlvxWuEmitter<Gp, Gp> for Assembler<'_> {
20873 fn hlvx_wu(&mut self, rd: Gp, rs1: Gp) {
20874 self.emit_n(Opcode::HLVXWU as i64, &[rd.as_operand(), rs1.as_operand()]);
20875 }
20876}
20877
20878impl HsvBEmitter<Gp, Gp> for Assembler<'_> {
20879 fn hsv_b(&mut self, rs1: Gp, rs2: Gp) {
20880 self.emit_n(Opcode::HSVB as i64, &[rs1.as_operand(), rs2.as_operand()]);
20881 }
20882}
20883
20884impl HsvDEmitter<Gp, Gp> for Assembler<'_> {
20885 fn hsv_d(&mut self, rs1: Gp, rs2: Gp) {
20886 self.emit_n(Opcode::HSVD as i64, &[rs1.as_operand(), rs2.as_operand()]);
20887 }
20888}
20889
20890impl HsvHEmitter<Gp, Gp> for Assembler<'_> {
20891 fn hsv_h(&mut self, rs1: Gp, rs2: Gp) {
20892 self.emit_n(Opcode::HSVH as i64, &[rs1.as_operand(), rs2.as_operand()]);
20893 }
20894}
20895
20896impl HsvWEmitter<Gp, Gp> for Assembler<'_> {
20897 fn hsv_w(&mut self, rs1: Gp, rs2: Gp) {
20898 self.emit_n(Opcode::HSVW as i64, &[rs1.as_operand(), rs2.as_operand()]);
20899 }
20900}
20901
20902impl<U0: Into<Imm>> JEmitter<U0> for Assembler<'_> {
20903 fn j(&mut self, imm: U0) {
20904 self.emit_n(Opcode::J as i64, &[Into::<Imm>::into(imm).as_operand()]);
20905 }
20906}
20907
20908impl JEmitter<Label> for Assembler<'_> {
20909 fn j(&mut self, imm: Label) {
20910 self.emit_n(Opcode::J as i64, &[imm.as_operand()]);
20911 }
20912}
20913
20914impl<U1: Into<Imm>> JalEmitter<Gp, U1> for Assembler<'_> {
20915 fn jal(&mut self, rd: Gp, imm: U1) {
20916 self.emit_n(
20917 Opcode::JAL as i64,
20918 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
20919 );
20920 }
20921}
20922
20923impl JalEmitter<Gp, Label> for Assembler<'_> {
20924 fn jal(&mut self, rd: Gp, imm: Label) {
20925 self.emit_n(Opcode::JAL as i64, &[rd.as_operand(), imm.as_operand()]);
20926 }
20927}
20928
20929impl<U0: Into<Imm>> JalPseudoEmitter<U0> for Assembler<'_> {
20930 fn jal_pseudo(&mut self, imm: U0) {
20931 self.emit_n(
20932 Opcode::JALPSEUDO as i64,
20933 &[Into::<Imm>::into(imm).as_operand()],
20934 );
20935 }
20936}
20937
20938impl JalPseudoEmitter<Label> for Assembler<'_> {
20939 fn jal_pseudo(&mut self, imm: Label) {
20940 self.emit_n(Opcode::JALPSEUDO as i64, &[imm.as_operand()]);
20941 }
20942}
20943
20944impl<U2: Into<Imm>> JalrEmitter<Gp, Gp, U2> for Assembler<'_> {
20945 fn jalr(&mut self, rd: Gp, rs1: Gp, imm: U2) {
20946 self.emit_n(
20947 Opcode::JALR as i64,
20948 &[
20949 rd.as_operand(),
20950 rs1.as_operand(),
20951 Into::<Imm>::into(imm).as_operand(),
20952 ],
20953 );
20954 }
20955}
20956
20957impl JalrPseudoEmitter<Gp> for Assembler<'_> {
20958 fn jalr_pseudo(&mut self, rs1: Gp) {
20959 self.emit_n(Opcode::JALRPSEUDO as i64, &[rs1.as_operand()]);
20960 }
20961}
20962
20963impl JrEmitter<Gp> for Assembler<'_> {
20964 fn jr(&mut self, rs1: Gp) {
20965 self.emit_n(Opcode::JR as i64, &[rs1.as_operand()]);
20966 }
20967}
20968
20969impl<U2: Into<Imm>> LbEmitter<Gp, Gp, U2> for Assembler<'_> {
20970 fn lb(&mut self, rd: Gp, rs1: Gp, imm: U2) {
20971 self.emit_n(
20972 Opcode::LB as i64,
20973 &[
20974 rd.as_operand(),
20975 rs1.as_operand(),
20976 Into::<Imm>::into(imm).as_operand(),
20977 ],
20978 );
20979 }
20980}
20981
20982impl<U2: Into<Imm>> LbuEmitter<Gp, Gp, U2> for Assembler<'_> {
20983 fn lbu(&mut self, rd: Gp, rs1: Gp, imm: U2) {
20984 self.emit_n(
20985 Opcode::LBU as i64,
20986 &[
20987 rd.as_operand(),
20988 rs1.as_operand(),
20989 Into::<Imm>::into(imm).as_operand(),
20990 ],
20991 );
20992 }
20993}
20994
20995impl<U2: Into<Imm>> LdEmitter<Gp, Gp, U2> for Assembler<'_> {
20996 fn ld(&mut self, rd: Gp, rs1: Gp, imm: U2) {
20997 self.emit_n(
20998 Opcode::LD as i64,
20999 &[
21000 rd.as_operand(),
21001 rs1.as_operand(),
21002 Into::<Imm>::into(imm).as_operand(),
21003 ],
21004 );
21005 }
21006}
21007
21008impl<U2: Into<Imm>> LhEmitter<Gp, Gp, U2> for Assembler<'_> {
21009 fn lh(&mut self, rd: Gp, rs1: Gp, imm: U2) {
21010 self.emit_n(
21011 Opcode::LH as i64,
21012 &[
21013 rd.as_operand(),
21014 rs1.as_operand(),
21015 Into::<Imm>::into(imm).as_operand(),
21016 ],
21017 );
21018 }
21019}
21020
21021impl<U2: Into<Imm>> LhuEmitter<Gp, Gp, U2> for Assembler<'_> {
21022 fn lhu(&mut self, rd: Gp, rs1: Gp, imm: U2) {
21023 self.emit_n(
21024 Opcode::LHU as i64,
21025 &[
21026 rd.as_operand(),
21027 rs1.as_operand(),
21028 Into::<Imm>::into(imm).as_operand(),
21029 ],
21030 );
21031 }
21032}
21033
21034impl<U0: Into<Imm>> LpadEmitter<U0> for Assembler<'_> {
21035 fn lpad(&mut self, imm: U0) {
21036 self.emit_n(Opcode::LPAD as i64, &[Into::<Imm>::into(imm).as_operand()]);
21037 }
21038}
21039
21040impl<U2: Into<Imm>, U3: Into<Imm>> LrDEmitter<Gp, Gp, U2, U3> for Assembler<'_> {
21041 fn lr_d(&mut self, rd: Gp, rs1: Gp, aq: U2, rl: U3) {
21042 self.emit_n(
21043 Opcode::LRD as i64,
21044 &[
21045 rd.as_operand(),
21046 rs1.as_operand(),
21047 Into::<Imm>::into(aq).as_operand(),
21048 Into::<Imm>::into(rl).as_operand(),
21049 ],
21050 );
21051 }
21052}
21053
21054impl<U2: Into<Imm>, U3: Into<Imm>> LrWEmitter<Gp, Gp, U2, U3> for Assembler<'_> {
21055 fn lr_w(&mut self, rd: Gp, rs1: Gp, aq: U2, rl: U3) {
21056 self.emit_n(
21057 Opcode::LRW as i64,
21058 &[
21059 rd.as_operand(),
21060 rs1.as_operand(),
21061 Into::<Imm>::into(aq).as_operand(),
21062 Into::<Imm>::into(rl).as_operand(),
21063 ],
21064 );
21065 }
21066}
21067
21068impl<U1: Into<Imm>> LuiEmitter<Gp, U1> for Assembler<'_> {
21069 fn lui(&mut self, rd: Gp, imm: U1) {
21070 self.emit_n(
21071 Opcode::LUI as i64,
21072 &[rd.as_operand(), Into::<Imm>::into(imm).as_operand()],
21073 );
21074 }
21075}
21076
21077impl<U2: Into<Imm>> LwEmitter<Gp, Gp, U2> for Assembler<'_> {
21078 fn lw(&mut self, rd: Gp, rs1: Gp, imm: U2) {
21079 self.emit_n(
21080 Opcode::LW as i64,
21081 &[
21082 rd.as_operand(),
21083 rs1.as_operand(),
21084 Into::<Imm>::into(imm).as_operand(),
21085 ],
21086 );
21087 }
21088}
21089
21090impl<U2: Into<Imm>> LwuEmitter<Gp, Gp, U2> for Assembler<'_> {
21091 fn lwu(&mut self, rd: Gp, rs1: Gp, imm: U2) {
21092 self.emit_n(
21093 Opcode::LWU as i64,
21094 &[
21095 rd.as_operand(),
21096 rs1.as_operand(),
21097 Into::<Imm>::into(imm).as_operand(),
21098 ],
21099 );
21100 }
21101}
21102
21103impl MaxEmitter<Gp, Gp, Gp> for Assembler<'_> {
21104 fn max(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21105 self.emit_n(
21106 Opcode::MAX as i64,
21107 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21108 );
21109 }
21110}
21111
21112impl MaxuEmitter<Gp, Gp, Gp> for Assembler<'_> {
21113 fn maxu(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21114 self.emit_n(
21115 Opcode::MAXU as i64,
21116 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21117 );
21118 }
21119}
21120
21121impl MinEmitter<Gp, Gp, Gp> for Assembler<'_> {
21122 fn min(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21123 self.emit_n(
21124 Opcode::MIN as i64,
21125 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21126 );
21127 }
21128}
21129
21130impl MinuEmitter<Gp, Gp, Gp> for Assembler<'_> {
21131 fn minu(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21132 self.emit_n(
21133 Opcode::MINU as i64,
21134 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21135 );
21136 }
21137}
21138
21139impl MnretEmitter for Assembler<'_> {
21140 fn mnret(&mut self) {
21141 self.emit_n(Opcode::MNRET as i64, &[]);
21142 }
21143}
21144
21145impl MopR0Emitter<Gp, Gp> for Assembler<'_> {
21146 fn mop_r_0(&mut self, rd: Gp, rs1: Gp) {
21147 self.emit_n(Opcode::MOPR0 as i64, &[rd.as_operand(), rs1.as_operand()]);
21148 }
21149}
21150
21151impl MopR1Emitter<Gp, Gp> for Assembler<'_> {
21152 fn mop_r_1(&mut self, rd: Gp, rs1: Gp) {
21153 self.emit_n(Opcode::MOPR1 as i64, &[rd.as_operand(), rs1.as_operand()]);
21154 }
21155}
21156
21157impl MopR10Emitter<Gp, Gp> for Assembler<'_> {
21158 fn mop_r_10(&mut self, rd: Gp, rs1: Gp) {
21159 self.emit_n(Opcode::MOPR10 as i64, &[rd.as_operand(), rs1.as_operand()]);
21160 }
21161}
21162
21163impl MopR11Emitter<Gp, Gp> for Assembler<'_> {
21164 fn mop_r_11(&mut self, rd: Gp, rs1: Gp) {
21165 self.emit_n(Opcode::MOPR11 as i64, &[rd.as_operand(), rs1.as_operand()]);
21166 }
21167}
21168
21169impl MopR12Emitter<Gp, Gp> for Assembler<'_> {
21170 fn mop_r_12(&mut self, rd: Gp, rs1: Gp) {
21171 self.emit_n(Opcode::MOPR12 as i64, &[rd.as_operand(), rs1.as_operand()]);
21172 }
21173}
21174
21175impl MopR13Emitter<Gp, Gp> for Assembler<'_> {
21176 fn mop_r_13(&mut self, rd: Gp, rs1: Gp) {
21177 self.emit_n(Opcode::MOPR13 as i64, &[rd.as_operand(), rs1.as_operand()]);
21178 }
21179}
21180
21181impl MopR14Emitter<Gp, Gp> for Assembler<'_> {
21182 fn mop_r_14(&mut self, rd: Gp, rs1: Gp) {
21183 self.emit_n(Opcode::MOPR14 as i64, &[rd.as_operand(), rs1.as_operand()]);
21184 }
21185}
21186
21187impl MopR15Emitter<Gp, Gp> for Assembler<'_> {
21188 fn mop_r_15(&mut self, rd: Gp, rs1: Gp) {
21189 self.emit_n(Opcode::MOPR15 as i64, &[rd.as_operand(), rs1.as_operand()]);
21190 }
21191}
21192
21193impl MopR16Emitter<Gp, Gp> for Assembler<'_> {
21194 fn mop_r_16(&mut self, rd: Gp, rs1: Gp) {
21195 self.emit_n(Opcode::MOPR16 as i64, &[rd.as_operand(), rs1.as_operand()]);
21196 }
21197}
21198
21199impl MopR17Emitter<Gp, Gp> for Assembler<'_> {
21200 fn mop_r_17(&mut self, rd: Gp, rs1: Gp) {
21201 self.emit_n(Opcode::MOPR17 as i64, &[rd.as_operand(), rs1.as_operand()]);
21202 }
21203}
21204
21205impl MopR18Emitter<Gp, Gp> for Assembler<'_> {
21206 fn mop_r_18(&mut self, rd: Gp, rs1: Gp) {
21207 self.emit_n(Opcode::MOPR18 as i64, &[rd.as_operand(), rs1.as_operand()]);
21208 }
21209}
21210
21211impl MopR19Emitter<Gp, Gp> for Assembler<'_> {
21212 fn mop_r_19(&mut self, rd: Gp, rs1: Gp) {
21213 self.emit_n(Opcode::MOPR19 as i64, &[rd.as_operand(), rs1.as_operand()]);
21214 }
21215}
21216
21217impl MopR2Emitter<Gp, Gp> for Assembler<'_> {
21218 fn mop_r_2(&mut self, rd: Gp, rs1: Gp) {
21219 self.emit_n(Opcode::MOPR2 as i64, &[rd.as_operand(), rs1.as_operand()]);
21220 }
21221}
21222
21223impl MopR20Emitter<Gp, Gp> for Assembler<'_> {
21224 fn mop_r_20(&mut self, rd: Gp, rs1: Gp) {
21225 self.emit_n(Opcode::MOPR20 as i64, &[rd.as_operand(), rs1.as_operand()]);
21226 }
21227}
21228
21229impl MopR21Emitter<Gp, Gp> for Assembler<'_> {
21230 fn mop_r_21(&mut self, rd: Gp, rs1: Gp) {
21231 self.emit_n(Opcode::MOPR21 as i64, &[rd.as_operand(), rs1.as_operand()]);
21232 }
21233}
21234
21235impl MopR22Emitter<Gp, Gp> for Assembler<'_> {
21236 fn mop_r_22(&mut self, rd: Gp, rs1: Gp) {
21237 self.emit_n(Opcode::MOPR22 as i64, &[rd.as_operand(), rs1.as_operand()]);
21238 }
21239}
21240
21241impl MopR23Emitter<Gp, Gp> for Assembler<'_> {
21242 fn mop_r_23(&mut self, rd: Gp, rs1: Gp) {
21243 self.emit_n(Opcode::MOPR23 as i64, &[rd.as_operand(), rs1.as_operand()]);
21244 }
21245}
21246
21247impl MopR24Emitter<Gp, Gp> for Assembler<'_> {
21248 fn mop_r_24(&mut self, rd: Gp, rs1: Gp) {
21249 self.emit_n(Opcode::MOPR24 as i64, &[rd.as_operand(), rs1.as_operand()]);
21250 }
21251}
21252
21253impl MopR25Emitter<Gp, Gp> for Assembler<'_> {
21254 fn mop_r_25(&mut self, rd: Gp, rs1: Gp) {
21255 self.emit_n(Opcode::MOPR25 as i64, &[rd.as_operand(), rs1.as_operand()]);
21256 }
21257}
21258
21259impl MopR26Emitter<Gp, Gp> for Assembler<'_> {
21260 fn mop_r_26(&mut self, rd: Gp, rs1: Gp) {
21261 self.emit_n(Opcode::MOPR26 as i64, &[rd.as_operand(), rs1.as_operand()]);
21262 }
21263}
21264
21265impl MopR27Emitter<Gp, Gp> for Assembler<'_> {
21266 fn mop_r_27(&mut self, rd: Gp, rs1: Gp) {
21267 self.emit_n(Opcode::MOPR27 as i64, &[rd.as_operand(), rs1.as_operand()]);
21268 }
21269}
21270
21271impl MopR28Emitter<Gp, Gp> for Assembler<'_> {
21272 fn mop_r_28(&mut self, rd: Gp, rs1: Gp) {
21273 self.emit_n(Opcode::MOPR28 as i64, &[rd.as_operand(), rs1.as_operand()]);
21274 }
21275}
21276
21277impl MopR29Emitter<Gp, Gp> for Assembler<'_> {
21278 fn mop_r_29(&mut self, rd: Gp, rs1: Gp) {
21279 self.emit_n(Opcode::MOPR29 as i64, &[rd.as_operand(), rs1.as_operand()]);
21280 }
21281}
21282
21283impl MopR3Emitter<Gp, Gp> for Assembler<'_> {
21284 fn mop_r_3(&mut self, rd: Gp, rs1: Gp) {
21285 self.emit_n(Opcode::MOPR3 as i64, &[rd.as_operand(), rs1.as_operand()]);
21286 }
21287}
21288
21289impl MopR30Emitter<Gp, Gp> for Assembler<'_> {
21290 fn mop_r_30(&mut self, rd: Gp, rs1: Gp) {
21291 self.emit_n(Opcode::MOPR30 as i64, &[rd.as_operand(), rs1.as_operand()]);
21292 }
21293}
21294
21295impl MopR31Emitter<Gp, Gp> for Assembler<'_> {
21296 fn mop_r_31(&mut self, rd: Gp, rs1: Gp) {
21297 self.emit_n(Opcode::MOPR31 as i64, &[rd.as_operand(), rs1.as_operand()]);
21298 }
21299}
21300
21301impl MopR4Emitter<Gp, Gp> for Assembler<'_> {
21302 fn mop_r_4(&mut self, rd: Gp, rs1: Gp) {
21303 self.emit_n(Opcode::MOPR4 as i64, &[rd.as_operand(), rs1.as_operand()]);
21304 }
21305}
21306
21307impl MopR5Emitter<Gp, Gp> for Assembler<'_> {
21308 fn mop_r_5(&mut self, rd: Gp, rs1: Gp) {
21309 self.emit_n(Opcode::MOPR5 as i64, &[rd.as_operand(), rs1.as_operand()]);
21310 }
21311}
21312
21313impl MopR6Emitter<Gp, Gp> for Assembler<'_> {
21314 fn mop_r_6(&mut self, rd: Gp, rs1: Gp) {
21315 self.emit_n(Opcode::MOPR6 as i64, &[rd.as_operand(), rs1.as_operand()]);
21316 }
21317}
21318
21319impl MopR7Emitter<Gp, Gp> for Assembler<'_> {
21320 fn mop_r_7(&mut self, rd: Gp, rs1: Gp) {
21321 self.emit_n(Opcode::MOPR7 as i64, &[rd.as_operand(), rs1.as_operand()]);
21322 }
21323}
21324
21325impl MopR8Emitter<Gp, Gp> for Assembler<'_> {
21326 fn mop_r_8(&mut self, rd: Gp, rs1: Gp) {
21327 self.emit_n(Opcode::MOPR8 as i64, &[rd.as_operand(), rs1.as_operand()]);
21328 }
21329}
21330
21331impl MopR9Emitter<Gp, Gp> for Assembler<'_> {
21332 fn mop_r_9(&mut self, rd: Gp, rs1: Gp) {
21333 self.emit_n(Opcode::MOPR9 as i64, &[rd.as_operand(), rs1.as_operand()]);
21334 }
21335}
21336
21337impl MopRr0Emitter<Gp, Gp, Gp> for Assembler<'_> {
21338 fn mop_rr_0(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21339 self.emit_n(
21340 Opcode::MOPRR0 as i64,
21341 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21342 );
21343 }
21344}
21345
21346impl MopRr1Emitter<Gp, Gp, Gp> for Assembler<'_> {
21347 fn mop_rr_1(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21348 self.emit_n(
21349 Opcode::MOPRR1 as i64,
21350 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21351 );
21352 }
21353}
21354
21355impl MopRr2Emitter<Gp, Gp, Gp> for Assembler<'_> {
21356 fn mop_rr_2(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21357 self.emit_n(
21358 Opcode::MOPRR2 as i64,
21359 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21360 );
21361 }
21362}
21363
21364impl MopRr3Emitter<Gp, Gp, Gp> for Assembler<'_> {
21365 fn mop_rr_3(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21366 self.emit_n(
21367 Opcode::MOPRR3 as i64,
21368 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21369 );
21370 }
21371}
21372
21373impl MopRr4Emitter<Gp, Gp, Gp> for Assembler<'_> {
21374 fn mop_rr_4(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21375 self.emit_n(
21376 Opcode::MOPRR4 as i64,
21377 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21378 );
21379 }
21380}
21381
21382impl MopRr5Emitter<Gp, Gp, Gp> for Assembler<'_> {
21383 fn mop_rr_5(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21384 self.emit_n(
21385 Opcode::MOPRR5 as i64,
21386 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21387 );
21388 }
21389}
21390
21391impl MopRr6Emitter<Gp, Gp, Gp> for Assembler<'_> {
21392 fn mop_rr_6(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21393 self.emit_n(
21394 Opcode::MOPRR6 as i64,
21395 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21396 );
21397 }
21398}
21399
21400impl MopRr7Emitter<Gp, Gp, Gp> for Assembler<'_> {
21401 fn mop_rr_7(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21402 self.emit_n(
21403 Opcode::MOPRR7 as i64,
21404 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21405 );
21406 }
21407}
21408
21409impl MretEmitter for Assembler<'_> {
21410 fn mret(&mut self) {
21411 self.emit_n(Opcode::MRET as i64, &[]);
21412 }
21413}
21414
21415impl MulEmitter<Gp, Gp, Gp> for Assembler<'_> {
21416 fn mul(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21417 self.emit_n(
21418 Opcode::MUL as i64,
21419 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21420 );
21421 }
21422}
21423
21424impl MulhEmitter<Gp, Gp, Gp> for Assembler<'_> {
21425 fn mulh(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21426 self.emit_n(
21427 Opcode::MULH as i64,
21428 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21429 );
21430 }
21431}
21432
21433impl MulhsuEmitter<Gp, Gp, Gp> for Assembler<'_> {
21434 fn mulhsu(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21435 self.emit_n(
21436 Opcode::MULHSU as i64,
21437 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21438 );
21439 }
21440}
21441
21442impl MulhuEmitter<Gp, Gp, Gp> for Assembler<'_> {
21443 fn mulhu(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21444 self.emit_n(
21445 Opcode::MULHU as i64,
21446 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21447 );
21448 }
21449}
21450
21451impl MulwEmitter<Gp, Gp, Gp> for Assembler<'_> {
21452 fn mulw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21453 self.emit_n(
21454 Opcode::MULW as i64,
21455 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21456 );
21457 }
21458}
21459
21460impl MvEmitter<Gp, Gp> for Assembler<'_> {
21461 fn mv(&mut self, rd: Gp, rs1: Gp) {
21462 self.emit_n(Opcode::MV as i64, &[rd.as_operand(), rs1.as_operand()]);
21463 }
21464}
21465
21466impl NegEmitter<Gp, Gp> for Assembler<'_> {
21467 fn neg(&mut self, rd: Gp, rs1: Gp) {
21468 self.emit_n(Opcode::NEG as i64, &[rd.as_operand(), rs1.as_operand()]);
21469 }
21470}
21471
21472impl NopEmitter for Assembler<'_> {
21473 fn nop(&mut self) {
21474 self.emit_n(Opcode::NOP as i64, &[]);
21475 }
21476}
21477
21478impl NtlAllEmitter for Assembler<'_> {
21479 fn ntl_all(&mut self) {
21480 self.emit_n(Opcode::NTLALL as i64, &[]);
21481 }
21482}
21483
21484impl NtlP1Emitter for Assembler<'_> {
21485 fn ntl_p1(&mut self) {
21486 self.emit_n(Opcode::NTLP1 as i64, &[]);
21487 }
21488}
21489
21490impl NtlPallEmitter for Assembler<'_> {
21491 fn ntl_pall(&mut self) {
21492 self.emit_n(Opcode::NTLPALL as i64, &[]);
21493 }
21494}
21495
21496impl NtlS1Emitter for Assembler<'_> {
21497 fn ntl_s1(&mut self) {
21498 self.emit_n(Opcode::NTLS1 as i64, &[]);
21499 }
21500}
21501
21502impl OrEmitter<Gp, Gp, Gp> for Assembler<'_> {
21503 fn or(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21504 self.emit_n(
21505 Opcode::OR as i64,
21506 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21507 );
21508 }
21509}
21510
21511impl OrcBEmitter<Gp, Gp> for Assembler<'_> {
21512 fn orc_b(&mut self, rd: Gp, rs1: Gp) {
21513 self.emit_n(Opcode::ORCB as i64, &[rd.as_operand(), rs1.as_operand()]);
21514 }
21515}
21516
21517impl<U2: Into<Imm>> OriEmitter<Gp, Gp, U2> for Assembler<'_> {
21518 fn ori(&mut self, rd: Gp, rs1: Gp, imm: U2) {
21519 self.emit_n(
21520 Opcode::ORI as i64,
21521 &[
21522 rd.as_operand(),
21523 rs1.as_operand(),
21524 Into::<Imm>::into(imm).as_operand(),
21525 ],
21526 );
21527 }
21528}
21529
21530impl OrnEmitter<Gp, Gp, Gp> for Assembler<'_> {
21531 fn orn(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21532 self.emit_n(
21533 Opcode::ORN as i64,
21534 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21535 );
21536 }
21537}
21538
21539impl PackEmitter<Gp, Gp, Gp> for Assembler<'_> {
21540 fn pack(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21541 self.emit_n(
21542 Opcode::PACK as i64,
21543 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21544 );
21545 }
21546}
21547
21548impl PackhEmitter<Gp, Gp, Gp> for Assembler<'_> {
21549 fn packh(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21550 self.emit_n(
21551 Opcode::PACKH as i64,
21552 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21553 );
21554 }
21555}
21556
21557impl PackwEmitter<Gp, Gp, Gp> for Assembler<'_> {
21558 fn packw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21559 self.emit_n(
21560 Opcode::PACKW as i64,
21561 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21562 );
21563 }
21564}
21565
21566impl PauseEmitter for Assembler<'_> {
21567 fn pause(&mut self) {
21568 self.emit_n(Opcode::PAUSE as i64, &[]);
21569 }
21570}
21571
21572impl<U1: Into<Imm>> PrefetchIEmitter<Gp, U1> for Assembler<'_> {
21573 fn prefetch_i(&mut self, rs1: Gp, imm: U1) {
21574 self.emit_n(
21575 Opcode::PREFETCHI as i64,
21576 &[rs1.as_operand(), Into::<Imm>::into(imm).as_operand()],
21577 );
21578 }
21579}
21580
21581impl<U1: Into<Imm>> PrefetchREmitter<Gp, U1> for Assembler<'_> {
21582 fn prefetch_r(&mut self, rs1: Gp, imm: U1) {
21583 self.emit_n(
21584 Opcode::PREFETCHR as i64,
21585 &[rs1.as_operand(), Into::<Imm>::into(imm).as_operand()],
21586 );
21587 }
21588}
21589
21590impl<U1: Into<Imm>> PrefetchWEmitter<Gp, U1> for Assembler<'_> {
21591 fn prefetch_w(&mut self, rs1: Gp, imm: U1) {
21592 self.emit_n(
21593 Opcode::PREFETCHW as i64,
21594 &[rs1.as_operand(), Into::<Imm>::into(imm).as_operand()],
21595 );
21596 }
21597}
21598
21599impl RdcycleEmitter<Gp> for Assembler<'_> {
21600 fn rdcycle(&mut self, rd: Gp) {
21601 self.emit_n(Opcode::RDCYCLE as i64, &[rd.as_operand()]);
21602 }
21603}
21604
21605impl RdcyclehEmitter<Gp> for Assembler<'_> {
21606 fn rdcycleh(&mut self, rd: Gp) {
21607 self.emit_n(Opcode::RDCYCLEH as i64, &[rd.as_operand()]);
21608 }
21609}
21610
21611impl RdinstretEmitter<Gp> for Assembler<'_> {
21612 fn rdinstret(&mut self, rd: Gp) {
21613 self.emit_n(Opcode::RDINSTRET as i64, &[rd.as_operand()]);
21614 }
21615}
21616
21617impl RdinstrethEmitter<Gp> for Assembler<'_> {
21618 fn rdinstreth(&mut self, rd: Gp) {
21619 self.emit_n(Opcode::RDINSTRETH as i64, &[rd.as_operand()]);
21620 }
21621}
21622
21623impl RdtimeEmitter<Gp> for Assembler<'_> {
21624 fn rdtime(&mut self, rd: Gp) {
21625 self.emit_n(Opcode::RDTIME as i64, &[rd.as_operand()]);
21626 }
21627}
21628
21629impl RdtimehEmitter<Gp> for Assembler<'_> {
21630 fn rdtimeh(&mut self, rd: Gp) {
21631 self.emit_n(Opcode::RDTIMEH as i64, &[rd.as_operand()]);
21632 }
21633}
21634
21635impl RemEmitter<Gp, Gp, Gp> for Assembler<'_> {
21636 fn rem(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21637 self.emit_n(
21638 Opcode::REM as i64,
21639 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21640 );
21641 }
21642}
21643
21644impl RemuEmitter<Gp, Gp, Gp> for Assembler<'_> {
21645 fn remu(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21646 self.emit_n(
21647 Opcode::REMU as i64,
21648 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21649 );
21650 }
21651}
21652
21653impl RemuwEmitter<Gp, Gp, Gp> for Assembler<'_> {
21654 fn remuw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21655 self.emit_n(
21656 Opcode::REMUW as i64,
21657 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21658 );
21659 }
21660}
21661
21662impl RemwEmitter<Gp, Gp, Gp> for Assembler<'_> {
21663 fn remw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21664 self.emit_n(
21665 Opcode::REMW as i64,
21666 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21667 );
21668 }
21669}
21670
21671impl RetEmitter for Assembler<'_> {
21672 fn ret(&mut self) {
21673 self.emit_n(Opcode::RET as i64, &[]);
21674 }
21675}
21676
21677impl Rev8Emitter<Gp, Gp> for Assembler<'_> {
21678 fn rev8(&mut self, rd: Gp, rs1: Gp) {
21679 self.emit_n(Opcode::REV8 as i64, &[rd.as_operand(), rs1.as_operand()]);
21680 }
21681}
21682
21683impl Rev8Rv32Emitter<Gp, Gp> for Assembler<'_> {
21684 fn rev8_rv32(&mut self, rd: Gp, rs1: Gp) {
21685 self.emit_n(
21686 Opcode::REV8RV32 as i64,
21687 &[rd.as_operand(), rs1.as_operand()],
21688 );
21689 }
21690}
21691
21692impl RolEmitter<Gp, Gp, Gp> for Assembler<'_> {
21693 fn rol(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21694 self.emit_n(
21695 Opcode::ROL as i64,
21696 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21697 );
21698 }
21699}
21700
21701impl RolwEmitter<Gp, Gp, Gp> for Assembler<'_> {
21702 fn rolw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21703 self.emit_n(
21704 Opcode::ROLW as i64,
21705 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21706 );
21707 }
21708}
21709
21710impl RorEmitter<Gp, Gp, Gp> for Assembler<'_> {
21711 fn ror(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21712 self.emit_n(
21713 Opcode::ROR as i64,
21714 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21715 );
21716 }
21717}
21718
21719impl<U2: Into<Imm>> RoriEmitter<Gp, Gp, U2> for Assembler<'_> {
21720 fn rori(&mut self, rd: Gp, rs1: Gp, shamtd: U2) {
21721 self.emit_n(
21722 Opcode::RORI as i64,
21723 &[
21724 rd.as_operand(),
21725 rs1.as_operand(),
21726 Into::<Imm>::into(shamtd).as_operand(),
21727 ],
21728 );
21729 }
21730}
21731
21732impl<U2: Into<Imm>> RoriRv32Emitter<Gp, Gp, U2> for Assembler<'_> {
21733 fn rori_rv32(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
21734 self.emit_n(
21735 Opcode::RORIRV32 as i64,
21736 &[
21737 rd.as_operand(),
21738 rs1.as_operand(),
21739 Into::<Imm>::into(shamtw).as_operand(),
21740 ],
21741 );
21742 }
21743}
21744
21745impl<U2: Into<Imm>> RoriwEmitter<Gp, Gp, U2> for Assembler<'_> {
21746 fn roriw(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
21747 self.emit_n(
21748 Opcode::RORIW as i64,
21749 &[
21750 rd.as_operand(),
21751 rs1.as_operand(),
21752 Into::<Imm>::into(shamtw).as_operand(),
21753 ],
21754 );
21755 }
21756}
21757
21758impl RorwEmitter<Gp, Gp, Gp> for Assembler<'_> {
21759 fn rorw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21760 self.emit_n(
21761 Opcode::RORW as i64,
21762 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21763 );
21764 }
21765}
21766
21767impl<U2: Into<Imm>> SbEmitter<Gp, Gp, U2> for Assembler<'_> {
21768 fn sb(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
21769 self.emit_n(
21770 Opcode::SB as i64,
21771 &[
21772 rs1.as_operand(),
21773 rs2.as_operand(),
21774 Into::<Imm>::into(imm).as_operand(),
21775 ],
21776 );
21777 }
21778}
21779
21780impl SbreakEmitter for Assembler<'_> {
21781 fn sbreak(&mut self) {
21782 self.emit_n(Opcode::SBREAK as i64, &[]);
21783 }
21784}
21785
21786impl<U3: Into<Imm>, U4: Into<Imm>> ScDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
21787 fn sc_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
21788 self.emit_n(
21789 Opcode::SCD as i64,
21790 &[
21791 rd.as_operand(),
21792 rs1.as_operand(),
21793 rs2.as_operand(),
21794 Into::<Imm>::into(aq).as_operand(),
21795 Into::<Imm>::into(rl).as_operand(),
21796 ],
21797 );
21798 }
21799}
21800
21801impl<U3: Into<Imm>, U4: Into<Imm>> ScWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
21802 fn sc_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
21803 self.emit_n(
21804 Opcode::SCW as i64,
21805 &[
21806 rd.as_operand(),
21807 rs1.as_operand(),
21808 rs2.as_operand(),
21809 Into::<Imm>::into(aq).as_operand(),
21810 Into::<Imm>::into(rl).as_operand(),
21811 ],
21812 );
21813 }
21814}
21815
21816impl ScallEmitter for Assembler<'_> {
21817 fn scall(&mut self) {
21818 self.emit_n(Opcode::SCALL as i64, &[]);
21819 }
21820}
21821
21822impl SctrclrEmitter for Assembler<'_> {
21823 fn sctrclr(&mut self) {
21824 self.emit_n(Opcode::SCTRCLR as i64, &[]);
21825 }
21826}
21827
21828impl<U2: Into<Imm>> SdEmitter<Gp, Gp, U2> for Assembler<'_> {
21829 fn sd(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
21830 self.emit_n(
21831 Opcode::SD as i64,
21832 &[
21833 rs1.as_operand(),
21834 rs2.as_operand(),
21835 Into::<Imm>::into(imm).as_operand(),
21836 ],
21837 );
21838 }
21839}
21840
21841impl SeqzEmitter<Gp, Gp> for Assembler<'_> {
21842 fn seqz(&mut self, rd: Gp, rs1: Gp) {
21843 self.emit_n(Opcode::SEQZ as i64, &[rd.as_operand(), rs1.as_operand()]);
21844 }
21845}
21846
21847impl SextBEmitter<Gp, Gp> for Assembler<'_> {
21848 fn sext_b(&mut self, rd: Gp, rs1: Gp) {
21849 self.emit_n(Opcode::SEXTB as i64, &[rd.as_operand(), rs1.as_operand()]);
21850 }
21851}
21852
21853impl SextHEmitter<Gp, Gp> for Assembler<'_> {
21854 fn sext_h(&mut self, rd: Gp, rs1: Gp) {
21855 self.emit_n(Opcode::SEXTH as i64, &[rd.as_operand(), rs1.as_operand()]);
21856 }
21857}
21858
21859impl SextWEmitter<Gp, Gp> for Assembler<'_> {
21860 fn sext_w(&mut self, rd: Gp, rs1: Gp) {
21861 self.emit_n(Opcode::SEXTW as i64, &[rd.as_operand(), rs1.as_operand()]);
21862 }
21863}
21864
21865impl SfenceInvalIrEmitter for Assembler<'_> {
21866 fn sfence_inval_ir(&mut self) {
21867 self.emit_n(Opcode::SFENCEINVALIR as i64, &[]);
21868 }
21869}
21870
21871impl SfenceVmaEmitter<Gp, Gp> for Assembler<'_> {
21872 fn sfence_vma(&mut self, rs1: Gp, rs2: Gp) {
21873 self.emit_n(
21874 Opcode::SFENCEVMA as i64,
21875 &[rs1.as_operand(), rs2.as_operand()],
21876 );
21877 }
21878}
21879
21880impl SfenceWInvalEmitter for Assembler<'_> {
21881 fn sfence_w_inval(&mut self) {
21882 self.emit_n(Opcode::SFENCEWINVAL as i64, &[]);
21883 }
21884}
21885
21886impl SgtzEmitter<Gp, Gp> for Assembler<'_> {
21887 fn sgtz(&mut self, rd: Gp, rs2: Gp) {
21888 self.emit_n(Opcode::SGTZ as i64, &[rd.as_operand(), rs2.as_operand()]);
21889 }
21890}
21891
21892impl<U2: Into<Imm>> ShEmitter<Gp, Gp, U2> for Assembler<'_> {
21893 fn sh(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
21894 self.emit_n(
21895 Opcode::SH as i64,
21896 &[
21897 rs1.as_operand(),
21898 rs2.as_operand(),
21899 Into::<Imm>::into(imm).as_operand(),
21900 ],
21901 );
21902 }
21903}
21904
21905impl Sh1AddEmitter<Gp, Gp, Gp> for Assembler<'_> {
21906 fn sh1add(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21907 self.emit_n(
21908 Opcode::SH1ADD as i64,
21909 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21910 );
21911 }
21912}
21913
21914impl Sh1AddUwEmitter<Gp, Gp, Gp> for Assembler<'_> {
21915 fn sh1add_uw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21916 self.emit_n(
21917 Opcode::SH1ADDUW as i64,
21918 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21919 );
21920 }
21921}
21922
21923impl Sh2AddEmitter<Gp, Gp, Gp> for Assembler<'_> {
21924 fn sh2add(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21925 self.emit_n(
21926 Opcode::SH2ADD as i64,
21927 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21928 );
21929 }
21930}
21931
21932impl Sh2AddUwEmitter<Gp, Gp, Gp> for Assembler<'_> {
21933 fn sh2add_uw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21934 self.emit_n(
21935 Opcode::SH2ADDUW as i64,
21936 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21937 );
21938 }
21939}
21940
21941impl Sh3AddEmitter<Gp, Gp, Gp> for Assembler<'_> {
21942 fn sh3add(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21943 self.emit_n(
21944 Opcode::SH3ADD as i64,
21945 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21946 );
21947 }
21948}
21949
21950impl Sh3AddUwEmitter<Gp, Gp, Gp> for Assembler<'_> {
21951 fn sh3add_uw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
21952 self.emit_n(
21953 Opcode::SH3ADDUW as i64,
21954 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
21955 );
21956 }
21957}
21958
21959impl Sha256Sig0Emitter<Gp, Gp> for Assembler<'_> {
21960 fn sha256sig0(&mut self, rd: Gp, rs1: Gp) {
21961 self.emit_n(
21962 Opcode::SHA256SIG0 as i64,
21963 &[rd.as_operand(), rs1.as_operand()],
21964 );
21965 }
21966}
21967
21968impl Sha256Sig1Emitter<Gp, Gp> for Assembler<'_> {
21969 fn sha256sig1(&mut self, rd: Gp, rs1: Gp) {
21970 self.emit_n(
21971 Opcode::SHA256SIG1 as i64,
21972 &[rd.as_operand(), rs1.as_operand()],
21973 );
21974 }
21975}
21976
21977impl Sha256Sum0Emitter<Gp, Gp> for Assembler<'_> {
21978 fn sha256sum0(&mut self, rd: Gp, rs1: Gp) {
21979 self.emit_n(
21980 Opcode::SHA256SUM0 as i64,
21981 &[rd.as_operand(), rs1.as_operand()],
21982 );
21983 }
21984}
21985
21986impl Sha256Sum1Emitter<Gp, Gp> for Assembler<'_> {
21987 fn sha256sum1(&mut self, rd: Gp, rs1: Gp) {
21988 self.emit_n(
21989 Opcode::SHA256SUM1 as i64,
21990 &[rd.as_operand(), rs1.as_operand()],
21991 );
21992 }
21993}
21994
21995impl Sha512Sig0Emitter<Gp, Gp> for Assembler<'_> {
21996 fn sha512sig0(&mut self, rd: Gp, rs1: Gp) {
21997 self.emit_n(
21998 Opcode::SHA512SIG0 as i64,
21999 &[rd.as_operand(), rs1.as_operand()],
22000 );
22001 }
22002}
22003
22004impl Sha512Sig0HEmitter<Gp, Gp, Gp> for Assembler<'_> {
22005 fn sha512sig0h(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22006 self.emit_n(
22007 Opcode::SHA512SIG0H as i64,
22008 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22009 );
22010 }
22011}
22012
22013impl Sha512Sig0LEmitter<Gp, Gp, Gp> for Assembler<'_> {
22014 fn sha512sig0l(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22015 self.emit_n(
22016 Opcode::SHA512SIG0L as i64,
22017 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22018 );
22019 }
22020}
22021
22022impl Sha512Sig1Emitter<Gp, Gp> for Assembler<'_> {
22023 fn sha512sig1(&mut self, rd: Gp, rs1: Gp) {
22024 self.emit_n(
22025 Opcode::SHA512SIG1 as i64,
22026 &[rd.as_operand(), rs1.as_operand()],
22027 );
22028 }
22029}
22030
22031impl Sha512Sig1HEmitter<Gp, Gp, Gp> for Assembler<'_> {
22032 fn sha512sig1h(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22033 self.emit_n(
22034 Opcode::SHA512SIG1H as i64,
22035 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22036 );
22037 }
22038}
22039
22040impl Sha512Sig1LEmitter<Gp, Gp, Gp> for Assembler<'_> {
22041 fn sha512sig1l(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22042 self.emit_n(
22043 Opcode::SHA512SIG1L as i64,
22044 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22045 );
22046 }
22047}
22048
22049impl Sha512Sum0Emitter<Gp, Gp> for Assembler<'_> {
22050 fn sha512sum0(&mut self, rd: Gp, rs1: Gp) {
22051 self.emit_n(
22052 Opcode::SHA512SUM0 as i64,
22053 &[rd.as_operand(), rs1.as_operand()],
22054 );
22055 }
22056}
22057
22058impl Sha512Sum0REmitter<Gp, Gp, Gp> for Assembler<'_> {
22059 fn sha512sum0r(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22060 self.emit_n(
22061 Opcode::SHA512SUM0R as i64,
22062 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22063 );
22064 }
22065}
22066
22067impl Sha512Sum1Emitter<Gp, Gp> for Assembler<'_> {
22068 fn sha512sum1(&mut self, rd: Gp, rs1: Gp) {
22069 self.emit_n(
22070 Opcode::SHA512SUM1 as i64,
22071 &[rd.as_operand(), rs1.as_operand()],
22072 );
22073 }
22074}
22075
22076impl Sha512Sum1REmitter<Gp, Gp, Gp> for Assembler<'_> {
22077 fn sha512sum1r(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22078 self.emit_n(
22079 Opcode::SHA512SUM1R as i64,
22080 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22081 );
22082 }
22083}
22084
22085impl SinvalVmaEmitter<Gp, Gp> for Assembler<'_> {
22086 fn sinval_vma(&mut self, rs1: Gp, rs2: Gp) {
22087 self.emit_n(
22088 Opcode::SINVALVMA as i64,
22089 &[rs1.as_operand(), rs2.as_operand()],
22090 );
22091 }
22092}
22093
22094impl SllEmitter<Gp, Gp, Gp> for Assembler<'_> {
22095 fn sll(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22096 self.emit_n(
22097 Opcode::SLL as i64,
22098 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22099 );
22100 }
22101}
22102
22103impl<U2: Into<Imm>> SlliEmitter<Gp, Gp, U2> for Assembler<'_> {
22104 fn slli(&mut self, rd: Gp, rs1: Gp, shamtd: U2) {
22105 self.emit_n(
22106 Opcode::SLLI as i64,
22107 &[
22108 rd.as_operand(),
22109 rs1.as_operand(),
22110 Into::<Imm>::into(shamtd).as_operand(),
22111 ],
22112 );
22113 }
22114}
22115
22116impl<U2: Into<Imm>> SlliRv32Emitter<Gp, Gp, U2> for Assembler<'_> {
22117 fn slli_rv32(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
22118 self.emit_n(
22119 Opcode::SLLIRV32 as i64,
22120 &[
22121 rd.as_operand(),
22122 rs1.as_operand(),
22123 Into::<Imm>::into(shamtw).as_operand(),
22124 ],
22125 );
22126 }
22127}
22128
22129impl<U2: Into<Imm>> SlliUwEmitter<Gp, Gp, U2> for Assembler<'_> {
22130 fn slli_uw(&mut self, rd: Gp, rs1: Gp, shamtd: U2) {
22131 self.emit_n(
22132 Opcode::SLLIUW as i64,
22133 &[
22134 rd.as_operand(),
22135 rs1.as_operand(),
22136 Into::<Imm>::into(shamtd).as_operand(),
22137 ],
22138 );
22139 }
22140}
22141
22142impl<U2: Into<Imm>> SlliwEmitter<Gp, Gp, U2> for Assembler<'_> {
22143 fn slliw(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
22144 self.emit_n(
22145 Opcode::SLLIW as i64,
22146 &[
22147 rd.as_operand(),
22148 rs1.as_operand(),
22149 Into::<Imm>::into(shamtw).as_operand(),
22150 ],
22151 );
22152 }
22153}
22154
22155impl SllwEmitter<Gp, Gp, Gp> for Assembler<'_> {
22156 fn sllw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22157 self.emit_n(
22158 Opcode::SLLW as i64,
22159 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22160 );
22161 }
22162}
22163
22164impl SltEmitter<Gp, Gp, Gp> for Assembler<'_> {
22165 fn slt(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22166 self.emit_n(
22167 Opcode::SLT as i64,
22168 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22169 );
22170 }
22171}
22172
22173impl<U2: Into<Imm>> SltiEmitter<Gp, Gp, U2> for Assembler<'_> {
22174 fn slti(&mut self, rd: Gp, rs1: Gp, imm: U2) {
22175 self.emit_n(
22176 Opcode::SLTI as i64,
22177 &[
22178 rd.as_operand(),
22179 rs1.as_operand(),
22180 Into::<Imm>::into(imm).as_operand(),
22181 ],
22182 );
22183 }
22184}
22185
22186impl<U2: Into<Imm>> SltiuEmitter<Gp, Gp, U2> for Assembler<'_> {
22187 fn sltiu(&mut self, rd: Gp, rs1: Gp, imm: U2) {
22188 self.emit_n(
22189 Opcode::SLTIU as i64,
22190 &[
22191 rd.as_operand(),
22192 rs1.as_operand(),
22193 Into::<Imm>::into(imm).as_operand(),
22194 ],
22195 );
22196 }
22197}
22198
22199impl SltuEmitter<Gp, Gp, Gp> for Assembler<'_> {
22200 fn sltu(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22201 self.emit_n(
22202 Opcode::SLTU as i64,
22203 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22204 );
22205 }
22206}
22207
22208impl SltzEmitter<Gp, Gp> for Assembler<'_> {
22209 fn sltz(&mut self, rd: Gp, rs1: Gp) {
22210 self.emit_n(Opcode::SLTZ as i64, &[rd.as_operand(), rs1.as_operand()]);
22211 }
22212}
22213
22214impl Sm3P0Emitter<Gp, Gp> for Assembler<'_> {
22215 fn sm3p0(&mut self, rd: Gp, rs1: Gp) {
22216 self.emit_n(Opcode::SM3P0 as i64, &[rd.as_operand(), rs1.as_operand()]);
22217 }
22218}
22219
22220impl Sm3P1Emitter<Gp, Gp> for Assembler<'_> {
22221 fn sm3p1(&mut self, rd: Gp, rs1: Gp) {
22222 self.emit_n(Opcode::SM3P1 as i64, &[rd.as_operand(), rs1.as_operand()]);
22223 }
22224}
22225
22226impl<U3: Into<Imm>> Sm4EdEmitter<Gp, Gp, Gp, U3> for Assembler<'_> {
22227 fn sm4ed(&mut self, rd: Gp, rs1: Gp, rs2: Gp, bs: U3) {
22228 self.emit_n(
22229 Opcode::SM4ED as i64,
22230 &[
22231 rd.as_operand(),
22232 rs1.as_operand(),
22233 rs2.as_operand(),
22234 Into::<Imm>::into(bs).as_operand(),
22235 ],
22236 );
22237 }
22238}
22239
22240impl<U3: Into<Imm>> Sm4KsEmitter<Gp, Gp, Gp, U3> for Assembler<'_> {
22241 fn sm4ks(&mut self, rd: Gp, rs1: Gp, rs2: Gp, bs: U3) {
22242 self.emit_n(
22243 Opcode::SM4KS as i64,
22244 &[
22245 rd.as_operand(),
22246 rs1.as_operand(),
22247 rs2.as_operand(),
22248 Into::<Imm>::into(bs).as_operand(),
22249 ],
22250 );
22251 }
22252}
22253
22254impl SnezEmitter<Gp, Gp> for Assembler<'_> {
22255 fn snez(&mut self, rd: Gp, rs2: Gp) {
22256 self.emit_n(Opcode::SNEZ as i64, &[rd.as_operand(), rs2.as_operand()]);
22257 }
22258}
22259
22260impl SraEmitter<Gp, Gp, Gp> for Assembler<'_> {
22261 fn sra(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22262 self.emit_n(
22263 Opcode::SRA as i64,
22264 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22265 );
22266 }
22267}
22268
22269impl<U2: Into<Imm>> SraiEmitter<Gp, Gp, U2> for Assembler<'_> {
22270 fn srai(&mut self, rd: Gp, rs1: Gp, shamtd: U2) {
22271 self.emit_n(
22272 Opcode::SRAI as i64,
22273 &[
22274 rd.as_operand(),
22275 rs1.as_operand(),
22276 Into::<Imm>::into(shamtd).as_operand(),
22277 ],
22278 );
22279 }
22280}
22281
22282impl<U2: Into<Imm>> SraiRv32Emitter<Gp, Gp, U2> for Assembler<'_> {
22283 fn srai_rv32(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
22284 self.emit_n(
22285 Opcode::SRAIRV32 as i64,
22286 &[
22287 rd.as_operand(),
22288 rs1.as_operand(),
22289 Into::<Imm>::into(shamtw).as_operand(),
22290 ],
22291 );
22292 }
22293}
22294
22295impl<U2: Into<Imm>> SraiwEmitter<Gp, Gp, U2> for Assembler<'_> {
22296 fn sraiw(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
22297 self.emit_n(
22298 Opcode::SRAIW as i64,
22299 &[
22300 rd.as_operand(),
22301 rs1.as_operand(),
22302 Into::<Imm>::into(shamtw).as_operand(),
22303 ],
22304 );
22305 }
22306}
22307
22308impl SrawEmitter<Gp, Gp, Gp> for Assembler<'_> {
22309 fn sraw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22310 self.emit_n(
22311 Opcode::SRAW as i64,
22312 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22313 );
22314 }
22315}
22316
22317impl SretEmitter for Assembler<'_> {
22318 fn sret(&mut self) {
22319 self.emit_n(Opcode::SRET as i64, &[]);
22320 }
22321}
22322
22323impl SrlEmitter<Gp, Gp, Gp> for Assembler<'_> {
22324 fn srl(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22325 self.emit_n(
22326 Opcode::SRL as i64,
22327 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22328 );
22329 }
22330}
22331
22332impl<U2: Into<Imm>> SrliEmitter<Gp, Gp, U2> for Assembler<'_> {
22333 fn srli(&mut self, rd: Gp, rs1: Gp, shamtd: U2) {
22334 self.emit_n(
22335 Opcode::SRLI as i64,
22336 &[
22337 rd.as_operand(),
22338 rs1.as_operand(),
22339 Into::<Imm>::into(shamtd).as_operand(),
22340 ],
22341 );
22342 }
22343}
22344
22345impl<U2: Into<Imm>> SrliRv32Emitter<Gp, Gp, U2> for Assembler<'_> {
22346 fn srli_rv32(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
22347 self.emit_n(
22348 Opcode::SRLIRV32 as i64,
22349 &[
22350 rd.as_operand(),
22351 rs1.as_operand(),
22352 Into::<Imm>::into(shamtw).as_operand(),
22353 ],
22354 );
22355 }
22356}
22357
22358impl<U2: Into<Imm>> SrliwEmitter<Gp, Gp, U2> for Assembler<'_> {
22359 fn srliw(&mut self, rd: Gp, rs1: Gp, shamtw: U2) {
22360 self.emit_n(
22361 Opcode::SRLIW as i64,
22362 &[
22363 rd.as_operand(),
22364 rs1.as_operand(),
22365 Into::<Imm>::into(shamtw).as_operand(),
22366 ],
22367 );
22368 }
22369}
22370
22371impl SrlwEmitter<Gp, Gp, Gp> for Assembler<'_> {
22372 fn srlw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22373 self.emit_n(
22374 Opcode::SRLW as i64,
22375 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22376 );
22377 }
22378}
22379
22380impl<U3: Into<Imm>, U4: Into<Imm>> SsamoswapDEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
22381 fn ssamoswap_d(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
22382 self.emit_n(
22383 Opcode::SSAMOSWAPD as i64,
22384 &[
22385 rd.as_operand(),
22386 rs1.as_operand(),
22387 rs2.as_operand(),
22388 Into::<Imm>::into(aq).as_operand(),
22389 Into::<Imm>::into(rl).as_operand(),
22390 ],
22391 );
22392 }
22393}
22394
22395impl<U3: Into<Imm>, U4: Into<Imm>> SsamoswapWEmitter<Gp, Gp, Gp, U3, U4> for Assembler<'_> {
22396 fn ssamoswap_w(&mut self, rd: Gp, rs1: Gp, rs2: Gp, aq: U3, rl: U4) {
22397 self.emit_n(
22398 Opcode::SSAMOSWAPW as i64,
22399 &[
22400 rd.as_operand(),
22401 rs1.as_operand(),
22402 rs2.as_operand(),
22403 Into::<Imm>::into(aq).as_operand(),
22404 Into::<Imm>::into(rl).as_operand(),
22405 ],
22406 );
22407 }
22408}
22409
22410impl SspopchkX1Emitter for Assembler<'_> {
22411 fn sspopchk_x1(&mut self) {
22412 self.emit_n(Opcode::SSPOPCHKX1 as i64, &[]);
22413 }
22414}
22415
22416impl SspopchkX5Emitter for Assembler<'_> {
22417 fn sspopchk_x5(&mut self) {
22418 self.emit_n(Opcode::SSPOPCHKX5 as i64, &[]);
22419 }
22420}
22421
22422impl SspushX1Emitter for Assembler<'_> {
22423 fn sspush_x1(&mut self) {
22424 self.emit_n(Opcode::SSPUSHX1 as i64, &[]);
22425 }
22426}
22427
22428impl SspushX5Emitter for Assembler<'_> {
22429 fn sspush_x5(&mut self) {
22430 self.emit_n(Opcode::SSPUSHX5 as i64, &[]);
22431 }
22432}
22433
22434impl SsrdpEmitter<Gp> for Assembler<'_> {
22435 fn ssrdp(&mut self, rd: Gp) {
22436 self.emit_n(Opcode::SSRDP as i64, &[rd.as_operand()]);
22437 }
22438}
22439
22440impl SubEmitter<Gp, Gp, Gp> for Assembler<'_> {
22441 fn sub(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22442 self.emit_n(
22443 Opcode::SUB as i64,
22444 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22445 );
22446 }
22447}
22448
22449impl SubwEmitter<Gp, Gp, Gp> for Assembler<'_> {
22450 fn subw(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
22451 self.emit_n(
22452 Opcode::SUBW as i64,
22453 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
22454 );
22455 }
22456}
22457
22458impl<U2: Into<Imm>> SwEmitter<Gp, Gp, U2> for Assembler<'_> {
22459 fn sw(&mut self, rs1: Gp, rs2: Gp, imm: U2) {
22460 self.emit_n(
22461 Opcode::SW as i64,
22462 &[
22463 rs1.as_operand(),
22464 rs2.as_operand(),
22465 Into::<Imm>::into(imm).as_operand(),
22466 ],
22467 );
22468 }
22469}
22470
22471impl UnzipEmitter<Gp, Gp> for Assembler<'_> {
22472 fn unzip(&mut self, rd: Gp, rs1: Gp) {
22473 self.emit_n(Opcode::UNZIP as i64, &[rd.as_operand(), rs1.as_operand()]);
22474 }
22475}
22476
22477impl<U3: Into<Imm>> VaaddVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22478 fn vaadd_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22479 self.emit_n(
22480 Opcode::VAADDVV as i64,
22481 &[
22482 vd.as_operand(),
22483 vs1.as_operand(),
22484 vs2.as_operand(),
22485 Into::<Imm>::into(vm).as_operand(),
22486 ],
22487 );
22488 }
22489}
22490
22491impl<U3: Into<Imm>> VaaddVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22492 fn vaadd_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22493 self.emit_n(
22494 Opcode::VAADDVX as i64,
22495 &[
22496 vd.as_operand(),
22497 vs2.as_operand(),
22498 rs1.as_operand(),
22499 Into::<Imm>::into(vm).as_operand(),
22500 ],
22501 );
22502 }
22503}
22504
22505impl<U3: Into<Imm>> VaadduVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22506 fn vaaddu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22507 self.emit_n(
22508 Opcode::VAADDUVV as i64,
22509 &[
22510 vd.as_operand(),
22511 vs1.as_operand(),
22512 vs2.as_operand(),
22513 Into::<Imm>::into(vm).as_operand(),
22514 ],
22515 );
22516 }
22517}
22518
22519impl<U3: Into<Imm>> VaadduVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22520 fn vaaddu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22521 self.emit_n(
22522 Opcode::VAADDUVX as i64,
22523 &[
22524 vd.as_operand(),
22525 vs2.as_operand(),
22526 rs1.as_operand(),
22527 Into::<Imm>::into(vm).as_operand(),
22528 ],
22529 );
22530 }
22531}
22532
22533impl<U2: Into<Imm>> VadcVimEmitter<Vp, Vp, U2> for Assembler<'_> {
22534 fn vadc_vim(&mut self, vd: Vp, vs2: Vp, simm5: U2) {
22535 self.emit_n(
22536 Opcode::VADCVIM as i64,
22537 &[
22538 vd.as_operand(),
22539 vs2.as_operand(),
22540 Into::<Imm>::into(simm5).as_operand(),
22541 ],
22542 );
22543 }
22544}
22545
22546impl VadcVvmEmitter<Vp, Vp, Vp> for Assembler<'_> {
22547 fn vadc_vvm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
22548 self.emit_n(
22549 Opcode::VADCVVM as i64,
22550 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
22551 );
22552 }
22553}
22554
22555impl VadcVxmEmitter<Vp, Gp, Vp> for Assembler<'_> {
22556 fn vadc_vxm(&mut self, vd: Vp, rs1: Gp, vs2: Vp) {
22557 self.emit_n(
22558 Opcode::VADCVXM as i64,
22559 &[vd.as_operand(), rs1.as_operand(), vs2.as_operand()],
22560 );
22561 }
22562}
22563
22564impl<U2: Into<Imm>, U3: Into<Imm>> VaddViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
22565 fn vadd_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
22566 self.emit_n(
22567 Opcode::VADDVI as i64,
22568 &[
22569 vd.as_operand(),
22570 vs2.as_operand(),
22571 Into::<Imm>::into(simm5).as_operand(),
22572 Into::<Imm>::into(vm).as_operand(),
22573 ],
22574 );
22575 }
22576}
22577
22578impl<U3: Into<Imm>> VaddVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22579 fn vadd_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22580 self.emit_n(
22581 Opcode::VADDVV as i64,
22582 &[
22583 vd.as_operand(),
22584 vs1.as_operand(),
22585 vs2.as_operand(),
22586 Into::<Imm>::into(vm).as_operand(),
22587 ],
22588 );
22589 }
22590}
22591
22592impl<U3: Into<Imm>> VaddVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22593 fn vadd_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22594 self.emit_n(
22595 Opcode::VADDVX as i64,
22596 &[
22597 vd.as_operand(),
22598 vs2.as_operand(),
22599 rs1.as_operand(),
22600 Into::<Imm>::into(vm).as_operand(),
22601 ],
22602 );
22603 }
22604}
22605
22606impl VaesdfVsEmitter<Vp, Vp> for Assembler<'_> {
22607 fn vaesdf_vs(&mut self, vd: Vp, vs2: Vp) {
22608 self.emit_n(
22609 Opcode::VAESDFVS as i64,
22610 &[vd.as_operand(), vs2.as_operand()],
22611 );
22612 }
22613}
22614
22615impl VaesdfVvEmitter<Vp, Vp> for Assembler<'_> {
22616 fn vaesdf_vv(&mut self, vd: Vp, vs2: Vp) {
22617 self.emit_n(
22618 Opcode::VAESDFVV as i64,
22619 &[vd.as_operand(), vs2.as_operand()],
22620 );
22621 }
22622}
22623
22624impl VaesdmVsEmitter<Vp, Vp> for Assembler<'_> {
22625 fn vaesdm_vs(&mut self, vd: Vp, vs2: Vp) {
22626 self.emit_n(
22627 Opcode::VAESDMVS as i64,
22628 &[vd.as_operand(), vs2.as_operand()],
22629 );
22630 }
22631}
22632
22633impl VaesdmVvEmitter<Vp, Vp> for Assembler<'_> {
22634 fn vaesdm_vv(&mut self, vd: Vp, vs2: Vp) {
22635 self.emit_n(
22636 Opcode::VAESDMVV as i64,
22637 &[vd.as_operand(), vs2.as_operand()],
22638 );
22639 }
22640}
22641
22642impl VaesefVsEmitter<Vp, Vp> for Assembler<'_> {
22643 fn vaesef_vs(&mut self, vd: Vp, vs2: Vp) {
22644 self.emit_n(
22645 Opcode::VAESEFVS as i64,
22646 &[vd.as_operand(), vs2.as_operand()],
22647 );
22648 }
22649}
22650
22651impl VaesefVvEmitter<Vp, Vp> for Assembler<'_> {
22652 fn vaesef_vv(&mut self, vd: Vp, vs2: Vp) {
22653 self.emit_n(
22654 Opcode::VAESEFVV as i64,
22655 &[vd.as_operand(), vs2.as_operand()],
22656 );
22657 }
22658}
22659
22660impl VaesemVsEmitter<Vp, Vp> for Assembler<'_> {
22661 fn vaesem_vs(&mut self, vd: Vp, vs2: Vp) {
22662 self.emit_n(
22663 Opcode::VAESEMVS as i64,
22664 &[vd.as_operand(), vs2.as_operand()],
22665 );
22666 }
22667}
22668
22669impl VaesemVvEmitter<Vp, Vp> for Assembler<'_> {
22670 fn vaesem_vv(&mut self, vd: Vp, vs2: Vp) {
22671 self.emit_n(
22672 Opcode::VAESEMVV as i64,
22673 &[vd.as_operand(), vs2.as_operand()],
22674 );
22675 }
22676}
22677
22678impl<U2: Into<Imm>> Vaeskf1ViEmitter<Vp, Vp, U2> for Assembler<'_> {
22679 fn vaeskf1_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2) {
22680 self.emit_n(
22681 Opcode::VAESKF1VI as i64,
22682 &[
22683 vd.as_operand(),
22684 vs2.as_operand(),
22685 Into::<Imm>::into(zimm5).as_operand(),
22686 ],
22687 );
22688 }
22689}
22690
22691impl<U2: Into<Imm>> Vaeskf2ViEmitter<Vp, Vp, U2> for Assembler<'_> {
22692 fn vaeskf2_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2) {
22693 self.emit_n(
22694 Opcode::VAESKF2VI as i64,
22695 &[
22696 vd.as_operand(),
22697 vs2.as_operand(),
22698 Into::<Imm>::into(zimm5).as_operand(),
22699 ],
22700 );
22701 }
22702}
22703
22704impl VaeszVsEmitter<Vp, Vp> for Assembler<'_> {
22705 fn vaesz_vs(&mut self, vd: Vp, vs2: Vp) {
22706 self.emit_n(Opcode::VAESZVS as i64, &[vd.as_operand(), vs2.as_operand()]);
22707 }
22708}
22709
22710impl<U2: Into<Imm>, U3: Into<Imm>> VandViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
22711 fn vand_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
22712 self.emit_n(
22713 Opcode::VANDVI as i64,
22714 &[
22715 vd.as_operand(),
22716 vs2.as_operand(),
22717 Into::<Imm>::into(simm5).as_operand(),
22718 Into::<Imm>::into(vm).as_operand(),
22719 ],
22720 );
22721 }
22722}
22723
22724impl<U3: Into<Imm>> VandVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22725 fn vand_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22726 self.emit_n(
22727 Opcode::VANDVV as i64,
22728 &[
22729 vd.as_operand(),
22730 vs1.as_operand(),
22731 vs2.as_operand(),
22732 Into::<Imm>::into(vm).as_operand(),
22733 ],
22734 );
22735 }
22736}
22737
22738impl<U3: Into<Imm>> VandVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22739 fn vand_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22740 self.emit_n(
22741 Opcode::VANDVX as i64,
22742 &[
22743 vd.as_operand(),
22744 vs2.as_operand(),
22745 rs1.as_operand(),
22746 Into::<Imm>::into(vm).as_operand(),
22747 ],
22748 );
22749 }
22750}
22751
22752impl<U3: Into<Imm>> VandnVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22753 fn vandn_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22754 self.emit_n(
22755 Opcode::VANDNVV as i64,
22756 &[
22757 vd.as_operand(),
22758 vs1.as_operand(),
22759 vs2.as_operand(),
22760 Into::<Imm>::into(vm).as_operand(),
22761 ],
22762 );
22763 }
22764}
22765
22766impl<U3: Into<Imm>> VandnVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22767 fn vandn_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22768 self.emit_n(
22769 Opcode::VANDNVX as i64,
22770 &[
22771 vd.as_operand(),
22772 vs2.as_operand(),
22773 rs1.as_operand(),
22774 Into::<Imm>::into(vm).as_operand(),
22775 ],
22776 );
22777 }
22778}
22779
22780impl<U3: Into<Imm>> VasubVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22781 fn vasub_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22782 self.emit_n(
22783 Opcode::VASUBVV as i64,
22784 &[
22785 vd.as_operand(),
22786 vs1.as_operand(),
22787 vs2.as_operand(),
22788 Into::<Imm>::into(vm).as_operand(),
22789 ],
22790 );
22791 }
22792}
22793
22794impl<U3: Into<Imm>> VasubVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22795 fn vasub_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22796 self.emit_n(
22797 Opcode::VASUBVX as i64,
22798 &[
22799 vd.as_operand(),
22800 vs2.as_operand(),
22801 rs1.as_operand(),
22802 Into::<Imm>::into(vm).as_operand(),
22803 ],
22804 );
22805 }
22806}
22807
22808impl<U3: Into<Imm>> VasubuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22809 fn vasubu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22810 self.emit_n(
22811 Opcode::VASUBUVV as i64,
22812 &[
22813 vd.as_operand(),
22814 vs1.as_operand(),
22815 vs2.as_operand(),
22816 Into::<Imm>::into(vm).as_operand(),
22817 ],
22818 );
22819 }
22820}
22821
22822impl<U3: Into<Imm>> VasubuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22823 fn vasubu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22824 self.emit_n(
22825 Opcode::VASUBUVX as i64,
22826 &[
22827 vd.as_operand(),
22828 vs2.as_operand(),
22829 rs1.as_operand(),
22830 Into::<Imm>::into(vm).as_operand(),
22831 ],
22832 );
22833 }
22834}
22835
22836impl<U2: Into<Imm>> Vbrev8VEmitter<Vp, Vp, U2> for Assembler<'_> {
22837 fn vbrev8_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
22838 self.emit_n(
22839 Opcode::VBREV8V as i64,
22840 &[
22841 vd.as_operand(),
22842 vs2.as_operand(),
22843 Into::<Imm>::into(vm).as_operand(),
22844 ],
22845 );
22846 }
22847}
22848
22849impl<U2: Into<Imm>> VbrevVEmitter<Vp, Vp, U2> for Assembler<'_> {
22850 fn vbrev_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
22851 self.emit_n(
22852 Opcode::VBREVV as i64,
22853 &[
22854 vd.as_operand(),
22855 vs2.as_operand(),
22856 Into::<Imm>::into(vm).as_operand(),
22857 ],
22858 );
22859 }
22860}
22861
22862impl<U3: Into<Imm>> VclmulVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22863 fn vclmul_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22864 self.emit_n(
22865 Opcode::VCLMULVV as i64,
22866 &[
22867 vd.as_operand(),
22868 vs1.as_operand(),
22869 vs2.as_operand(),
22870 Into::<Imm>::into(vm).as_operand(),
22871 ],
22872 );
22873 }
22874}
22875
22876impl<U3: Into<Imm>> VclmulVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22877 fn vclmul_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22878 self.emit_n(
22879 Opcode::VCLMULVX as i64,
22880 &[
22881 vd.as_operand(),
22882 vs2.as_operand(),
22883 rs1.as_operand(),
22884 Into::<Imm>::into(vm).as_operand(),
22885 ],
22886 );
22887 }
22888}
22889
22890impl<U3: Into<Imm>> VclmulhVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22891 fn vclmulh_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22892 self.emit_n(
22893 Opcode::VCLMULHVV as i64,
22894 &[
22895 vd.as_operand(),
22896 vs1.as_operand(),
22897 vs2.as_operand(),
22898 Into::<Imm>::into(vm).as_operand(),
22899 ],
22900 );
22901 }
22902}
22903
22904impl<U3: Into<Imm>> VclmulhVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22905 fn vclmulh_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22906 self.emit_n(
22907 Opcode::VCLMULHVX as i64,
22908 &[
22909 vd.as_operand(),
22910 vs2.as_operand(),
22911 rs1.as_operand(),
22912 Into::<Imm>::into(vm).as_operand(),
22913 ],
22914 );
22915 }
22916}
22917
22918impl<U2: Into<Imm>> VclzVEmitter<Vp, Vp, U2> for Assembler<'_> {
22919 fn vclz_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
22920 self.emit_n(
22921 Opcode::VCLZV as i64,
22922 &[
22923 vd.as_operand(),
22924 vs2.as_operand(),
22925 Into::<Imm>::into(vm).as_operand(),
22926 ],
22927 );
22928 }
22929}
22930
22931impl VcompressVmEmitter<Vp, Vp, Vp> for Assembler<'_> {
22932 fn vcompress_vm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
22933 self.emit_n(
22934 Opcode::VCOMPRESSVM as i64,
22935 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
22936 );
22937 }
22938}
22939
22940impl<U2: Into<Imm>> VcpopMEmitter<Gp, Vp, U2> for Assembler<'_> {
22941 fn vcpop_m(&mut self, rd: Gp, vs2: Vp, vm: U2) {
22942 self.emit_n(
22943 Opcode::VCPOPM as i64,
22944 &[
22945 rd.as_operand(),
22946 vs2.as_operand(),
22947 Into::<Imm>::into(vm).as_operand(),
22948 ],
22949 );
22950 }
22951}
22952
22953impl<U2: Into<Imm>> VcpopVEmitter<Vp, Vp, U2> for Assembler<'_> {
22954 fn vcpop_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
22955 self.emit_n(
22956 Opcode::VCPOPV as i64,
22957 &[
22958 vd.as_operand(),
22959 vs2.as_operand(),
22960 Into::<Imm>::into(vm).as_operand(),
22961 ],
22962 );
22963 }
22964}
22965
22966impl<U2: Into<Imm>> VctzVEmitter<Vp, Vp, U2> for Assembler<'_> {
22967 fn vctz_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
22968 self.emit_n(
22969 Opcode::VCTZV as i64,
22970 &[
22971 vd.as_operand(),
22972 vs2.as_operand(),
22973 Into::<Imm>::into(vm).as_operand(),
22974 ],
22975 );
22976 }
22977}
22978
22979impl<U3: Into<Imm>> VdivVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
22980 fn vdiv_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
22981 self.emit_n(
22982 Opcode::VDIVVV as i64,
22983 &[
22984 vd.as_operand(),
22985 vs1.as_operand(),
22986 vs2.as_operand(),
22987 Into::<Imm>::into(vm).as_operand(),
22988 ],
22989 );
22990 }
22991}
22992
22993impl<U3: Into<Imm>> VdivVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
22994 fn vdiv_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
22995 self.emit_n(
22996 Opcode::VDIVVX as i64,
22997 &[
22998 vd.as_operand(),
22999 vs2.as_operand(),
23000 rs1.as_operand(),
23001 Into::<Imm>::into(vm).as_operand(),
23002 ],
23003 );
23004 }
23005}
23006
23007impl<U3: Into<Imm>> VdivuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23008 fn vdivu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23009 self.emit_n(
23010 Opcode::VDIVUVV as i64,
23011 &[
23012 vd.as_operand(),
23013 vs1.as_operand(),
23014 vs2.as_operand(),
23015 Into::<Imm>::into(vm).as_operand(),
23016 ],
23017 );
23018 }
23019}
23020
23021impl<U3: Into<Imm>> VdivuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
23022 fn vdivu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
23023 self.emit_n(
23024 Opcode::VDIVUVX as i64,
23025 &[
23026 vd.as_operand(),
23027 vs2.as_operand(),
23028 rs1.as_operand(),
23029 Into::<Imm>::into(vm).as_operand(),
23030 ],
23031 );
23032 }
23033}
23034
23035impl<U3: Into<Imm>> VfaddVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23036 fn vfadd_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23037 self.emit_n(
23038 Opcode::VFADDVF as i64,
23039 &[
23040 vd.as_operand(),
23041 vs2.as_operand(),
23042 rs1.as_operand(),
23043 Into::<Imm>::into(vm).as_operand(),
23044 ],
23045 );
23046 }
23047}
23048
23049impl<U3: Into<Imm>> VfaddVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23050 fn vfadd_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23051 self.emit_n(
23052 Opcode::VFADDVV as i64,
23053 &[
23054 vd.as_operand(),
23055 vs1.as_operand(),
23056 vs2.as_operand(),
23057 Into::<Imm>::into(vm).as_operand(),
23058 ],
23059 );
23060 }
23061}
23062
23063impl<U2: Into<Imm>> VfclassVEmitter<Vp, Vp, U2> for Assembler<'_> {
23064 fn vfclass_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23065 self.emit_n(
23066 Opcode::VFCLASSV as i64,
23067 &[
23068 vd.as_operand(),
23069 vs2.as_operand(),
23070 Into::<Imm>::into(vm).as_operand(),
23071 ],
23072 );
23073 }
23074}
23075
23076impl<U2: Into<Imm>> VfcvtFXVEmitter<Vp, Vp, U2> for Assembler<'_> {
23077 fn vfcvt_f_x_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23078 self.emit_n(
23079 Opcode::VFCVTFXV as i64,
23080 &[
23081 vd.as_operand(),
23082 vs2.as_operand(),
23083 Into::<Imm>::into(vm).as_operand(),
23084 ],
23085 );
23086 }
23087}
23088
23089impl<U2: Into<Imm>> VfcvtFXuVEmitter<Vp, Vp, U2> for Assembler<'_> {
23090 fn vfcvt_f_xu_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23091 self.emit_n(
23092 Opcode::VFCVTFXUV as i64,
23093 &[
23094 vd.as_operand(),
23095 vs2.as_operand(),
23096 Into::<Imm>::into(vm).as_operand(),
23097 ],
23098 );
23099 }
23100}
23101
23102impl<U2: Into<Imm>> VfcvtRtzXFVEmitter<Vp, Vp, U2> for Assembler<'_> {
23103 fn vfcvt_rtz_x_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23104 self.emit_n(
23105 Opcode::VFCVTRTZXFV as i64,
23106 &[
23107 vd.as_operand(),
23108 vs2.as_operand(),
23109 Into::<Imm>::into(vm).as_operand(),
23110 ],
23111 );
23112 }
23113}
23114
23115impl<U2: Into<Imm>> VfcvtRtzXuFVEmitter<Vp, Vp, U2> for Assembler<'_> {
23116 fn vfcvt_rtz_xu_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23117 self.emit_n(
23118 Opcode::VFCVTRTZXUFV as i64,
23119 &[
23120 vd.as_operand(),
23121 vs2.as_operand(),
23122 Into::<Imm>::into(vm).as_operand(),
23123 ],
23124 );
23125 }
23126}
23127
23128impl<U2: Into<Imm>> VfcvtXFVEmitter<Vp, Vp, U2> for Assembler<'_> {
23129 fn vfcvt_x_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23130 self.emit_n(
23131 Opcode::VFCVTXFV as i64,
23132 &[
23133 vd.as_operand(),
23134 vs2.as_operand(),
23135 Into::<Imm>::into(vm).as_operand(),
23136 ],
23137 );
23138 }
23139}
23140
23141impl<U2: Into<Imm>> VfcvtXuFVEmitter<Vp, Vp, U2> for Assembler<'_> {
23142 fn vfcvt_xu_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23143 self.emit_n(
23144 Opcode::VFCVTXUFV as i64,
23145 &[
23146 vd.as_operand(),
23147 vs2.as_operand(),
23148 Into::<Imm>::into(vm).as_operand(),
23149 ],
23150 );
23151 }
23152}
23153
23154impl<U3: Into<Imm>> VfdivVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23155 fn vfdiv_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23156 self.emit_n(
23157 Opcode::VFDIVVF as i64,
23158 &[
23159 vd.as_operand(),
23160 vs2.as_operand(),
23161 rs1.as_operand(),
23162 Into::<Imm>::into(vm).as_operand(),
23163 ],
23164 );
23165 }
23166}
23167
23168impl<U3: Into<Imm>> VfdivVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23169 fn vfdiv_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23170 self.emit_n(
23171 Opcode::VFDIVVV as i64,
23172 &[
23173 vd.as_operand(),
23174 vs1.as_operand(),
23175 vs2.as_operand(),
23176 Into::<Imm>::into(vm).as_operand(),
23177 ],
23178 );
23179 }
23180}
23181
23182impl<U2: Into<Imm>> VfirstMEmitter<Gp, Vp, U2> for Assembler<'_> {
23183 fn vfirst_m(&mut self, rd: Gp, vs2: Vp, vm: U2) {
23184 self.emit_n(
23185 Opcode::VFIRSTM as i64,
23186 &[
23187 rd.as_operand(),
23188 vs2.as_operand(),
23189 Into::<Imm>::into(vm).as_operand(),
23190 ],
23191 );
23192 }
23193}
23194
23195impl<U3: Into<Imm>> VfmaccVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23196 fn vfmacc_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23197 self.emit_n(
23198 Opcode::VFMACCVF as i64,
23199 &[
23200 vd.as_operand(),
23201 vs2.as_operand(),
23202 rs1.as_operand(),
23203 Into::<Imm>::into(vm).as_operand(),
23204 ],
23205 );
23206 }
23207}
23208
23209impl<U3: Into<Imm>> VfmaccVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23210 fn vfmacc_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23211 self.emit_n(
23212 Opcode::VFMACCVV as i64,
23213 &[
23214 vd.as_operand(),
23215 vs1.as_operand(),
23216 vs2.as_operand(),
23217 Into::<Imm>::into(vm).as_operand(),
23218 ],
23219 );
23220 }
23221}
23222
23223impl<U3: Into<Imm>> VfmaddVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23224 fn vfmadd_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23225 self.emit_n(
23226 Opcode::VFMADDVF as i64,
23227 &[
23228 vd.as_operand(),
23229 vs2.as_operand(),
23230 rs1.as_operand(),
23231 Into::<Imm>::into(vm).as_operand(),
23232 ],
23233 );
23234 }
23235}
23236
23237impl<U3: Into<Imm>> VfmaddVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23238 fn vfmadd_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23239 self.emit_n(
23240 Opcode::VFMADDVV as i64,
23241 &[
23242 vd.as_operand(),
23243 vs1.as_operand(),
23244 vs2.as_operand(),
23245 Into::<Imm>::into(vm).as_operand(),
23246 ],
23247 );
23248 }
23249}
23250
23251impl<U3: Into<Imm>> VfmaxVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23252 fn vfmax_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23253 self.emit_n(
23254 Opcode::VFMAXVF as i64,
23255 &[
23256 vd.as_operand(),
23257 vs2.as_operand(),
23258 rs1.as_operand(),
23259 Into::<Imm>::into(vm).as_operand(),
23260 ],
23261 );
23262 }
23263}
23264
23265impl<U3: Into<Imm>> VfmaxVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23266 fn vfmax_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23267 self.emit_n(
23268 Opcode::VFMAXVV as i64,
23269 &[
23270 vd.as_operand(),
23271 vs1.as_operand(),
23272 vs2.as_operand(),
23273 Into::<Imm>::into(vm).as_operand(),
23274 ],
23275 );
23276 }
23277}
23278
23279impl VfmergeVfmEmitter<Vp, Fp, Vp> for Assembler<'_> {
23280 fn vfmerge_vfm(&mut self, vd: Vp, rs1: Fp, vs2: Vp) {
23281 self.emit_n(
23282 Opcode::VFMERGEVFM as i64,
23283 &[vd.as_operand(), rs1.as_operand(), vs2.as_operand()],
23284 );
23285 }
23286}
23287
23288impl<U3: Into<Imm>> VfminVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23289 fn vfmin_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23290 self.emit_n(
23291 Opcode::VFMINVF as i64,
23292 &[
23293 vd.as_operand(),
23294 vs2.as_operand(),
23295 rs1.as_operand(),
23296 Into::<Imm>::into(vm).as_operand(),
23297 ],
23298 );
23299 }
23300}
23301
23302impl<U3: Into<Imm>> VfminVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23303 fn vfmin_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23304 self.emit_n(
23305 Opcode::VFMINVV as i64,
23306 &[
23307 vd.as_operand(),
23308 vs1.as_operand(),
23309 vs2.as_operand(),
23310 Into::<Imm>::into(vm).as_operand(),
23311 ],
23312 );
23313 }
23314}
23315
23316impl<U3: Into<Imm>> VfmsacVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23317 fn vfmsac_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23318 self.emit_n(
23319 Opcode::VFMSACVF as i64,
23320 &[
23321 vd.as_operand(),
23322 vs2.as_operand(),
23323 rs1.as_operand(),
23324 Into::<Imm>::into(vm).as_operand(),
23325 ],
23326 );
23327 }
23328}
23329
23330impl<U3: Into<Imm>> VfmsacVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23331 fn vfmsac_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23332 self.emit_n(
23333 Opcode::VFMSACVV as i64,
23334 &[
23335 vd.as_operand(),
23336 vs1.as_operand(),
23337 vs2.as_operand(),
23338 Into::<Imm>::into(vm).as_operand(),
23339 ],
23340 );
23341 }
23342}
23343
23344impl<U3: Into<Imm>> VfmsubVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23345 fn vfmsub_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23346 self.emit_n(
23347 Opcode::VFMSUBVF as i64,
23348 &[
23349 vd.as_operand(),
23350 vs2.as_operand(),
23351 rs1.as_operand(),
23352 Into::<Imm>::into(vm).as_operand(),
23353 ],
23354 );
23355 }
23356}
23357
23358impl<U3: Into<Imm>> VfmsubVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23359 fn vfmsub_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23360 self.emit_n(
23361 Opcode::VFMSUBVV as i64,
23362 &[
23363 vd.as_operand(),
23364 vs1.as_operand(),
23365 vs2.as_operand(),
23366 Into::<Imm>::into(vm).as_operand(),
23367 ],
23368 );
23369 }
23370}
23371
23372impl<U3: Into<Imm>> VfmulVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23373 fn vfmul_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23374 self.emit_n(
23375 Opcode::VFMULVF as i64,
23376 &[
23377 vd.as_operand(),
23378 vs2.as_operand(),
23379 rs1.as_operand(),
23380 Into::<Imm>::into(vm).as_operand(),
23381 ],
23382 );
23383 }
23384}
23385
23386impl<U3: Into<Imm>> VfmulVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23387 fn vfmul_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23388 self.emit_n(
23389 Opcode::VFMULVV as i64,
23390 &[
23391 vd.as_operand(),
23392 vs1.as_operand(),
23393 vs2.as_operand(),
23394 Into::<Imm>::into(vm).as_operand(),
23395 ],
23396 );
23397 }
23398}
23399
23400impl VfmvFSEmitter<Fp, Vp> for Assembler<'_> {
23401 fn vfmv_f_s(&mut self, rd: Fp, vs2: Vp) {
23402 self.emit_n(Opcode::VFMVFS as i64, &[rd.as_operand(), vs2.as_operand()]);
23403 }
23404}
23405
23406impl VfmvSFEmitter<Vp, Fp> for Assembler<'_> {
23407 fn vfmv_s_f(&mut self, vd: Vp, rs1: Fp) {
23408 self.emit_n(Opcode::VFMVSF as i64, &[vd.as_operand(), rs1.as_operand()]);
23409 }
23410}
23411
23412impl VfmvVFEmitter<Vp, Fp> for Assembler<'_> {
23413 fn vfmv_v_f(&mut self, vd: Vp, rs1: Fp) {
23414 self.emit_n(Opcode::VFMVVF as i64, &[vd.as_operand(), rs1.as_operand()]);
23415 }
23416}
23417
23418impl<U2: Into<Imm>> VfncvtFFWEmitter<Vp, Vp, U2> for Assembler<'_> {
23419 fn vfncvt_f_f_w(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23420 self.emit_n(
23421 Opcode::VFNCVTFFW as i64,
23422 &[
23423 vd.as_operand(),
23424 vs2.as_operand(),
23425 Into::<Imm>::into(vm).as_operand(),
23426 ],
23427 );
23428 }
23429}
23430
23431impl<U2: Into<Imm>> VfncvtFXWEmitter<Vp, Vp, U2> for Assembler<'_> {
23432 fn vfncvt_f_x_w(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23433 self.emit_n(
23434 Opcode::VFNCVTFXW as i64,
23435 &[
23436 vd.as_operand(),
23437 vs2.as_operand(),
23438 Into::<Imm>::into(vm).as_operand(),
23439 ],
23440 );
23441 }
23442}
23443
23444impl<U2: Into<Imm>> VfncvtFXuWEmitter<Vp, Vp, U2> for Assembler<'_> {
23445 fn vfncvt_f_xu_w(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23446 self.emit_n(
23447 Opcode::VFNCVTFXUW as i64,
23448 &[
23449 vd.as_operand(),
23450 vs2.as_operand(),
23451 Into::<Imm>::into(vm).as_operand(),
23452 ],
23453 );
23454 }
23455}
23456
23457impl<U2: Into<Imm>> VfncvtRodFFWEmitter<Vp, Vp, U2> for Assembler<'_> {
23458 fn vfncvt_rod_f_f_w(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23459 self.emit_n(
23460 Opcode::VFNCVTRODFFW as i64,
23461 &[
23462 vd.as_operand(),
23463 vs2.as_operand(),
23464 Into::<Imm>::into(vm).as_operand(),
23465 ],
23466 );
23467 }
23468}
23469
23470impl<U2: Into<Imm>> VfncvtRtzXFWEmitter<Vp, Vp, U2> for Assembler<'_> {
23471 fn vfncvt_rtz_x_f_w(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23472 self.emit_n(
23473 Opcode::VFNCVTRTZXFW as i64,
23474 &[
23475 vd.as_operand(),
23476 vs2.as_operand(),
23477 Into::<Imm>::into(vm).as_operand(),
23478 ],
23479 );
23480 }
23481}
23482
23483impl<U2: Into<Imm>> VfncvtRtzXuFWEmitter<Vp, Vp, U2> for Assembler<'_> {
23484 fn vfncvt_rtz_xu_f_w(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23485 self.emit_n(
23486 Opcode::VFNCVTRTZXUFW as i64,
23487 &[
23488 vd.as_operand(),
23489 vs2.as_operand(),
23490 Into::<Imm>::into(vm).as_operand(),
23491 ],
23492 );
23493 }
23494}
23495
23496impl<U2: Into<Imm>> VfncvtXFWEmitter<Vp, Vp, U2> for Assembler<'_> {
23497 fn vfncvt_x_f_w(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23498 self.emit_n(
23499 Opcode::VFNCVTXFW as i64,
23500 &[
23501 vd.as_operand(),
23502 vs2.as_operand(),
23503 Into::<Imm>::into(vm).as_operand(),
23504 ],
23505 );
23506 }
23507}
23508
23509impl<U2: Into<Imm>> VfncvtXuFWEmitter<Vp, Vp, U2> for Assembler<'_> {
23510 fn vfncvt_xu_f_w(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23511 self.emit_n(
23512 Opcode::VFNCVTXUFW as i64,
23513 &[
23514 vd.as_operand(),
23515 vs2.as_operand(),
23516 Into::<Imm>::into(vm).as_operand(),
23517 ],
23518 );
23519 }
23520}
23521
23522impl<U2: Into<Imm>> Vfncvtbf16FFWEmitter<Vp, Vp, U2> for Assembler<'_> {
23523 fn vfncvtbf16_f_f_w(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23524 self.emit_n(
23525 Opcode::VFNCVTBF16FFW as i64,
23526 &[
23527 vd.as_operand(),
23528 vs2.as_operand(),
23529 Into::<Imm>::into(vm).as_operand(),
23530 ],
23531 );
23532 }
23533}
23534
23535impl<U3: Into<Imm>> VfnmaccVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23536 fn vfnmacc_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23537 self.emit_n(
23538 Opcode::VFNMACCVF as i64,
23539 &[
23540 vd.as_operand(),
23541 vs2.as_operand(),
23542 rs1.as_operand(),
23543 Into::<Imm>::into(vm).as_operand(),
23544 ],
23545 );
23546 }
23547}
23548
23549impl<U3: Into<Imm>> VfnmaccVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23550 fn vfnmacc_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23551 self.emit_n(
23552 Opcode::VFNMACCVV as i64,
23553 &[
23554 vd.as_operand(),
23555 vs1.as_operand(),
23556 vs2.as_operand(),
23557 Into::<Imm>::into(vm).as_operand(),
23558 ],
23559 );
23560 }
23561}
23562
23563impl<U3: Into<Imm>> VfnmaddVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23564 fn vfnmadd_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23565 self.emit_n(
23566 Opcode::VFNMADDVF as i64,
23567 &[
23568 vd.as_operand(),
23569 vs2.as_operand(),
23570 rs1.as_operand(),
23571 Into::<Imm>::into(vm).as_operand(),
23572 ],
23573 );
23574 }
23575}
23576
23577impl<U3: Into<Imm>> VfnmaddVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23578 fn vfnmadd_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23579 self.emit_n(
23580 Opcode::VFNMADDVV as i64,
23581 &[
23582 vd.as_operand(),
23583 vs1.as_operand(),
23584 vs2.as_operand(),
23585 Into::<Imm>::into(vm).as_operand(),
23586 ],
23587 );
23588 }
23589}
23590
23591impl<U3: Into<Imm>> VfnmsacVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23592 fn vfnmsac_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23593 self.emit_n(
23594 Opcode::VFNMSACVF as i64,
23595 &[
23596 vd.as_operand(),
23597 vs2.as_operand(),
23598 rs1.as_operand(),
23599 Into::<Imm>::into(vm).as_operand(),
23600 ],
23601 );
23602 }
23603}
23604
23605impl<U3: Into<Imm>> VfnmsacVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23606 fn vfnmsac_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23607 self.emit_n(
23608 Opcode::VFNMSACVV as i64,
23609 &[
23610 vd.as_operand(),
23611 vs1.as_operand(),
23612 vs2.as_operand(),
23613 Into::<Imm>::into(vm).as_operand(),
23614 ],
23615 );
23616 }
23617}
23618
23619impl<U3: Into<Imm>> VfnmsubVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23620 fn vfnmsub_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23621 self.emit_n(
23622 Opcode::VFNMSUBVF as i64,
23623 &[
23624 vd.as_operand(),
23625 vs2.as_operand(),
23626 rs1.as_operand(),
23627 Into::<Imm>::into(vm).as_operand(),
23628 ],
23629 );
23630 }
23631}
23632
23633impl<U3: Into<Imm>> VfnmsubVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23634 fn vfnmsub_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23635 self.emit_n(
23636 Opcode::VFNMSUBVV as i64,
23637 &[
23638 vd.as_operand(),
23639 vs1.as_operand(),
23640 vs2.as_operand(),
23641 Into::<Imm>::into(vm).as_operand(),
23642 ],
23643 );
23644 }
23645}
23646
23647impl<U3: Into<Imm>> VfrdivVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23648 fn vfrdiv_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23649 self.emit_n(
23650 Opcode::VFRDIVVF as i64,
23651 &[
23652 vd.as_operand(),
23653 vs2.as_operand(),
23654 rs1.as_operand(),
23655 Into::<Imm>::into(vm).as_operand(),
23656 ],
23657 );
23658 }
23659}
23660
23661impl<U2: Into<Imm>> Vfrec7VEmitter<Vp, Vp, U2> for Assembler<'_> {
23662 fn vfrec7_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23663 self.emit_n(
23664 Opcode::VFREC7V as i64,
23665 &[
23666 vd.as_operand(),
23667 vs2.as_operand(),
23668 Into::<Imm>::into(vm).as_operand(),
23669 ],
23670 );
23671 }
23672}
23673
23674impl<U3: Into<Imm>> VfredmaxVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23675 fn vfredmax_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23676 self.emit_n(
23677 Opcode::VFREDMAXVS as i64,
23678 &[
23679 vd.as_operand(),
23680 vs1.as_operand(),
23681 vs2.as_operand(),
23682 Into::<Imm>::into(vm).as_operand(),
23683 ],
23684 );
23685 }
23686}
23687
23688impl<U3: Into<Imm>> VfredminVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23689 fn vfredmin_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23690 self.emit_n(
23691 Opcode::VFREDMINVS as i64,
23692 &[
23693 vd.as_operand(),
23694 vs1.as_operand(),
23695 vs2.as_operand(),
23696 Into::<Imm>::into(vm).as_operand(),
23697 ],
23698 );
23699 }
23700}
23701
23702impl<U3: Into<Imm>> VfredosumVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23703 fn vfredosum_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23704 self.emit_n(
23705 Opcode::VFREDOSUMVS as i64,
23706 &[
23707 vd.as_operand(),
23708 vs1.as_operand(),
23709 vs2.as_operand(),
23710 Into::<Imm>::into(vm).as_operand(),
23711 ],
23712 );
23713 }
23714}
23715
23716impl<U3: Into<Imm>> VfredsumVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23717 fn vfredsum_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23718 self.emit_n(
23719 Opcode::VFREDSUMVS as i64,
23720 &[
23721 vd.as_operand(),
23722 vs1.as_operand(),
23723 vs2.as_operand(),
23724 Into::<Imm>::into(vm).as_operand(),
23725 ],
23726 );
23727 }
23728}
23729
23730impl<U3: Into<Imm>> VfredusumVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23731 fn vfredusum_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23732 self.emit_n(
23733 Opcode::VFREDUSUMVS as i64,
23734 &[
23735 vd.as_operand(),
23736 vs1.as_operand(),
23737 vs2.as_operand(),
23738 Into::<Imm>::into(vm).as_operand(),
23739 ],
23740 );
23741 }
23742}
23743
23744impl<U2: Into<Imm>> Vfrsqrt7VEmitter<Vp, Vp, U2> for Assembler<'_> {
23745 fn vfrsqrt7_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23746 self.emit_n(
23747 Opcode::VFRSQRT7V as i64,
23748 &[
23749 vd.as_operand(),
23750 vs2.as_operand(),
23751 Into::<Imm>::into(vm).as_operand(),
23752 ],
23753 );
23754 }
23755}
23756
23757impl<U3: Into<Imm>> VfrsubVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23758 fn vfrsub_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23759 self.emit_n(
23760 Opcode::VFRSUBVF as i64,
23761 &[
23762 vd.as_operand(),
23763 vs2.as_operand(),
23764 rs1.as_operand(),
23765 Into::<Imm>::into(vm).as_operand(),
23766 ],
23767 );
23768 }
23769}
23770
23771impl<U3: Into<Imm>> VfsgnjVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23772 fn vfsgnj_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23773 self.emit_n(
23774 Opcode::VFSGNJVF as i64,
23775 &[
23776 vd.as_operand(),
23777 vs2.as_operand(),
23778 rs1.as_operand(),
23779 Into::<Imm>::into(vm).as_operand(),
23780 ],
23781 );
23782 }
23783}
23784
23785impl<U3: Into<Imm>> VfsgnjVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23786 fn vfsgnj_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23787 self.emit_n(
23788 Opcode::VFSGNJVV as i64,
23789 &[
23790 vd.as_operand(),
23791 vs1.as_operand(),
23792 vs2.as_operand(),
23793 Into::<Imm>::into(vm).as_operand(),
23794 ],
23795 );
23796 }
23797}
23798
23799impl<U3: Into<Imm>> VfsgnjnVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23800 fn vfsgnjn_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23801 self.emit_n(
23802 Opcode::VFSGNJNVF as i64,
23803 &[
23804 vd.as_operand(),
23805 vs2.as_operand(),
23806 rs1.as_operand(),
23807 Into::<Imm>::into(vm).as_operand(),
23808 ],
23809 );
23810 }
23811}
23812
23813impl<U3: Into<Imm>> VfsgnjnVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23814 fn vfsgnjn_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23815 self.emit_n(
23816 Opcode::VFSGNJNVV as i64,
23817 &[
23818 vd.as_operand(),
23819 vs1.as_operand(),
23820 vs2.as_operand(),
23821 Into::<Imm>::into(vm).as_operand(),
23822 ],
23823 );
23824 }
23825}
23826
23827impl<U3: Into<Imm>> VfsgnjxVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23828 fn vfsgnjx_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23829 self.emit_n(
23830 Opcode::VFSGNJXVF as i64,
23831 &[
23832 vd.as_operand(),
23833 vs2.as_operand(),
23834 rs1.as_operand(),
23835 Into::<Imm>::into(vm).as_operand(),
23836 ],
23837 );
23838 }
23839}
23840
23841impl<U3: Into<Imm>> VfsgnjxVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23842 fn vfsgnjx_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23843 self.emit_n(
23844 Opcode::VFSGNJXVV as i64,
23845 &[
23846 vd.as_operand(),
23847 vs1.as_operand(),
23848 vs2.as_operand(),
23849 Into::<Imm>::into(vm).as_operand(),
23850 ],
23851 );
23852 }
23853}
23854
23855impl<U3: Into<Imm>> Vfslide1DownVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23856 fn vfslide1down_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23857 self.emit_n(
23858 Opcode::VFSLIDE1DOWNVF as i64,
23859 &[
23860 vd.as_operand(),
23861 vs2.as_operand(),
23862 rs1.as_operand(),
23863 Into::<Imm>::into(vm).as_operand(),
23864 ],
23865 );
23866 }
23867}
23868
23869impl<U3: Into<Imm>> Vfslide1UpVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23870 fn vfslide1up_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23871 self.emit_n(
23872 Opcode::VFSLIDE1UPVF as i64,
23873 &[
23874 vd.as_operand(),
23875 vs2.as_operand(),
23876 rs1.as_operand(),
23877 Into::<Imm>::into(vm).as_operand(),
23878 ],
23879 );
23880 }
23881}
23882
23883impl<U2: Into<Imm>> VfsqrtVEmitter<Vp, Vp, U2> for Assembler<'_> {
23884 fn vfsqrt_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23885 self.emit_n(
23886 Opcode::VFSQRTV as i64,
23887 &[
23888 vd.as_operand(),
23889 vs2.as_operand(),
23890 Into::<Imm>::into(vm).as_operand(),
23891 ],
23892 );
23893 }
23894}
23895
23896impl<U3: Into<Imm>> VfsubVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23897 fn vfsub_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23898 self.emit_n(
23899 Opcode::VFSUBVF as i64,
23900 &[
23901 vd.as_operand(),
23902 vs2.as_operand(),
23903 rs1.as_operand(),
23904 Into::<Imm>::into(vm).as_operand(),
23905 ],
23906 );
23907 }
23908}
23909
23910impl<U3: Into<Imm>> VfsubVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23911 fn vfsub_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23912 self.emit_n(
23913 Opcode::VFSUBVV as i64,
23914 &[
23915 vd.as_operand(),
23916 vs1.as_operand(),
23917 vs2.as_operand(),
23918 Into::<Imm>::into(vm).as_operand(),
23919 ],
23920 );
23921 }
23922}
23923
23924impl<U3: Into<Imm>> VfwaddVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23925 fn vfwadd_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23926 self.emit_n(
23927 Opcode::VFWADDVF as i64,
23928 &[
23929 vd.as_operand(),
23930 vs2.as_operand(),
23931 rs1.as_operand(),
23932 Into::<Imm>::into(vm).as_operand(),
23933 ],
23934 );
23935 }
23936}
23937
23938impl<U3: Into<Imm>> VfwaddVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23939 fn vfwadd_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23940 self.emit_n(
23941 Opcode::VFWADDVV as i64,
23942 &[
23943 vd.as_operand(),
23944 vs1.as_operand(),
23945 vs2.as_operand(),
23946 Into::<Imm>::into(vm).as_operand(),
23947 ],
23948 );
23949 }
23950}
23951
23952impl<U3: Into<Imm>> VfwaddWfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
23953 fn vfwadd_wf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
23954 self.emit_n(
23955 Opcode::VFWADDWF as i64,
23956 &[
23957 vd.as_operand(),
23958 vs2.as_operand(),
23959 rs1.as_operand(),
23960 Into::<Imm>::into(vm).as_operand(),
23961 ],
23962 );
23963 }
23964}
23965
23966impl<U3: Into<Imm>> VfwaddWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
23967 fn vfwadd_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
23968 self.emit_n(
23969 Opcode::VFWADDWV as i64,
23970 &[
23971 vd.as_operand(),
23972 vs1.as_operand(),
23973 vs2.as_operand(),
23974 Into::<Imm>::into(vm).as_operand(),
23975 ],
23976 );
23977 }
23978}
23979
23980impl<U2: Into<Imm>> VfwcvtFFVEmitter<Vp, Vp, U2> for Assembler<'_> {
23981 fn vfwcvt_f_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23982 self.emit_n(
23983 Opcode::VFWCVTFFV as i64,
23984 &[
23985 vd.as_operand(),
23986 vs2.as_operand(),
23987 Into::<Imm>::into(vm).as_operand(),
23988 ],
23989 );
23990 }
23991}
23992
23993impl<U2: Into<Imm>> VfwcvtFXVEmitter<Vp, Vp, U2> for Assembler<'_> {
23994 fn vfwcvt_f_x_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
23995 self.emit_n(
23996 Opcode::VFWCVTFXV as i64,
23997 &[
23998 vd.as_operand(),
23999 vs2.as_operand(),
24000 Into::<Imm>::into(vm).as_operand(),
24001 ],
24002 );
24003 }
24004}
24005
24006impl<U2: Into<Imm>> VfwcvtFXuVEmitter<Vp, Vp, U2> for Assembler<'_> {
24007 fn vfwcvt_f_xu_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
24008 self.emit_n(
24009 Opcode::VFWCVTFXUV as i64,
24010 &[
24011 vd.as_operand(),
24012 vs2.as_operand(),
24013 Into::<Imm>::into(vm).as_operand(),
24014 ],
24015 );
24016 }
24017}
24018
24019impl<U2: Into<Imm>> VfwcvtRtzXFVEmitter<Vp, Vp, U2> for Assembler<'_> {
24020 fn vfwcvt_rtz_x_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
24021 self.emit_n(
24022 Opcode::VFWCVTRTZXFV as i64,
24023 &[
24024 vd.as_operand(),
24025 vs2.as_operand(),
24026 Into::<Imm>::into(vm).as_operand(),
24027 ],
24028 );
24029 }
24030}
24031
24032impl<U2: Into<Imm>> VfwcvtRtzXuFVEmitter<Vp, Vp, U2> for Assembler<'_> {
24033 fn vfwcvt_rtz_xu_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
24034 self.emit_n(
24035 Opcode::VFWCVTRTZXUFV as i64,
24036 &[
24037 vd.as_operand(),
24038 vs2.as_operand(),
24039 Into::<Imm>::into(vm).as_operand(),
24040 ],
24041 );
24042 }
24043}
24044
24045impl<U2: Into<Imm>> VfwcvtXFVEmitter<Vp, Vp, U2> for Assembler<'_> {
24046 fn vfwcvt_x_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
24047 self.emit_n(
24048 Opcode::VFWCVTXFV as i64,
24049 &[
24050 vd.as_operand(),
24051 vs2.as_operand(),
24052 Into::<Imm>::into(vm).as_operand(),
24053 ],
24054 );
24055 }
24056}
24057
24058impl<U2: Into<Imm>> VfwcvtXuFVEmitter<Vp, Vp, U2> for Assembler<'_> {
24059 fn vfwcvt_xu_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
24060 self.emit_n(
24061 Opcode::VFWCVTXUFV as i64,
24062 &[
24063 vd.as_operand(),
24064 vs2.as_operand(),
24065 Into::<Imm>::into(vm).as_operand(),
24066 ],
24067 );
24068 }
24069}
24070
24071impl<U2: Into<Imm>> Vfwcvtbf16FFVEmitter<Vp, Vp, U2> for Assembler<'_> {
24072 fn vfwcvtbf16_f_f_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
24073 self.emit_n(
24074 Opcode::VFWCVTBF16FFV as i64,
24075 &[
24076 vd.as_operand(),
24077 vs2.as_operand(),
24078 Into::<Imm>::into(vm).as_operand(),
24079 ],
24080 );
24081 }
24082}
24083
24084impl<U3: Into<Imm>> VfwmaccVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
24085 fn vfwmacc_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
24086 self.emit_n(
24087 Opcode::VFWMACCVF as i64,
24088 &[
24089 vd.as_operand(),
24090 vs2.as_operand(),
24091 rs1.as_operand(),
24092 Into::<Imm>::into(vm).as_operand(),
24093 ],
24094 );
24095 }
24096}
24097
24098impl<U3: Into<Imm>> VfwmaccVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24099 fn vfwmacc_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24100 self.emit_n(
24101 Opcode::VFWMACCVV as i64,
24102 &[
24103 vd.as_operand(),
24104 vs1.as_operand(),
24105 vs2.as_operand(),
24106 Into::<Imm>::into(vm).as_operand(),
24107 ],
24108 );
24109 }
24110}
24111
24112impl<U3: Into<Imm>> Vfwmaccbf16VfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
24113 fn vfwmaccbf16_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
24114 self.emit_n(
24115 Opcode::VFWMACCBF16VF as i64,
24116 &[
24117 vd.as_operand(),
24118 vs2.as_operand(),
24119 rs1.as_operand(),
24120 Into::<Imm>::into(vm).as_operand(),
24121 ],
24122 );
24123 }
24124}
24125
24126impl<U3: Into<Imm>> Vfwmaccbf16VvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24127 fn vfwmaccbf16_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24128 self.emit_n(
24129 Opcode::VFWMACCBF16VV as i64,
24130 &[
24131 vd.as_operand(),
24132 vs1.as_operand(),
24133 vs2.as_operand(),
24134 Into::<Imm>::into(vm).as_operand(),
24135 ],
24136 );
24137 }
24138}
24139
24140impl<U3: Into<Imm>> VfwmsacVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
24141 fn vfwmsac_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
24142 self.emit_n(
24143 Opcode::VFWMSACVF as i64,
24144 &[
24145 vd.as_operand(),
24146 vs2.as_operand(),
24147 rs1.as_operand(),
24148 Into::<Imm>::into(vm).as_operand(),
24149 ],
24150 );
24151 }
24152}
24153
24154impl<U3: Into<Imm>> VfwmsacVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24155 fn vfwmsac_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24156 self.emit_n(
24157 Opcode::VFWMSACVV as i64,
24158 &[
24159 vd.as_operand(),
24160 vs1.as_operand(),
24161 vs2.as_operand(),
24162 Into::<Imm>::into(vm).as_operand(),
24163 ],
24164 );
24165 }
24166}
24167
24168impl<U3: Into<Imm>> VfwmulVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
24169 fn vfwmul_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
24170 self.emit_n(
24171 Opcode::VFWMULVF as i64,
24172 &[
24173 vd.as_operand(),
24174 vs2.as_operand(),
24175 rs1.as_operand(),
24176 Into::<Imm>::into(vm).as_operand(),
24177 ],
24178 );
24179 }
24180}
24181
24182impl<U3: Into<Imm>> VfwmulVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24183 fn vfwmul_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24184 self.emit_n(
24185 Opcode::VFWMULVV as i64,
24186 &[
24187 vd.as_operand(),
24188 vs1.as_operand(),
24189 vs2.as_operand(),
24190 Into::<Imm>::into(vm).as_operand(),
24191 ],
24192 );
24193 }
24194}
24195
24196impl<U3: Into<Imm>> VfwnmaccVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
24197 fn vfwnmacc_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
24198 self.emit_n(
24199 Opcode::VFWNMACCVF as i64,
24200 &[
24201 vd.as_operand(),
24202 vs2.as_operand(),
24203 rs1.as_operand(),
24204 Into::<Imm>::into(vm).as_operand(),
24205 ],
24206 );
24207 }
24208}
24209
24210impl<U3: Into<Imm>> VfwnmaccVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24211 fn vfwnmacc_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24212 self.emit_n(
24213 Opcode::VFWNMACCVV as i64,
24214 &[
24215 vd.as_operand(),
24216 vs1.as_operand(),
24217 vs2.as_operand(),
24218 Into::<Imm>::into(vm).as_operand(),
24219 ],
24220 );
24221 }
24222}
24223
24224impl<U3: Into<Imm>> VfwnmsacVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
24225 fn vfwnmsac_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
24226 self.emit_n(
24227 Opcode::VFWNMSACVF as i64,
24228 &[
24229 vd.as_operand(),
24230 vs2.as_operand(),
24231 rs1.as_operand(),
24232 Into::<Imm>::into(vm).as_operand(),
24233 ],
24234 );
24235 }
24236}
24237
24238impl<U3: Into<Imm>> VfwnmsacVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24239 fn vfwnmsac_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24240 self.emit_n(
24241 Opcode::VFWNMSACVV as i64,
24242 &[
24243 vd.as_operand(),
24244 vs1.as_operand(),
24245 vs2.as_operand(),
24246 Into::<Imm>::into(vm).as_operand(),
24247 ],
24248 );
24249 }
24250}
24251
24252impl<U3: Into<Imm>> VfwredosumVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24253 fn vfwredosum_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24254 self.emit_n(
24255 Opcode::VFWREDOSUMVS as i64,
24256 &[
24257 vd.as_operand(),
24258 vs1.as_operand(),
24259 vs2.as_operand(),
24260 Into::<Imm>::into(vm).as_operand(),
24261 ],
24262 );
24263 }
24264}
24265
24266impl<U3: Into<Imm>> VfwredsumVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24267 fn vfwredsum_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24268 self.emit_n(
24269 Opcode::VFWREDSUMVS as i64,
24270 &[
24271 vd.as_operand(),
24272 vs1.as_operand(),
24273 vs2.as_operand(),
24274 Into::<Imm>::into(vm).as_operand(),
24275 ],
24276 );
24277 }
24278}
24279
24280impl<U3: Into<Imm>> VfwredusumVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24281 fn vfwredusum_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24282 self.emit_n(
24283 Opcode::VFWREDUSUMVS as i64,
24284 &[
24285 vd.as_operand(),
24286 vs1.as_operand(),
24287 vs2.as_operand(),
24288 Into::<Imm>::into(vm).as_operand(),
24289 ],
24290 );
24291 }
24292}
24293
24294impl<U3: Into<Imm>> VfwsubVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
24295 fn vfwsub_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
24296 self.emit_n(
24297 Opcode::VFWSUBVF as i64,
24298 &[
24299 vd.as_operand(),
24300 vs2.as_operand(),
24301 rs1.as_operand(),
24302 Into::<Imm>::into(vm).as_operand(),
24303 ],
24304 );
24305 }
24306}
24307
24308impl<U3: Into<Imm>> VfwsubVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24309 fn vfwsub_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24310 self.emit_n(
24311 Opcode::VFWSUBVV as i64,
24312 &[
24313 vd.as_operand(),
24314 vs1.as_operand(),
24315 vs2.as_operand(),
24316 Into::<Imm>::into(vm).as_operand(),
24317 ],
24318 );
24319 }
24320}
24321
24322impl<U3: Into<Imm>> VfwsubWfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
24323 fn vfwsub_wf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
24324 self.emit_n(
24325 Opcode::VFWSUBWF as i64,
24326 &[
24327 vd.as_operand(),
24328 vs2.as_operand(),
24329 rs1.as_operand(),
24330 Into::<Imm>::into(vm).as_operand(),
24331 ],
24332 );
24333 }
24334}
24335
24336impl<U3: Into<Imm>> VfwsubWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24337 fn vfwsub_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24338 self.emit_n(
24339 Opcode::VFWSUBWV as i64,
24340 &[
24341 vd.as_operand(),
24342 vs1.as_operand(),
24343 vs2.as_operand(),
24344 Into::<Imm>::into(vm).as_operand(),
24345 ],
24346 );
24347 }
24348}
24349
24350impl VghshVvEmitter<Vp, Vp, Vp> for Assembler<'_> {
24351 fn vghsh_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
24352 self.emit_n(
24353 Opcode::VGHSHVV as i64,
24354 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
24355 );
24356 }
24357}
24358
24359impl VgmulVvEmitter<Vp, Vp> for Assembler<'_> {
24360 fn vgmul_vv(&mut self, vd: Vp, vs2: Vp) {
24361 self.emit_n(Opcode::VGMULVV as i64, &[vd.as_operand(), vs2.as_operand()]);
24362 }
24363}
24364
24365impl<U1: Into<Imm>> VidVEmitter<Vp, U1> for Assembler<'_> {
24366 fn vid_v(&mut self, vd: Vp, vm: U1) {
24367 self.emit_n(
24368 Opcode::VIDV as i64,
24369 &[vd.as_operand(), Into::<Imm>::into(vm).as_operand()],
24370 );
24371 }
24372}
24373
24374impl<U2: Into<Imm>> ViotaMEmitter<Vp, Vp, U2> for Assembler<'_> {
24375 fn viota_m(&mut self, vd: Vp, vs2: Vp, vm: U2) {
24376 self.emit_n(
24377 Opcode::VIOTAM as i64,
24378 &[
24379 vd.as_operand(),
24380 vs2.as_operand(),
24381 Into::<Imm>::into(vm).as_operand(),
24382 ],
24383 );
24384 }
24385}
24386
24387impl Vl1RVEmitter<Vp, Gp> for Assembler<'_> {
24388 fn vl1r_v(&mut self, vd: Vp, rs1: Gp) {
24389 self.emit_n(Opcode::VL1RV as i64, &[vd.as_operand(), rs1.as_operand()]);
24390 }
24391}
24392
24393impl Vl1Re16VEmitter<Vp, Gp> for Assembler<'_> {
24394 fn vl1re16_v(&mut self, vd: Vp, rs1: Gp) {
24395 self.emit_n(
24396 Opcode::VL1RE16V as i64,
24397 &[vd.as_operand(), rs1.as_operand()],
24398 );
24399 }
24400}
24401
24402impl Vl1Re32VEmitter<Vp, Gp> for Assembler<'_> {
24403 fn vl1re32_v(&mut self, vd: Vp, rs1: Gp) {
24404 self.emit_n(
24405 Opcode::VL1RE32V as i64,
24406 &[vd.as_operand(), rs1.as_operand()],
24407 );
24408 }
24409}
24410
24411impl Vl1Re64VEmitter<Vp, Gp> for Assembler<'_> {
24412 fn vl1re64_v(&mut self, vd: Vp, rs1: Gp) {
24413 self.emit_n(
24414 Opcode::VL1RE64V as i64,
24415 &[vd.as_operand(), rs1.as_operand()],
24416 );
24417 }
24418}
24419
24420impl Vl1Re8VEmitter<Vp, Gp> for Assembler<'_> {
24421 fn vl1re8_v(&mut self, vd: Vp, rs1: Gp) {
24422 self.emit_n(Opcode::VL1RE8V as i64, &[vd.as_operand(), rs1.as_operand()]);
24423 }
24424}
24425
24426impl Vl2RVEmitter<Vp, Gp> for Assembler<'_> {
24427 fn vl2r_v(&mut self, vd: Vp, rs1: Gp) {
24428 self.emit_n(Opcode::VL2RV as i64, &[vd.as_operand(), rs1.as_operand()]);
24429 }
24430}
24431
24432impl Vl2Re16VEmitter<Vp, Gp> for Assembler<'_> {
24433 fn vl2re16_v(&mut self, vd: Vp, rs1: Gp) {
24434 self.emit_n(
24435 Opcode::VL2RE16V as i64,
24436 &[vd.as_operand(), rs1.as_operand()],
24437 );
24438 }
24439}
24440
24441impl Vl2Re32VEmitter<Vp, Gp> for Assembler<'_> {
24442 fn vl2re32_v(&mut self, vd: Vp, rs1: Gp) {
24443 self.emit_n(
24444 Opcode::VL2RE32V as i64,
24445 &[vd.as_operand(), rs1.as_operand()],
24446 );
24447 }
24448}
24449
24450impl Vl2Re64VEmitter<Vp, Gp> for Assembler<'_> {
24451 fn vl2re64_v(&mut self, vd: Vp, rs1: Gp) {
24452 self.emit_n(
24453 Opcode::VL2RE64V as i64,
24454 &[vd.as_operand(), rs1.as_operand()],
24455 );
24456 }
24457}
24458
24459impl Vl2Re8VEmitter<Vp, Gp> for Assembler<'_> {
24460 fn vl2re8_v(&mut self, vd: Vp, rs1: Gp) {
24461 self.emit_n(Opcode::VL2RE8V as i64, &[vd.as_operand(), rs1.as_operand()]);
24462 }
24463}
24464
24465impl Vl4RVEmitter<Vp, Gp> for Assembler<'_> {
24466 fn vl4r_v(&mut self, vd: Vp, rs1: Gp) {
24467 self.emit_n(Opcode::VL4RV as i64, &[vd.as_operand(), rs1.as_operand()]);
24468 }
24469}
24470
24471impl Vl4Re16VEmitter<Vp, Gp> for Assembler<'_> {
24472 fn vl4re16_v(&mut self, vd: Vp, rs1: Gp) {
24473 self.emit_n(
24474 Opcode::VL4RE16V as i64,
24475 &[vd.as_operand(), rs1.as_operand()],
24476 );
24477 }
24478}
24479
24480impl Vl4Re32VEmitter<Vp, Gp> for Assembler<'_> {
24481 fn vl4re32_v(&mut self, vd: Vp, rs1: Gp) {
24482 self.emit_n(
24483 Opcode::VL4RE32V as i64,
24484 &[vd.as_operand(), rs1.as_operand()],
24485 );
24486 }
24487}
24488
24489impl Vl4Re64VEmitter<Vp, Gp> for Assembler<'_> {
24490 fn vl4re64_v(&mut self, vd: Vp, rs1: Gp) {
24491 self.emit_n(
24492 Opcode::VL4RE64V as i64,
24493 &[vd.as_operand(), rs1.as_operand()],
24494 );
24495 }
24496}
24497
24498impl Vl4Re8VEmitter<Vp, Gp> for Assembler<'_> {
24499 fn vl4re8_v(&mut self, vd: Vp, rs1: Gp) {
24500 self.emit_n(Opcode::VL4RE8V as i64, &[vd.as_operand(), rs1.as_operand()]);
24501 }
24502}
24503
24504impl Vl8RVEmitter<Vp, Gp> for Assembler<'_> {
24505 fn vl8r_v(&mut self, vd: Vp, rs1: Gp) {
24506 self.emit_n(Opcode::VL8RV as i64, &[vd.as_operand(), rs1.as_operand()]);
24507 }
24508}
24509
24510impl Vl8Re16VEmitter<Vp, Gp> for Assembler<'_> {
24511 fn vl8re16_v(&mut self, vd: Vp, rs1: Gp) {
24512 self.emit_n(
24513 Opcode::VL8RE16V as i64,
24514 &[vd.as_operand(), rs1.as_operand()],
24515 );
24516 }
24517}
24518
24519impl Vl8Re32VEmitter<Vp, Gp> for Assembler<'_> {
24520 fn vl8re32_v(&mut self, vd: Vp, rs1: Gp) {
24521 self.emit_n(
24522 Opcode::VL8RE32V as i64,
24523 &[vd.as_operand(), rs1.as_operand()],
24524 );
24525 }
24526}
24527
24528impl Vl8Re64VEmitter<Vp, Gp> for Assembler<'_> {
24529 fn vl8re64_v(&mut self, vd: Vp, rs1: Gp) {
24530 self.emit_n(
24531 Opcode::VL8RE64V as i64,
24532 &[vd.as_operand(), rs1.as_operand()],
24533 );
24534 }
24535}
24536
24537impl Vl8Re8VEmitter<Vp, Gp> for Assembler<'_> {
24538 fn vl8re8_v(&mut self, vd: Vp, rs1: Gp) {
24539 self.emit_n(Opcode::VL8RE8V as i64, &[vd.as_operand(), rs1.as_operand()]);
24540 }
24541}
24542
24543impl<U2: Into<Imm>, U3: Into<Imm>> Vle16VEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
24544 fn vle16_v(&mut self, vd: Vp, rs1: Gp, vm: U2, nf: U3) {
24545 self.emit_n(
24546 Opcode::VLE16V as i64,
24547 &[
24548 vd.as_operand(),
24549 rs1.as_operand(),
24550 Into::<Imm>::into(vm).as_operand(),
24551 Into::<Imm>::into(nf).as_operand(),
24552 ],
24553 );
24554 }
24555}
24556
24557impl<U2: Into<Imm>, U3: Into<Imm>> Vle16FfVEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
24558 fn vle16ff_v(&mut self, vd: Vp, rs1: Gp, vm: U2, nf: U3) {
24559 self.emit_n(
24560 Opcode::VLE16FFV as i64,
24561 &[
24562 vd.as_operand(),
24563 rs1.as_operand(),
24564 Into::<Imm>::into(vm).as_operand(),
24565 Into::<Imm>::into(nf).as_operand(),
24566 ],
24567 );
24568 }
24569}
24570
24571impl Vle1VEmitter<Vp, Gp> for Assembler<'_> {
24572 fn vle1_v(&mut self, vd: Vp, rs1: Gp) {
24573 self.emit_n(Opcode::VLE1V as i64, &[vd.as_operand(), rs1.as_operand()]);
24574 }
24575}
24576
24577impl<U2: Into<Imm>, U3: Into<Imm>> Vle32VEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
24578 fn vle32_v(&mut self, vd: Vp, rs1: Gp, vm: U2, nf: U3) {
24579 self.emit_n(
24580 Opcode::VLE32V as i64,
24581 &[
24582 vd.as_operand(),
24583 rs1.as_operand(),
24584 Into::<Imm>::into(vm).as_operand(),
24585 Into::<Imm>::into(nf).as_operand(),
24586 ],
24587 );
24588 }
24589}
24590
24591impl<U2: Into<Imm>, U3: Into<Imm>> Vle32FfVEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
24592 fn vle32ff_v(&mut self, vd: Vp, rs1: Gp, vm: U2, nf: U3) {
24593 self.emit_n(
24594 Opcode::VLE32FFV as i64,
24595 &[
24596 vd.as_operand(),
24597 rs1.as_operand(),
24598 Into::<Imm>::into(vm).as_operand(),
24599 Into::<Imm>::into(nf).as_operand(),
24600 ],
24601 );
24602 }
24603}
24604
24605impl<U2: Into<Imm>, U3: Into<Imm>> Vle64VEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
24606 fn vle64_v(&mut self, vd: Vp, rs1: Gp, vm: U2, nf: U3) {
24607 self.emit_n(
24608 Opcode::VLE64V as i64,
24609 &[
24610 vd.as_operand(),
24611 rs1.as_operand(),
24612 Into::<Imm>::into(vm).as_operand(),
24613 Into::<Imm>::into(nf).as_operand(),
24614 ],
24615 );
24616 }
24617}
24618
24619impl<U2: Into<Imm>, U3: Into<Imm>> Vle64FfVEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
24620 fn vle64ff_v(&mut self, vd: Vp, rs1: Gp, vm: U2, nf: U3) {
24621 self.emit_n(
24622 Opcode::VLE64FFV as i64,
24623 &[
24624 vd.as_operand(),
24625 rs1.as_operand(),
24626 Into::<Imm>::into(vm).as_operand(),
24627 Into::<Imm>::into(nf).as_operand(),
24628 ],
24629 );
24630 }
24631}
24632
24633impl<U2: Into<Imm>, U3: Into<Imm>> Vle8VEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
24634 fn vle8_v(&mut self, vd: Vp, rs1: Gp, vm: U2, nf: U3) {
24635 self.emit_n(
24636 Opcode::VLE8V as i64,
24637 &[
24638 vd.as_operand(),
24639 rs1.as_operand(),
24640 Into::<Imm>::into(vm).as_operand(),
24641 Into::<Imm>::into(nf).as_operand(),
24642 ],
24643 );
24644 }
24645}
24646
24647impl<U2: Into<Imm>, U3: Into<Imm>> Vle8FfVEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
24648 fn vle8ff_v(&mut self, vd: Vp, rs1: Gp, vm: U2, nf: U3) {
24649 self.emit_n(
24650 Opcode::VLE8FFV as i64,
24651 &[
24652 vd.as_operand(),
24653 rs1.as_operand(),
24654 Into::<Imm>::into(vm).as_operand(),
24655 Into::<Imm>::into(nf).as_operand(),
24656 ],
24657 );
24658 }
24659}
24660
24661impl VlmVEmitter<Vp, Gp> for Assembler<'_> {
24662 fn vlm_v(&mut self, vd: Vp, rs1: Gp) {
24663 self.emit_n(Opcode::VLMV as i64, &[vd.as_operand(), rs1.as_operand()]);
24664 }
24665}
24666
24667impl<U3: Into<Imm>, U4: Into<Imm>> Vloxei16VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
24668 fn vloxei16_v(&mut self, vd: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
24669 self.emit_n(
24670 Opcode::VLOXEI16V as i64,
24671 &[
24672 vd.as_operand(),
24673 rs1.as_operand(),
24674 vs2.as_operand(),
24675 Into::<Imm>::into(vm).as_operand(),
24676 Into::<Imm>::into(nf).as_operand(),
24677 ],
24678 );
24679 }
24680}
24681
24682impl<U3: Into<Imm>, U4: Into<Imm>> Vloxei32VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
24683 fn vloxei32_v(&mut self, vd: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
24684 self.emit_n(
24685 Opcode::VLOXEI32V as i64,
24686 &[
24687 vd.as_operand(),
24688 rs1.as_operand(),
24689 vs2.as_operand(),
24690 Into::<Imm>::into(vm).as_operand(),
24691 Into::<Imm>::into(nf).as_operand(),
24692 ],
24693 );
24694 }
24695}
24696
24697impl<U3: Into<Imm>, U4: Into<Imm>> Vloxei64VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
24698 fn vloxei64_v(&mut self, vd: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
24699 self.emit_n(
24700 Opcode::VLOXEI64V as i64,
24701 &[
24702 vd.as_operand(),
24703 rs1.as_operand(),
24704 vs2.as_operand(),
24705 Into::<Imm>::into(vm).as_operand(),
24706 Into::<Imm>::into(nf).as_operand(),
24707 ],
24708 );
24709 }
24710}
24711
24712impl<U3: Into<Imm>, U4: Into<Imm>> Vloxei8VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
24713 fn vloxei8_v(&mut self, vd: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
24714 self.emit_n(
24715 Opcode::VLOXEI8V as i64,
24716 &[
24717 vd.as_operand(),
24718 rs1.as_operand(),
24719 vs2.as_operand(),
24720 Into::<Imm>::into(vm).as_operand(),
24721 Into::<Imm>::into(nf).as_operand(),
24722 ],
24723 );
24724 }
24725}
24726
24727impl<U3: Into<Imm>, U4: Into<Imm>> Vlse16VEmitter<Vp, Gp, Gp, U3, U4> for Assembler<'_> {
24728 fn vlse16_v(&mut self, vd: Vp, rs1: Gp, rs2: Gp, vm: U3, nf: U4) {
24729 self.emit_n(
24730 Opcode::VLSE16V as i64,
24731 &[
24732 vd.as_operand(),
24733 rs1.as_operand(),
24734 rs2.as_operand(),
24735 Into::<Imm>::into(vm).as_operand(),
24736 Into::<Imm>::into(nf).as_operand(),
24737 ],
24738 );
24739 }
24740}
24741
24742impl<U3: Into<Imm>, U4: Into<Imm>> Vlse32VEmitter<Vp, Gp, Gp, U3, U4> for Assembler<'_> {
24743 fn vlse32_v(&mut self, vd: Vp, rs1: Gp, rs2: Gp, vm: U3, nf: U4) {
24744 self.emit_n(
24745 Opcode::VLSE32V as i64,
24746 &[
24747 vd.as_operand(),
24748 rs1.as_operand(),
24749 rs2.as_operand(),
24750 Into::<Imm>::into(vm).as_operand(),
24751 Into::<Imm>::into(nf).as_operand(),
24752 ],
24753 );
24754 }
24755}
24756
24757impl<U3: Into<Imm>, U4: Into<Imm>> Vlse64VEmitter<Vp, Gp, Gp, U3, U4> for Assembler<'_> {
24758 fn vlse64_v(&mut self, vd: Vp, rs1: Gp, rs2: Gp, vm: U3, nf: U4) {
24759 self.emit_n(
24760 Opcode::VLSE64V as i64,
24761 &[
24762 vd.as_operand(),
24763 rs1.as_operand(),
24764 rs2.as_operand(),
24765 Into::<Imm>::into(vm).as_operand(),
24766 Into::<Imm>::into(nf).as_operand(),
24767 ],
24768 );
24769 }
24770}
24771
24772impl<U3: Into<Imm>, U4: Into<Imm>> Vlse8VEmitter<Vp, Gp, Gp, U3, U4> for Assembler<'_> {
24773 fn vlse8_v(&mut self, vd: Vp, rs1: Gp, rs2: Gp, vm: U3, nf: U4) {
24774 self.emit_n(
24775 Opcode::VLSE8V as i64,
24776 &[
24777 vd.as_operand(),
24778 rs1.as_operand(),
24779 rs2.as_operand(),
24780 Into::<Imm>::into(vm).as_operand(),
24781 Into::<Imm>::into(nf).as_operand(),
24782 ],
24783 );
24784 }
24785}
24786
24787impl<U3: Into<Imm>, U4: Into<Imm>> Vluxei16VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
24788 fn vluxei16_v(&mut self, vd: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
24789 self.emit_n(
24790 Opcode::VLUXEI16V as i64,
24791 &[
24792 vd.as_operand(),
24793 rs1.as_operand(),
24794 vs2.as_operand(),
24795 Into::<Imm>::into(vm).as_operand(),
24796 Into::<Imm>::into(nf).as_operand(),
24797 ],
24798 );
24799 }
24800}
24801
24802impl<U3: Into<Imm>, U4: Into<Imm>> Vluxei32VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
24803 fn vluxei32_v(&mut self, vd: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
24804 self.emit_n(
24805 Opcode::VLUXEI32V as i64,
24806 &[
24807 vd.as_operand(),
24808 rs1.as_operand(),
24809 vs2.as_operand(),
24810 Into::<Imm>::into(vm).as_operand(),
24811 Into::<Imm>::into(nf).as_operand(),
24812 ],
24813 );
24814 }
24815}
24816
24817impl<U3: Into<Imm>, U4: Into<Imm>> Vluxei64VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
24818 fn vluxei64_v(&mut self, vd: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
24819 self.emit_n(
24820 Opcode::VLUXEI64V as i64,
24821 &[
24822 vd.as_operand(),
24823 rs1.as_operand(),
24824 vs2.as_operand(),
24825 Into::<Imm>::into(vm).as_operand(),
24826 Into::<Imm>::into(nf).as_operand(),
24827 ],
24828 );
24829 }
24830}
24831
24832impl<U3: Into<Imm>, U4: Into<Imm>> Vluxei8VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
24833 fn vluxei8_v(&mut self, vd: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
24834 self.emit_n(
24835 Opcode::VLUXEI8V as i64,
24836 &[
24837 vd.as_operand(),
24838 rs1.as_operand(),
24839 vs2.as_operand(),
24840 Into::<Imm>::into(vm).as_operand(),
24841 Into::<Imm>::into(nf).as_operand(),
24842 ],
24843 );
24844 }
24845}
24846
24847impl<U3: Into<Imm>> VmaccVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24848 fn vmacc_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24849 self.emit_n(
24850 Opcode::VMACCVV as i64,
24851 &[
24852 vd.as_operand(),
24853 vs1.as_operand(),
24854 vs2.as_operand(),
24855 Into::<Imm>::into(vm).as_operand(),
24856 ],
24857 );
24858 }
24859}
24860
24861impl<U3: Into<Imm>> VmaccVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
24862 fn vmacc_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
24863 self.emit_n(
24864 Opcode::VMACCVX as i64,
24865 &[
24866 vd.as_operand(),
24867 vs2.as_operand(),
24868 rs1.as_operand(),
24869 Into::<Imm>::into(vm).as_operand(),
24870 ],
24871 );
24872 }
24873}
24874
24875impl<U2: Into<Imm>> VmadcViEmitter<Vp, Vp, U2> for Assembler<'_> {
24876 fn vmadc_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2) {
24877 self.emit_n(
24878 Opcode::VMADCVI as i64,
24879 &[
24880 vd.as_operand(),
24881 vs2.as_operand(),
24882 Into::<Imm>::into(simm5).as_operand(),
24883 ],
24884 );
24885 }
24886}
24887
24888impl<U2: Into<Imm>> VmadcVimEmitter<Vp, Vp, U2> for Assembler<'_> {
24889 fn vmadc_vim(&mut self, vd: Vp, vs2: Vp, simm5: U2) {
24890 self.emit_n(
24891 Opcode::VMADCVIM as i64,
24892 &[
24893 vd.as_operand(),
24894 vs2.as_operand(),
24895 Into::<Imm>::into(simm5).as_operand(),
24896 ],
24897 );
24898 }
24899}
24900
24901impl VmadcVvEmitter<Vp, Vp, Vp> for Assembler<'_> {
24902 fn vmadc_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
24903 self.emit_n(
24904 Opcode::VMADCVV as i64,
24905 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
24906 );
24907 }
24908}
24909
24910impl VmadcVvmEmitter<Vp, Vp, Vp> for Assembler<'_> {
24911 fn vmadc_vvm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
24912 self.emit_n(
24913 Opcode::VMADCVVM as i64,
24914 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
24915 );
24916 }
24917}
24918
24919impl VmadcVxEmitter<Vp, Gp, Vp> for Assembler<'_> {
24920 fn vmadc_vx(&mut self, vd: Vp, rs1: Gp, vs2: Vp) {
24921 self.emit_n(
24922 Opcode::VMADCVX as i64,
24923 &[vd.as_operand(), rs1.as_operand(), vs2.as_operand()],
24924 );
24925 }
24926}
24927
24928impl VmadcVxmEmitter<Vp, Gp, Vp> for Assembler<'_> {
24929 fn vmadc_vxm(&mut self, vd: Vp, rs1: Gp, vs2: Vp) {
24930 self.emit_n(
24931 Opcode::VMADCVXM as i64,
24932 &[vd.as_operand(), rs1.as_operand(), vs2.as_operand()],
24933 );
24934 }
24935}
24936
24937impl<U3: Into<Imm>> VmaddVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24938 fn vmadd_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24939 self.emit_n(
24940 Opcode::VMADDVV as i64,
24941 &[
24942 vd.as_operand(),
24943 vs1.as_operand(),
24944 vs2.as_operand(),
24945 Into::<Imm>::into(vm).as_operand(),
24946 ],
24947 );
24948 }
24949}
24950
24951impl<U3: Into<Imm>> VmaddVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
24952 fn vmadd_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
24953 self.emit_n(
24954 Opcode::VMADDVX as i64,
24955 &[
24956 vd.as_operand(),
24957 vs2.as_operand(),
24958 rs1.as_operand(),
24959 Into::<Imm>::into(vm).as_operand(),
24960 ],
24961 );
24962 }
24963}
24964
24965impl VmandMmEmitter<Vp, Vp, Vp> for Assembler<'_> {
24966 fn vmand_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
24967 self.emit_n(
24968 Opcode::VMANDMM as i64,
24969 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
24970 );
24971 }
24972}
24973
24974impl VmandnMmEmitter<Vp, Vp, Vp> for Assembler<'_> {
24975 fn vmandn_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
24976 self.emit_n(
24977 Opcode::VMANDNMM as i64,
24978 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
24979 );
24980 }
24981}
24982
24983impl<U3: Into<Imm>> VmandnotMmEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24984 fn vmandnot_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24985 self.emit_n(
24986 Opcode::VMANDNOTMM as i64,
24987 &[
24988 vd.as_operand(),
24989 vs1.as_operand(),
24990 vs2.as_operand(),
24991 Into::<Imm>::into(vm).as_operand(),
24992 ],
24993 );
24994 }
24995}
24996
24997impl<U3: Into<Imm>> VmaxVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
24998 fn vmax_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
24999 self.emit_n(
25000 Opcode::VMAXVV as i64,
25001 &[
25002 vd.as_operand(),
25003 vs1.as_operand(),
25004 vs2.as_operand(),
25005 Into::<Imm>::into(vm).as_operand(),
25006 ],
25007 );
25008 }
25009}
25010
25011impl<U3: Into<Imm>> VmaxVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25012 fn vmax_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25013 self.emit_n(
25014 Opcode::VMAXVX as i64,
25015 &[
25016 vd.as_operand(),
25017 vs2.as_operand(),
25018 rs1.as_operand(),
25019 Into::<Imm>::into(vm).as_operand(),
25020 ],
25021 );
25022 }
25023}
25024
25025impl<U3: Into<Imm>> VmaxuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25026 fn vmaxu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25027 self.emit_n(
25028 Opcode::VMAXUVV as i64,
25029 &[
25030 vd.as_operand(),
25031 vs1.as_operand(),
25032 vs2.as_operand(),
25033 Into::<Imm>::into(vm).as_operand(),
25034 ],
25035 );
25036 }
25037}
25038
25039impl<U3: Into<Imm>> VmaxuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25040 fn vmaxu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25041 self.emit_n(
25042 Opcode::VMAXUVX as i64,
25043 &[
25044 vd.as_operand(),
25045 vs2.as_operand(),
25046 rs1.as_operand(),
25047 Into::<Imm>::into(vm).as_operand(),
25048 ],
25049 );
25050 }
25051}
25052
25053impl<U2: Into<Imm>> VmergeVimEmitter<Vp, Vp, U2> for Assembler<'_> {
25054 fn vmerge_vim(&mut self, vd: Vp, vs2: Vp, simm5: U2) {
25055 self.emit_n(
25056 Opcode::VMERGEVIM as i64,
25057 &[
25058 vd.as_operand(),
25059 vs2.as_operand(),
25060 Into::<Imm>::into(simm5).as_operand(),
25061 ],
25062 );
25063 }
25064}
25065
25066impl VmergeVvmEmitter<Vp, Vp, Vp> for Assembler<'_> {
25067 fn vmerge_vvm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
25068 self.emit_n(
25069 Opcode::VMERGEVVM as i64,
25070 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
25071 );
25072 }
25073}
25074
25075impl VmergeVxmEmitter<Vp, Gp, Vp> for Assembler<'_> {
25076 fn vmerge_vxm(&mut self, vd: Vp, rs1: Gp, vs2: Vp) {
25077 self.emit_n(
25078 Opcode::VMERGEVXM as i64,
25079 &[vd.as_operand(), rs1.as_operand(), vs2.as_operand()],
25080 );
25081 }
25082}
25083
25084impl<U3: Into<Imm>> VmfeqVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
25085 fn vmfeq_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
25086 self.emit_n(
25087 Opcode::VMFEQVF as i64,
25088 &[
25089 vd.as_operand(),
25090 vs2.as_operand(),
25091 rs1.as_operand(),
25092 Into::<Imm>::into(vm).as_operand(),
25093 ],
25094 );
25095 }
25096}
25097
25098impl<U3: Into<Imm>> VmfeqVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25099 fn vmfeq_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25100 self.emit_n(
25101 Opcode::VMFEQVV as i64,
25102 &[
25103 vd.as_operand(),
25104 vs1.as_operand(),
25105 vs2.as_operand(),
25106 Into::<Imm>::into(vm).as_operand(),
25107 ],
25108 );
25109 }
25110}
25111
25112impl<U3: Into<Imm>> VmfgeVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
25113 fn vmfge_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
25114 self.emit_n(
25115 Opcode::VMFGEVF as i64,
25116 &[
25117 vd.as_operand(),
25118 vs2.as_operand(),
25119 rs1.as_operand(),
25120 Into::<Imm>::into(vm).as_operand(),
25121 ],
25122 );
25123 }
25124}
25125
25126impl<U3: Into<Imm>> VmfgtVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
25127 fn vmfgt_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
25128 self.emit_n(
25129 Opcode::VMFGTVF as i64,
25130 &[
25131 vd.as_operand(),
25132 vs2.as_operand(),
25133 rs1.as_operand(),
25134 Into::<Imm>::into(vm).as_operand(),
25135 ],
25136 );
25137 }
25138}
25139
25140impl<U3: Into<Imm>> VmfleVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
25141 fn vmfle_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
25142 self.emit_n(
25143 Opcode::VMFLEVF as i64,
25144 &[
25145 vd.as_operand(),
25146 vs2.as_operand(),
25147 rs1.as_operand(),
25148 Into::<Imm>::into(vm).as_operand(),
25149 ],
25150 );
25151 }
25152}
25153
25154impl<U3: Into<Imm>> VmfleVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25155 fn vmfle_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25156 self.emit_n(
25157 Opcode::VMFLEVV as i64,
25158 &[
25159 vd.as_operand(),
25160 vs1.as_operand(),
25161 vs2.as_operand(),
25162 Into::<Imm>::into(vm).as_operand(),
25163 ],
25164 );
25165 }
25166}
25167
25168impl<U3: Into<Imm>> VmfltVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
25169 fn vmflt_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
25170 self.emit_n(
25171 Opcode::VMFLTVF as i64,
25172 &[
25173 vd.as_operand(),
25174 vs2.as_operand(),
25175 rs1.as_operand(),
25176 Into::<Imm>::into(vm).as_operand(),
25177 ],
25178 );
25179 }
25180}
25181
25182impl<U3: Into<Imm>> VmfltVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25183 fn vmflt_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25184 self.emit_n(
25185 Opcode::VMFLTVV as i64,
25186 &[
25187 vd.as_operand(),
25188 vs1.as_operand(),
25189 vs2.as_operand(),
25190 Into::<Imm>::into(vm).as_operand(),
25191 ],
25192 );
25193 }
25194}
25195
25196impl<U3: Into<Imm>> VmfneVfEmitter<Vp, Vp, Fp, U3> for Assembler<'_> {
25197 fn vmfne_vf(&mut self, vd: Vp, vs2: Vp, rs1: Fp, vm: U3) {
25198 self.emit_n(
25199 Opcode::VMFNEVF as i64,
25200 &[
25201 vd.as_operand(),
25202 vs2.as_operand(),
25203 rs1.as_operand(),
25204 Into::<Imm>::into(vm).as_operand(),
25205 ],
25206 );
25207 }
25208}
25209
25210impl<U3: Into<Imm>> VmfneVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25211 fn vmfne_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25212 self.emit_n(
25213 Opcode::VMFNEVV as i64,
25214 &[
25215 vd.as_operand(),
25216 vs1.as_operand(),
25217 vs2.as_operand(),
25218 Into::<Imm>::into(vm).as_operand(),
25219 ],
25220 );
25221 }
25222}
25223
25224impl<U3: Into<Imm>> VminVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25225 fn vmin_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25226 self.emit_n(
25227 Opcode::VMINVV as i64,
25228 &[
25229 vd.as_operand(),
25230 vs1.as_operand(),
25231 vs2.as_operand(),
25232 Into::<Imm>::into(vm).as_operand(),
25233 ],
25234 );
25235 }
25236}
25237
25238impl<U3: Into<Imm>> VminVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25239 fn vmin_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25240 self.emit_n(
25241 Opcode::VMINVX as i64,
25242 &[
25243 vd.as_operand(),
25244 vs2.as_operand(),
25245 rs1.as_operand(),
25246 Into::<Imm>::into(vm).as_operand(),
25247 ],
25248 );
25249 }
25250}
25251
25252impl<U3: Into<Imm>> VminuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25253 fn vminu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25254 self.emit_n(
25255 Opcode::VMINUVV as i64,
25256 &[
25257 vd.as_operand(),
25258 vs1.as_operand(),
25259 vs2.as_operand(),
25260 Into::<Imm>::into(vm).as_operand(),
25261 ],
25262 );
25263 }
25264}
25265
25266impl<U3: Into<Imm>> VminuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25267 fn vminu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25268 self.emit_n(
25269 Opcode::VMINUVX as i64,
25270 &[
25271 vd.as_operand(),
25272 vs2.as_operand(),
25273 rs1.as_operand(),
25274 Into::<Imm>::into(vm).as_operand(),
25275 ],
25276 );
25277 }
25278}
25279
25280impl VmnandMmEmitter<Vp, Vp, Vp> for Assembler<'_> {
25281 fn vmnand_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
25282 self.emit_n(
25283 Opcode::VMNANDMM as i64,
25284 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
25285 );
25286 }
25287}
25288
25289impl VmnorMmEmitter<Vp, Vp, Vp> for Assembler<'_> {
25290 fn vmnor_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
25291 self.emit_n(
25292 Opcode::VMNORMM as i64,
25293 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
25294 );
25295 }
25296}
25297
25298impl VmorMmEmitter<Vp, Vp, Vp> for Assembler<'_> {
25299 fn vmor_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
25300 self.emit_n(
25301 Opcode::VMORMM as i64,
25302 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
25303 );
25304 }
25305}
25306
25307impl VmornMmEmitter<Vp, Vp, Vp> for Assembler<'_> {
25308 fn vmorn_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
25309 self.emit_n(
25310 Opcode::VMORNMM as i64,
25311 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
25312 );
25313 }
25314}
25315
25316impl<U3: Into<Imm>> VmornotMmEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25317 fn vmornot_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25318 self.emit_n(
25319 Opcode::VMORNOTMM as i64,
25320 &[
25321 vd.as_operand(),
25322 vs1.as_operand(),
25323 vs2.as_operand(),
25324 Into::<Imm>::into(vm).as_operand(),
25325 ],
25326 );
25327 }
25328}
25329
25330impl VmsbcVvEmitter<Vp, Vp, Vp> for Assembler<'_> {
25331 fn vmsbc_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
25332 self.emit_n(
25333 Opcode::VMSBCVV as i64,
25334 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
25335 );
25336 }
25337}
25338
25339impl VmsbcVvmEmitter<Vp, Vp, Vp> for Assembler<'_> {
25340 fn vmsbc_vvm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
25341 self.emit_n(
25342 Opcode::VMSBCVVM as i64,
25343 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
25344 );
25345 }
25346}
25347
25348impl VmsbcVxEmitter<Vp, Gp, Vp> for Assembler<'_> {
25349 fn vmsbc_vx(&mut self, vd: Vp, rs1: Gp, vs2: Vp) {
25350 self.emit_n(
25351 Opcode::VMSBCVX as i64,
25352 &[vd.as_operand(), rs1.as_operand(), vs2.as_operand()],
25353 );
25354 }
25355}
25356
25357impl VmsbcVxmEmitter<Vp, Gp, Vp> for Assembler<'_> {
25358 fn vmsbc_vxm(&mut self, vd: Vp, rs1: Gp, vs2: Vp) {
25359 self.emit_n(
25360 Opcode::VMSBCVXM as i64,
25361 &[vd.as_operand(), rs1.as_operand(), vs2.as_operand()],
25362 );
25363 }
25364}
25365
25366impl<U2: Into<Imm>> VmsbfMEmitter<Vp, Vp, U2> for Assembler<'_> {
25367 fn vmsbf_m(&mut self, vd: Vp, vs2: Vp, vm: U2) {
25368 self.emit_n(
25369 Opcode::VMSBFM as i64,
25370 &[
25371 vd.as_operand(),
25372 vs2.as_operand(),
25373 Into::<Imm>::into(vm).as_operand(),
25374 ],
25375 );
25376 }
25377}
25378
25379impl<U2: Into<Imm>, U3: Into<Imm>> VmseqViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
25380 fn vmseq_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
25381 self.emit_n(
25382 Opcode::VMSEQVI as i64,
25383 &[
25384 vd.as_operand(),
25385 vs2.as_operand(),
25386 Into::<Imm>::into(simm5).as_operand(),
25387 Into::<Imm>::into(vm).as_operand(),
25388 ],
25389 );
25390 }
25391}
25392
25393impl<U3: Into<Imm>> VmseqVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25394 fn vmseq_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25395 self.emit_n(
25396 Opcode::VMSEQVV as i64,
25397 &[
25398 vd.as_operand(),
25399 vs1.as_operand(),
25400 vs2.as_operand(),
25401 Into::<Imm>::into(vm).as_operand(),
25402 ],
25403 );
25404 }
25405}
25406
25407impl<U3: Into<Imm>> VmseqVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25408 fn vmseq_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25409 self.emit_n(
25410 Opcode::VMSEQVX as i64,
25411 &[
25412 vd.as_operand(),
25413 vs2.as_operand(),
25414 rs1.as_operand(),
25415 Into::<Imm>::into(vm).as_operand(),
25416 ],
25417 );
25418 }
25419}
25420
25421impl<U2: Into<Imm>, U3: Into<Imm>> VmsgtViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
25422 fn vmsgt_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
25423 self.emit_n(
25424 Opcode::VMSGTVI as i64,
25425 &[
25426 vd.as_operand(),
25427 vs2.as_operand(),
25428 Into::<Imm>::into(simm5).as_operand(),
25429 Into::<Imm>::into(vm).as_operand(),
25430 ],
25431 );
25432 }
25433}
25434
25435impl<U3: Into<Imm>> VmsgtVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25436 fn vmsgt_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25437 self.emit_n(
25438 Opcode::VMSGTVX as i64,
25439 &[
25440 vd.as_operand(),
25441 vs2.as_operand(),
25442 rs1.as_operand(),
25443 Into::<Imm>::into(vm).as_operand(),
25444 ],
25445 );
25446 }
25447}
25448
25449impl<U2: Into<Imm>, U3: Into<Imm>> VmsgtuViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
25450 fn vmsgtu_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
25451 self.emit_n(
25452 Opcode::VMSGTUVI as i64,
25453 &[
25454 vd.as_operand(),
25455 vs2.as_operand(),
25456 Into::<Imm>::into(simm5).as_operand(),
25457 Into::<Imm>::into(vm).as_operand(),
25458 ],
25459 );
25460 }
25461}
25462
25463impl<U3: Into<Imm>> VmsgtuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25464 fn vmsgtu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25465 self.emit_n(
25466 Opcode::VMSGTUVX as i64,
25467 &[
25468 vd.as_operand(),
25469 vs2.as_operand(),
25470 rs1.as_operand(),
25471 Into::<Imm>::into(vm).as_operand(),
25472 ],
25473 );
25474 }
25475}
25476
25477impl<U2: Into<Imm>> VmsifMEmitter<Vp, Vp, U2> for Assembler<'_> {
25478 fn vmsif_m(&mut self, vd: Vp, vs2: Vp, vm: U2) {
25479 self.emit_n(
25480 Opcode::VMSIFM as i64,
25481 &[
25482 vd.as_operand(),
25483 vs2.as_operand(),
25484 Into::<Imm>::into(vm).as_operand(),
25485 ],
25486 );
25487 }
25488}
25489
25490impl<U2: Into<Imm>, U3: Into<Imm>> VmsleViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
25491 fn vmsle_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
25492 self.emit_n(
25493 Opcode::VMSLEVI as i64,
25494 &[
25495 vd.as_operand(),
25496 vs2.as_operand(),
25497 Into::<Imm>::into(simm5).as_operand(),
25498 Into::<Imm>::into(vm).as_operand(),
25499 ],
25500 );
25501 }
25502}
25503
25504impl<U3: Into<Imm>> VmsleVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25505 fn vmsle_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25506 self.emit_n(
25507 Opcode::VMSLEVV as i64,
25508 &[
25509 vd.as_operand(),
25510 vs1.as_operand(),
25511 vs2.as_operand(),
25512 Into::<Imm>::into(vm).as_operand(),
25513 ],
25514 );
25515 }
25516}
25517
25518impl<U3: Into<Imm>> VmsleVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25519 fn vmsle_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25520 self.emit_n(
25521 Opcode::VMSLEVX as i64,
25522 &[
25523 vd.as_operand(),
25524 vs2.as_operand(),
25525 rs1.as_operand(),
25526 Into::<Imm>::into(vm).as_operand(),
25527 ],
25528 );
25529 }
25530}
25531
25532impl<U2: Into<Imm>, U3: Into<Imm>> VmsleuViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
25533 fn vmsleu_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
25534 self.emit_n(
25535 Opcode::VMSLEUVI as i64,
25536 &[
25537 vd.as_operand(),
25538 vs2.as_operand(),
25539 Into::<Imm>::into(simm5).as_operand(),
25540 Into::<Imm>::into(vm).as_operand(),
25541 ],
25542 );
25543 }
25544}
25545
25546impl<U3: Into<Imm>> VmsleuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25547 fn vmsleu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25548 self.emit_n(
25549 Opcode::VMSLEUVV as i64,
25550 &[
25551 vd.as_operand(),
25552 vs1.as_operand(),
25553 vs2.as_operand(),
25554 Into::<Imm>::into(vm).as_operand(),
25555 ],
25556 );
25557 }
25558}
25559
25560impl<U3: Into<Imm>> VmsleuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25561 fn vmsleu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25562 self.emit_n(
25563 Opcode::VMSLEUVX as i64,
25564 &[
25565 vd.as_operand(),
25566 vs2.as_operand(),
25567 rs1.as_operand(),
25568 Into::<Imm>::into(vm).as_operand(),
25569 ],
25570 );
25571 }
25572}
25573
25574impl<U3: Into<Imm>> VmsltVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25575 fn vmslt_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25576 self.emit_n(
25577 Opcode::VMSLTVV as i64,
25578 &[
25579 vd.as_operand(),
25580 vs1.as_operand(),
25581 vs2.as_operand(),
25582 Into::<Imm>::into(vm).as_operand(),
25583 ],
25584 );
25585 }
25586}
25587
25588impl<U3: Into<Imm>> VmsltVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25589 fn vmslt_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25590 self.emit_n(
25591 Opcode::VMSLTVX as i64,
25592 &[
25593 vd.as_operand(),
25594 vs2.as_operand(),
25595 rs1.as_operand(),
25596 Into::<Imm>::into(vm).as_operand(),
25597 ],
25598 );
25599 }
25600}
25601
25602impl<U3: Into<Imm>> VmsltuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25603 fn vmsltu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25604 self.emit_n(
25605 Opcode::VMSLTUVV as i64,
25606 &[
25607 vd.as_operand(),
25608 vs1.as_operand(),
25609 vs2.as_operand(),
25610 Into::<Imm>::into(vm).as_operand(),
25611 ],
25612 );
25613 }
25614}
25615
25616impl<U3: Into<Imm>> VmsltuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25617 fn vmsltu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25618 self.emit_n(
25619 Opcode::VMSLTUVX as i64,
25620 &[
25621 vd.as_operand(),
25622 vs2.as_operand(),
25623 rs1.as_operand(),
25624 Into::<Imm>::into(vm).as_operand(),
25625 ],
25626 );
25627 }
25628}
25629
25630impl<U2: Into<Imm>, U3: Into<Imm>> VmsneViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
25631 fn vmsne_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
25632 self.emit_n(
25633 Opcode::VMSNEVI as i64,
25634 &[
25635 vd.as_operand(),
25636 vs2.as_operand(),
25637 Into::<Imm>::into(simm5).as_operand(),
25638 Into::<Imm>::into(vm).as_operand(),
25639 ],
25640 );
25641 }
25642}
25643
25644impl<U3: Into<Imm>> VmsneVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25645 fn vmsne_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25646 self.emit_n(
25647 Opcode::VMSNEVV as i64,
25648 &[
25649 vd.as_operand(),
25650 vs1.as_operand(),
25651 vs2.as_operand(),
25652 Into::<Imm>::into(vm).as_operand(),
25653 ],
25654 );
25655 }
25656}
25657
25658impl<U3: Into<Imm>> VmsneVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25659 fn vmsne_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25660 self.emit_n(
25661 Opcode::VMSNEVX as i64,
25662 &[
25663 vd.as_operand(),
25664 vs2.as_operand(),
25665 rs1.as_operand(),
25666 Into::<Imm>::into(vm).as_operand(),
25667 ],
25668 );
25669 }
25670}
25671
25672impl<U2: Into<Imm>> VmsofMEmitter<Vp, Vp, U2> for Assembler<'_> {
25673 fn vmsof_m(&mut self, vd: Vp, vs2: Vp, vm: U2) {
25674 self.emit_n(
25675 Opcode::VMSOFM as i64,
25676 &[
25677 vd.as_operand(),
25678 vs2.as_operand(),
25679 Into::<Imm>::into(vm).as_operand(),
25680 ],
25681 );
25682 }
25683}
25684
25685impl<U3: Into<Imm>> VmulVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25686 fn vmul_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25687 self.emit_n(
25688 Opcode::VMULVV as i64,
25689 &[
25690 vd.as_operand(),
25691 vs1.as_operand(),
25692 vs2.as_operand(),
25693 Into::<Imm>::into(vm).as_operand(),
25694 ],
25695 );
25696 }
25697}
25698
25699impl<U3: Into<Imm>> VmulVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25700 fn vmul_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25701 self.emit_n(
25702 Opcode::VMULVX as i64,
25703 &[
25704 vd.as_operand(),
25705 vs2.as_operand(),
25706 rs1.as_operand(),
25707 Into::<Imm>::into(vm).as_operand(),
25708 ],
25709 );
25710 }
25711}
25712
25713impl<U3: Into<Imm>> VmulhVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25714 fn vmulh_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25715 self.emit_n(
25716 Opcode::VMULHVV as i64,
25717 &[
25718 vd.as_operand(),
25719 vs1.as_operand(),
25720 vs2.as_operand(),
25721 Into::<Imm>::into(vm).as_operand(),
25722 ],
25723 );
25724 }
25725}
25726
25727impl<U3: Into<Imm>> VmulhVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25728 fn vmulh_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25729 self.emit_n(
25730 Opcode::VMULHVX as i64,
25731 &[
25732 vd.as_operand(),
25733 vs2.as_operand(),
25734 rs1.as_operand(),
25735 Into::<Imm>::into(vm).as_operand(),
25736 ],
25737 );
25738 }
25739}
25740
25741impl<U3: Into<Imm>> VmulhsuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25742 fn vmulhsu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25743 self.emit_n(
25744 Opcode::VMULHSUVV as i64,
25745 &[
25746 vd.as_operand(),
25747 vs1.as_operand(),
25748 vs2.as_operand(),
25749 Into::<Imm>::into(vm).as_operand(),
25750 ],
25751 );
25752 }
25753}
25754
25755impl<U3: Into<Imm>> VmulhsuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25756 fn vmulhsu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25757 self.emit_n(
25758 Opcode::VMULHSUVX as i64,
25759 &[
25760 vd.as_operand(),
25761 vs2.as_operand(),
25762 rs1.as_operand(),
25763 Into::<Imm>::into(vm).as_operand(),
25764 ],
25765 );
25766 }
25767}
25768
25769impl<U3: Into<Imm>> VmulhuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25770 fn vmulhu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25771 self.emit_n(
25772 Opcode::VMULHUVV as i64,
25773 &[
25774 vd.as_operand(),
25775 vs1.as_operand(),
25776 vs2.as_operand(),
25777 Into::<Imm>::into(vm).as_operand(),
25778 ],
25779 );
25780 }
25781}
25782
25783impl<U3: Into<Imm>> VmulhuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25784 fn vmulhu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25785 self.emit_n(
25786 Opcode::VMULHUVX as i64,
25787 &[
25788 vd.as_operand(),
25789 vs2.as_operand(),
25790 rs1.as_operand(),
25791 Into::<Imm>::into(vm).as_operand(),
25792 ],
25793 );
25794 }
25795}
25796
25797impl Vmv1RVEmitter<Vp, Vp> for Assembler<'_> {
25798 fn vmv1r_v(&mut self, vd: Vp, vs2: Vp) {
25799 self.emit_n(Opcode::VMV1RV as i64, &[vd.as_operand(), vs2.as_operand()]);
25800 }
25801}
25802
25803impl Vmv2RVEmitter<Vp, Vp> for Assembler<'_> {
25804 fn vmv2r_v(&mut self, vd: Vp, vs2: Vp) {
25805 self.emit_n(Opcode::VMV2RV as i64, &[vd.as_operand(), vs2.as_operand()]);
25806 }
25807}
25808
25809impl Vmv4RVEmitter<Vp, Vp> for Assembler<'_> {
25810 fn vmv4r_v(&mut self, vd: Vp, vs2: Vp) {
25811 self.emit_n(Opcode::VMV4RV as i64, &[vd.as_operand(), vs2.as_operand()]);
25812 }
25813}
25814
25815impl Vmv8RVEmitter<Vp, Vp> for Assembler<'_> {
25816 fn vmv8r_v(&mut self, vd: Vp, vs2: Vp) {
25817 self.emit_n(Opcode::VMV8RV as i64, &[vd.as_operand(), vs2.as_operand()]);
25818 }
25819}
25820
25821impl VmvSXEmitter<Vp, Gp> for Assembler<'_> {
25822 fn vmv_s_x(&mut self, vd: Vp, rs1: Gp) {
25823 self.emit_n(Opcode::VMVSX as i64, &[vd.as_operand(), rs1.as_operand()]);
25824 }
25825}
25826
25827impl<U1: Into<Imm>> VmvVIEmitter<Vp, U1> for Assembler<'_> {
25828 fn vmv_v_i(&mut self, vd: Vp, simm5: U1) {
25829 self.emit_n(
25830 Opcode::VMVVI as i64,
25831 &[vd.as_operand(), Into::<Imm>::into(simm5).as_operand()],
25832 );
25833 }
25834}
25835
25836impl VmvVVEmitter<Vp, Vp> for Assembler<'_> {
25837 fn vmv_v_v(&mut self, vd: Vp, vs1: Vp) {
25838 self.emit_n(Opcode::VMVVV as i64, &[vd.as_operand(), vs1.as_operand()]);
25839 }
25840}
25841
25842impl VmvVXEmitter<Vp, Gp> for Assembler<'_> {
25843 fn vmv_v_x(&mut self, vd: Vp, rs1: Gp) {
25844 self.emit_n(Opcode::VMVVX as i64, &[vd.as_operand(), rs1.as_operand()]);
25845 }
25846}
25847
25848impl VmvXSEmitter<Gp, Vp> for Assembler<'_> {
25849 fn vmv_x_s(&mut self, rd: Gp, vs2: Vp) {
25850 self.emit_n(Opcode::VMVXS as i64, &[rd.as_operand(), vs2.as_operand()]);
25851 }
25852}
25853
25854impl VmxnorMmEmitter<Vp, Vp, Vp> for Assembler<'_> {
25855 fn vmxnor_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
25856 self.emit_n(
25857 Opcode::VMXNORMM as i64,
25858 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
25859 );
25860 }
25861}
25862
25863impl VmxorMmEmitter<Vp, Vp, Vp> for Assembler<'_> {
25864 fn vmxor_mm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
25865 self.emit_n(
25866 Opcode::VMXORMM as i64,
25867 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
25868 );
25869 }
25870}
25871
25872impl<U2: Into<Imm>, U3: Into<Imm>> VnclipWiEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
25873 fn vnclip_wi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
25874 self.emit_n(
25875 Opcode::VNCLIPWI as i64,
25876 &[
25877 vd.as_operand(),
25878 vs2.as_operand(),
25879 Into::<Imm>::into(zimm5).as_operand(),
25880 Into::<Imm>::into(vm).as_operand(),
25881 ],
25882 );
25883 }
25884}
25885
25886impl<U3: Into<Imm>> VnclipWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25887 fn vnclip_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25888 self.emit_n(
25889 Opcode::VNCLIPWV as i64,
25890 &[
25891 vd.as_operand(),
25892 vs1.as_operand(),
25893 vs2.as_operand(),
25894 Into::<Imm>::into(vm).as_operand(),
25895 ],
25896 );
25897 }
25898}
25899
25900impl<U3: Into<Imm>> VnclipWxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25901 fn vnclip_wx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25902 self.emit_n(
25903 Opcode::VNCLIPWX as i64,
25904 &[
25905 vd.as_operand(),
25906 vs2.as_operand(),
25907 rs1.as_operand(),
25908 Into::<Imm>::into(vm).as_operand(),
25909 ],
25910 );
25911 }
25912}
25913
25914impl<U2: Into<Imm>, U3: Into<Imm>> VnclipuWiEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
25915 fn vnclipu_wi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
25916 self.emit_n(
25917 Opcode::VNCLIPUWI as i64,
25918 &[
25919 vd.as_operand(),
25920 vs2.as_operand(),
25921 Into::<Imm>::into(zimm5).as_operand(),
25922 Into::<Imm>::into(vm).as_operand(),
25923 ],
25924 );
25925 }
25926}
25927
25928impl<U3: Into<Imm>> VnclipuWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25929 fn vnclipu_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25930 self.emit_n(
25931 Opcode::VNCLIPUWV as i64,
25932 &[
25933 vd.as_operand(),
25934 vs1.as_operand(),
25935 vs2.as_operand(),
25936 Into::<Imm>::into(vm).as_operand(),
25937 ],
25938 );
25939 }
25940}
25941
25942impl<U3: Into<Imm>> VnclipuWxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25943 fn vnclipu_wx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25944 self.emit_n(
25945 Opcode::VNCLIPUWX as i64,
25946 &[
25947 vd.as_operand(),
25948 vs2.as_operand(),
25949 rs1.as_operand(),
25950 Into::<Imm>::into(vm).as_operand(),
25951 ],
25952 );
25953 }
25954}
25955
25956impl<U3: Into<Imm>> VnmsacVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25957 fn vnmsac_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25958 self.emit_n(
25959 Opcode::VNMSACVV as i64,
25960 &[
25961 vd.as_operand(),
25962 vs1.as_operand(),
25963 vs2.as_operand(),
25964 Into::<Imm>::into(vm).as_operand(),
25965 ],
25966 );
25967 }
25968}
25969
25970impl<U3: Into<Imm>> VnmsacVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25971 fn vnmsac_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
25972 self.emit_n(
25973 Opcode::VNMSACVX as i64,
25974 &[
25975 vd.as_operand(),
25976 vs2.as_operand(),
25977 rs1.as_operand(),
25978 Into::<Imm>::into(vm).as_operand(),
25979 ],
25980 );
25981 }
25982}
25983
25984impl<U3: Into<Imm>> VnmsubVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
25985 fn vnmsub_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
25986 self.emit_n(
25987 Opcode::VNMSUBVV as i64,
25988 &[
25989 vd.as_operand(),
25990 vs1.as_operand(),
25991 vs2.as_operand(),
25992 Into::<Imm>::into(vm).as_operand(),
25993 ],
25994 );
25995 }
25996}
25997
25998impl<U3: Into<Imm>> VnmsubVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
25999 fn vnmsub_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26000 self.emit_n(
26001 Opcode::VNMSUBVX as i64,
26002 &[
26003 vd.as_operand(),
26004 vs2.as_operand(),
26005 rs1.as_operand(),
26006 Into::<Imm>::into(vm).as_operand(),
26007 ],
26008 );
26009 }
26010}
26011
26012impl<U2: Into<Imm>, U3: Into<Imm>> VnsraWiEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26013 fn vnsra_wi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
26014 self.emit_n(
26015 Opcode::VNSRAWI as i64,
26016 &[
26017 vd.as_operand(),
26018 vs2.as_operand(),
26019 Into::<Imm>::into(zimm5).as_operand(),
26020 Into::<Imm>::into(vm).as_operand(),
26021 ],
26022 );
26023 }
26024}
26025
26026impl<U3: Into<Imm>> VnsraWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26027 fn vnsra_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26028 self.emit_n(
26029 Opcode::VNSRAWV as i64,
26030 &[
26031 vd.as_operand(),
26032 vs1.as_operand(),
26033 vs2.as_operand(),
26034 Into::<Imm>::into(vm).as_operand(),
26035 ],
26036 );
26037 }
26038}
26039
26040impl<U3: Into<Imm>> VnsraWxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26041 fn vnsra_wx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26042 self.emit_n(
26043 Opcode::VNSRAWX as i64,
26044 &[
26045 vd.as_operand(),
26046 vs2.as_operand(),
26047 rs1.as_operand(),
26048 Into::<Imm>::into(vm).as_operand(),
26049 ],
26050 );
26051 }
26052}
26053
26054impl<U2: Into<Imm>, U3: Into<Imm>> VnsrlWiEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26055 fn vnsrl_wi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
26056 self.emit_n(
26057 Opcode::VNSRLWI as i64,
26058 &[
26059 vd.as_operand(),
26060 vs2.as_operand(),
26061 Into::<Imm>::into(zimm5).as_operand(),
26062 Into::<Imm>::into(vm).as_operand(),
26063 ],
26064 );
26065 }
26066}
26067
26068impl<U3: Into<Imm>> VnsrlWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26069 fn vnsrl_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26070 self.emit_n(
26071 Opcode::VNSRLWV as i64,
26072 &[
26073 vd.as_operand(),
26074 vs1.as_operand(),
26075 vs2.as_operand(),
26076 Into::<Imm>::into(vm).as_operand(),
26077 ],
26078 );
26079 }
26080}
26081
26082impl<U3: Into<Imm>> VnsrlWxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26083 fn vnsrl_wx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26084 self.emit_n(
26085 Opcode::VNSRLWX as i64,
26086 &[
26087 vd.as_operand(),
26088 vs2.as_operand(),
26089 rs1.as_operand(),
26090 Into::<Imm>::into(vm).as_operand(),
26091 ],
26092 );
26093 }
26094}
26095
26096impl<U2: Into<Imm>, U3: Into<Imm>> VorViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26097 fn vor_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
26098 self.emit_n(
26099 Opcode::VORVI as i64,
26100 &[
26101 vd.as_operand(),
26102 vs2.as_operand(),
26103 Into::<Imm>::into(simm5).as_operand(),
26104 Into::<Imm>::into(vm).as_operand(),
26105 ],
26106 );
26107 }
26108}
26109
26110impl<U3: Into<Imm>> VorVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26111 fn vor_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26112 self.emit_n(
26113 Opcode::VORVV as i64,
26114 &[
26115 vd.as_operand(),
26116 vs1.as_operand(),
26117 vs2.as_operand(),
26118 Into::<Imm>::into(vm).as_operand(),
26119 ],
26120 );
26121 }
26122}
26123
26124impl<U3: Into<Imm>> VorVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26125 fn vor_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26126 self.emit_n(
26127 Opcode::VORVX as i64,
26128 &[
26129 vd.as_operand(),
26130 vs2.as_operand(),
26131 rs1.as_operand(),
26132 Into::<Imm>::into(vm).as_operand(),
26133 ],
26134 );
26135 }
26136}
26137
26138impl<U2: Into<Imm>> VpopcMEmitter<Gp, Vp, U2> for Assembler<'_> {
26139 fn vpopc_m(&mut self, rd: Gp, vs2: Vp, vm: U2) {
26140 self.emit_n(
26141 Opcode::VPOPCM as i64,
26142 &[
26143 rd.as_operand(),
26144 vs2.as_operand(),
26145 Into::<Imm>::into(vm).as_operand(),
26146 ],
26147 );
26148 }
26149}
26150
26151impl<U3: Into<Imm>> VredandVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26152 fn vredand_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26153 self.emit_n(
26154 Opcode::VREDANDVS as i64,
26155 &[
26156 vd.as_operand(),
26157 vs1.as_operand(),
26158 vs2.as_operand(),
26159 Into::<Imm>::into(vm).as_operand(),
26160 ],
26161 );
26162 }
26163}
26164
26165impl<U3: Into<Imm>> VredmaxVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26166 fn vredmax_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26167 self.emit_n(
26168 Opcode::VREDMAXVS as i64,
26169 &[
26170 vd.as_operand(),
26171 vs1.as_operand(),
26172 vs2.as_operand(),
26173 Into::<Imm>::into(vm).as_operand(),
26174 ],
26175 );
26176 }
26177}
26178
26179impl<U3: Into<Imm>> VredmaxuVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26180 fn vredmaxu_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26181 self.emit_n(
26182 Opcode::VREDMAXUVS as i64,
26183 &[
26184 vd.as_operand(),
26185 vs1.as_operand(),
26186 vs2.as_operand(),
26187 Into::<Imm>::into(vm).as_operand(),
26188 ],
26189 );
26190 }
26191}
26192
26193impl<U3: Into<Imm>> VredminVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26194 fn vredmin_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26195 self.emit_n(
26196 Opcode::VREDMINVS as i64,
26197 &[
26198 vd.as_operand(),
26199 vs1.as_operand(),
26200 vs2.as_operand(),
26201 Into::<Imm>::into(vm).as_operand(),
26202 ],
26203 );
26204 }
26205}
26206
26207impl<U3: Into<Imm>> VredminuVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26208 fn vredminu_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26209 self.emit_n(
26210 Opcode::VREDMINUVS as i64,
26211 &[
26212 vd.as_operand(),
26213 vs1.as_operand(),
26214 vs2.as_operand(),
26215 Into::<Imm>::into(vm).as_operand(),
26216 ],
26217 );
26218 }
26219}
26220
26221impl<U3: Into<Imm>> VredorVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26222 fn vredor_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26223 self.emit_n(
26224 Opcode::VREDORVS as i64,
26225 &[
26226 vd.as_operand(),
26227 vs1.as_operand(),
26228 vs2.as_operand(),
26229 Into::<Imm>::into(vm).as_operand(),
26230 ],
26231 );
26232 }
26233}
26234
26235impl<U3: Into<Imm>> VredsumVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26236 fn vredsum_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26237 self.emit_n(
26238 Opcode::VREDSUMVS as i64,
26239 &[
26240 vd.as_operand(),
26241 vs1.as_operand(),
26242 vs2.as_operand(),
26243 Into::<Imm>::into(vm).as_operand(),
26244 ],
26245 );
26246 }
26247}
26248
26249impl<U3: Into<Imm>> VredxorVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26250 fn vredxor_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26251 self.emit_n(
26252 Opcode::VREDXORVS as i64,
26253 &[
26254 vd.as_operand(),
26255 vs1.as_operand(),
26256 vs2.as_operand(),
26257 Into::<Imm>::into(vm).as_operand(),
26258 ],
26259 );
26260 }
26261}
26262
26263impl<U3: Into<Imm>> VremVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26264 fn vrem_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26265 self.emit_n(
26266 Opcode::VREMVV as i64,
26267 &[
26268 vd.as_operand(),
26269 vs1.as_operand(),
26270 vs2.as_operand(),
26271 Into::<Imm>::into(vm).as_operand(),
26272 ],
26273 );
26274 }
26275}
26276
26277impl<U3: Into<Imm>> VremVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26278 fn vrem_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26279 self.emit_n(
26280 Opcode::VREMVX as i64,
26281 &[
26282 vd.as_operand(),
26283 vs2.as_operand(),
26284 rs1.as_operand(),
26285 Into::<Imm>::into(vm).as_operand(),
26286 ],
26287 );
26288 }
26289}
26290
26291impl<U3: Into<Imm>> VremuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26292 fn vremu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26293 self.emit_n(
26294 Opcode::VREMUVV as i64,
26295 &[
26296 vd.as_operand(),
26297 vs1.as_operand(),
26298 vs2.as_operand(),
26299 Into::<Imm>::into(vm).as_operand(),
26300 ],
26301 );
26302 }
26303}
26304
26305impl<U3: Into<Imm>> VremuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26306 fn vremu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26307 self.emit_n(
26308 Opcode::VREMUVX as i64,
26309 &[
26310 vd.as_operand(),
26311 vs2.as_operand(),
26312 rs1.as_operand(),
26313 Into::<Imm>::into(vm).as_operand(),
26314 ],
26315 );
26316 }
26317}
26318
26319impl<U2: Into<Imm>> Vrev8VEmitter<Vp, Vp, U2> for Assembler<'_> {
26320 fn vrev8_v(&mut self, vd: Vp, vs2: Vp, vm: U2) {
26321 self.emit_n(
26322 Opcode::VREV8V as i64,
26323 &[
26324 vd.as_operand(),
26325 vs2.as_operand(),
26326 Into::<Imm>::into(vm).as_operand(),
26327 ],
26328 );
26329 }
26330}
26331
26332impl<U2: Into<Imm>, U3: Into<Imm>> VrgatherViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26333 fn vrgather_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
26334 self.emit_n(
26335 Opcode::VRGATHERVI as i64,
26336 &[
26337 vd.as_operand(),
26338 vs2.as_operand(),
26339 Into::<Imm>::into(zimm5).as_operand(),
26340 Into::<Imm>::into(vm).as_operand(),
26341 ],
26342 );
26343 }
26344}
26345
26346impl<U3: Into<Imm>> VrgatherVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26347 fn vrgather_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26348 self.emit_n(
26349 Opcode::VRGATHERVV as i64,
26350 &[
26351 vd.as_operand(),
26352 vs1.as_operand(),
26353 vs2.as_operand(),
26354 Into::<Imm>::into(vm).as_operand(),
26355 ],
26356 );
26357 }
26358}
26359
26360impl<U3: Into<Imm>> VrgatherVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26361 fn vrgather_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26362 self.emit_n(
26363 Opcode::VRGATHERVX as i64,
26364 &[
26365 vd.as_operand(),
26366 vs2.as_operand(),
26367 rs1.as_operand(),
26368 Into::<Imm>::into(vm).as_operand(),
26369 ],
26370 );
26371 }
26372}
26373
26374impl<U3: Into<Imm>> Vrgatherei16VvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26375 fn vrgatherei16_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26376 self.emit_n(
26377 Opcode::VRGATHEREI16VV as i64,
26378 &[
26379 vd.as_operand(),
26380 vs1.as_operand(),
26381 vs2.as_operand(),
26382 Into::<Imm>::into(vm).as_operand(),
26383 ],
26384 );
26385 }
26386}
26387
26388impl<U3: Into<Imm>> VrolVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26389 fn vrol_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26390 self.emit_n(
26391 Opcode::VROLVV as i64,
26392 &[
26393 vd.as_operand(),
26394 vs1.as_operand(),
26395 vs2.as_operand(),
26396 Into::<Imm>::into(vm).as_operand(),
26397 ],
26398 );
26399 }
26400}
26401
26402impl<U3: Into<Imm>> VrolVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26403 fn vrol_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26404 self.emit_n(
26405 Opcode::VROLVX as i64,
26406 &[
26407 vd.as_operand(),
26408 vs2.as_operand(),
26409 rs1.as_operand(),
26410 Into::<Imm>::into(vm).as_operand(),
26411 ],
26412 );
26413 }
26414}
26415
26416impl<U2: Into<Imm>, U3: Into<Imm>> VrorViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26417 fn vror_vi(&mut self, vd: Vp, vs2: Vp, zimm6lohi: U2, vm: U3) {
26418 self.emit_n(
26419 Opcode::VRORVI as i64,
26420 &[
26421 vd.as_operand(),
26422 vs2.as_operand(),
26423 Into::<Imm>::into(zimm6lohi).as_operand(),
26424 Into::<Imm>::into(vm).as_operand(),
26425 ],
26426 );
26427 }
26428}
26429
26430impl<U3: Into<Imm>> VrorVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26431 fn vror_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26432 self.emit_n(
26433 Opcode::VRORVV as i64,
26434 &[
26435 vd.as_operand(),
26436 vs1.as_operand(),
26437 vs2.as_operand(),
26438 Into::<Imm>::into(vm).as_operand(),
26439 ],
26440 );
26441 }
26442}
26443
26444impl<U3: Into<Imm>> VrorVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26445 fn vror_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26446 self.emit_n(
26447 Opcode::VRORVX as i64,
26448 &[
26449 vd.as_operand(),
26450 vs2.as_operand(),
26451 rs1.as_operand(),
26452 Into::<Imm>::into(vm).as_operand(),
26453 ],
26454 );
26455 }
26456}
26457
26458impl<U2: Into<Imm>, U3: Into<Imm>> VrsubViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26459 fn vrsub_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
26460 self.emit_n(
26461 Opcode::VRSUBVI as i64,
26462 &[
26463 vd.as_operand(),
26464 vs2.as_operand(),
26465 Into::<Imm>::into(simm5).as_operand(),
26466 Into::<Imm>::into(vm).as_operand(),
26467 ],
26468 );
26469 }
26470}
26471
26472impl<U3: Into<Imm>> VrsubVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26473 fn vrsub_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26474 self.emit_n(
26475 Opcode::VRSUBVX as i64,
26476 &[
26477 vd.as_operand(),
26478 vs2.as_operand(),
26479 rs1.as_operand(),
26480 Into::<Imm>::into(vm).as_operand(),
26481 ],
26482 );
26483 }
26484}
26485
26486impl Vs1RVEmitter<Vp, Gp> for Assembler<'_> {
26487 fn vs1r_v(&mut self, vs3: Vp, rs1: Gp) {
26488 self.emit_n(Opcode::VS1RV as i64, &[vs3.as_operand(), rs1.as_operand()]);
26489 }
26490}
26491
26492impl Vs2RVEmitter<Vp, Gp> for Assembler<'_> {
26493 fn vs2r_v(&mut self, vs3: Vp, rs1: Gp) {
26494 self.emit_n(Opcode::VS2RV as i64, &[vs3.as_operand(), rs1.as_operand()]);
26495 }
26496}
26497
26498impl Vs4RVEmitter<Vp, Gp> for Assembler<'_> {
26499 fn vs4r_v(&mut self, vs3: Vp, rs1: Gp) {
26500 self.emit_n(Opcode::VS4RV as i64, &[vs3.as_operand(), rs1.as_operand()]);
26501 }
26502}
26503
26504impl Vs8RVEmitter<Vp, Gp> for Assembler<'_> {
26505 fn vs8r_v(&mut self, vs3: Vp, rs1: Gp) {
26506 self.emit_n(Opcode::VS8RV as i64, &[vs3.as_operand(), rs1.as_operand()]);
26507 }
26508}
26509
26510impl<U2: Into<Imm>, U3: Into<Imm>> VsaddViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26511 fn vsadd_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
26512 self.emit_n(
26513 Opcode::VSADDVI as i64,
26514 &[
26515 vd.as_operand(),
26516 vs2.as_operand(),
26517 Into::<Imm>::into(simm5).as_operand(),
26518 Into::<Imm>::into(vm).as_operand(),
26519 ],
26520 );
26521 }
26522}
26523
26524impl<U3: Into<Imm>> VsaddVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26525 fn vsadd_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26526 self.emit_n(
26527 Opcode::VSADDVV as i64,
26528 &[
26529 vd.as_operand(),
26530 vs1.as_operand(),
26531 vs2.as_operand(),
26532 Into::<Imm>::into(vm).as_operand(),
26533 ],
26534 );
26535 }
26536}
26537
26538impl<U3: Into<Imm>> VsaddVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26539 fn vsadd_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26540 self.emit_n(
26541 Opcode::VSADDVX as i64,
26542 &[
26543 vd.as_operand(),
26544 vs2.as_operand(),
26545 rs1.as_operand(),
26546 Into::<Imm>::into(vm).as_operand(),
26547 ],
26548 );
26549 }
26550}
26551
26552impl<U2: Into<Imm>, U3: Into<Imm>> VsadduViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26553 fn vsaddu_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
26554 self.emit_n(
26555 Opcode::VSADDUVI as i64,
26556 &[
26557 vd.as_operand(),
26558 vs2.as_operand(),
26559 Into::<Imm>::into(simm5).as_operand(),
26560 Into::<Imm>::into(vm).as_operand(),
26561 ],
26562 );
26563 }
26564}
26565
26566impl<U3: Into<Imm>> VsadduVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26567 fn vsaddu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26568 self.emit_n(
26569 Opcode::VSADDUVV as i64,
26570 &[
26571 vd.as_operand(),
26572 vs1.as_operand(),
26573 vs2.as_operand(),
26574 Into::<Imm>::into(vm).as_operand(),
26575 ],
26576 );
26577 }
26578}
26579
26580impl<U3: Into<Imm>> VsadduVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26581 fn vsaddu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26582 self.emit_n(
26583 Opcode::VSADDUVX as i64,
26584 &[
26585 vd.as_operand(),
26586 vs2.as_operand(),
26587 rs1.as_operand(),
26588 Into::<Imm>::into(vm).as_operand(),
26589 ],
26590 );
26591 }
26592}
26593
26594impl VsbcVvmEmitter<Vp, Vp, Vp> for Assembler<'_> {
26595 fn vsbc_vvm(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
26596 self.emit_n(
26597 Opcode::VSBCVVM as i64,
26598 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
26599 );
26600 }
26601}
26602
26603impl VsbcVxmEmitter<Vp, Gp, Vp> for Assembler<'_> {
26604 fn vsbc_vxm(&mut self, vd: Vp, rs1: Gp, vs2: Vp) {
26605 self.emit_n(
26606 Opcode::VSBCVXM as i64,
26607 &[vd.as_operand(), rs1.as_operand(), vs2.as_operand()],
26608 );
26609 }
26610}
26611
26612impl<U2: Into<Imm>, U3: Into<Imm>> Vse16VEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
26613 fn vse16_v(&mut self, vs3: Vp, rs1: Gp, vm: U2, nf: U3) {
26614 self.emit_n(
26615 Opcode::VSE16V as i64,
26616 &[
26617 vs3.as_operand(),
26618 rs1.as_operand(),
26619 Into::<Imm>::into(vm).as_operand(),
26620 Into::<Imm>::into(nf).as_operand(),
26621 ],
26622 );
26623 }
26624}
26625
26626impl Vse1VEmitter<Vp, Gp> for Assembler<'_> {
26627 fn vse1_v(&mut self, vs3: Vp, rs1: Gp) {
26628 self.emit_n(Opcode::VSE1V as i64, &[vs3.as_operand(), rs1.as_operand()]);
26629 }
26630}
26631
26632impl<U2: Into<Imm>, U3: Into<Imm>> Vse32VEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
26633 fn vse32_v(&mut self, vs3: Vp, rs1: Gp, vm: U2, nf: U3) {
26634 self.emit_n(
26635 Opcode::VSE32V as i64,
26636 &[
26637 vs3.as_operand(),
26638 rs1.as_operand(),
26639 Into::<Imm>::into(vm).as_operand(),
26640 Into::<Imm>::into(nf).as_operand(),
26641 ],
26642 );
26643 }
26644}
26645
26646impl<U2: Into<Imm>, U3: Into<Imm>> Vse64VEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
26647 fn vse64_v(&mut self, vs3: Vp, rs1: Gp, vm: U2, nf: U3) {
26648 self.emit_n(
26649 Opcode::VSE64V as i64,
26650 &[
26651 vs3.as_operand(),
26652 rs1.as_operand(),
26653 Into::<Imm>::into(vm).as_operand(),
26654 Into::<Imm>::into(nf).as_operand(),
26655 ],
26656 );
26657 }
26658}
26659
26660impl<U2: Into<Imm>, U3: Into<Imm>> Vse8VEmitter<Vp, Gp, U2, U3> for Assembler<'_> {
26661 fn vse8_v(&mut self, vs3: Vp, rs1: Gp, vm: U2, nf: U3) {
26662 self.emit_n(
26663 Opcode::VSE8V as i64,
26664 &[
26665 vs3.as_operand(),
26666 rs1.as_operand(),
26667 Into::<Imm>::into(vm).as_operand(),
26668 Into::<Imm>::into(nf).as_operand(),
26669 ],
26670 );
26671 }
26672}
26673
26674impl<U1: Into<Imm>, U2: Into<Imm>> VsetivliEmitter<Gp, U1, U2> for Assembler<'_> {
26675 fn vsetivli(&mut self, rd: Gp, zimm5: U1, zimm10: U2) {
26676 self.emit_n(
26677 Opcode::VSETIVLI as i64,
26678 &[
26679 rd.as_operand(),
26680 Into::<Imm>::into(zimm5).as_operand(),
26681 Into::<Imm>::into(zimm10).as_operand(),
26682 ],
26683 );
26684 }
26685}
26686
26687impl VsetvlEmitter<Gp, Gp, Gp> for Assembler<'_> {
26688 fn vsetvl(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
26689 self.emit_n(
26690 Opcode::VSETVL as i64,
26691 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
26692 );
26693 }
26694}
26695
26696impl<U2: Into<Imm>> VsetvliEmitter<Gp, Gp, U2> for Assembler<'_> {
26697 fn vsetvli(&mut self, rd: Gp, rs1: Gp, zimm11: U2) {
26698 self.emit_n(
26699 Opcode::VSETVLI as i64,
26700 &[
26701 rd.as_operand(),
26702 rs1.as_operand(),
26703 Into::<Imm>::into(zimm11).as_operand(),
26704 ],
26705 );
26706 }
26707}
26708
26709impl<U2: Into<Imm>> VsextVf2Emitter<Vp, Vp, U2> for Assembler<'_> {
26710 fn vsext_vf2(&mut self, vd: Vp, vs2: Vp, vm: U2) {
26711 self.emit_n(
26712 Opcode::VSEXTVF2 as i64,
26713 &[
26714 vd.as_operand(),
26715 vs2.as_operand(),
26716 Into::<Imm>::into(vm).as_operand(),
26717 ],
26718 );
26719 }
26720}
26721
26722impl<U2: Into<Imm>> VsextVf4Emitter<Vp, Vp, U2> for Assembler<'_> {
26723 fn vsext_vf4(&mut self, vd: Vp, vs2: Vp, vm: U2) {
26724 self.emit_n(
26725 Opcode::VSEXTVF4 as i64,
26726 &[
26727 vd.as_operand(),
26728 vs2.as_operand(),
26729 Into::<Imm>::into(vm).as_operand(),
26730 ],
26731 );
26732 }
26733}
26734
26735impl<U2: Into<Imm>> VsextVf8Emitter<Vp, Vp, U2> for Assembler<'_> {
26736 fn vsext_vf8(&mut self, vd: Vp, vs2: Vp, vm: U2) {
26737 self.emit_n(
26738 Opcode::VSEXTVF8 as i64,
26739 &[
26740 vd.as_operand(),
26741 vs2.as_operand(),
26742 Into::<Imm>::into(vm).as_operand(),
26743 ],
26744 );
26745 }
26746}
26747
26748impl Vsha2ChVvEmitter<Vp, Vp, Vp> for Assembler<'_> {
26749 fn vsha2ch_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
26750 self.emit_n(
26751 Opcode::VSHA2CHVV as i64,
26752 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
26753 );
26754 }
26755}
26756
26757impl Vsha2ClVvEmitter<Vp, Vp, Vp> for Assembler<'_> {
26758 fn vsha2cl_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
26759 self.emit_n(
26760 Opcode::VSHA2CLVV as i64,
26761 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
26762 );
26763 }
26764}
26765
26766impl Vsha2MsVvEmitter<Vp, Vp, Vp> for Assembler<'_> {
26767 fn vsha2ms_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
26768 self.emit_n(
26769 Opcode::VSHA2MSVV as i64,
26770 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
26771 );
26772 }
26773}
26774
26775impl<U3: Into<Imm>> Vslide1DownVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26776 fn vslide1down_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26777 self.emit_n(
26778 Opcode::VSLIDE1DOWNVX as i64,
26779 &[
26780 vd.as_operand(),
26781 vs2.as_operand(),
26782 rs1.as_operand(),
26783 Into::<Imm>::into(vm).as_operand(),
26784 ],
26785 );
26786 }
26787}
26788
26789impl<U3: Into<Imm>> Vslide1UpVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26790 fn vslide1up_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26791 self.emit_n(
26792 Opcode::VSLIDE1UPVX as i64,
26793 &[
26794 vd.as_operand(),
26795 vs2.as_operand(),
26796 rs1.as_operand(),
26797 Into::<Imm>::into(vm).as_operand(),
26798 ],
26799 );
26800 }
26801}
26802
26803impl<U2: Into<Imm>, U3: Into<Imm>> VslidedownViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26804 fn vslidedown_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
26805 self.emit_n(
26806 Opcode::VSLIDEDOWNVI as i64,
26807 &[
26808 vd.as_operand(),
26809 vs2.as_operand(),
26810 Into::<Imm>::into(zimm5).as_operand(),
26811 Into::<Imm>::into(vm).as_operand(),
26812 ],
26813 );
26814 }
26815}
26816
26817impl<U3: Into<Imm>> VslidedownVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26818 fn vslidedown_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26819 self.emit_n(
26820 Opcode::VSLIDEDOWNVX as i64,
26821 &[
26822 vd.as_operand(),
26823 vs2.as_operand(),
26824 rs1.as_operand(),
26825 Into::<Imm>::into(vm).as_operand(),
26826 ],
26827 );
26828 }
26829}
26830
26831impl<U2: Into<Imm>, U3: Into<Imm>> VslideupViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26832 fn vslideup_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
26833 self.emit_n(
26834 Opcode::VSLIDEUPVI as i64,
26835 &[
26836 vd.as_operand(),
26837 vs2.as_operand(),
26838 Into::<Imm>::into(zimm5).as_operand(),
26839 Into::<Imm>::into(vm).as_operand(),
26840 ],
26841 );
26842 }
26843}
26844
26845impl<U3: Into<Imm>> VslideupVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26846 fn vslideup_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26847 self.emit_n(
26848 Opcode::VSLIDEUPVX as i64,
26849 &[
26850 vd.as_operand(),
26851 vs2.as_operand(),
26852 rs1.as_operand(),
26853 Into::<Imm>::into(vm).as_operand(),
26854 ],
26855 );
26856 }
26857}
26858
26859impl<U2: Into<Imm>, U3: Into<Imm>> VsllViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
26860 fn vsll_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
26861 self.emit_n(
26862 Opcode::VSLLVI as i64,
26863 &[
26864 vd.as_operand(),
26865 vs2.as_operand(),
26866 Into::<Imm>::into(zimm5).as_operand(),
26867 Into::<Imm>::into(vm).as_operand(),
26868 ],
26869 );
26870 }
26871}
26872
26873impl<U3: Into<Imm>> VsllVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26874 fn vsll_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26875 self.emit_n(
26876 Opcode::VSLLVV as i64,
26877 &[
26878 vd.as_operand(),
26879 vs1.as_operand(),
26880 vs2.as_operand(),
26881 Into::<Imm>::into(vm).as_operand(),
26882 ],
26883 );
26884 }
26885}
26886
26887impl<U3: Into<Imm>> VsllVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26888 fn vsll_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26889 self.emit_n(
26890 Opcode::VSLLVX as i64,
26891 &[
26892 vd.as_operand(),
26893 vs2.as_operand(),
26894 rs1.as_operand(),
26895 Into::<Imm>::into(vm).as_operand(),
26896 ],
26897 );
26898 }
26899}
26900
26901impl<U2: Into<Imm>> Vsm3CViEmitter<Vp, Vp, U2> for Assembler<'_> {
26902 fn vsm3c_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2) {
26903 self.emit_n(
26904 Opcode::VSM3CVI as i64,
26905 &[
26906 vd.as_operand(),
26907 vs2.as_operand(),
26908 Into::<Imm>::into(zimm5).as_operand(),
26909 ],
26910 );
26911 }
26912}
26913
26914impl Vsm3MeVvEmitter<Vp, Vp, Vp> for Assembler<'_> {
26915 fn vsm3me_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp) {
26916 self.emit_n(
26917 Opcode::VSM3MEVV as i64,
26918 &[vd.as_operand(), vs1.as_operand(), vs2.as_operand()],
26919 );
26920 }
26921}
26922
26923impl<U2: Into<Imm>> Vsm4KViEmitter<Vp, Vp, U2> for Assembler<'_> {
26924 fn vsm4k_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2) {
26925 self.emit_n(
26926 Opcode::VSM4KVI as i64,
26927 &[
26928 vd.as_operand(),
26929 vs2.as_operand(),
26930 Into::<Imm>::into(zimm5).as_operand(),
26931 ],
26932 );
26933 }
26934}
26935
26936impl Vsm4RVsEmitter<Vp, Vp> for Assembler<'_> {
26937 fn vsm4r_vs(&mut self, vd: Vp, vs2: Vp) {
26938 self.emit_n(Opcode::VSM4RVS as i64, &[vd.as_operand(), vs2.as_operand()]);
26939 }
26940}
26941
26942impl Vsm4RVvEmitter<Vp, Vp> for Assembler<'_> {
26943 fn vsm4r_vv(&mut self, vd: Vp, vs2: Vp) {
26944 self.emit_n(Opcode::VSM4RVV as i64, &[vd.as_operand(), vs2.as_operand()]);
26945 }
26946}
26947
26948impl VsmVEmitter<Vp, Gp> for Assembler<'_> {
26949 fn vsm_v(&mut self, vs3: Vp, rs1: Gp) {
26950 self.emit_n(Opcode::VSMV as i64, &[vs3.as_operand(), rs1.as_operand()]);
26951 }
26952}
26953
26954impl<U3: Into<Imm>> VsmulVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
26955 fn vsmul_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
26956 self.emit_n(
26957 Opcode::VSMULVV as i64,
26958 &[
26959 vd.as_operand(),
26960 vs1.as_operand(),
26961 vs2.as_operand(),
26962 Into::<Imm>::into(vm).as_operand(),
26963 ],
26964 );
26965 }
26966}
26967
26968impl<U3: Into<Imm>> VsmulVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
26969 fn vsmul_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
26970 self.emit_n(
26971 Opcode::VSMULVX as i64,
26972 &[
26973 vd.as_operand(),
26974 vs2.as_operand(),
26975 rs1.as_operand(),
26976 Into::<Imm>::into(vm).as_operand(),
26977 ],
26978 );
26979 }
26980}
26981
26982impl<U3: Into<Imm>, U4: Into<Imm>> Vsoxei16VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
26983 fn vsoxei16_v(&mut self, vs3: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
26984 self.emit_n(
26985 Opcode::VSOXEI16V as i64,
26986 &[
26987 vs3.as_operand(),
26988 rs1.as_operand(),
26989 vs2.as_operand(),
26990 Into::<Imm>::into(vm).as_operand(),
26991 Into::<Imm>::into(nf).as_operand(),
26992 ],
26993 );
26994 }
26995}
26996
26997impl<U3: Into<Imm>, U4: Into<Imm>> Vsoxei32VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
26998 fn vsoxei32_v(&mut self, vs3: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
26999 self.emit_n(
27000 Opcode::VSOXEI32V as i64,
27001 &[
27002 vs3.as_operand(),
27003 rs1.as_operand(),
27004 vs2.as_operand(),
27005 Into::<Imm>::into(vm).as_operand(),
27006 Into::<Imm>::into(nf).as_operand(),
27007 ],
27008 );
27009 }
27010}
27011
27012impl<U3: Into<Imm>, U4: Into<Imm>> Vsoxei64VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
27013 fn vsoxei64_v(&mut self, vs3: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
27014 self.emit_n(
27015 Opcode::VSOXEI64V as i64,
27016 &[
27017 vs3.as_operand(),
27018 rs1.as_operand(),
27019 vs2.as_operand(),
27020 Into::<Imm>::into(vm).as_operand(),
27021 Into::<Imm>::into(nf).as_operand(),
27022 ],
27023 );
27024 }
27025}
27026
27027impl<U3: Into<Imm>, U4: Into<Imm>> Vsoxei8VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
27028 fn vsoxei8_v(&mut self, vs3: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
27029 self.emit_n(
27030 Opcode::VSOXEI8V as i64,
27031 &[
27032 vs3.as_operand(),
27033 rs1.as_operand(),
27034 vs2.as_operand(),
27035 Into::<Imm>::into(vm).as_operand(),
27036 Into::<Imm>::into(nf).as_operand(),
27037 ],
27038 );
27039 }
27040}
27041
27042impl<U2: Into<Imm>, U3: Into<Imm>> VsraViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
27043 fn vsra_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
27044 self.emit_n(
27045 Opcode::VSRAVI as i64,
27046 &[
27047 vd.as_operand(),
27048 vs2.as_operand(),
27049 Into::<Imm>::into(zimm5).as_operand(),
27050 Into::<Imm>::into(vm).as_operand(),
27051 ],
27052 );
27053 }
27054}
27055
27056impl<U3: Into<Imm>> VsraVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27057 fn vsra_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27058 self.emit_n(
27059 Opcode::VSRAVV as i64,
27060 &[
27061 vd.as_operand(),
27062 vs1.as_operand(),
27063 vs2.as_operand(),
27064 Into::<Imm>::into(vm).as_operand(),
27065 ],
27066 );
27067 }
27068}
27069
27070impl<U3: Into<Imm>> VsraVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27071 fn vsra_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27072 self.emit_n(
27073 Opcode::VSRAVX as i64,
27074 &[
27075 vd.as_operand(),
27076 vs2.as_operand(),
27077 rs1.as_operand(),
27078 Into::<Imm>::into(vm).as_operand(),
27079 ],
27080 );
27081 }
27082}
27083
27084impl<U2: Into<Imm>, U3: Into<Imm>> VsrlViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
27085 fn vsrl_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
27086 self.emit_n(
27087 Opcode::VSRLVI as i64,
27088 &[
27089 vd.as_operand(),
27090 vs2.as_operand(),
27091 Into::<Imm>::into(zimm5).as_operand(),
27092 Into::<Imm>::into(vm).as_operand(),
27093 ],
27094 );
27095 }
27096}
27097
27098impl<U3: Into<Imm>> VsrlVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27099 fn vsrl_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27100 self.emit_n(
27101 Opcode::VSRLVV as i64,
27102 &[
27103 vd.as_operand(),
27104 vs1.as_operand(),
27105 vs2.as_operand(),
27106 Into::<Imm>::into(vm).as_operand(),
27107 ],
27108 );
27109 }
27110}
27111
27112impl<U3: Into<Imm>> VsrlVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27113 fn vsrl_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27114 self.emit_n(
27115 Opcode::VSRLVX as i64,
27116 &[
27117 vd.as_operand(),
27118 vs2.as_operand(),
27119 rs1.as_operand(),
27120 Into::<Imm>::into(vm).as_operand(),
27121 ],
27122 );
27123 }
27124}
27125
27126impl<U3: Into<Imm>, U4: Into<Imm>> Vsse16VEmitter<Vp, Gp, Gp, U3, U4> for Assembler<'_> {
27127 fn vsse16_v(&mut self, vs3: Vp, rs1: Gp, rs2: Gp, vm: U3, nf: U4) {
27128 self.emit_n(
27129 Opcode::VSSE16V as i64,
27130 &[
27131 vs3.as_operand(),
27132 rs1.as_operand(),
27133 rs2.as_operand(),
27134 Into::<Imm>::into(vm).as_operand(),
27135 Into::<Imm>::into(nf).as_operand(),
27136 ],
27137 );
27138 }
27139}
27140
27141impl<U3: Into<Imm>, U4: Into<Imm>> Vsse32VEmitter<Vp, Gp, Gp, U3, U4> for Assembler<'_> {
27142 fn vsse32_v(&mut self, vs3: Vp, rs1: Gp, rs2: Gp, vm: U3, nf: U4) {
27143 self.emit_n(
27144 Opcode::VSSE32V as i64,
27145 &[
27146 vs3.as_operand(),
27147 rs1.as_operand(),
27148 rs2.as_operand(),
27149 Into::<Imm>::into(vm).as_operand(),
27150 Into::<Imm>::into(nf).as_operand(),
27151 ],
27152 );
27153 }
27154}
27155
27156impl<U3: Into<Imm>, U4: Into<Imm>> Vsse64VEmitter<Vp, Gp, Gp, U3, U4> for Assembler<'_> {
27157 fn vsse64_v(&mut self, vs3: Vp, rs1: Gp, rs2: Gp, vm: U3, nf: U4) {
27158 self.emit_n(
27159 Opcode::VSSE64V as i64,
27160 &[
27161 vs3.as_operand(),
27162 rs1.as_operand(),
27163 rs2.as_operand(),
27164 Into::<Imm>::into(vm).as_operand(),
27165 Into::<Imm>::into(nf).as_operand(),
27166 ],
27167 );
27168 }
27169}
27170
27171impl<U3: Into<Imm>, U4: Into<Imm>> Vsse8VEmitter<Vp, Gp, Gp, U3, U4> for Assembler<'_> {
27172 fn vsse8_v(&mut self, vs3: Vp, rs1: Gp, rs2: Gp, vm: U3, nf: U4) {
27173 self.emit_n(
27174 Opcode::VSSE8V as i64,
27175 &[
27176 vs3.as_operand(),
27177 rs1.as_operand(),
27178 rs2.as_operand(),
27179 Into::<Imm>::into(vm).as_operand(),
27180 Into::<Imm>::into(nf).as_operand(),
27181 ],
27182 );
27183 }
27184}
27185
27186impl<U2: Into<Imm>, U3: Into<Imm>> VssraViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
27187 fn vssra_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
27188 self.emit_n(
27189 Opcode::VSSRAVI as i64,
27190 &[
27191 vd.as_operand(),
27192 vs2.as_operand(),
27193 Into::<Imm>::into(zimm5).as_operand(),
27194 Into::<Imm>::into(vm).as_operand(),
27195 ],
27196 );
27197 }
27198}
27199
27200impl<U3: Into<Imm>> VssraVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27201 fn vssra_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27202 self.emit_n(
27203 Opcode::VSSRAVV as i64,
27204 &[
27205 vd.as_operand(),
27206 vs1.as_operand(),
27207 vs2.as_operand(),
27208 Into::<Imm>::into(vm).as_operand(),
27209 ],
27210 );
27211 }
27212}
27213
27214impl<U3: Into<Imm>> VssraVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27215 fn vssra_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27216 self.emit_n(
27217 Opcode::VSSRAVX as i64,
27218 &[
27219 vd.as_operand(),
27220 vs2.as_operand(),
27221 rs1.as_operand(),
27222 Into::<Imm>::into(vm).as_operand(),
27223 ],
27224 );
27225 }
27226}
27227
27228impl<U2: Into<Imm>, U3: Into<Imm>> VssrlViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
27229 fn vssrl_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
27230 self.emit_n(
27231 Opcode::VSSRLVI as i64,
27232 &[
27233 vd.as_operand(),
27234 vs2.as_operand(),
27235 Into::<Imm>::into(zimm5).as_operand(),
27236 Into::<Imm>::into(vm).as_operand(),
27237 ],
27238 );
27239 }
27240}
27241
27242impl<U3: Into<Imm>> VssrlVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27243 fn vssrl_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27244 self.emit_n(
27245 Opcode::VSSRLVV as i64,
27246 &[
27247 vd.as_operand(),
27248 vs1.as_operand(),
27249 vs2.as_operand(),
27250 Into::<Imm>::into(vm).as_operand(),
27251 ],
27252 );
27253 }
27254}
27255
27256impl<U3: Into<Imm>> VssrlVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27257 fn vssrl_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27258 self.emit_n(
27259 Opcode::VSSRLVX as i64,
27260 &[
27261 vd.as_operand(),
27262 vs2.as_operand(),
27263 rs1.as_operand(),
27264 Into::<Imm>::into(vm).as_operand(),
27265 ],
27266 );
27267 }
27268}
27269
27270impl<U3: Into<Imm>> VssubVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27271 fn vssub_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27272 self.emit_n(
27273 Opcode::VSSUBVV as i64,
27274 &[
27275 vd.as_operand(),
27276 vs1.as_operand(),
27277 vs2.as_operand(),
27278 Into::<Imm>::into(vm).as_operand(),
27279 ],
27280 );
27281 }
27282}
27283
27284impl<U3: Into<Imm>> VssubVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27285 fn vssub_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27286 self.emit_n(
27287 Opcode::VSSUBVX as i64,
27288 &[
27289 vd.as_operand(),
27290 vs2.as_operand(),
27291 rs1.as_operand(),
27292 Into::<Imm>::into(vm).as_operand(),
27293 ],
27294 );
27295 }
27296}
27297
27298impl<U3: Into<Imm>> VssubuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27299 fn vssubu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27300 self.emit_n(
27301 Opcode::VSSUBUVV as i64,
27302 &[
27303 vd.as_operand(),
27304 vs1.as_operand(),
27305 vs2.as_operand(),
27306 Into::<Imm>::into(vm).as_operand(),
27307 ],
27308 );
27309 }
27310}
27311
27312impl<U3: Into<Imm>> VssubuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27313 fn vssubu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27314 self.emit_n(
27315 Opcode::VSSUBUVX as i64,
27316 &[
27317 vd.as_operand(),
27318 vs2.as_operand(),
27319 rs1.as_operand(),
27320 Into::<Imm>::into(vm).as_operand(),
27321 ],
27322 );
27323 }
27324}
27325
27326impl<U3: Into<Imm>> VsubVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27327 fn vsub_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27328 self.emit_n(
27329 Opcode::VSUBVV as i64,
27330 &[
27331 vd.as_operand(),
27332 vs1.as_operand(),
27333 vs2.as_operand(),
27334 Into::<Imm>::into(vm).as_operand(),
27335 ],
27336 );
27337 }
27338}
27339
27340impl<U3: Into<Imm>> VsubVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27341 fn vsub_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27342 self.emit_n(
27343 Opcode::VSUBVX as i64,
27344 &[
27345 vd.as_operand(),
27346 vs2.as_operand(),
27347 rs1.as_operand(),
27348 Into::<Imm>::into(vm).as_operand(),
27349 ],
27350 );
27351 }
27352}
27353
27354impl<U3: Into<Imm>, U4: Into<Imm>> Vsuxei16VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
27355 fn vsuxei16_v(&mut self, vs3: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
27356 self.emit_n(
27357 Opcode::VSUXEI16V as i64,
27358 &[
27359 vs3.as_operand(),
27360 rs1.as_operand(),
27361 vs2.as_operand(),
27362 Into::<Imm>::into(vm).as_operand(),
27363 Into::<Imm>::into(nf).as_operand(),
27364 ],
27365 );
27366 }
27367}
27368
27369impl<U3: Into<Imm>, U4: Into<Imm>> Vsuxei32VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
27370 fn vsuxei32_v(&mut self, vs3: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
27371 self.emit_n(
27372 Opcode::VSUXEI32V as i64,
27373 &[
27374 vs3.as_operand(),
27375 rs1.as_operand(),
27376 vs2.as_operand(),
27377 Into::<Imm>::into(vm).as_operand(),
27378 Into::<Imm>::into(nf).as_operand(),
27379 ],
27380 );
27381 }
27382}
27383
27384impl<U3: Into<Imm>, U4: Into<Imm>> Vsuxei64VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
27385 fn vsuxei64_v(&mut self, vs3: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
27386 self.emit_n(
27387 Opcode::VSUXEI64V as i64,
27388 &[
27389 vs3.as_operand(),
27390 rs1.as_operand(),
27391 vs2.as_operand(),
27392 Into::<Imm>::into(vm).as_operand(),
27393 Into::<Imm>::into(nf).as_operand(),
27394 ],
27395 );
27396 }
27397}
27398
27399impl<U3: Into<Imm>, U4: Into<Imm>> Vsuxei8VEmitter<Vp, Gp, Vp, U3, U4> for Assembler<'_> {
27400 fn vsuxei8_v(&mut self, vs3: Vp, rs1: Gp, vs2: Vp, vm: U3, nf: U4) {
27401 self.emit_n(
27402 Opcode::VSUXEI8V as i64,
27403 &[
27404 vs3.as_operand(),
27405 rs1.as_operand(),
27406 vs2.as_operand(),
27407 Into::<Imm>::into(vm).as_operand(),
27408 Into::<Imm>::into(nf).as_operand(),
27409 ],
27410 );
27411 }
27412}
27413
27414impl<U3: Into<Imm>> VwaddVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27415 fn vwadd_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27416 self.emit_n(
27417 Opcode::VWADDVV as i64,
27418 &[
27419 vd.as_operand(),
27420 vs1.as_operand(),
27421 vs2.as_operand(),
27422 Into::<Imm>::into(vm).as_operand(),
27423 ],
27424 );
27425 }
27426}
27427
27428impl<U3: Into<Imm>> VwaddVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27429 fn vwadd_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27430 self.emit_n(
27431 Opcode::VWADDVX as i64,
27432 &[
27433 vd.as_operand(),
27434 vs2.as_operand(),
27435 rs1.as_operand(),
27436 Into::<Imm>::into(vm).as_operand(),
27437 ],
27438 );
27439 }
27440}
27441
27442impl<U3: Into<Imm>> VwaddWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27443 fn vwadd_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27444 self.emit_n(
27445 Opcode::VWADDWV as i64,
27446 &[
27447 vd.as_operand(),
27448 vs1.as_operand(),
27449 vs2.as_operand(),
27450 Into::<Imm>::into(vm).as_operand(),
27451 ],
27452 );
27453 }
27454}
27455
27456impl<U3: Into<Imm>> VwaddWxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27457 fn vwadd_wx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27458 self.emit_n(
27459 Opcode::VWADDWX as i64,
27460 &[
27461 vd.as_operand(),
27462 vs2.as_operand(),
27463 rs1.as_operand(),
27464 Into::<Imm>::into(vm).as_operand(),
27465 ],
27466 );
27467 }
27468}
27469
27470impl<U3: Into<Imm>> VwadduVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27471 fn vwaddu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27472 self.emit_n(
27473 Opcode::VWADDUVV as i64,
27474 &[
27475 vd.as_operand(),
27476 vs1.as_operand(),
27477 vs2.as_operand(),
27478 Into::<Imm>::into(vm).as_operand(),
27479 ],
27480 );
27481 }
27482}
27483
27484impl<U3: Into<Imm>> VwadduVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27485 fn vwaddu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27486 self.emit_n(
27487 Opcode::VWADDUVX as i64,
27488 &[
27489 vd.as_operand(),
27490 vs2.as_operand(),
27491 rs1.as_operand(),
27492 Into::<Imm>::into(vm).as_operand(),
27493 ],
27494 );
27495 }
27496}
27497
27498impl<U3: Into<Imm>> VwadduWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27499 fn vwaddu_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27500 self.emit_n(
27501 Opcode::VWADDUWV as i64,
27502 &[
27503 vd.as_operand(),
27504 vs1.as_operand(),
27505 vs2.as_operand(),
27506 Into::<Imm>::into(vm).as_operand(),
27507 ],
27508 );
27509 }
27510}
27511
27512impl<U3: Into<Imm>> VwadduWxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27513 fn vwaddu_wx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27514 self.emit_n(
27515 Opcode::VWADDUWX as i64,
27516 &[
27517 vd.as_operand(),
27518 vs2.as_operand(),
27519 rs1.as_operand(),
27520 Into::<Imm>::into(vm).as_operand(),
27521 ],
27522 );
27523 }
27524}
27525
27526impl<U3: Into<Imm>> VwmaccVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27527 fn vwmacc_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27528 self.emit_n(
27529 Opcode::VWMACCVV as i64,
27530 &[
27531 vd.as_operand(),
27532 vs1.as_operand(),
27533 vs2.as_operand(),
27534 Into::<Imm>::into(vm).as_operand(),
27535 ],
27536 );
27537 }
27538}
27539
27540impl<U3: Into<Imm>> VwmaccVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27541 fn vwmacc_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27542 self.emit_n(
27543 Opcode::VWMACCVX as i64,
27544 &[
27545 vd.as_operand(),
27546 vs2.as_operand(),
27547 rs1.as_operand(),
27548 Into::<Imm>::into(vm).as_operand(),
27549 ],
27550 );
27551 }
27552}
27553
27554impl<U3: Into<Imm>> VwmaccsuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27555 fn vwmaccsu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27556 self.emit_n(
27557 Opcode::VWMACCSUVV as i64,
27558 &[
27559 vd.as_operand(),
27560 vs1.as_operand(),
27561 vs2.as_operand(),
27562 Into::<Imm>::into(vm).as_operand(),
27563 ],
27564 );
27565 }
27566}
27567
27568impl<U3: Into<Imm>> VwmaccsuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27569 fn vwmaccsu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27570 self.emit_n(
27571 Opcode::VWMACCSUVX as i64,
27572 &[
27573 vd.as_operand(),
27574 vs2.as_operand(),
27575 rs1.as_operand(),
27576 Into::<Imm>::into(vm).as_operand(),
27577 ],
27578 );
27579 }
27580}
27581
27582impl<U3: Into<Imm>> VwmaccuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27583 fn vwmaccu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27584 self.emit_n(
27585 Opcode::VWMACCUVV as i64,
27586 &[
27587 vd.as_operand(),
27588 vs1.as_operand(),
27589 vs2.as_operand(),
27590 Into::<Imm>::into(vm).as_operand(),
27591 ],
27592 );
27593 }
27594}
27595
27596impl<U3: Into<Imm>> VwmaccuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27597 fn vwmaccu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27598 self.emit_n(
27599 Opcode::VWMACCUVX as i64,
27600 &[
27601 vd.as_operand(),
27602 vs2.as_operand(),
27603 rs1.as_operand(),
27604 Into::<Imm>::into(vm).as_operand(),
27605 ],
27606 );
27607 }
27608}
27609
27610impl<U3: Into<Imm>> VwmaccusVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27611 fn vwmaccus_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27612 self.emit_n(
27613 Opcode::VWMACCUSVX as i64,
27614 &[
27615 vd.as_operand(),
27616 vs2.as_operand(),
27617 rs1.as_operand(),
27618 Into::<Imm>::into(vm).as_operand(),
27619 ],
27620 );
27621 }
27622}
27623
27624impl<U3: Into<Imm>> VwmulVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27625 fn vwmul_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27626 self.emit_n(
27627 Opcode::VWMULVV as i64,
27628 &[
27629 vd.as_operand(),
27630 vs1.as_operand(),
27631 vs2.as_operand(),
27632 Into::<Imm>::into(vm).as_operand(),
27633 ],
27634 );
27635 }
27636}
27637
27638impl<U3: Into<Imm>> VwmulVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27639 fn vwmul_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27640 self.emit_n(
27641 Opcode::VWMULVX as i64,
27642 &[
27643 vd.as_operand(),
27644 vs2.as_operand(),
27645 rs1.as_operand(),
27646 Into::<Imm>::into(vm).as_operand(),
27647 ],
27648 );
27649 }
27650}
27651
27652impl<U3: Into<Imm>> VwmulsuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27653 fn vwmulsu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27654 self.emit_n(
27655 Opcode::VWMULSUVV as i64,
27656 &[
27657 vd.as_operand(),
27658 vs1.as_operand(),
27659 vs2.as_operand(),
27660 Into::<Imm>::into(vm).as_operand(),
27661 ],
27662 );
27663 }
27664}
27665
27666impl<U3: Into<Imm>> VwmulsuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27667 fn vwmulsu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27668 self.emit_n(
27669 Opcode::VWMULSUVX as i64,
27670 &[
27671 vd.as_operand(),
27672 vs2.as_operand(),
27673 rs1.as_operand(),
27674 Into::<Imm>::into(vm).as_operand(),
27675 ],
27676 );
27677 }
27678}
27679
27680impl<U3: Into<Imm>> VwmuluVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27681 fn vwmulu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27682 self.emit_n(
27683 Opcode::VWMULUVV as i64,
27684 &[
27685 vd.as_operand(),
27686 vs1.as_operand(),
27687 vs2.as_operand(),
27688 Into::<Imm>::into(vm).as_operand(),
27689 ],
27690 );
27691 }
27692}
27693
27694impl<U3: Into<Imm>> VwmuluVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27695 fn vwmulu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27696 self.emit_n(
27697 Opcode::VWMULUVX as i64,
27698 &[
27699 vd.as_operand(),
27700 vs2.as_operand(),
27701 rs1.as_operand(),
27702 Into::<Imm>::into(vm).as_operand(),
27703 ],
27704 );
27705 }
27706}
27707
27708impl<U3: Into<Imm>> VwredsumVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27709 fn vwredsum_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27710 self.emit_n(
27711 Opcode::VWREDSUMVS as i64,
27712 &[
27713 vd.as_operand(),
27714 vs1.as_operand(),
27715 vs2.as_operand(),
27716 Into::<Imm>::into(vm).as_operand(),
27717 ],
27718 );
27719 }
27720}
27721
27722impl<U3: Into<Imm>> VwredsumuVsEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27723 fn vwredsumu_vs(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27724 self.emit_n(
27725 Opcode::VWREDSUMUVS as i64,
27726 &[
27727 vd.as_operand(),
27728 vs1.as_operand(),
27729 vs2.as_operand(),
27730 Into::<Imm>::into(vm).as_operand(),
27731 ],
27732 );
27733 }
27734}
27735
27736impl<U2: Into<Imm>, U3: Into<Imm>> VwsllViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
27737 fn vwsll_vi(&mut self, vd: Vp, vs2: Vp, zimm5: U2, vm: U3) {
27738 self.emit_n(
27739 Opcode::VWSLLVI as i64,
27740 &[
27741 vd.as_operand(),
27742 vs2.as_operand(),
27743 Into::<Imm>::into(zimm5).as_operand(),
27744 Into::<Imm>::into(vm).as_operand(),
27745 ],
27746 );
27747 }
27748}
27749
27750impl<U3: Into<Imm>> VwsllVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27751 fn vwsll_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27752 self.emit_n(
27753 Opcode::VWSLLVV as i64,
27754 &[
27755 vd.as_operand(),
27756 vs1.as_operand(),
27757 vs2.as_operand(),
27758 Into::<Imm>::into(vm).as_operand(),
27759 ],
27760 );
27761 }
27762}
27763
27764impl<U3: Into<Imm>> VwsllVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27765 fn vwsll_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27766 self.emit_n(
27767 Opcode::VWSLLVX as i64,
27768 &[
27769 vd.as_operand(),
27770 vs2.as_operand(),
27771 rs1.as_operand(),
27772 Into::<Imm>::into(vm).as_operand(),
27773 ],
27774 );
27775 }
27776}
27777
27778impl<U3: Into<Imm>> VwsubVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27779 fn vwsub_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27780 self.emit_n(
27781 Opcode::VWSUBVV as i64,
27782 &[
27783 vd.as_operand(),
27784 vs1.as_operand(),
27785 vs2.as_operand(),
27786 Into::<Imm>::into(vm).as_operand(),
27787 ],
27788 );
27789 }
27790}
27791
27792impl<U3: Into<Imm>> VwsubVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27793 fn vwsub_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27794 self.emit_n(
27795 Opcode::VWSUBVX as i64,
27796 &[
27797 vd.as_operand(),
27798 vs2.as_operand(),
27799 rs1.as_operand(),
27800 Into::<Imm>::into(vm).as_operand(),
27801 ],
27802 );
27803 }
27804}
27805
27806impl<U3: Into<Imm>> VwsubWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27807 fn vwsub_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27808 self.emit_n(
27809 Opcode::VWSUBWV as i64,
27810 &[
27811 vd.as_operand(),
27812 vs1.as_operand(),
27813 vs2.as_operand(),
27814 Into::<Imm>::into(vm).as_operand(),
27815 ],
27816 );
27817 }
27818}
27819
27820impl<U3: Into<Imm>> VwsubWxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27821 fn vwsub_wx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27822 self.emit_n(
27823 Opcode::VWSUBWX as i64,
27824 &[
27825 vd.as_operand(),
27826 vs2.as_operand(),
27827 rs1.as_operand(),
27828 Into::<Imm>::into(vm).as_operand(),
27829 ],
27830 );
27831 }
27832}
27833
27834impl<U3: Into<Imm>> VwsubuVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27835 fn vwsubu_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27836 self.emit_n(
27837 Opcode::VWSUBUVV as i64,
27838 &[
27839 vd.as_operand(),
27840 vs1.as_operand(),
27841 vs2.as_operand(),
27842 Into::<Imm>::into(vm).as_operand(),
27843 ],
27844 );
27845 }
27846}
27847
27848impl<U3: Into<Imm>> VwsubuVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27849 fn vwsubu_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27850 self.emit_n(
27851 Opcode::VWSUBUVX as i64,
27852 &[
27853 vd.as_operand(),
27854 vs2.as_operand(),
27855 rs1.as_operand(),
27856 Into::<Imm>::into(vm).as_operand(),
27857 ],
27858 );
27859 }
27860}
27861
27862impl<U3: Into<Imm>> VwsubuWvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27863 fn vwsubu_wv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27864 self.emit_n(
27865 Opcode::VWSUBUWV as i64,
27866 &[
27867 vd.as_operand(),
27868 vs1.as_operand(),
27869 vs2.as_operand(),
27870 Into::<Imm>::into(vm).as_operand(),
27871 ],
27872 );
27873 }
27874}
27875
27876impl<U3: Into<Imm>> VwsubuWxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27877 fn vwsubu_wx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27878 self.emit_n(
27879 Opcode::VWSUBUWX as i64,
27880 &[
27881 vd.as_operand(),
27882 vs2.as_operand(),
27883 rs1.as_operand(),
27884 Into::<Imm>::into(vm).as_operand(),
27885 ],
27886 );
27887 }
27888}
27889
27890impl<U2: Into<Imm>, U3: Into<Imm>> VxorViEmitter<Vp, Vp, U2, U3> for Assembler<'_> {
27891 fn vxor_vi(&mut self, vd: Vp, vs2: Vp, simm5: U2, vm: U3) {
27892 self.emit_n(
27893 Opcode::VXORVI as i64,
27894 &[
27895 vd.as_operand(),
27896 vs2.as_operand(),
27897 Into::<Imm>::into(simm5).as_operand(),
27898 Into::<Imm>::into(vm).as_operand(),
27899 ],
27900 );
27901 }
27902}
27903
27904impl<U3: Into<Imm>> VxorVvEmitter<Vp, Vp, Vp, U3> for Assembler<'_> {
27905 fn vxor_vv(&mut self, vd: Vp, vs1: Vp, vs2: Vp, vm: U3) {
27906 self.emit_n(
27907 Opcode::VXORVV as i64,
27908 &[
27909 vd.as_operand(),
27910 vs1.as_operand(),
27911 vs2.as_operand(),
27912 Into::<Imm>::into(vm).as_operand(),
27913 ],
27914 );
27915 }
27916}
27917
27918impl<U3: Into<Imm>> VxorVxEmitter<Vp, Vp, Gp, U3> for Assembler<'_> {
27919 fn vxor_vx(&mut self, vd: Vp, vs2: Vp, rs1: Gp, vm: U3) {
27920 self.emit_n(
27921 Opcode::VXORVX as i64,
27922 &[
27923 vd.as_operand(),
27924 vs2.as_operand(),
27925 rs1.as_operand(),
27926 Into::<Imm>::into(vm).as_operand(),
27927 ],
27928 );
27929 }
27930}
27931
27932impl<U2: Into<Imm>> VzextVf2Emitter<Vp, Vp, U2> for Assembler<'_> {
27933 fn vzext_vf2(&mut self, vd: Vp, vs2: Vp, vm: U2) {
27934 self.emit_n(
27935 Opcode::VZEXTVF2 as i64,
27936 &[
27937 vd.as_operand(),
27938 vs2.as_operand(),
27939 Into::<Imm>::into(vm).as_operand(),
27940 ],
27941 );
27942 }
27943}
27944
27945impl<U2: Into<Imm>> VzextVf4Emitter<Vp, Vp, U2> for Assembler<'_> {
27946 fn vzext_vf4(&mut self, vd: Vp, vs2: Vp, vm: U2) {
27947 self.emit_n(
27948 Opcode::VZEXTVF4 as i64,
27949 &[
27950 vd.as_operand(),
27951 vs2.as_operand(),
27952 Into::<Imm>::into(vm).as_operand(),
27953 ],
27954 );
27955 }
27956}
27957
27958impl<U2: Into<Imm>> VzextVf8Emitter<Vp, Vp, U2> for Assembler<'_> {
27959 fn vzext_vf8(&mut self, vd: Vp, vs2: Vp, vm: U2) {
27960 self.emit_n(
27961 Opcode::VZEXTVF8 as i64,
27962 &[
27963 vd.as_operand(),
27964 vs2.as_operand(),
27965 Into::<Imm>::into(vm).as_operand(),
27966 ],
27967 );
27968 }
27969}
27970
27971impl WfiEmitter for Assembler<'_> {
27972 fn wfi(&mut self) {
27973 self.emit_n(Opcode::WFI as i64, &[]);
27974 }
27975}
27976
27977impl WrsNtoEmitter for Assembler<'_> {
27978 fn wrs_nto(&mut self) {
27979 self.emit_n(Opcode::WRSNTO as i64, &[]);
27980 }
27981}
27982
27983impl WrsStoEmitter for Assembler<'_> {
27984 fn wrs_sto(&mut self) {
27985 self.emit_n(Opcode::WRSSTO as i64, &[]);
27986 }
27987}
27988
27989impl XnorEmitter<Gp, Gp, Gp> for Assembler<'_> {
27990 fn xnor(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
27991 self.emit_n(
27992 Opcode::XNOR as i64,
27993 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
27994 );
27995 }
27996}
27997
27998impl XorEmitter<Gp, Gp, Gp> for Assembler<'_> {
27999 fn xor(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
28000 self.emit_n(
28001 Opcode::XOR as i64,
28002 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
28003 );
28004 }
28005}
28006
28007impl<U2: Into<Imm>> XoriEmitter<Gp, Gp, U2> for Assembler<'_> {
28008 fn xori(&mut self, rd: Gp, rs1: Gp, imm: U2) {
28009 self.emit_n(
28010 Opcode::XORI as i64,
28011 &[
28012 rd.as_operand(),
28013 rs1.as_operand(),
28014 Into::<Imm>::into(imm).as_operand(),
28015 ],
28016 );
28017 }
28018}
28019
28020impl Xperm4Emitter<Gp, Gp, Gp> for Assembler<'_> {
28021 fn xperm4(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
28022 self.emit_n(
28023 Opcode::XPERM4 as i64,
28024 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
28025 );
28026 }
28027}
28028
28029impl Xperm8Emitter<Gp, Gp, Gp> for Assembler<'_> {
28030 fn xperm8(&mut self, rd: Gp, rs1: Gp, rs2: Gp) {
28031 self.emit_n(
28032 Opcode::XPERM8 as i64,
28033 &[rd.as_operand(), rs1.as_operand(), rs2.as_operand()],
28034 );
28035 }
28036}
28037
28038impl ZextBEmitter<Gp, Gp> for Assembler<'_> {
28039 fn zext_b(&mut self, rd: Gp, rs1: Gp) {
28040 self.emit_n(Opcode::ZEXTB as i64, &[rd.as_operand(), rs1.as_operand()]);
28041 }
28042}
28043
28044impl ZextHEmitter<Gp, Gp> for Assembler<'_> {
28045 fn zext_h(&mut self, rd: Gp, rs1: Gp) {
28046 self.emit_n(Opcode::ZEXTH as i64, &[rd.as_operand(), rs1.as_operand()]);
28047 }
28048}
28049
28050impl ZextHRv32Emitter<Gp, Gp> for Assembler<'_> {
28051 fn zext_h_rv32(&mut self, rd: Gp, rs1: Gp) {
28052 self.emit_n(
28053 Opcode::ZEXTHRV32 as i64,
28054 &[rd.as_operand(), rs1.as_operand()],
28055 );
28056 }
28057}
28058
28059impl ZextWEmitter<Gp, Gp> for Assembler<'_> {
28060 fn zext_w(&mut self, rd: Gp, rs1: Gp) {
28061 self.emit_n(Opcode::ZEXTW as i64, &[rd.as_operand(), rs1.as_operand()]);
28062 }
28063}
28064
28065impl ZipEmitter<Gp, Gp> for Assembler<'_> {
28066 fn zip(&mut self, rd: Gp, rs1: Gp) {
28067 self.emit_n(Opcode::ZIP as i64, &[rd.as_operand(), rs1.as_operand()]);
28068 }
28069}
28070
28071impl Assembler<'_> {
28072 /// Integer add
28073 ///
28074 /// Add the value in rs1 to rs2, and store the result in rd.
28075 /// Any overflow is thrown away.
28076 ///
28077 /// # Forms
28078 /// Assembly: `add xd, xs1, xs2`
28079 /// Rust: `add(rd, rs1, rs2)`
28080 ///
28081 /// # Arguments
28082 /// - `rd` — Destination register.
28083 /// - `rs1` — Source register.
28084 /// - `rs2` — Source register.
28085 pub fn add<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
28086 where
28087 Self: AddEmitter<T0, T1, T2>,
28088 {
28089 <Self as AddEmitter<T0, T1, T2>>::add(self, rd, rs1, rs2);
28090 }
28091 /// Add unsigned word
28092 ///
28093 /// This instruction performs an XLEN-wide addition between rs2 and the
28094 /// zero-extended least-significant word of rs1.
28095 ///
28096 /// # Forms
28097 /// Assembly: `add.uw xd, xs1, xs2`
28098 /// Rust: `add_uw(rd, rs1, rs2)`
28099 ///
28100 /// # Arguments
28101 /// - `rd` — Destination register.
28102 /// - `rs1` — Source register.
28103 /// - `rs2` — Source register.
28104 pub fn add_uw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
28105 where
28106 Self: AddUwEmitter<T0, T1, T2>,
28107 {
28108 <Self as AddUwEmitter<T0, T1, T2>>::add_uw(self, rd, rs1, rs2);
28109 }
28110 /// Add immediate
28111 ///
28112 /// Add an immediate to the value in rs1, and store the result in rd
28113 ///
28114 /// # Forms
28115 /// Assembly: `addi xd, xs1, imm`
28116 /// Rust: `addi(rd, rs1, imm)`
28117 ///
28118 /// # Arguments
28119 /// - `rd` — Destination register.
28120 /// - `rs1` — Source register.
28121 /// - `imm` — Immediate encoding value.
28122 pub fn addi<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
28123 where
28124 Self: AddiEmitter<T0, T1, T2>,
28125 {
28126 <Self as AddiEmitter<T0, T1, T2>>::addi(self, rd, rs1, imm);
28127 }
28128 /// Add immediate word
28129 ///
28130 /// Add an immediate to the 32-bit value in rs1, and store the sign extended result in rd
28131 ///
28132 /// # Forms
28133 /// Assembly: `addiw xd, xs1, imm`
28134 /// Rust: `addiw(rd, rs1, imm)`
28135 ///
28136 /// # Arguments
28137 /// - `rd` — Destination register.
28138 /// - `rs1` — Source register.
28139 /// - `imm` — Immediate encoding value.
28140 pub fn addiw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
28141 where
28142 Self: AddiwEmitter<T0, T1, T2>,
28143 {
28144 <Self as AddiwEmitter<T0, T1, T2>>::addiw(self, rd, rs1, imm);
28145 }
28146 /// Add word
28147 ///
28148 /// Add the 32-bit values in rs1 to rs2, and store the sign-extended result in rd.
28149 /// Any overflow is thrown away.
28150 ///
28151 /// # Forms
28152 /// Assembly: `addw xd, xs1, xs2`
28153 /// Rust: `addw(rd, rs1, rs2)`
28154 ///
28155 /// # Arguments
28156 /// - `rd` — Destination register.
28157 /// - `rs1` — Source register.
28158 /// - `rs2` — Source register.
28159 pub fn addw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
28160 where
28161 Self: AddwEmitter<T0, T1, T2>,
28162 {
28163 <Self as AddwEmitter<T0, T1, T2>>::addw(self, rd, rs1, rs2);
28164 }
28165 /// RISC-V `aes32dsi` instruction.
28166 ///
28167 /// # Forms
28168 /// Assembly: `aes32dsi xd, xs1, xs2, bs`
28169 /// Rust: `aes32dsi(rd, rs1, rs2, bs)`
28170 ///
28171 /// # Arguments
28172 /// - `rd` — Destination register.
28173 /// - `rs1` — Source register.
28174 /// - `rs2` — Source register.
28175 /// - `bs` — Immediate encoding value.
28176 pub fn aes32dsi<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3)
28177 where
28178 Self: Aes32DsiEmitter<T0, T1, T2, T3>,
28179 {
28180 <Self as Aes32DsiEmitter<T0, T1, T2, T3>>::aes32dsi(self, rd, rs1, rs2, bs);
28181 }
28182 /// RISC-V `aes32dsmi` instruction.
28183 ///
28184 /// # Forms
28185 /// Assembly: `aes32dsmi xd, xs1, xs2, bs`
28186 /// Rust: `aes32dsmi(rd, rs1, rs2, bs)`
28187 ///
28188 /// # Arguments
28189 /// - `rd` — Destination register.
28190 /// - `rs1` — Source register.
28191 /// - `rs2` — Source register.
28192 /// - `bs` — Immediate encoding value.
28193 pub fn aes32dsmi<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3)
28194 where
28195 Self: Aes32DsmiEmitter<T0, T1, T2, T3>,
28196 {
28197 <Self as Aes32DsmiEmitter<T0, T1, T2, T3>>::aes32dsmi(self, rd, rs1, rs2, bs);
28198 }
28199 /// RISC-V `aes32esi` instruction.
28200 ///
28201 /// # Forms
28202 /// Assembly: `aes32esi xd, xs1, xs2, bs`
28203 /// Rust: `aes32esi(rd, rs1, rs2, bs)`
28204 ///
28205 /// # Arguments
28206 /// - `rd` — Destination register.
28207 /// - `rs1` — Source register.
28208 /// - `rs2` — Source register.
28209 /// - `bs` — Immediate encoding value.
28210 pub fn aes32esi<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3)
28211 where
28212 Self: Aes32EsiEmitter<T0, T1, T2, T3>,
28213 {
28214 <Self as Aes32EsiEmitter<T0, T1, T2, T3>>::aes32esi(self, rd, rs1, rs2, bs);
28215 }
28216 /// RISC-V `aes32esmi` instruction.
28217 ///
28218 /// # Forms
28219 /// Assembly: `aes32esmi xd, xs1, xs2, bs`
28220 /// Rust: `aes32esmi(rd, rs1, rs2, bs)`
28221 ///
28222 /// # Arguments
28223 /// - `rd` — Destination register.
28224 /// - `rs1` — Source register.
28225 /// - `rs2` — Source register.
28226 /// - `bs` — Immediate encoding value.
28227 pub fn aes32esmi<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3)
28228 where
28229 Self: Aes32EsmiEmitter<T0, T1, T2, T3>,
28230 {
28231 <Self as Aes32EsmiEmitter<T0, T1, T2, T3>>::aes32esmi(self, rd, rs1, rs2, bs);
28232 }
28233 /// RISC-V `aes64ds` instruction.
28234 ///
28235 /// # Forms
28236 /// Assembly: `aes64ds xd, xs1, xs2`
28237 /// Rust: `aes64ds(rd, rs1, rs2)`
28238 ///
28239 /// # Arguments
28240 /// - `rd` — Destination register.
28241 /// - `rs1` — Source register.
28242 /// - `rs2` — Source register.
28243 pub fn aes64ds<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
28244 where
28245 Self: Aes64DsEmitter<T0, T1, T2>,
28246 {
28247 <Self as Aes64DsEmitter<T0, T1, T2>>::aes64ds(self, rd, rs1, rs2);
28248 }
28249 /// RISC-V `aes64dsm` instruction.
28250 ///
28251 /// # Forms
28252 /// Assembly: `aes64dsm xd, xs1, xs2`
28253 /// Rust: `aes64dsm(rd, rs1, rs2)`
28254 ///
28255 /// # Arguments
28256 /// - `rd` — Destination register.
28257 /// - `rs1` — Source register.
28258 /// - `rs2` — Source register.
28259 pub fn aes64dsm<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
28260 where
28261 Self: Aes64DsmEmitter<T0, T1, T2>,
28262 {
28263 <Self as Aes64DsmEmitter<T0, T1, T2>>::aes64dsm(self, rd, rs1, rs2);
28264 }
28265 /// RISC-V `aes64es` instruction.
28266 ///
28267 /// # Forms
28268 /// Assembly: `aes64es xd, xs1, xs2`
28269 /// Rust: `aes64es(rd, rs1, rs2)`
28270 ///
28271 /// # Arguments
28272 /// - `rd` — Destination register.
28273 /// - `rs1` — Source register.
28274 /// - `rs2` — Source register.
28275 pub fn aes64es<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
28276 where
28277 Self: Aes64EsEmitter<T0, T1, T2>,
28278 {
28279 <Self as Aes64EsEmitter<T0, T1, T2>>::aes64es(self, rd, rs1, rs2);
28280 }
28281 /// RISC-V `aes64esm` instruction.
28282 ///
28283 /// # Forms
28284 /// Assembly: `aes64esm xd, xs1, xs2`
28285 /// Rust: `aes64esm(rd, rs1, rs2)`
28286 ///
28287 /// # Arguments
28288 /// - `rd` — Destination register.
28289 /// - `rs1` — Source register.
28290 /// - `rs2` — Source register.
28291 pub fn aes64esm<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
28292 where
28293 Self: Aes64EsmEmitter<T0, T1, T2>,
28294 {
28295 <Self as Aes64EsmEmitter<T0, T1, T2>>::aes64esm(self, rd, rs1, rs2);
28296 }
28297 /// RISC-V `aes64im` instruction.
28298 ///
28299 /// # Forms
28300 /// Assembly: `aes64im xd, xs1`
28301 /// Rust: `aes64im(rd, rs1)`
28302 ///
28303 /// # Arguments
28304 /// - `rd` — Destination register.
28305 /// - `rs1` — Source register.
28306 pub fn aes64im<T0, T1>(&mut self, rd: T0, rs1: T1)
28307 where
28308 Self: Aes64ImEmitter<T0, T1>,
28309 {
28310 <Self as Aes64ImEmitter<T0, T1>>::aes64im(self, rd, rs1);
28311 }
28312 /// RISC-V `aes64ks1i` instruction.
28313 ///
28314 /// # Forms
28315 /// Assembly: `aes64ks1i xd, xs1, rnum`
28316 /// Rust: `aes64ks1i(rd, rs1, rnum)`
28317 ///
28318 /// # Arguments
28319 /// - `rd` — Destination register.
28320 /// - `rs1` — Source register.
28321 /// - `rnum` — Immediate encoding value.
28322 pub fn aes64ks1i<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rnum: T2)
28323 where
28324 Self: Aes64Ks1IEmitter<T0, T1, T2>,
28325 {
28326 <Self as Aes64Ks1IEmitter<T0, T1, T2>>::aes64ks1i(self, rd, rs1, rnum);
28327 }
28328 /// RISC-V `aes64ks2` instruction.
28329 ///
28330 /// # Forms
28331 /// Assembly: `aes64ks2 xd, xs1, xs2`
28332 /// Rust: `aes64ks2(rd, rs1, rs2)`
28333 ///
28334 /// # Arguments
28335 /// - `rd` — Destination register.
28336 /// - `rs1` — Source register.
28337 /// - `rs2` — Source register.
28338 pub fn aes64ks2<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
28339 where
28340 Self: Aes64Ks2Emitter<T0, T1, T2>,
28341 {
28342 <Self as Aes64Ks2Emitter<T0, T1, T2>>::aes64ks2(self, rd, rs1, rs2);
28343 }
28344 /// RISC-V `amoadd.b` instruction.
28345 ///
28346 /// # Forms
28347 /// Assembly: `amoadd.b xd, xs1, xs2, aq, rl`
28348 /// Rust: `amoadd_b(rd, rs1, rs2, aq, rl)`
28349 ///
28350 /// # Arguments
28351 /// - `rd` — Destination register.
28352 /// - `rs1` — Memory base register.
28353 /// - `rs2` — Source register.
28354 /// - `aq` — Acquire-order bit.
28355 /// - `rl` — Release-order bit; retained for the existing emitter API.
28356 pub fn amoadd_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28357 where
28358 Self: AmoaddBEmitter<T0, T1, T2, T3, T4>,
28359 {
28360 <Self as AmoaddBEmitter<T0, T1, T2, T3, T4>>::amoadd_b(self, rd, rs1, rs2, aq, rl);
28361 }
28362 /// Atomic fetch-and-add doubleword
28363 ///
28364 /// Atomically:
28365 ///
28366 /// * Load the doubleword at address _rs1_
28367 /// * Write the loaded value into _rd_
28368 /// * Add the value of register _rs2_ to the loaded value
28369 /// * Write the sum to the address in _rs1_
28370 ///
28371 /// # Forms
28372 /// Assembly: `amoadd.d xd, xs2, (xs1)`
28373 /// Rust: `amoadd_d(rd, rs1, rs2, aq, rl)`
28374 ///
28375 /// # Arguments
28376 /// - `rd` — Destination register.
28377 /// - `rs1` — Memory base register.
28378 /// - `rs2` — Source register.
28379 /// - `aq` — Acquire-order bit.
28380 /// - `rl` — Release-order bit; retained for the existing emitter API.
28381 pub fn amoadd_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28382 where
28383 Self: AmoaddDEmitter<T0, T1, T2, T3, T4>,
28384 {
28385 <Self as AmoaddDEmitter<T0, T1, T2, T3, T4>>::amoadd_d(self, rd, rs1, rs2, aq, rl);
28386 }
28387 /// RISC-V `amoadd.h` instruction.
28388 ///
28389 /// # Forms
28390 /// Assembly: `amoadd.h xd, xs1, xs2, aq, rl`
28391 /// Rust: `amoadd_h(rd, rs1, rs2, aq, rl)`
28392 ///
28393 /// # Arguments
28394 /// - `rd` — Destination register.
28395 /// - `rs1` — Memory base register.
28396 /// - `rs2` — Source register.
28397 /// - `aq` — Acquire-order bit.
28398 /// - `rl` — Release-order bit; retained for the existing emitter API.
28399 pub fn amoadd_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28400 where
28401 Self: AmoaddHEmitter<T0, T1, T2, T3, T4>,
28402 {
28403 <Self as AmoaddHEmitter<T0, T1, T2, T3, T4>>::amoadd_h(self, rd, rs1, rs2, aq, rl);
28404 }
28405 /// Atomic fetch-and-add word
28406 ///
28407 /// Atomically:
28408 ///
28409 /// * Load the word at address _rs1_
28410 /// * Write the sign-extended value into _rd_
28411 /// * Add the least-significant word of register _rs2_ to the loaded value
28412 /// * Write the sum to the address in _rs1_
28413 ///
28414 /// # Forms
28415 /// Assembly: `amoadd.w xd, xs2, (xrs1)`
28416 /// Rust: `amoadd_w(rd, rs1, rs2, aq, rl)`
28417 ///
28418 /// # Arguments
28419 /// - `rd` — Destination register.
28420 /// - `rs1` — Memory base register.
28421 /// - `rs2` — Source register.
28422 /// - `aq` — Acquire-order bit.
28423 /// - `rl` — Release-order bit; retained for the existing emitter API.
28424 pub fn amoadd_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28425 where
28426 Self: AmoaddWEmitter<T0, T1, T2, T3, T4>,
28427 {
28428 <Self as AmoaddWEmitter<T0, T1, T2, T3, T4>>::amoadd_w(self, rd, rs1, rs2, aq, rl);
28429 }
28430 /// RISC-V `amoand.b` instruction.
28431 ///
28432 /// # Forms
28433 /// Assembly: `amoand.b xd, xs1, xs2, aq, rl`
28434 /// Rust: `amoand_b(rd, rs1, rs2, aq, rl)`
28435 ///
28436 /// # Arguments
28437 /// - `rd` — Destination register.
28438 /// - `rs1` — Memory base register.
28439 /// - `rs2` — Source register.
28440 /// - `aq` — Acquire-order bit.
28441 /// - `rl` — Release-order bit; retained for the existing emitter API.
28442 pub fn amoand_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28443 where
28444 Self: AmoandBEmitter<T0, T1, T2, T3, T4>,
28445 {
28446 <Self as AmoandBEmitter<T0, T1, T2, T3, T4>>::amoand_b(self, rd, rs1, rs2, aq, rl);
28447 }
28448 /// Atomic fetch-and-and doubleword
28449 ///
28450 /// Atomically:
28451 ///
28452 /// * Load the doubleword at address _rs1_
28453 /// * Write the loaded value into _rd_
28454 /// * AND the value of register _rs2_ to the loaded value
28455 /// * Write the result to the address in _rs1_
28456 ///
28457 /// # Forms
28458 /// Assembly: `amoand.d xd, xs2, (xrs1)`
28459 /// Rust: `amoand_d(rd, rs1, rs2, aq, rl)`
28460 ///
28461 /// # Arguments
28462 /// - `rd` — Destination register.
28463 /// - `rs1` — Memory base register.
28464 /// - `rs2` — Source register.
28465 /// - `aq` — Acquire-order bit.
28466 /// - `rl` — Release-order bit; retained for the existing emitter API.
28467 pub fn amoand_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28468 where
28469 Self: AmoandDEmitter<T0, T1, T2, T3, T4>,
28470 {
28471 <Self as AmoandDEmitter<T0, T1, T2, T3, T4>>::amoand_d(self, rd, rs1, rs2, aq, rl);
28472 }
28473 /// RISC-V `amoand.h` instruction.
28474 ///
28475 /// # Forms
28476 /// Assembly: `amoand.h xd, xs1, xs2, aq, rl`
28477 /// Rust: `amoand_h(rd, rs1, rs2, aq, rl)`
28478 ///
28479 /// # Arguments
28480 /// - `rd` — Destination register.
28481 /// - `rs1` — Memory base register.
28482 /// - `rs2` — Source register.
28483 /// - `aq` — Acquire-order bit.
28484 /// - `rl` — Release-order bit; retained for the existing emitter API.
28485 pub fn amoand_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28486 where
28487 Self: AmoandHEmitter<T0, T1, T2, T3, T4>,
28488 {
28489 <Self as AmoandHEmitter<T0, T1, T2, T3, T4>>::amoand_h(self, rd, rs1, rs2, aq, rl);
28490 }
28491 /// Atomic fetch-and-and word
28492 ///
28493 /// Atomically:
28494 ///
28495 /// * Load the word at address _rs1_
28496 /// * Write the sign-extended value into _rd_
28497 /// * AND the least-significant word of register _rs2_ to the loaded value
28498 /// * Write the result to the address in _rs1_
28499 ///
28500 /// # Forms
28501 /// Assembly: `amoand.w xd, xs2, (xrs1)`
28502 /// Rust: `amoand_w(rd, rs1, rs2, aq, rl)`
28503 ///
28504 /// # Arguments
28505 /// - `rd` — Destination register.
28506 /// - `rs1` — Memory base register.
28507 /// - `rs2` — Source register.
28508 /// - `aq` — Acquire-order bit.
28509 /// - `rl` — Release-order bit; retained for the existing emitter API.
28510 pub fn amoand_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28511 where
28512 Self: AmoandWEmitter<T0, T1, T2, T3, T4>,
28513 {
28514 <Self as AmoandWEmitter<T0, T1, T2, T3, T4>>::amoand_w(self, rd, rs1, rs2, aq, rl);
28515 }
28516 /// RISC-V `amocas.b` instruction.
28517 ///
28518 /// # Forms
28519 /// Assembly: `amocas.b xd, xs1, xs2, aq, rl`
28520 /// Rust: `amocas_b(rd, rs1, rs2, aq, rl)`
28521 ///
28522 /// # Arguments
28523 /// - `rd` — Destination register.
28524 /// - `rs1` — Memory base register.
28525 /// - `rs2` — Source register.
28526 /// - `aq` — Acquire-order bit.
28527 /// - `rl` — Release-order bit; retained for the existing emitter API.
28528 pub fn amocas_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28529 where
28530 Self: AmocasBEmitter<T0, T1, T2, T3, T4>,
28531 {
28532 <Self as AmocasBEmitter<T0, T1, T2, T3, T4>>::amocas_b(self, rd, rs1, rs2, aq, rl);
28533 }
28534 /// RISC-V `amocas.d` instruction.
28535 ///
28536 /// # Forms
28537 /// Assembly: `amocas.d xd, xs1, xs2, aq, rl`
28538 /// Rust: `amocas_d(rd, rs1, rs2, aq, rl)`
28539 ///
28540 /// # Arguments
28541 /// - `rd` — Destination register.
28542 /// - `rs1` — Memory base register.
28543 /// - `rs2` — Source register.
28544 /// - `aq` — Acquire-order bit.
28545 /// - `rl` — Release-order bit; retained for the existing emitter API.
28546 pub fn amocas_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28547 where
28548 Self: AmocasDEmitter<T0, T1, T2, T3, T4>,
28549 {
28550 <Self as AmocasDEmitter<T0, T1, T2, T3, T4>>::amocas_d(self, rd, rs1, rs2, aq, rl);
28551 }
28552 /// RISC-V `amocas.h` instruction.
28553 ///
28554 /// # Forms
28555 /// Assembly: `amocas.h xd, xs1, xs2, aq, rl`
28556 /// Rust: `amocas_h(rd, rs1, rs2, aq, rl)`
28557 ///
28558 /// # Arguments
28559 /// - `rd` — Destination register.
28560 /// - `rs1` — Memory base register.
28561 /// - `rs2` — Source register.
28562 /// - `aq` — Acquire-order bit.
28563 /// - `rl` — Release-order bit; retained for the existing emitter API.
28564 pub fn amocas_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28565 where
28566 Self: AmocasHEmitter<T0, T1, T2, T3, T4>,
28567 {
28568 <Self as AmocasHEmitter<T0, T1, T2, T3, T4>>::amocas_h(self, rd, rs1, rs2, aq, rl);
28569 }
28570 /// RISC-V `amocas.q` instruction.
28571 ///
28572 /// # Forms
28573 /// Assembly: `amocas.q xd, xs1, xs2, aq, rl`
28574 /// Rust: `amocas_q(rd, rs1, rs2, aq, rl)`
28575 ///
28576 /// # Arguments
28577 /// - `rd` — Destination register.
28578 /// - `rs1` — Memory base register.
28579 /// - `rs2` — Source register.
28580 /// - `aq` — Acquire-order bit.
28581 /// - `rl` — Release-order bit; retained for the existing emitter API.
28582 pub fn amocas_q<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28583 where
28584 Self: AmocasQEmitter<T0, T1, T2, T3, T4>,
28585 {
28586 <Self as AmocasQEmitter<T0, T1, T2, T3, T4>>::amocas_q(self, rd, rs1, rs2, aq, rl);
28587 }
28588 /// RISC-V `amocas.w` instruction.
28589 ///
28590 /// # Forms
28591 /// Assembly: `amocas.w xd, xs1, xs2, aq, rl`
28592 /// Rust: `amocas_w(rd, rs1, rs2, aq, rl)`
28593 ///
28594 /// # Arguments
28595 /// - `rd` — Destination register.
28596 /// - `rs1` — Memory base register.
28597 /// - `rs2` — Source register.
28598 /// - `aq` — Acquire-order bit.
28599 /// - `rl` — Release-order bit; retained for the existing emitter API.
28600 pub fn amocas_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28601 where
28602 Self: AmocasWEmitter<T0, T1, T2, T3, T4>,
28603 {
28604 <Self as AmocasWEmitter<T0, T1, T2, T3, T4>>::amocas_w(self, rd, rs1, rs2, aq, rl);
28605 }
28606 /// RISC-V `amomax.b` instruction.
28607 ///
28608 /// # Forms
28609 /// Assembly: `amomax.b xd, xs1, xs2, aq, rl`
28610 /// Rust: `amomax_b(rd, rs1, rs2, aq, rl)`
28611 ///
28612 /// # Arguments
28613 /// - `rd` — Destination register.
28614 /// - `rs1` — Memory base register.
28615 /// - `rs2` — Source register.
28616 /// - `aq` — Acquire-order bit.
28617 /// - `rl` — Release-order bit; retained for the existing emitter API.
28618 pub fn amomax_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28619 where
28620 Self: AmomaxBEmitter<T0, T1, T2, T3, T4>,
28621 {
28622 <Self as AmomaxBEmitter<T0, T1, T2, T3, T4>>::amomax_b(self, rd, rs1, rs2, aq, rl);
28623 }
28624 /// Atomic MAX doubleword
28625 ///
28626 /// Atomically:
28627 ///
28628 /// * Load the doubleword at address _rs1_
28629 /// * Write the loaded value into _rd_
28630 /// * Signed compare the value of register _rs2_ to the loaded value, and select the maximum value
28631 /// * Write the maximum to the address in _rs1_
28632 ///
28633 /// # Forms
28634 /// Assembly: `amomax.d xd, xs2, (xrs1)`
28635 /// Rust: `amomax_d(rd, rs1, rs2, aq, rl)`
28636 ///
28637 /// # Arguments
28638 /// - `rd` — Destination register.
28639 /// - `rs1` — Memory base register.
28640 /// - `rs2` — Source register.
28641 /// - `aq` — Acquire-order bit.
28642 /// - `rl` — Release-order bit; retained for the existing emitter API.
28643 pub fn amomax_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28644 where
28645 Self: AmomaxDEmitter<T0, T1, T2, T3, T4>,
28646 {
28647 <Self as AmomaxDEmitter<T0, T1, T2, T3, T4>>::amomax_d(self, rd, rs1, rs2, aq, rl);
28648 }
28649 /// RISC-V `amomax.h` instruction.
28650 ///
28651 /// # Forms
28652 /// Assembly: `amomax.h xd, xs1, xs2, aq, rl`
28653 /// Rust: `amomax_h(rd, rs1, rs2, aq, rl)`
28654 ///
28655 /// # Arguments
28656 /// - `rd` — Destination register.
28657 /// - `rs1` — Memory base register.
28658 /// - `rs2` — Source register.
28659 /// - `aq` — Acquire-order bit.
28660 /// - `rl` — Release-order bit; retained for the existing emitter API.
28661 pub fn amomax_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28662 where
28663 Self: AmomaxHEmitter<T0, T1, T2, T3, T4>,
28664 {
28665 <Self as AmomaxHEmitter<T0, T1, T2, T3, T4>>::amomax_h(self, rd, rs1, rs2, aq, rl);
28666 }
28667 /// Atomic MAX word
28668 ///
28669 /// Atomically:
28670 ///
28671 /// * Load the word at address _rs1_
28672 /// * Write the sign-extended value into _rd_
28673 /// * Signed compare the least-significant word of register _rs2_ to the loaded value, and select the maximum value
28674 /// * Write the maximum to the address in _rs1_
28675 ///
28676 /// # Forms
28677 /// Assembly: `amomax.w xd, xs2, (xrs1)`
28678 /// Rust: `amomax_w(rd, rs1, rs2, aq, rl)`
28679 ///
28680 /// # Arguments
28681 /// - `rd` — Destination register.
28682 /// - `rs1` — Memory base register.
28683 /// - `rs2` — Source register.
28684 /// - `aq` — Acquire-order bit.
28685 /// - `rl` — Release-order bit; retained for the existing emitter API.
28686 pub fn amomax_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28687 where
28688 Self: AmomaxWEmitter<T0, T1, T2, T3, T4>,
28689 {
28690 <Self as AmomaxWEmitter<T0, T1, T2, T3, T4>>::amomax_w(self, rd, rs1, rs2, aq, rl);
28691 }
28692 /// RISC-V `amomaxu.b` instruction.
28693 ///
28694 /// # Forms
28695 /// Assembly: `amomaxu.b xd, xs1, xs2, aq, rl`
28696 /// Rust: `amomaxu_b(rd, rs1, rs2, aq, rl)`
28697 ///
28698 /// # Arguments
28699 /// - `rd` — Destination register.
28700 /// - `rs1` — Memory base register.
28701 /// - `rs2` — Source register.
28702 /// - `aq` — Acquire-order bit.
28703 /// - `rl` — Release-order bit; retained for the existing emitter API.
28704 pub fn amomaxu_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28705 where
28706 Self: AmomaxuBEmitter<T0, T1, T2, T3, T4>,
28707 {
28708 <Self as AmomaxuBEmitter<T0, T1, T2, T3, T4>>::amomaxu_b(self, rd, rs1, rs2, aq, rl);
28709 }
28710 /// Atomic MAX unsigned doubleword
28711 ///
28712 /// Atomically:
28713 ///
28714 /// * Load the doubleword at address _rs1_
28715 /// * Write the loaded value into _rd_
28716 /// * Unsigned compare the value of register _rs2_ to the loaded value, and select the maximum value
28717 /// * Write the maximum to the address in _rs1_
28718 ///
28719 /// # Forms
28720 /// Assembly: `amomaxu.d xd, xs2, (xrs1)`
28721 /// Rust: `amomaxu_d(rd, rs1, rs2, aq, rl)`
28722 ///
28723 /// # Arguments
28724 /// - `rd` — Destination register.
28725 /// - `rs1` — Memory base register.
28726 /// - `rs2` — Source register.
28727 /// - `aq` — Acquire-order bit.
28728 /// - `rl` — Release-order bit; retained for the existing emitter API.
28729 pub fn amomaxu_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28730 where
28731 Self: AmomaxuDEmitter<T0, T1, T2, T3, T4>,
28732 {
28733 <Self as AmomaxuDEmitter<T0, T1, T2, T3, T4>>::amomaxu_d(self, rd, rs1, rs2, aq, rl);
28734 }
28735 /// RISC-V `amomaxu.h` instruction.
28736 ///
28737 /// # Forms
28738 /// Assembly: `amomaxu.h xd, xs1, xs2, aq, rl`
28739 /// Rust: `amomaxu_h(rd, rs1, rs2, aq, rl)`
28740 ///
28741 /// # Arguments
28742 /// - `rd` — Destination register.
28743 /// - `rs1` — Memory base register.
28744 /// - `rs2` — Source register.
28745 /// - `aq` — Acquire-order bit.
28746 /// - `rl` — Release-order bit; retained for the existing emitter API.
28747 pub fn amomaxu_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28748 where
28749 Self: AmomaxuHEmitter<T0, T1, T2, T3, T4>,
28750 {
28751 <Self as AmomaxuHEmitter<T0, T1, T2, T3, T4>>::amomaxu_h(self, rd, rs1, rs2, aq, rl);
28752 }
28753 /// Atomic MAX unsigned word
28754 ///
28755 /// Atomically:
28756 ///
28757 /// * Load the word at address _rs1_
28758 /// * Write the sign-extended value into _rd_
28759 /// * Unsigned compare the least-significant word of register _rs2_ to the loaded value, and select the maximum value
28760 /// * Write the maximum to the address in _rs1_
28761 ///
28762 /// # Forms
28763 /// Assembly: `amomaxu.w xd, xs2, (xrs1)`
28764 /// Rust: `amomaxu_w(rd, rs1, rs2, aq, rl)`
28765 ///
28766 /// # Arguments
28767 /// - `rd` — Destination register.
28768 /// - `rs1` — Memory base register.
28769 /// - `rs2` — Source register.
28770 /// - `aq` — Acquire-order bit.
28771 /// - `rl` — Release-order bit; retained for the existing emitter API.
28772 pub fn amomaxu_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28773 where
28774 Self: AmomaxuWEmitter<T0, T1, T2, T3, T4>,
28775 {
28776 <Self as AmomaxuWEmitter<T0, T1, T2, T3, T4>>::amomaxu_w(self, rd, rs1, rs2, aq, rl);
28777 }
28778 /// RISC-V `amomin.b` instruction.
28779 ///
28780 /// # Forms
28781 /// Assembly: `amomin.b xd, xs1, xs2, aq, rl`
28782 /// Rust: `amomin_b(rd, rs1, rs2, aq, rl)`
28783 ///
28784 /// # Arguments
28785 /// - `rd` — Destination register.
28786 /// - `rs1` — Memory base register.
28787 /// - `rs2` — Source register.
28788 /// - `aq` — Acquire-order bit.
28789 /// - `rl` — Release-order bit; retained for the existing emitter API.
28790 pub fn amomin_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28791 where
28792 Self: AmominBEmitter<T0, T1, T2, T3, T4>,
28793 {
28794 <Self as AmominBEmitter<T0, T1, T2, T3, T4>>::amomin_b(self, rd, rs1, rs2, aq, rl);
28795 }
28796 /// Atomic MIN doubleword
28797 ///
28798 /// Atomically:
28799 ///
28800 /// * Load the doubleword at address _rs1_
28801 /// * Write the loaded value into _rd_
28802 /// * Signed compare the value of register _rs2_ to the loaded value, and select the minimum value
28803 /// * Write the minimum to the address in _rs1_
28804 ///
28805 /// # Forms
28806 /// Assembly: `amomin.d xd, xs2, (xrs1)`
28807 /// Rust: `amomin_d(rd, rs1, rs2, aq, rl)`
28808 ///
28809 /// # Arguments
28810 /// - `rd` — Destination register.
28811 /// - `rs1` — Memory base register.
28812 /// - `rs2` — Source register.
28813 /// - `aq` — Acquire-order bit.
28814 /// - `rl` — Release-order bit; retained for the existing emitter API.
28815 pub fn amomin_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28816 where
28817 Self: AmominDEmitter<T0, T1, T2, T3, T4>,
28818 {
28819 <Self as AmominDEmitter<T0, T1, T2, T3, T4>>::amomin_d(self, rd, rs1, rs2, aq, rl);
28820 }
28821 /// RISC-V `amomin.h` instruction.
28822 ///
28823 /// # Forms
28824 /// Assembly: `amomin.h xd, xs1, xs2, aq, rl`
28825 /// Rust: `amomin_h(rd, rs1, rs2, aq, rl)`
28826 ///
28827 /// # Arguments
28828 /// - `rd` — Destination register.
28829 /// - `rs1` — Memory base register.
28830 /// - `rs2` — Source register.
28831 /// - `aq` — Acquire-order bit.
28832 /// - `rl` — Release-order bit; retained for the existing emitter API.
28833 pub fn amomin_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28834 where
28835 Self: AmominHEmitter<T0, T1, T2, T3, T4>,
28836 {
28837 <Self as AmominHEmitter<T0, T1, T2, T3, T4>>::amomin_h(self, rd, rs1, rs2, aq, rl);
28838 }
28839 /// Atomic MIN word
28840 ///
28841 /// Atomically:
28842 ///
28843 /// * Load the word at address _rs1_
28844 /// * Write the sign-extended value into _rd_
28845 /// * Signed compare the least-significant word of register _rs2_ to the loaded value, and select the minimum value
28846 /// * Write the result to the address in _rs1_
28847 ///
28848 /// # Forms
28849 /// Assembly: `amomin.w xd, xs2, (xrs1)`
28850 /// Rust: `amomin_w(rd, rs1, rs2, aq, rl)`
28851 ///
28852 /// # Arguments
28853 /// - `rd` — Destination register.
28854 /// - `rs1` — Memory base register.
28855 /// - `rs2` — Source register.
28856 /// - `aq` — Acquire-order bit.
28857 /// - `rl` — Release-order bit; retained for the existing emitter API.
28858 pub fn amomin_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28859 where
28860 Self: AmominWEmitter<T0, T1, T2, T3, T4>,
28861 {
28862 <Self as AmominWEmitter<T0, T1, T2, T3, T4>>::amomin_w(self, rd, rs1, rs2, aq, rl);
28863 }
28864 /// RISC-V `amominu.b` instruction.
28865 ///
28866 /// # Forms
28867 /// Assembly: `amominu.b xd, xs1, xs2, aq, rl`
28868 /// Rust: `amominu_b(rd, rs1, rs2, aq, rl)`
28869 ///
28870 /// # Arguments
28871 /// - `rd` — Destination register.
28872 /// - `rs1` — Memory base register.
28873 /// - `rs2` — Source register.
28874 /// - `aq` — Acquire-order bit.
28875 /// - `rl` — Release-order bit; retained for the existing emitter API.
28876 pub fn amominu_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28877 where
28878 Self: AmominuBEmitter<T0, T1, T2, T3, T4>,
28879 {
28880 <Self as AmominuBEmitter<T0, T1, T2, T3, T4>>::amominu_b(self, rd, rs1, rs2, aq, rl);
28881 }
28882 /// Atomic MIN unsigned doubleword
28883 ///
28884 /// Atomically:
28885 ///
28886 /// * Load the doubleword at address _rs1_
28887 /// * Write the loaded value into _rd_
28888 /// * Unsigned compare the value of register _rs2_ to the loaded value, and select the minimum value
28889 /// * Write the minimum to the address in _rs1_
28890 ///
28891 /// # Forms
28892 /// Assembly: `amominu.d xd, xs2, (xrs1)`
28893 /// Rust: `amominu_d(rd, rs1, rs2, aq, rl)`
28894 ///
28895 /// # Arguments
28896 /// - `rd` — Destination register.
28897 /// - `rs1` — Memory base register.
28898 /// - `rs2` — Source register.
28899 /// - `aq` — Acquire-order bit.
28900 /// - `rl` — Release-order bit; retained for the existing emitter API.
28901 pub fn amominu_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28902 where
28903 Self: AmominuDEmitter<T0, T1, T2, T3, T4>,
28904 {
28905 <Self as AmominuDEmitter<T0, T1, T2, T3, T4>>::amominu_d(self, rd, rs1, rs2, aq, rl);
28906 }
28907 /// RISC-V `amominu.h` instruction.
28908 ///
28909 /// # Forms
28910 /// Assembly: `amominu.h xd, xs1, xs2, aq, rl`
28911 /// Rust: `amominu_h(rd, rs1, rs2, aq, rl)`
28912 ///
28913 /// # Arguments
28914 /// - `rd` — Destination register.
28915 /// - `rs1` — Memory base register.
28916 /// - `rs2` — Source register.
28917 /// - `aq` — Acquire-order bit.
28918 /// - `rl` — Release-order bit; retained for the existing emitter API.
28919 pub fn amominu_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28920 where
28921 Self: AmominuHEmitter<T0, T1, T2, T3, T4>,
28922 {
28923 <Self as AmominuHEmitter<T0, T1, T2, T3, T4>>::amominu_h(self, rd, rs1, rs2, aq, rl);
28924 }
28925 /// Atomic MIN unsigned word
28926 ///
28927 /// Atomically:
28928 ///
28929 /// * Load the word at address _rs1_
28930 /// * Write the sign-extended value into _rd_
28931 /// * Unsigned compare the least-significant word of register _rs2_ to the loaded word, and select the minimum value
28932 /// * Write the result to the address in _rs1_
28933 ///
28934 /// # Forms
28935 /// Assembly: `amominu.w xd, xs2, (xrs1)`
28936 /// Rust: `amominu_w(rd, rs1, rs2, aq, rl)`
28937 ///
28938 /// # Arguments
28939 /// - `rd` — Destination register.
28940 /// - `rs1` — Memory base register.
28941 /// - `rs2` — Source register.
28942 /// - `aq` — Acquire-order bit.
28943 /// - `rl` — Release-order bit; retained for the existing emitter API.
28944 pub fn amominu_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28945 where
28946 Self: AmominuWEmitter<T0, T1, T2, T3, T4>,
28947 {
28948 <Self as AmominuWEmitter<T0, T1, T2, T3, T4>>::amominu_w(self, rd, rs1, rs2, aq, rl);
28949 }
28950 /// RISC-V `amoor.b` instruction.
28951 ///
28952 /// # Forms
28953 /// Assembly: `amoor.b xd, xs1, xs2, aq, rl`
28954 /// Rust: `amoor_b(rd, rs1, rs2, aq, rl)`
28955 ///
28956 /// # Arguments
28957 /// - `rd` — Destination register.
28958 /// - `rs1` — Memory base register.
28959 /// - `rs2` — Source register.
28960 /// - `aq` — Acquire-order bit.
28961 /// - `rl` — Release-order bit; retained for the existing emitter API.
28962 pub fn amoor_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28963 where
28964 Self: AmoorBEmitter<T0, T1, T2, T3, T4>,
28965 {
28966 <Self as AmoorBEmitter<T0, T1, T2, T3, T4>>::amoor_b(self, rd, rs1, rs2, aq, rl);
28967 }
28968 /// Atomic fetch-and-or doubleword
28969 ///
28970 /// Atomically:
28971 ///
28972 /// * Load the doubleword at address _rs1_
28973 /// * Write the loaded value into _rd_
28974 /// * OR the value of register _rs2_ to the loaded value
28975 /// * Write the result to the address in _rs1_
28976 ///
28977 /// # Forms
28978 /// Assembly: `amoor.d xd, xs2, (xrs1)`
28979 /// Rust: `amoor_d(rd, rs1, rs2, aq, rl)`
28980 ///
28981 /// # Arguments
28982 /// - `rd` — Destination register.
28983 /// - `rs1` — Memory base register.
28984 /// - `rs2` — Source register.
28985 /// - `aq` — Acquire-order bit.
28986 /// - `rl` — Release-order bit; retained for the existing emitter API.
28987 pub fn amoor_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
28988 where
28989 Self: AmoorDEmitter<T0, T1, T2, T3, T4>,
28990 {
28991 <Self as AmoorDEmitter<T0, T1, T2, T3, T4>>::amoor_d(self, rd, rs1, rs2, aq, rl);
28992 }
28993 /// RISC-V `amoor.h` instruction.
28994 ///
28995 /// # Forms
28996 /// Assembly: `amoor.h xd, xs1, xs2, aq, rl`
28997 /// Rust: `amoor_h(rd, rs1, rs2, aq, rl)`
28998 ///
28999 /// # Arguments
29000 /// - `rd` — Destination register.
29001 /// - `rs1` — Memory base register.
29002 /// - `rs2` — Source register.
29003 /// - `aq` — Acquire-order bit.
29004 /// - `rl` — Release-order bit; retained for the existing emitter API.
29005 pub fn amoor_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29006 where
29007 Self: AmoorHEmitter<T0, T1, T2, T3, T4>,
29008 {
29009 <Self as AmoorHEmitter<T0, T1, T2, T3, T4>>::amoor_h(self, rd, rs1, rs2, aq, rl);
29010 }
29011 /// Atomic fetch-and-or word
29012 ///
29013 /// Atomically:
29014 ///
29015 /// * Load the word at address _rs1_
29016 /// * Write the sign-extended value into _rd_
29017 /// * OR the least-significant word of register _rs2_ to the loaded value
29018 /// * Write the result to the address in _rs1_
29019 ///
29020 /// # Forms
29021 /// Assembly: `amoor.w xd, xs2, (xrs1)`
29022 /// Rust: `amoor_w(rd, rs1, rs2, aq, rl)`
29023 ///
29024 /// # Arguments
29025 /// - `rd` — Destination register.
29026 /// - `rs1` — Memory base register.
29027 /// - `rs2` — Source register.
29028 /// - `aq` — Acquire-order bit.
29029 /// - `rl` — Release-order bit; retained for the existing emitter API.
29030 pub fn amoor_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29031 where
29032 Self: AmoorWEmitter<T0, T1, T2, T3, T4>,
29033 {
29034 <Self as AmoorWEmitter<T0, T1, T2, T3, T4>>::amoor_w(self, rd, rs1, rs2, aq, rl);
29035 }
29036 /// RISC-V `amoswap.b` instruction.
29037 ///
29038 /// # Forms
29039 /// Assembly: `amoswap.b xd, xs1, xs2, aq, rl`
29040 /// Rust: `amoswap_b(rd, rs1, rs2, aq, rl)`
29041 ///
29042 /// # Arguments
29043 /// - `rd` — Destination register.
29044 /// - `rs1` — Memory base register.
29045 /// - `rs2` — Source register.
29046 /// - `aq` — Acquire-order bit.
29047 /// - `rl` — Release-order bit; retained for the existing emitter API.
29048 pub fn amoswap_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29049 where
29050 Self: AmoswapBEmitter<T0, T1, T2, T3, T4>,
29051 {
29052 <Self as AmoswapBEmitter<T0, T1, T2, T3, T4>>::amoswap_b(self, rd, rs1, rs2, aq, rl);
29053 }
29054 /// Atomic SWAP doubleword
29055 ///
29056 /// Atomically:
29057 ///
29058 /// * Load the doubleword at address _rs1_
29059 /// * Write the value into _rd_
29060 /// * Store the value of register _rs2_ to the address in _rs1_
29061 ///
29062 /// # Forms
29063 /// Assembly: `amoswap.d xd, xs2, (xrs1)`
29064 /// Rust: `amoswap_d(rd, rs1, rs2, aq, rl)`
29065 ///
29066 /// # Arguments
29067 /// - `rd` — Destination register.
29068 /// - `rs1` — Memory base register.
29069 /// - `rs2` — Source register.
29070 /// - `aq` — Acquire-order bit.
29071 /// - `rl` — Release-order bit; retained for the existing emitter API.
29072 pub fn amoswap_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29073 where
29074 Self: AmoswapDEmitter<T0, T1, T2, T3, T4>,
29075 {
29076 <Self as AmoswapDEmitter<T0, T1, T2, T3, T4>>::amoswap_d(self, rd, rs1, rs2, aq, rl);
29077 }
29078 /// RISC-V `amoswap.h` instruction.
29079 ///
29080 /// # Forms
29081 /// Assembly: `amoswap.h xd, xs1, xs2, aq, rl`
29082 /// Rust: `amoswap_h(rd, rs1, rs2, aq, rl)`
29083 ///
29084 /// # Arguments
29085 /// - `rd` — Destination register.
29086 /// - `rs1` — Memory base register.
29087 /// - `rs2` — Source register.
29088 /// - `aq` — Acquire-order bit.
29089 /// - `rl` — Release-order bit; retained for the existing emitter API.
29090 pub fn amoswap_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29091 where
29092 Self: AmoswapHEmitter<T0, T1, T2, T3, T4>,
29093 {
29094 <Self as AmoswapHEmitter<T0, T1, T2, T3, T4>>::amoswap_h(self, rd, rs1, rs2, aq, rl);
29095 }
29096 /// Atomic SWAP word
29097 ///
29098 /// Atomically:
29099 ///
29100 /// * Load the word at address _rs1_
29101 /// * Write the sign-extended value into _rd_
29102 /// * Store the least-significant word of register _rs2_ to the address in _rs1_
29103 ///
29104 /// # Forms
29105 /// Assembly: `amoswap.w xd, xs2, (xrs1)`
29106 /// Rust: `amoswap_w(rd, rs1, rs2, aq, rl)`
29107 ///
29108 /// # Arguments
29109 /// - `rd` — Destination register.
29110 /// - `rs1` — Memory base register.
29111 /// - `rs2` — Source register.
29112 /// - `aq` — Acquire-order bit.
29113 /// - `rl` — Release-order bit; retained for the existing emitter API.
29114 pub fn amoswap_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29115 where
29116 Self: AmoswapWEmitter<T0, T1, T2, T3, T4>,
29117 {
29118 <Self as AmoswapWEmitter<T0, T1, T2, T3, T4>>::amoswap_w(self, rd, rs1, rs2, aq, rl);
29119 }
29120 /// RISC-V `amoxor.b` instruction.
29121 ///
29122 /// # Forms
29123 /// Assembly: `amoxor.b xd, xs1, xs2, aq, rl`
29124 /// Rust: `amoxor_b(rd, rs1, rs2, aq, rl)`
29125 ///
29126 /// # Arguments
29127 /// - `rd` — Destination register.
29128 /// - `rs1` — Memory base register.
29129 /// - `rs2` — Source register.
29130 /// - `aq` — Acquire-order bit.
29131 /// - `rl` — Release-order bit; retained for the existing emitter API.
29132 pub fn amoxor_b<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29133 where
29134 Self: AmoxorBEmitter<T0, T1, T2, T3, T4>,
29135 {
29136 <Self as AmoxorBEmitter<T0, T1, T2, T3, T4>>::amoxor_b(self, rd, rs1, rs2, aq, rl);
29137 }
29138 /// Atomic fetch-and-xor doubleword
29139 ///
29140 /// Atomically:
29141 ///
29142 /// * Load the doubleword at address _rs1_
29143 /// * Write the loaded value into _rd_
29144 /// * XOR the value of register _rs2_ to the loaded value
29145 /// * Write the result to the address in _rs1_
29146 ///
29147 /// # Forms
29148 /// Assembly: `amoxor.d xd, xs2, (xrs1)`
29149 /// Rust: `amoxor_d(rd, rs1, rs2, aq, rl)`
29150 ///
29151 /// # Arguments
29152 /// - `rd` — Destination register.
29153 /// - `rs1` — Memory base register.
29154 /// - `rs2` — Source register.
29155 /// - `aq` — Acquire-order bit.
29156 /// - `rl` — Release-order bit; retained for the existing emitter API.
29157 pub fn amoxor_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29158 where
29159 Self: AmoxorDEmitter<T0, T1, T2, T3, T4>,
29160 {
29161 <Self as AmoxorDEmitter<T0, T1, T2, T3, T4>>::amoxor_d(self, rd, rs1, rs2, aq, rl);
29162 }
29163 /// RISC-V `amoxor.h` instruction.
29164 ///
29165 /// # Forms
29166 /// Assembly: `amoxor.h xd, xs1, xs2, aq, rl`
29167 /// Rust: `amoxor_h(rd, rs1, rs2, aq, rl)`
29168 ///
29169 /// # Arguments
29170 /// - `rd` — Destination register.
29171 /// - `rs1` — Memory base register.
29172 /// - `rs2` — Source register.
29173 /// - `aq` — Acquire-order bit.
29174 /// - `rl` — Release-order bit; retained for the existing emitter API.
29175 pub fn amoxor_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29176 where
29177 Self: AmoxorHEmitter<T0, T1, T2, T3, T4>,
29178 {
29179 <Self as AmoxorHEmitter<T0, T1, T2, T3, T4>>::amoxor_h(self, rd, rs1, rs2, aq, rl);
29180 }
29181 /// Atomic fetch-and-xor word
29182 ///
29183 /// Atomically:
29184 ///
29185 /// * Load the word at address _rs1_
29186 /// * Write the sign-extended value into _rd_
29187 /// * XOR the least-significant word of register _rs2_ to the loaded value
29188 /// * Write the result to the address in _rs1_
29189 ///
29190 /// # Forms
29191 /// Assembly: `amoxor.w xd, xs2, (xrs1)`
29192 /// Rust: `amoxor_w(rd, rs1, rs2, aq, rl)`
29193 ///
29194 /// # Arguments
29195 /// - `rd` — Destination register.
29196 /// - `rs1` — Memory base register.
29197 /// - `rs2` — Source register.
29198 /// - `aq` — Acquire-order bit.
29199 /// - `rl` — Release-order bit; retained for the existing emitter API.
29200 pub fn amoxor_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
29201 where
29202 Self: AmoxorWEmitter<T0, T1, T2, T3, T4>,
29203 {
29204 <Self as AmoxorWEmitter<T0, T1, T2, T3, T4>>::amoxor_w(self, rd, rs1, rs2, aq, rl);
29205 }
29206 /// And
29207 ///
29208 /// And rs1 with rs2, and store the result in rd
29209 ///
29210 /// # Forms
29211 /// Assembly: `and xd, xs1, xs2`
29212 /// Rust: `and(rd, rs1, rs2)`
29213 ///
29214 /// # Arguments
29215 /// - `rd` — Destination register.
29216 /// - `rs1` — Source register.
29217 /// - `rs2` — Source register.
29218 pub fn and<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
29219 where
29220 Self: AndEmitter<T0, T1, T2>,
29221 {
29222 <Self as AndEmitter<T0, T1, T2>>::and(self, rd, rs1, rs2);
29223 }
29224 /// And immediate
29225 ///
29226 /// And an immediate to the value in rs1, and store the result in rd
29227 ///
29228 /// # Forms
29229 /// Assembly: `andi xd, xs1, imm`
29230 /// Rust: `andi(rd, rs1, imm)`
29231 ///
29232 /// # Arguments
29233 /// - `rd` — Destination register.
29234 /// - `rs1` — Source register.
29235 /// - `imm` — Immediate encoding value.
29236 pub fn andi<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
29237 where
29238 Self: AndiEmitter<T0, T1, T2>,
29239 {
29240 <Self as AndiEmitter<T0, T1, T2>>::andi(self, rd, rs1, imm);
29241 }
29242 /// AND with inverted operand
29243 ///
29244 /// This instruction performs the bitwise logical AND operation between `rs1` and the
29245 /// bitwise inversion of `rs2`.
29246 ///
29247 /// # Forms
29248 /// Assembly: `andn xd, xs1, xs2`
29249 /// Rust: `andn(rd, rs1, rs2)`
29250 ///
29251 /// # Arguments
29252 /// - `rd` — Destination register.
29253 /// - `rs1` — Source register.
29254 /// - `rs2` — Source register.
29255 pub fn andn<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
29256 where
29257 Self: AndnEmitter<T0, T1, T2>,
29258 {
29259 <Self as AndnEmitter<T0, T1, T2>>::andn(self, rd, rs1, rs2);
29260 }
29261 /// Add upper immediate to pc
29262 ///
29263 /// Add an immediate to the current PC.
29264 ///
29265 /// # Forms
29266 /// Assembly: `auipc xd, imm`
29267 /// Rust: `auipc(rd, imm)`
29268 ///
29269 /// # Arguments
29270 /// - `rd` — Destination register.
29271 /// - `imm` — Immediate encoding value.
29272 pub fn auipc<T0, T1>(&mut self, rd: T0, imm: T1)
29273 where
29274 Self: AuipcEmitter<T0, T1>,
29275 {
29276 <Self as AuipcEmitter<T0, T1>>::auipc(self, rd, imm);
29277 }
29278 /// Single-Bit clear (Register)
29279 ///
29280 /// This instruction returns rs1 with a single bit cleared at the index specified in rs2.
29281 /// The index is read from the lower log2(XLEN) bits of rs2.
29282 ///
29283 /// # Forms
29284 /// Assembly: `bclr xd, xs1, xs2`
29285 /// Rust: `bclr(rd, rs1, rs2)`
29286 ///
29287 /// # Arguments
29288 /// - `rd` — Destination register.
29289 /// - `rs1` — Source register.
29290 /// - `rs2` — Source register.
29291 pub fn bclr<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
29292 where
29293 Self: BclrEmitter<T0, T1, T2>,
29294 {
29295 <Self as BclrEmitter<T0, T1, T2>>::bclr(self, rd, rs1, rs2);
29296 }
29297 /// Single-Bit clear (Immediate)
29298 ///
29299 /// This instruction returns rs1 with a single bit cleared at the index specified in shamt. The
29300 /// index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings corresponding
29301 /// to shamt\[5\]=1 are reserved.
29302 ///
29303 /// # Forms
29304 /// Assembly: `bclri xd, xs1, shamt`
29305 /// Rust: `bclri(rd, rs1, shamtd)`
29306 ///
29307 /// # Arguments
29308 /// - `rd` — Destination register.
29309 /// - `rs1` — Source register.
29310 /// - `shamtd` — Immediate encoding value.
29311 pub fn bclri<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtd: T2)
29312 where
29313 Self: BclriEmitter<T0, T1, T2>,
29314 {
29315 <Self as BclriEmitter<T0, T1, T2>>::bclri(self, rd, rs1, shamtd);
29316 }
29317 /// Single-Bit clear (Immediate)
29318 ///
29319 /// This instruction returns rs1 with a single bit cleared at the index specified in shamt. The
29320 /// index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings corresponding
29321 /// to shamt\[5\]=1 are reserved.
29322 ///
29323 /// # Forms
29324 /// Assembly: `bclri.rv32 xd, xs1, shamt`
29325 /// Rust: `bclri_rv32(rd, rs1, shamtw)`
29326 ///
29327 /// # Arguments
29328 /// - `rd` — Destination register.
29329 /// - `rs1` — Source register.
29330 /// - `shamtw` — Immediate encoding value.
29331 pub fn bclri_rv32<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
29332 where
29333 Self: BclriRv32Emitter<T0, T1, T2>,
29334 {
29335 <Self as BclriRv32Emitter<T0, T1, T2>>::bclri_rv32(self, rd, rs1, shamtw);
29336 }
29337 /// Branch if equal
29338 ///
29339 /// Branch to PC + imm if
29340 /// the value in register rs1 is equal to the value in register rs2.
29341 ///
29342 /// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
29343 ///
29344 /// # Forms
29345 /// Assembly: `beq xs1, xs2, imm`
29346 /// Rust: `beq(rs1, rs2, imm)`
29347 ///
29348 /// # Arguments
29349 /// - `rs1` — Source register.
29350 /// - `rs2` — Source register.
29351 /// - `imm` — Immediate encoding value.
29352 pub fn beq<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29353 where
29354 Self: BeqEmitter<T0, T1, T2>,
29355 {
29356 <Self as BeqEmitter<T0, T1, T2>>::beq(self, rs1, rs2, imm);
29357 }
29358 /// RISC-V `beqz` instruction.
29359 ///
29360 /// # Forms
29361 /// Assembly: `beqz rs1 bimm12lohi`
29362 /// Rust: `beqz(rs1, imm)`
29363 ///
29364 /// # Arguments
29365 /// - `rs1` — Source register.
29366 /// - `imm` — Immediate encoding value.
29367 pub fn beqz<T0, T1>(&mut self, rs1: T0, imm: T1)
29368 where
29369 Self: BeqzEmitter<T0, T1>,
29370 {
29371 <Self as BeqzEmitter<T0, T1>>::beqz(self, rs1, imm);
29372 }
29373 /// Single-Bit extract (Register)
29374 ///
29375 /// This instruction returns a single bit extracted from rs1 at the index specified in rs2.
29376 /// The index is read from the lower log2(XLEN) bits of rs2.
29377 ///
29378 /// # Forms
29379 /// Assembly: `bext xd, xs1, xs2`
29380 /// Rust: `bext(rd, rs1, rs2)`
29381 ///
29382 /// # Arguments
29383 /// - `rd` — Destination register.
29384 /// - `rs1` — Source register.
29385 /// - `rs2` — Source register.
29386 pub fn bext<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
29387 where
29388 Self: BextEmitter<T0, T1, T2>,
29389 {
29390 <Self as BextEmitter<T0, T1, T2>>::bext(self, rd, rs1, rs2);
29391 }
29392 /// Single-Bit extract (Immediate)
29393 ///
29394 /// This instruction returns a single bit extracted from rs1 at the index specified in rs2.
29395 /// The index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings
29396 /// corresponding to shamt\[5\]=1 are reserved.
29397 ///
29398 /// # Forms
29399 /// Assembly: `bexti xd, xs1, shamt`
29400 /// Rust: `bexti(rd, rs1, shamtd)`
29401 ///
29402 /// # Arguments
29403 /// - `rd` — Destination register.
29404 /// - `rs1` — Source register.
29405 /// - `shamtd` — Immediate encoding value.
29406 pub fn bexti<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtd: T2)
29407 where
29408 Self: BextiEmitter<T0, T1, T2>,
29409 {
29410 <Self as BextiEmitter<T0, T1, T2>>::bexti(self, rd, rs1, shamtd);
29411 }
29412 /// Single-Bit extract (Immediate)
29413 ///
29414 /// This instruction returns a single bit extracted from rs1 at the index specified in rs2.
29415 /// The index is read from the lower log2(XLEN) bits of shamt. For RV32, the encodings
29416 /// corresponding to shamt\[5\]=1 are reserved.
29417 ///
29418 /// # Forms
29419 /// Assembly: `bexti.rv32 xd, xs1, shamt`
29420 /// Rust: `bexti_rv32(rd, rs1, shamtw)`
29421 ///
29422 /// # Arguments
29423 /// - `rd` — Destination register.
29424 /// - `rs1` — Source register.
29425 /// - `shamtw` — Immediate encoding value.
29426 pub fn bexti_rv32<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
29427 where
29428 Self: BextiRv32Emitter<T0, T1, T2>,
29429 {
29430 <Self as BextiRv32Emitter<T0, T1, T2>>::bexti_rv32(self, rd, rs1, shamtw);
29431 }
29432 /// Branch if greater than or equal
29433 ///
29434 /// Branch to PC + imm if
29435 /// the signed value in register rs1 is greater than or equal to the signed value in register rs2.
29436 ///
29437 /// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
29438 ///
29439 /// # Forms
29440 /// Assembly: `bge xs1, xs2, imm`
29441 /// Rust: `bge(rs1, rs2, imm)`
29442 ///
29443 /// # Arguments
29444 /// - `rs1` — Source register.
29445 /// - `rs2` — Source register.
29446 /// - `imm` — Immediate encoding value.
29447 pub fn bge<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29448 where
29449 Self: BgeEmitter<T0, T1, T2>,
29450 {
29451 <Self as BgeEmitter<T0, T1, T2>>::bge(self, rs1, rs2, imm);
29452 }
29453 /// Branch if greater than or equal unsigned
29454 ///
29455 /// Branch to PC + imm if
29456 /// the unsigned value in register rs1 is greater than or equal to the unsigned value in register rs2.
29457 ///
29458 /// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
29459 ///
29460 /// # Forms
29461 /// Assembly: `bgeu xs1, xs2, imm`
29462 /// Rust: `bgeu(rs1, rs2, imm)`
29463 ///
29464 /// # Arguments
29465 /// - `rs1` — Source register.
29466 /// - `rs2` — Source register.
29467 /// - `imm` — Immediate encoding value.
29468 pub fn bgeu<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29469 where
29470 Self: BgeuEmitter<T0, T1, T2>,
29471 {
29472 <Self as BgeuEmitter<T0, T1, T2>>::bgeu(self, rs1, rs2, imm);
29473 }
29474 /// RISC-V `bgez` instruction.
29475 ///
29476 /// # Forms
29477 /// Assembly: `bgez rs1 bimm12lohi`
29478 /// Rust: `bgez(rs1, imm)`
29479 ///
29480 /// # Arguments
29481 /// - `rs1` — Source register.
29482 /// - `imm` — Immediate encoding value.
29483 pub fn bgez<T0, T1>(&mut self, rs1: T0, imm: T1)
29484 where
29485 Self: BgezEmitter<T0, T1>,
29486 {
29487 <Self as BgezEmitter<T0, T1>>::bgez(self, rs1, imm);
29488 }
29489 /// RISC-V `bgt` instruction.
29490 ///
29491 /// # Forms
29492 /// Assembly: `bgt rs1 rs2 bimm12lohi`
29493 /// Rust: `bgt(rs1, rs2, imm)`
29494 ///
29495 /// # Arguments
29496 /// - `rs1` — Source register.
29497 /// - `rs2` — Source register.
29498 /// - `imm` — Immediate encoding value.
29499 pub fn bgt<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29500 where
29501 Self: BgtEmitter<T0, T1, T2>,
29502 {
29503 <Self as BgtEmitter<T0, T1, T2>>::bgt(self, rs1, rs2, imm);
29504 }
29505 /// RISC-V `bgtu` instruction.
29506 ///
29507 /// # Forms
29508 /// Assembly: `bgtu rs1 rs2 bimm12lohi`
29509 /// Rust: `bgtu(rs1, rs2, imm)`
29510 ///
29511 /// # Arguments
29512 /// - `rs1` — Source register.
29513 /// - `rs2` — Source register.
29514 /// - `imm` — Immediate encoding value.
29515 pub fn bgtu<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29516 where
29517 Self: BgtuEmitter<T0, T1, T2>,
29518 {
29519 <Self as BgtuEmitter<T0, T1, T2>>::bgtu(self, rs1, rs2, imm);
29520 }
29521 /// RISC-V `bgtz` instruction.
29522 ///
29523 /// # Forms
29524 /// Assembly: `bgtz rs2 bimm12lohi`
29525 /// Rust: `bgtz(rs2, imm)`
29526 ///
29527 /// # Arguments
29528 /// - `rs2` — Source register.
29529 /// - `imm` — Immediate encoding value.
29530 pub fn bgtz<T0, T1>(&mut self, rs2: T0, imm: T1)
29531 where
29532 Self: BgtzEmitter<T0, T1>,
29533 {
29534 <Self as BgtzEmitter<T0, T1>>::bgtz(self, rs2, imm);
29535 }
29536 /// Single-Bit invert (Register)
29537 ///
29538 /// This instruction returns rs1 with a single bit inverted at the index specified in rs2.
29539 /// The index is read from the lower log2(XLEN) bits of rs2.
29540 ///
29541 /// # Forms
29542 /// Assembly: `binv xd, xs1, xs2`
29543 /// Rust: `binv(rd, rs1, rs2)`
29544 ///
29545 /// # Arguments
29546 /// - `rd` — Destination register.
29547 /// - `rs1` — Source register.
29548 /// - `rs2` — Source register.
29549 pub fn binv<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
29550 where
29551 Self: BinvEmitter<T0, T1, T2>,
29552 {
29553 <Self as BinvEmitter<T0, T1, T2>>::binv(self, rd, rs1, rs2);
29554 }
29555 /// Single-Bit invert (Immediate)
29556 ///
29557 /// This instruction returns rs1 with a single bit inverted at the index specified in shamt.
29558 /// The index is read from the lower log2(XLEN) bits of shamt.
29559 /// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
29560 ///
29561 /// # Forms
29562 /// Assembly: `binvi xd, xs1, shamt`
29563 /// Rust: `binvi(rd, rs1, shamtd)`
29564 ///
29565 /// # Arguments
29566 /// - `rd` — Destination register.
29567 /// - `rs1` — Source register.
29568 /// - `shamtd` — Immediate encoding value.
29569 pub fn binvi<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtd: T2)
29570 where
29571 Self: BinviEmitter<T0, T1, T2>,
29572 {
29573 <Self as BinviEmitter<T0, T1, T2>>::binvi(self, rd, rs1, shamtd);
29574 }
29575 /// Single-Bit invert (Immediate)
29576 ///
29577 /// This instruction returns rs1 with a single bit inverted at the index specified in shamt.
29578 /// The index is read from the lower log2(XLEN) bits of shamt.
29579 /// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
29580 ///
29581 /// # Forms
29582 /// Assembly: `binvi.rv32 xd, xs1, shamt`
29583 /// Rust: `binvi_rv32(rd, rs1, shamtw)`
29584 ///
29585 /// # Arguments
29586 /// - `rd` — Destination register.
29587 /// - `rs1` — Source register.
29588 /// - `shamtw` — Immediate encoding value.
29589 pub fn binvi_rv32<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
29590 where
29591 Self: BinviRv32Emitter<T0, T1, T2>,
29592 {
29593 <Self as BinviRv32Emitter<T0, T1, T2>>::binvi_rv32(self, rd, rs1, shamtw);
29594 }
29595 /// RISC-V `ble` instruction.
29596 ///
29597 /// # Forms
29598 /// Assembly: `ble rs1 rs2 bimm12lohi`
29599 /// Rust: `ble(rs1, rs2, imm)`
29600 ///
29601 /// # Arguments
29602 /// - `rs1` — Source register.
29603 /// - `rs2` — Source register.
29604 /// - `imm` — Immediate encoding value.
29605 pub fn ble<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29606 where
29607 Self: BleEmitter<T0, T1, T2>,
29608 {
29609 <Self as BleEmitter<T0, T1, T2>>::ble(self, rs1, rs2, imm);
29610 }
29611 /// RISC-V `bleu` instruction.
29612 ///
29613 /// # Forms
29614 /// Assembly: `bleu rs1 rs2 bimm12lohi`
29615 /// Rust: `bleu(rs1, rs2, imm)`
29616 ///
29617 /// # Arguments
29618 /// - `rs1` — Source register.
29619 /// - `rs2` — Source register.
29620 /// - `imm` — Immediate encoding value.
29621 pub fn bleu<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29622 where
29623 Self: BleuEmitter<T0, T1, T2>,
29624 {
29625 <Self as BleuEmitter<T0, T1, T2>>::bleu(self, rs1, rs2, imm);
29626 }
29627 /// RISC-V `blez` instruction.
29628 ///
29629 /// # Forms
29630 /// Assembly: `blez rs2 bimm12lohi`
29631 /// Rust: `blez(rs2, imm)`
29632 ///
29633 /// # Arguments
29634 /// - `rs2` — Source register.
29635 /// - `imm` — Immediate encoding value.
29636 pub fn blez<T0, T1>(&mut self, rs2: T0, imm: T1)
29637 where
29638 Self: BlezEmitter<T0, T1>,
29639 {
29640 <Self as BlezEmitter<T0, T1>>::blez(self, rs2, imm);
29641 }
29642 /// Branch if less than
29643 ///
29644 /// Branch to PC + imm if
29645 /// the signed value in register rs1 is less than the signed value in register rs2.
29646 ///
29647 /// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
29648 ///
29649 /// # Forms
29650 /// Assembly: `blt xs1, xs2, imm`
29651 /// Rust: `blt(rs1, rs2, imm)`
29652 ///
29653 /// # Arguments
29654 /// - `rs1` — Source register.
29655 /// - `rs2` — Source register.
29656 /// - `imm` — Immediate encoding value.
29657 pub fn blt<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29658 where
29659 Self: BltEmitter<T0, T1, T2>,
29660 {
29661 <Self as BltEmitter<T0, T1, T2>>::blt(self, rs1, rs2, imm);
29662 }
29663 /// Branch if less than unsigned
29664 ///
29665 /// Branch to PC + imm if
29666 /// the unsigned value in register rs1 is less than the unsigned value in register rs2.
29667 ///
29668 /// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
29669 ///
29670 /// # Forms
29671 /// Assembly: `bltu xs1, xs2, imm`
29672 /// Rust: `bltu(rs1, rs2, imm)`
29673 ///
29674 /// # Arguments
29675 /// - `rs1` — Source register.
29676 /// - `rs2` — Source register.
29677 /// - `imm` — Immediate encoding value.
29678 pub fn bltu<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29679 where
29680 Self: BltuEmitter<T0, T1, T2>,
29681 {
29682 <Self as BltuEmitter<T0, T1, T2>>::bltu(self, rs1, rs2, imm);
29683 }
29684 /// RISC-V `bltz` instruction.
29685 ///
29686 /// # Forms
29687 /// Assembly: `bltz rs1 bimm12lohi`
29688 /// Rust: `bltz(rs1, imm)`
29689 ///
29690 /// # Arguments
29691 /// - `rs1` — Source register.
29692 /// - `imm` — Immediate encoding value.
29693 pub fn bltz<T0, T1>(&mut self, rs1: T0, imm: T1)
29694 where
29695 Self: BltzEmitter<T0, T1>,
29696 {
29697 <Self as BltzEmitter<T0, T1>>::bltz(self, rs1, imm);
29698 }
29699 /// Branch if not equal
29700 ///
29701 /// Branch to PC + imm if
29702 /// the value in register rs1 is not equal to the value in register rs2.
29703 ///
29704 /// Raise a `MisalignedAddress` exception if PC + imm is misaligned.
29705 ///
29706 /// # Forms
29707 /// Assembly: `bne xs1, xs2, imm`
29708 /// Rust: `bne(rs1, rs2, imm)`
29709 ///
29710 /// # Arguments
29711 /// - `rs1` — Source register.
29712 /// - `rs2` — Source register.
29713 /// - `imm` — Immediate encoding value.
29714 pub fn bne<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
29715 where
29716 Self: BneEmitter<T0, T1, T2>,
29717 {
29718 <Self as BneEmitter<T0, T1, T2>>::bne(self, rs1, rs2, imm);
29719 }
29720 /// RISC-V `bnez` instruction.
29721 ///
29722 /// # Forms
29723 /// Assembly: `bnez rs1 bimm12lohi`
29724 /// Rust: `bnez(rs1, imm)`
29725 ///
29726 /// # Arguments
29727 /// - `rs1` — Source register.
29728 /// - `imm` — Immediate encoding value.
29729 pub fn bnez<T0, T1>(&mut self, rs1: T0, imm: T1)
29730 where
29731 Self: BnezEmitter<T0, T1>,
29732 {
29733 <Self as BnezEmitter<T0, T1>>::bnez(self, rs1, imm);
29734 }
29735 /// Reverse bits in bytes
29736 ///
29737 /// This instruction reverses the order of the bits in every byte of a register.
29738 ///
29739 /// # Forms
29740 /// Assembly: `brev8 xd, xs1`
29741 /// Rust: `brev8(rd, rs1)`
29742 ///
29743 /// # Arguments
29744 /// - `rd` — Destination register.
29745 /// - `rs1` — Source register.
29746 pub fn brev8<T0, T1>(&mut self, rd: T0, rs1: T1)
29747 where
29748 Self: Brev8Emitter<T0, T1>,
29749 {
29750 <Self as Brev8Emitter<T0, T1>>::brev8(self, rd, rs1);
29751 }
29752 /// Single-Bit set (Register)
29753 ///
29754 /// This instruction returns rs1 with a single bit set at the index specified in rs2.
29755 /// The index is read from the lower log2(XLEN) bits of rs2.
29756 ///
29757 /// # Forms
29758 /// Assembly: `bset xd, xs1, xs2`
29759 /// Rust: `bset(rd, rs1, rs2)`
29760 ///
29761 /// # Arguments
29762 /// - `rd` — Destination register.
29763 /// - `rs1` — Source register.
29764 /// - `rs2` — Source register.
29765 pub fn bset<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
29766 where
29767 Self: BsetEmitter<T0, T1, T2>,
29768 {
29769 <Self as BsetEmitter<T0, T1, T2>>::bset(self, rd, rs1, rs2);
29770 }
29771 /// Single-Bit set (Immediate)
29772 ///
29773 /// This instruction returns rs1 with a single bit set at the index specified in shamt.
29774 /// The index is read from the lower log2(XLEN) bits of shamt.
29775 /// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
29776 ///
29777 /// # Forms
29778 /// Assembly: `bseti xd, xs1, shamt`
29779 /// Rust: `bseti(rd, rs1, shamtd)`
29780 ///
29781 /// # Arguments
29782 /// - `rd` — Destination register.
29783 /// - `rs1` — Source register.
29784 /// - `shamtd` — Immediate encoding value.
29785 pub fn bseti<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtd: T2)
29786 where
29787 Self: BsetiEmitter<T0, T1, T2>,
29788 {
29789 <Self as BsetiEmitter<T0, T1, T2>>::bseti(self, rd, rs1, shamtd);
29790 }
29791 /// Single-Bit set (Immediate)
29792 ///
29793 /// This instruction returns rs1 with a single bit set at the index specified in shamt.
29794 /// The index is read from the lower log2(XLEN) bits of shamt.
29795 /// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
29796 ///
29797 /// # Forms
29798 /// Assembly: `bseti.rv32 xd, xs1, shamt`
29799 /// Rust: `bseti_rv32(rd, rs1, shamtw)`
29800 ///
29801 /// # Arguments
29802 /// - `rd` — Destination register.
29803 /// - `rs1` — Source register.
29804 /// - `shamtw` — Immediate encoding value.
29805 pub fn bseti_rv32<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
29806 where
29807 Self: BsetiRv32Emitter<T0, T1, T2>,
29808 {
29809 <Self as BsetiRv32Emitter<T0, T1, T2>>::bseti_rv32(self, rd, rs1, shamtw);
29810 }
29811 /// Add
29812 ///
29813 /// Add the value in rs2 to rd, and store the result in rd.
29814 /// C.ADD expands into `add rd, rd, rs2`.
29815 ///
29816 /// # Forms
29817 /// Assembly: `c.add xd, rs2`
29818 /// Rust: `c_add(rd, rs2)`
29819 ///
29820 /// # Arguments
29821 /// - `rd` — Destination/source register.
29822 /// - `rs2` — Instruction operand.
29823 pub fn c_add<T0, T1>(&mut self, rd: T0, rs2: T1)
29824 where
29825 Self: CAddEmitter<T0, T1>,
29826 {
29827 <Self as CAddEmitter<T0, T1>>::c_add(self, rd, rs2);
29828 }
29829 /// Add a sign-extended non-zero immediate
29830 ///
29831 /// C.ADDI adds the non-zero sign-extended 6-bit immediate to the value in register rd then writes the result to rd.
29832 /// C.ADDI expands into `addi rd, rd, imm`.
29833 /// C.ADDI is only valid when rd ≠ x0 and imm ≠ 0.
29834 /// The code points with rd=x0 encode the C.NOP instruction; the remaining code points with imm=0 encode HINTs.
29835 ///
29836 /// # Forms
29837 /// Assembly: `c.addi xd, imm`
29838 /// Rust: `c_addi(rd, imm)`
29839 ///
29840 /// # Arguments
29841 /// - `rd` — Destination/source register.
29842 /// - `imm` — Immediate encoding value.
29843 pub fn c_addi<T0, T1>(&mut self, rd: T0, imm: T1)
29844 where
29845 Self: CAddiEmitter<T0, T1>,
29846 {
29847 <Self as CAddiEmitter<T0, T1>>::c_addi(self, rd, imm);
29848 }
29849 /// Add a sign-extended non-zero immediate
29850 ///
29851 /// C.ADDI16SP adds the non-zero sign-extended 6-bit immediate to the value in the stack pointer (sp=x2), where the immediate is scaled to represent multiples of 16 in the range (-512,496).
29852 /// C.ADDI16SP is used to adjust the stack pointer in procedure prologues and epilogues.
29853 /// It expands into `addi x2, x2, nzimm\[9:4\]`.
29854 /// C.ADDI16SP is only valid when nzimm ≠ 0; the code point with nzimm=0 is reserved.
29855 ///
29856 /// # Forms
29857 /// Assembly: `c.addi16sp imm`
29858 /// Rust: `c_addi16sp(imm)`
29859 ///
29860 /// # Arguments
29861 /// - `imm` — Immediate encoding value.
29862 pub fn c_addi16sp<T0>(&mut self, imm: T0)
29863 where
29864 Self: CAddi16spEmitter<T0>,
29865 {
29866 <Self as CAddi16spEmitter<T0>>::c_addi16sp(self, imm);
29867 }
29868 /// Add a zero-extended non-zero immediate, scaled by 4, to the stack pointer
29869 ///
29870 /// Adds a zero-extended non-zero immediate, scaled by 4, to the stack pointer, x2, and writes the result to rd'.
29871 /// This instruction is used to generate pointers to stack-allocated variables.
29872 /// It expands to `addi rd', x2, nzuimm\[9:2\]`.
29873 /// C.ADDI4SPN is only valid when nzuimm ≠ 0; the code points with nzuimm=0 are reserved.
29874 ///
29875 /// # Forms
29876 /// Assembly: `c.addi4spn xd, imm`
29877 /// Rust: `c_addi4spn(rd, imm)`
29878 ///
29879 /// # Arguments
29880 /// - `rd` — Destination register.
29881 /// - `imm` — Immediate encoding value.
29882 pub fn c_addi4spn<T0, T1>(&mut self, rd: T0, imm: T1)
29883 where
29884 Self: CAddi4spnEmitter<T0, T1>,
29885 {
29886 <Self as CAddi4spnEmitter<T0, T1>>::c_addi4spn(self, rd, imm);
29887 }
29888 /// Add a sign-extended non-zero immediate
29889 ///
29890 /// C.ADDIW is an RV64C/RV128C-only instruction that performs the same computation as C.ADDI but produces a 32-bit result, then sign-extends result to 64 bits.
29891 /// C.ADDIW expands into `addiw rd, rd, imm`.
29892 /// The immediate can be zero for C.ADDIW, where this corresponds to `sext.w rd`.
29893 /// C.ADDIW is only valid when rd ≠ x0; the code points with rd=x0 are reserved.
29894 ///
29895 /// # Forms
29896 /// Assembly: `c.addiw xd, imm`
29897 /// Rust: `c_addiw(rd, imm)`
29898 ///
29899 /// # Arguments
29900 /// - `rd` — Destination/source register.
29901 /// - `imm` — Immediate encoding value.
29902 pub fn c_addiw<T0, T1>(&mut self, rd: T0, imm: T1)
29903 where
29904 Self: CAddiwEmitter<T0, T1>,
29905 {
29906 <Self as CAddiwEmitter<T0, T1>>::c_addiw(self, rd, imm);
29907 }
29908 /// Add word
29909 ///
29910 /// Add the 32-bit values in rs2 from rd, and store the result in rd.
29911 /// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
29912 /// C.ADDW expands into `addw rd, rd, rs2`.
29913 ///
29914 /// # Forms
29915 /// Assembly: `c.addw xd, rs2`
29916 /// Rust: `c_addw(rd, rs2)`
29917 ///
29918 /// # Arguments
29919 /// - `rd` — Destination/source register.
29920 /// - `rs2` — Source register.
29921 pub fn c_addw<T0, T1>(&mut self, rd: T0, rs2: T1)
29922 where
29923 Self: CAddwEmitter<T0, T1>,
29924 {
29925 <Self as CAddwEmitter<T0, T1>>::c_addw(self, rd, rs2);
29926 }
29927 /// And
29928 ///
29929 /// And rd with rs2, and store the result in rd
29930 /// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
29931 /// C.AND expands into `and rd, rd, rs2`.
29932 ///
29933 /// # Forms
29934 /// Assembly: `c.and xd, rs2`
29935 /// Rust: `c_and(rd, rs2)`
29936 ///
29937 /// # Arguments
29938 /// - `rd` — Destination/source register.
29939 /// - `rs2` — Source register.
29940 pub fn c_and<T0, T1>(&mut self, rd: T0, rs2: T1)
29941 where
29942 Self: CAndEmitter<T0, T1>,
29943 {
29944 <Self as CAndEmitter<T0, T1>>::c_and(self, rd, rs2);
29945 }
29946 /// And immediate
29947 ///
29948 /// And an immediate to the value in rd, and store the result in rd.
29949 /// The rd register index should be used as rd+8 (registers x8-x15).
29950 /// C.ANDI expands into `andi rd, rd, imm`.
29951 ///
29952 /// # Forms
29953 /// Assembly: `c.andi xd, imm`
29954 /// Rust: `c_andi(rd, imm)`
29955 ///
29956 /// # Arguments
29957 /// - `rd` — Destination/source register.
29958 /// - `imm` — Immediate encoding value.
29959 pub fn c_andi<T0, T1>(&mut self, rd: T0, imm: T1)
29960 where
29961 Self: CAndiEmitter<T0, T1>,
29962 {
29963 <Self as CAndiEmitter<T0, T1>>::c_andi(self, rd, imm);
29964 }
29965 /// Branch if Equal Zero
29966 ///
29967 /// C.BEQZ performs conditional control transfers. The offset is sign-extended and added to the pc to form the branch target address. It can therefore target a ±256 B range. C.BEQZ takes the branch if the value in register rs1' is zero.
29968 /// It expands to `beq` `rs1, x0, offset`.
29969 ///
29970 /// # Forms
29971 /// Assembly: `c.beqz xs1, imm`
29972 /// Rust: `c_beqz(rs1, bimm9lohi)`
29973 ///
29974 /// # Arguments
29975 /// - `rs1` — Source register.
29976 /// - `bimm9lohi` — Immediate encoding value.
29977 pub fn c_beqz<T0, T1>(&mut self, rs1: T0, bimm9lohi: T1)
29978 where
29979 Self: CBeqzEmitter<T0, T1>,
29980 {
29981 <Self as CBeqzEmitter<T0, T1>>::c_beqz(self, rs1, bimm9lohi);
29982 }
29983 /// Branch if NOT Equal Zero
29984 ///
29985 /// C.BEQZ performs conditional control transfers. The offset is sign-extended and added to the pc to form the branch target address. It can therefore target a ±256 B range. C.BEQZ takes the branch if the value in register rs1' is NOT zero.
29986 /// It expands to `beq` `rs1, x0, offset`.
29987 ///
29988 /// # Forms
29989 /// Assembly: `c.bnez xs1, imm`
29990 /// Rust: `c_bnez(rs1, bimm9lohi)`
29991 ///
29992 /// # Arguments
29993 /// - `rs1` — Source register.
29994 /// - `bimm9lohi` — Immediate encoding value.
29995 pub fn c_bnez<T0, T1>(&mut self, rs1: T0, bimm9lohi: T1)
29996 where
29997 Self: CBnezEmitter<T0, T1>,
29998 {
29999 <Self as CBnezEmitter<T0, T1>>::c_bnez(self, rs1, bimm9lohi);
30000 }
30001 /// Breakpoint exception.
30002 ///
30003 /// The C.EBREAK instruction is used by debuggers to cause control to be transferred back to
30004 /// a debugging environment. Unless overridden by an external debug environment,
30005 /// C.EBREAK raises a breakpoint exception and performs no other operation.
30006 ///
30007 /// \[NOTE\]
30008 /// As described in the `C` Standard Extension for Compressed Instructions, the `c.ebreak`
30009 /// instruction performs the same operation as the EBREAK instruction.
30010 ///
30011 /// EBREAK causes the receiving privilege mode's epc register to be set to the address of
30012 /// the EBREAK instruction itself, not the address of the following instruction.
30013 /// As EBREAK causes a synchronous exception, it is not considered to retire,
30014 /// and should not increment the `minstret` CSR.
30015 ///
30016 /// # Forms
30017 /// Assembly: `c.ebreak " "`
30018 /// Rust: `c_ebreak()`
30019 ///
30020 /// # Arguments
30021 pub fn c_ebreak(&mut self)
30022 where
30023 Self: CEbreakEmitter,
30024 {
30025 <Self as CEbreakEmitter>::c_ebreak(self);
30026 }
30027 /// Load double-precision
30028 ///
30029 /// Loads a double precision floating-point value from memory into register rd.
30030 /// It computes an effective address by adding the zero-extended offset, scaled by 8,
30031 /// to the base address in register rs1.
30032 /// It expands to `fld` `rd, offset(rs1)`.
30033 ///
30034 /// # Forms
30035 /// Assembly: `c.fld xd, imm(xs1)`
30036 /// Rust: `c_fld(rd, rs1, imm)`
30037 ///
30038 /// # Arguments
30039 /// - `rd` — Destination register.
30040 /// - `rs1` — Memory base register.
30041 /// - `imm` — Immediate encoding value.
30042 pub fn c_fld<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
30043 where
30044 Self: CFldEmitter<T0, T1, T2>,
30045 {
30046 <Self as CFldEmitter<T0, T1, T2>>::c_fld(self, rd, rs1, imm);
30047 }
30048 /// Load doubleword into floating-point register from stack
30049 ///
30050 /// Loads a double-precision floating-point value from memory into floating-point register rd.
30051 /// It computes its effective address by adding the zero-extended offset, scaled by 8,
30052 /// to the stack pointer, x2.
30053 /// It expands to `fld` `rd, offset(x2)`.
30054 ///
30055 /// # Forms
30056 /// Assembly: `c.fldsp fd, imm(sp)`
30057 /// Rust: `c_fldsp(rd, imm)`
30058 ///
30059 /// # Arguments
30060 /// - `rd` — Destination register.
30061 /// - `imm` — Immediate encoding value.
30062 pub fn c_fldsp<T0, T1>(&mut self, rd: T0, imm: T1)
30063 where
30064 Self: CFldspEmitter<T0, T1>,
30065 {
30066 <Self as CFldspEmitter<T0, T1>>::c_fldsp(self, rd, imm);
30067 }
30068 /// Load single-precision
30069 ///
30070 /// Loads a single precision floating-point value from memory into register rd.
30071 /// It computes an effective address by adding the zero-extended offset, scaled by 4,
30072 /// to the base address in register rs1.
30073 /// It expands to `flw` `rd, offset(rs1)`.
30074 ///
30075 /// # Forms
30076 /// Assembly: `c.flw xd, imm(xs1)`
30077 /// Rust: `c_flw(rd, rs1, imm)`
30078 ///
30079 /// # Arguments
30080 /// - `rd` — Destination register.
30081 /// - `rs1` — Memory base register.
30082 /// - `imm` — Immediate encoding value.
30083 pub fn c_flw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
30084 where
30085 Self: CFlwEmitter<T0, T1, T2>,
30086 {
30087 <Self as CFlwEmitter<T0, T1, T2>>::c_flw(self, rd, rs1, imm);
30088 }
30089 /// Load word into floating-point register from stack
30090 ///
30091 /// Loads a single-precision floating-point value from memory into floating-point register rd.
30092 /// It computes its effective address by adding the zero-extended offset, scaled by 4,
30093 /// to the stack pointer, x2.
30094 /// It expands to `flw` `rd, offset(x2)`.
30095 ///
30096 /// # Forms
30097 /// Assembly: `c.flwsp fd, imm(sp)`
30098 /// Rust: `c_flwsp(rd, imm)`
30099 ///
30100 /// # Arguments
30101 /// - `rd` — Destination register.
30102 /// - `imm` — Immediate encoding value.
30103 pub fn c_flwsp<T0, T1>(&mut self, rd: T0, imm: T1)
30104 where
30105 Self: CFlwspEmitter<T0, T1>,
30106 {
30107 <Self as CFlwspEmitter<T0, T1>>::c_flwsp(self, rd, imm);
30108 }
30109 /// Store double-precision
30110 ///
30111 /// Stores a double precision floating-point value in register rs2 to memory.
30112 /// It computes an effective address by adding the zero-extended offset, scaled by 8,
30113 /// to the base address in register rs1.
30114 /// It expands to `fsd` `rs2, offset(rs1)`.
30115 ///
30116 /// # Forms
30117 /// Assembly: `c.fsd xs2, imm(xs1)`
30118 /// Rust: `c_fsd(rs1, rs2, imm)`
30119 ///
30120 /// # Arguments
30121 /// - `rs1` — Memory base register.
30122 /// - `rs2` — Source register.
30123 /// - `imm` — Immediate encoding value.
30124 pub fn c_fsd<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
30125 where
30126 Self: CFsdEmitter<T0, T1, T2>,
30127 {
30128 <Self as CFsdEmitter<T0, T1, T2>>::c_fsd(self, rs1, rs2, imm);
30129 }
30130 /// Store double-precision value to stack
30131 ///
30132 /// Stores a double-precision floating-point value in floating-point register rs2 to memory.
30133 /// It computes an effective address by adding the zero-extended offset, scaled by 8,
30134 /// to the stack pointer, x2.
30135 /// It expands to `fsd` `rs2, offset(x2)`.
30136 ///
30137 /// # Forms
30138 /// Assembly: `c.fsdsp fs2, imm(sp)`
30139 /// Rust: `c_fsdsp(rs2, imm)`
30140 ///
30141 /// # Arguments
30142 /// - `rs2` — Instruction operand.
30143 /// - `imm` — Immediate encoding value.
30144 pub fn c_fsdsp<T0, T1>(&mut self, rs2: T0, imm: T1)
30145 where
30146 Self: CFsdspEmitter<T0, T1>,
30147 {
30148 <Self as CFsdspEmitter<T0, T1>>::c_fsdsp(self, rs2, imm);
30149 }
30150 /// Store single-precision
30151 ///
30152 /// Stores a single precision floating-point value in register rs2 to memory.
30153 /// It computes an effective address by adding the zero-extended offset, scaled by 4,
30154 /// to the base address in register rs1.
30155 /// It expands to `fsw` `rs2, offset(rs1)`.
30156 ///
30157 /// # Forms
30158 /// Assembly: `c.fsw xs2, imm(xs1)`
30159 /// Rust: `c_fsw(rs1, rs2, imm)`
30160 ///
30161 /// # Arguments
30162 /// - `rs1` — Memory base register.
30163 /// - `rs2` — Source register.
30164 /// - `imm` — Immediate encoding value.
30165 pub fn c_fsw<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
30166 where
30167 Self: CFswEmitter<T0, T1, T2>,
30168 {
30169 <Self as CFswEmitter<T0, T1, T2>>::c_fsw(self, rs1, rs2, imm);
30170 }
30171 /// Store single-precision value to stack
30172 ///
30173 /// Stores a single-precision floating-point value in floating-point register rs2 to memory.
30174 /// It computes an effective address by adding the zero-extended offset, scaled by 4,
30175 /// to the stack pointer, x2.
30176 /// It expands to `fsw` `rs2, offset(x2)`.
30177 ///
30178 /// # Forms
30179 /// Assembly: `c.fswsp fs2, imm(sp)`
30180 /// Rust: `c_fswsp(rs2, imm)`
30181 ///
30182 /// # Arguments
30183 /// - `rs2` — Instruction operand.
30184 /// - `imm` — Immediate encoding value.
30185 pub fn c_fswsp<T0, T1>(&mut self, rs2: T0, imm: T1)
30186 where
30187 Self: CFswspEmitter<T0, T1>,
30188 {
30189 <Self as CFswspEmitter<T0, T1>>::c_fswsp(self, rs2, imm);
30190 }
30191 /// Jump
30192 ///
30193 /// C.J performs an unconditional control transfer. The offset is sign-extended and added to the pc to form the jump target address. C.J can therefore target a ±2 KiB range.
30194 /// It expands to `jal` `x0, offset`.
30195 ///
30196 /// # Forms
30197 /// Assembly: `c.j imm`
30198 /// Rust: `c_j(imm)`
30199 ///
30200 /// # Arguments
30201 /// - `imm` — Immediate encoding value.
30202 pub fn c_j<T0>(&mut self, imm: T0)
30203 where
30204 Self: CJEmitter<T0>,
30205 {
30206 <Self as CJEmitter<T0>>::c_j(self, imm);
30207 }
30208 /// Jump and Link
30209 ///
30210 /// C.JAL is an RV32C-only instruction that performs the same operation as C.J, but additionally writes the address of the instruction following the jump (pc+2) to the link register, x1.
30211 /// It expands to `jal` `x1, offset`.
30212 ///
30213 /// # Forms
30214 /// Assembly: `c.jal imm`
30215 /// Rust: `c_jal(imm)`
30216 ///
30217 /// # Arguments
30218 /// - `imm` — Immediate encoding value.
30219 pub fn c_jal<T0>(&mut self, imm: T0)
30220 where
30221 Self: CJalEmitter<T0>,
30222 {
30223 <Self as CJalEmitter<T0>>::c_jal(self, imm);
30224 }
30225 /// Jump and Link Register.
30226 ///
30227 /// C.JALR (jump and link register) performs the same operation as C.JR, but additionally writes the address of the instruction following the jump (pc+2) to the link register, x1.
30228 /// C.JALR expands to jalr x1, 0(rs1).
30229 ///
30230 /// # Forms
30231 /// Assembly: `c.jalr xs1`
30232 /// Rust: `c_jalr(rs1)`
30233 ///
30234 /// # Arguments
30235 /// - `rs1` — Instruction operand.
30236 pub fn c_jalr<T0>(&mut self, rs1: T0)
30237 where
30238 Self: CJalrEmitter<T0>,
30239 {
30240 <Self as CJalrEmitter<T0>>::c_jalr(self, rs1);
30241 }
30242 /// Jump Register
30243 ///
30244 /// C.JR (jump register) performs an unconditional control transfer to the address in register rs1.
30245 /// C.JR expands to jalr x0, 0(rs1).
30246 ///
30247 /// # Forms
30248 /// Assembly: `c.jr xs1`
30249 /// Rust: `c_jr(rs1)`
30250 ///
30251 /// # Arguments
30252 /// - `rs1` — Source register.
30253 pub fn c_jr<T0>(&mut self, rs1: T0)
30254 where
30255 Self: CJrEmitter<T0>,
30256 {
30257 <Self as CJrEmitter<T0>>::c_jr(self, rs1);
30258 }
30259 /// Load unsigned byte, 16-bit encoding
30260 ///
30261 /// Loads a 8-bit value from memory into register rd.
30262 /// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
30263 /// It expands to `lbu` `rd, offset(rs1)`.
30264 ///
30265 /// # Forms
30266 /// Assembly: `c.lbu xd, imm(xs1)`
30267 /// Rust: `c_lbu(rd, rs1, imm)`
30268 ///
30269 /// # Arguments
30270 /// - `rd` — Destination register.
30271 /// - `rs1` — Source register.
30272 /// - `imm` — Immediate encoding value.
30273 pub fn c_lbu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
30274 where
30275 Self: CLbuEmitter<T0, T1, T2>,
30276 {
30277 <Self as CLbuEmitter<T0, T1, T2>>::c_lbu(self, rd, rs1, imm);
30278 }
30279 /// Load double
30280 ///
30281 /// Loads a 64-bit value from memory into register rd.
30282 /// It computes an effective address by adding the zero-extended offset, scaled by 8,
30283 /// to the base address in register rs1.
30284 /// It expands to `ld` `rd, offset(rs1)`.
30285 ///
30286 /// # Forms
30287 /// Assembly: `c.ld xd, imm(xs1)`
30288 /// Rust: `c_ld(rd, rs1, imm)`
30289 ///
30290 /// # Arguments
30291 /// - `rd` — Destination register.
30292 /// - `rs1` — Memory base register.
30293 /// - `imm` — Immediate encoding value.
30294 pub fn c_ld<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
30295 where
30296 Self: CLdEmitter<T0, T1, T2>,
30297 {
30298 <Self as CLdEmitter<T0, T1, T2>>::c_ld(self, rd, rs1, imm);
30299 }
30300 /// Load doubleword from stack pointer
30301 ///
30302 /// C.LDSP is an RV64C/RV128C-only instruction that loads a 64-bit value from memory
30303 /// into register rd.
30304 /// It computes its effective address by adding the zero-extended offset, scaled by 8,
30305 /// to the stack pointer, x2.
30306 /// It expands to `ld` `rd, offset(x2)`.
30307 /// C.LDSP is only valid when rd ≠ x0 the code points with rd=x0 are reserved.
30308 ///
30309 /// # Forms
30310 /// Assembly: `c.ldsp xd, imm(sp)`
30311 /// Rust: `c_ldsp(rd, imm)`
30312 ///
30313 /// # Arguments
30314 /// - `rd` — Destination register.
30315 /// - `imm` — Immediate encoding value.
30316 pub fn c_ldsp<T0, T1>(&mut self, rd: T0, imm: T1)
30317 where
30318 Self: CLdspEmitter<T0, T1>,
30319 {
30320 <Self as CLdspEmitter<T0, T1>>::c_ldsp(self, rd, imm);
30321 }
30322 /// Load signed halfword, 16-bit encoding
30323 ///
30324 /// Loads a 16-bit value from memory into register rd.
30325 /// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
30326 /// It expands to `lh` `rd, offset(rs1)`.
30327 ///
30328 /// # Forms
30329 /// Assembly: `c.lh xd, imm(xs1)`
30330 /// Rust: `c_lh(rd, rs1, imm)`
30331 ///
30332 /// # Arguments
30333 /// - `rd` — Destination register.
30334 /// - `rs1` — Source register.
30335 /// - `imm` — Immediate encoding value.
30336 pub fn c_lh<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
30337 where
30338 Self: CLhEmitter<T0, T1, T2>,
30339 {
30340 <Self as CLhEmitter<T0, T1, T2>>::c_lh(self, rd, rs1, imm);
30341 }
30342 /// Load unsigned halfword, 16-bit encoding
30343 ///
30344 /// Loads a 16-bit value from memory into register rd.
30345 /// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
30346 /// It expands to `lhu` `rd, offset(rs1)`.
30347 ///
30348 /// # Forms
30349 /// Assembly: `c.lhu xd, imm(xs1)`
30350 /// Rust: `c_lhu(rd, rs1, imm)`
30351 ///
30352 /// # Arguments
30353 /// - `rd` — Destination register.
30354 /// - `rs1` — Source register.
30355 /// - `imm` — Immediate encoding value.
30356 pub fn c_lhu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
30357 where
30358 Self: CLhuEmitter<T0, T1, T2>,
30359 {
30360 <Self as CLhuEmitter<T0, T1, T2>>::c_lhu(self, rd, rs1, imm);
30361 }
30362 /// Load the sign-extended 6-bit immediate
30363 ///
30364 /// C.LI loads the sign-extended 6-bit immediate, imm, into register rd.
30365 /// C.LI expands into `addi rd, x0, imm`.
30366 /// C.LI is only valid when rd ≠ x0; the code points with rd=x0 encode HINTs.
30367 ///
30368 /// # Forms
30369 /// Assembly: `c.li xd, imm`
30370 /// Rust: `c_li(rd, imm)`
30371 ///
30372 /// # Arguments
30373 /// - `rd` — Destination register.
30374 /// - `imm` — Immediate encoding value.
30375 pub fn c_li<T0, T1>(&mut self, rd: T0, imm: T1)
30376 where
30377 Self: CLiEmitter<T0, T1>,
30378 {
30379 <Self as CLiEmitter<T0, T1>>::c_li(self, rd, imm);
30380 }
30381 /// Load the non-zero 6-bit immediate field into bits 17-12 of the destination register
30382 ///
30383 /// C.LUI loads the non-zero 6-bit immediate field into bits 17-12 of the destination register, clears the bottom 12 bits, and sign-extends bit 17 into all higher bits of the destination.
30384 /// C.LUI expands into `lui rd, imm`.
30385 /// C.LUI is only valid when rd≠x0 and rd≠x2, and when the immediate is not equal to zero.
30386 /// The code points with imm=0 are reserved; the remaining code points with rd=x0 are HINTs; and the remaining code points with rd=x2 correspond to the C.ADDI16SP instruction
30387 ///
30388 /// # Forms
30389 /// Assembly: `c.lui xd, imm`
30390 /// Rust: `c_lui(rd, imm)`
30391 ///
30392 /// # Arguments
30393 /// - `rd` — Destination register.
30394 /// - `imm` — Immediate encoding value.
30395 pub fn c_lui<T0, T1>(&mut self, rd: T0, imm: T1)
30396 where
30397 Self: CLuiEmitter<T0, T1>,
30398 {
30399 <Self as CLuiEmitter<T0, T1>>::c_lui(self, rd, imm);
30400 }
30401 /// Load word
30402 ///
30403 /// Loads a 32-bit value from memory into register rd.
30404 /// It computes an effective address by adding the zero-extended offset, scaled by 4,
30405 /// to the base address in register rs1.
30406 /// It expands to `lw` `rd, offset(rs1)`.
30407 ///
30408 /// # Forms
30409 /// Assembly: `c.lw xd, imm(xs1)`
30410 /// Rust: `c_lw(rd, rs1, imm)`
30411 ///
30412 /// # Arguments
30413 /// - `rd` — Destination register.
30414 /// - `rs1` — Memory base register.
30415 /// - `imm` — Immediate encoding value.
30416 pub fn c_lw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
30417 where
30418 Self: CLwEmitter<T0, T1, T2>,
30419 {
30420 <Self as CLwEmitter<T0, T1, T2>>::c_lw(self, rd, rs1, imm);
30421 }
30422 /// Load word from stack pointer
30423 ///
30424 /// Loads a 32-bit value from memory into register rd.
30425 /// It computes an effective address by adding the zero-extended offset, scaled by 4,
30426 /// to the stack pointer, x2.
30427 /// It expands to `lw` `rd, offset(x2)`.
30428 /// C.LWSP is only valid when rd ≠ x0. The code points with rd=x0 are reserved.
30429 ///
30430 /// # Forms
30431 /// Assembly: `c.lwsp xd, imm(sp)`
30432 /// Rust: `c_lwsp(rd, imm)`
30433 ///
30434 /// # Arguments
30435 /// - `rd` — Destination register.
30436 /// - `imm` — Immediate encoding value.
30437 pub fn c_lwsp<T0, T1>(&mut self, rd: T0, imm: T1)
30438 where
30439 Self: CLwspEmitter<T0, T1>,
30440 {
30441 <Self as CLwspEmitter<T0, T1>>::c_lwsp(self, rd, imm);
30442 }
30443 /// RISC-V `c.mop.1` instruction.
30444 ///
30445 /// # Forms
30446 /// Assembly: `c.mop.1`
30447 /// Rust: `c_mop_1()`
30448 ///
30449 /// # Arguments
30450 pub fn c_mop_1(&mut self)
30451 where
30452 Self: CMop1Emitter,
30453 {
30454 <Self as CMop1Emitter>::c_mop_1(self);
30455 }
30456 /// RISC-V `c.mop.11` instruction.
30457 ///
30458 /// # Forms
30459 /// Assembly: `c.mop.11`
30460 /// Rust: `c_mop_11()`
30461 ///
30462 /// # Arguments
30463 pub fn c_mop_11(&mut self)
30464 where
30465 Self: CMop11Emitter,
30466 {
30467 <Self as CMop11Emitter>::c_mop_11(self);
30468 }
30469 /// RISC-V `c.mop.13` instruction.
30470 ///
30471 /// # Forms
30472 /// Assembly: `c.mop.13`
30473 /// Rust: `c_mop_13()`
30474 ///
30475 /// # Arguments
30476 pub fn c_mop_13(&mut self)
30477 where
30478 Self: CMop13Emitter,
30479 {
30480 <Self as CMop13Emitter>::c_mop_13(self);
30481 }
30482 /// RISC-V `c.mop.15` instruction.
30483 ///
30484 /// # Forms
30485 /// Assembly: `c.mop.15`
30486 /// Rust: `c_mop_15()`
30487 ///
30488 /// # Arguments
30489 pub fn c_mop_15(&mut self)
30490 where
30491 Self: CMop15Emitter,
30492 {
30493 <Self as CMop15Emitter>::c_mop_15(self);
30494 }
30495 /// RISC-V `c.mop.3` instruction.
30496 ///
30497 /// # Forms
30498 /// Assembly: `c.mop.3`
30499 /// Rust: `c_mop_3()`
30500 ///
30501 /// # Arguments
30502 pub fn c_mop_3(&mut self)
30503 where
30504 Self: CMop3Emitter,
30505 {
30506 <Self as CMop3Emitter>::c_mop_3(self);
30507 }
30508 /// RISC-V `c.mop.5` instruction.
30509 ///
30510 /// # Forms
30511 /// Assembly: `c.mop.5`
30512 /// Rust: `c_mop_5()`
30513 ///
30514 /// # Arguments
30515 pub fn c_mop_5(&mut self)
30516 where
30517 Self: CMop5Emitter,
30518 {
30519 <Self as CMop5Emitter>::c_mop_5(self);
30520 }
30521 /// RISC-V `c.mop.7` instruction.
30522 ///
30523 /// # Forms
30524 /// Assembly: `c.mop.7`
30525 /// Rust: `c_mop_7()`
30526 ///
30527 /// # Arguments
30528 pub fn c_mop_7(&mut self)
30529 where
30530 Self: CMop7Emitter,
30531 {
30532 <Self as CMop7Emitter>::c_mop_7(self);
30533 }
30534 /// RISC-V `c.mop.9` instruction.
30535 ///
30536 /// # Forms
30537 /// Assembly: `c.mop.9`
30538 /// Rust: `c_mop_9()`
30539 ///
30540 /// # Arguments
30541 pub fn c_mop_9(&mut self)
30542 where
30543 Self: CMop9Emitter,
30544 {
30545 <Self as CMop9Emitter>::c_mop_9(self);
30546 }
30547 /// RISC-V `c.mop.n` instruction.
30548 ///
30549 /// # Forms
30550 /// Assembly: `c.mop.n c_mop_t`
30551 /// Rust: `c_mop_n(mop_t)`
30552 ///
30553 /// # Arguments
30554 /// - `mop_t` — Instruction operand.
30555 pub fn c_mop_n<T0>(&mut self, mop_t: T0)
30556 where
30557 Self: CMopNEmitter<T0>,
30558 {
30559 <Self as CMopNEmitter<T0>>::c_mop_n(self, mop_t);
30560 }
30561 /// Multiply, 16-bit encoding
30562 ///
30563 /// This instruction multiplies XLEN bits of the source operands from rsd' and rs2' and writes the lowest XLEN bits of the result to rsd'.
30564 ///
30565 /// # Forms
30566 /// Assembly: `c.mul xd, xs2`
30567 /// Rust: `c_mul(rd, rs2)`
30568 ///
30569 /// # Arguments
30570 /// - `rd` — Destination/source register.
30571 /// - `rs2` — Source register.
30572 pub fn c_mul<T0, T1>(&mut self, rd: T0, rs2: T1)
30573 where
30574 Self: CMulEmitter<T0, T1>,
30575 {
30576 <Self as CMulEmitter<T0, T1>>::c_mul(self, rd, rs2);
30577 }
30578 /// Move Register
30579 ///
30580 /// C.MV (move register) performs copy of the data in register rs2 to register rd
30581 /// C.MV expands to addi rd, x0, rs2.
30582 ///
30583 /// # Forms
30584 /// Assembly: `c.mv xd, xs2`
30585 /// Rust: `c_mv(rd, rs2)`
30586 ///
30587 /// # Arguments
30588 /// - `rd` — Destination register.
30589 /// - `rs2` — Instruction operand.
30590 pub fn c_mv<T0, T1>(&mut self, rd: T0, rs2: T1)
30591 where
30592 Self: CMvEmitter<T0, T1>,
30593 {
30594 <Self as CMvEmitter<T0, T1>>::c_mv(self, rd, rs2);
30595 }
30596 /// Non-operation
30597 ///
30598 /// C.NOP expands into `addi x0, x0, imm`.
30599 ///
30600 /// # Forms
30601 /// Assembly: `c.nop imm`
30602 /// Rust: `c_nop(imm)`
30603 ///
30604 /// # Arguments
30605 /// - `imm` — Immediate encoding value.
30606 pub fn c_nop<T0>(&mut self, imm: T0)
30607 where
30608 Self: CNopEmitter<T0>,
30609 {
30610 <Self as CNopEmitter<T0>>::c_nop(self, imm);
30611 }
30612 /// Bitwise not, 16-bit encoding
30613 ///
30614 /// This instruction takes a single source/destination operand.
30615 /// This instruction takes the one's complement of rd'/rs1' and writes the result to the same register.
30616 ///
30617 /// # Forms
30618 /// Assembly: `c.not xd`
30619 /// Rust: `c_not(rd)`
30620 ///
30621 /// # Arguments
30622 /// - `rd` — Destination/source register.
30623 pub fn c_not<T0>(&mut self, rd: T0)
30624 where
30625 Self: CNotEmitter<T0>,
30626 {
30627 <Self as CNotEmitter<T0>>::c_not(self, rd);
30628 }
30629 /// RISC-V `c.ntl.all` instruction.
30630 ///
30631 /// # Forms
30632 /// Assembly: `c.ntl.all`
30633 /// Rust: `c_ntl_all()`
30634 ///
30635 /// # Arguments
30636 pub fn c_ntl_all(&mut self)
30637 where
30638 Self: CNtlAllEmitter,
30639 {
30640 <Self as CNtlAllEmitter>::c_ntl_all(self);
30641 }
30642 /// RISC-V `c.ntl.p1` instruction.
30643 ///
30644 /// # Forms
30645 /// Assembly: `c.ntl.p1`
30646 /// Rust: `c_ntl_p1()`
30647 ///
30648 /// # Arguments
30649 pub fn c_ntl_p1(&mut self)
30650 where
30651 Self: CNtlP1Emitter,
30652 {
30653 <Self as CNtlP1Emitter>::c_ntl_p1(self);
30654 }
30655 /// RISC-V `c.ntl.pall` instruction.
30656 ///
30657 /// # Forms
30658 /// Assembly: `c.ntl.pall`
30659 /// Rust: `c_ntl_pall()`
30660 ///
30661 /// # Arguments
30662 pub fn c_ntl_pall(&mut self)
30663 where
30664 Self: CNtlPallEmitter,
30665 {
30666 <Self as CNtlPallEmitter>::c_ntl_pall(self);
30667 }
30668 /// RISC-V `c.ntl.s1` instruction.
30669 ///
30670 /// # Forms
30671 /// Assembly: `c.ntl.s1`
30672 /// Rust: `c_ntl_s1()`
30673 ///
30674 /// # Arguments
30675 pub fn c_ntl_s1(&mut self)
30676 where
30677 Self: CNtlS1Emitter,
30678 {
30679 <Self as CNtlS1Emitter>::c_ntl_s1(self);
30680 }
30681 /// Or
30682 ///
30683 /// Or rd with rs2, and store the result in rd
30684 /// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
30685 /// C.OR expands into `or rd, rd, rs2`.
30686 ///
30687 /// # Forms
30688 /// Assembly: `c.or xd, rs2`
30689 /// Rust: `c_or(rd, rs2)`
30690 ///
30691 /// # Arguments
30692 /// - `rd` — Destination/source register.
30693 /// - `rs2` — Source register.
30694 pub fn c_or<T0, T1>(&mut self, rd: T0, rs2: T1)
30695 where
30696 Self: COrEmitter<T0, T1>,
30697 {
30698 <Self as COrEmitter<T0, T1>>::c_or(self, rd, rs2);
30699 }
30700 /// Store unsigned byte, 16-bit encoding
30701 ///
30702 /// Stores a 8-bit value from register rs2 into memory.
30703 /// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
30704 /// It expands to `sb` `rs2, offset(rs1)`.
30705 ///
30706 /// # Forms
30707 /// Assembly: `c.sb xs2, imm(xs1)`
30708 /// Rust: `c_sb(rs1, rs2, imm)`
30709 ///
30710 /// # Arguments
30711 /// - `rs1` — Source register.
30712 /// - `rs2` — Source register.
30713 /// - `imm` — Immediate encoding value.
30714 pub fn c_sb<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
30715 where
30716 Self: CSbEmitter<T0, T1, T2>,
30717 {
30718 <Self as CSbEmitter<T0, T1, T2>>::c_sb(self, rs1, rs2, imm);
30719 }
30720 /// Store double
30721 ///
30722 /// Stores a 64-bit value in register rs2 to memory.
30723 /// It computes an effective address by adding the zero-extended offset, scaled by 8,
30724 /// to the base address in register rs1.
30725 /// It expands to `sd` `rs2, offset(rs1)`.
30726 ///
30727 /// # Forms
30728 /// Assembly: `c.sd xs2, imm(xs1)`
30729 /// Rust: `c_sd(rs1, rs2, imm)`
30730 ///
30731 /// # Arguments
30732 /// - `rs1` — Memory base register.
30733 /// - `rs2` — Source register.
30734 /// - `imm` — Immediate encoding value.
30735 pub fn c_sd<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
30736 where
30737 Self: CSdEmitter<T0, T1, T2>,
30738 {
30739 <Self as CSdEmitter<T0, T1, T2>>::c_sd(self, rs1, rs2, imm);
30740 }
30741 /// Store doubleword to stack
30742 ///
30743 /// Stores a 64-bit value in register rs2 to memory.
30744 /// It computes an effective address by adding the zero-extended offset, scaled by 8,
30745 /// to the stack pointer, x2.
30746 /// It expands to `sd` `rs2, offset(x2)`.
30747 ///
30748 /// # Forms
30749 /// Assembly: `c.sdsp xs2, imm(sp)`
30750 /// Rust: `c_sdsp(rs2, imm)`
30751 ///
30752 /// # Arguments
30753 /// - `rs2` — Instruction operand.
30754 /// - `imm` — Immediate encoding value.
30755 pub fn c_sdsp<T0, T1>(&mut self, rs2: T0, imm: T1)
30756 where
30757 Self: CSdspEmitter<T0, T1>,
30758 {
30759 <Self as CSdspEmitter<T0, T1>>::c_sdsp(self, rs2, imm);
30760 }
30761 /// Sign-extend byte, 16-bit encoding
30762 ///
30763 /// This instruction takes a single source/destination operand.
30764 /// This instruction sign-extends the least-significant byte of the source to XLEN by copying
30765 /// the most-significant bit in the byte (i.e., bit 7) to all of the more-significant bits.
30766 ///
30767 /// # Forms
30768 /// Assembly: `c.sext.b xd`
30769 /// Rust: `c_sext_b(rd)`
30770 ///
30771 /// # Arguments
30772 /// - `rd` — Destination/source register.
30773 pub fn c_sext_b<T0>(&mut self, rd: T0)
30774 where
30775 Self: CSextBEmitter<T0>,
30776 {
30777 <Self as CSextBEmitter<T0>>::c_sext_b(self, rd);
30778 }
30779 /// Sign-extend halfword, 16-bit encoding
30780 ///
30781 /// This instruction takes a single source/destination operand.
30782 /// This instruction sign-extends the least-significant halfword of the source to XLEN by copying
30783 /// the most-significant bit in the halfword (i.e., bit 15) to all of the more-significant bits.
30784 ///
30785 /// # Forms
30786 /// Assembly: `c.sext.h xd`
30787 /// Rust: `c_sext_h(rd)`
30788 ///
30789 /// # Arguments
30790 /// - `rd` — Destination/source register.
30791 pub fn c_sext_h<T0>(&mut self, rd: T0)
30792 where
30793 Self: CSextHEmitter<T0>,
30794 {
30795 <Self as CSextHEmitter<T0>>::c_sext_h(self, rd);
30796 }
30797 /// Store unsigned halfword, 16-bit encoding
30798 ///
30799 /// Stores a 16-bit value from register rs2 into memory.
30800 /// It computes an effective address by adding the zero-extended offset, to the base address in register rs1.
30801 /// It expands to `sh` `rs2, offset(rs1)`.
30802 ///
30803 /// # Forms
30804 /// Assembly: `c.sh xs2, imm(xs1)`
30805 /// Rust: `c_sh(rs1, rs2, imm)`
30806 ///
30807 /// # Arguments
30808 /// - `rs1` — Source register.
30809 /// - `rs2` — Source register.
30810 /// - `imm` — Immediate encoding value.
30811 pub fn c_sh<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
30812 where
30813 Self: CShEmitter<T0, T1, T2>,
30814 {
30815 <Self as CShEmitter<T0, T1, T2>>::c_sh(self, rs1, rs2, imm);
30816 }
30817 /// Shift left logical immediate
30818 ///
30819 /// Shift the value in rd left by shamt, and store the result back in rd.
30820 /// C.SLLI expands into `slli rd, rd, shamt`.
30821 ///
30822 /// # Forms
30823 /// Assembly: `c.slli xd, shamt`
30824 /// Rust: `c_slli(rd, imm)`
30825 ///
30826 /// # Arguments
30827 /// - `rd` — Destination/source register.
30828 /// - `imm` — Immediate encoding value.
30829 pub fn c_slli<T0, T1>(&mut self, rd: T0, imm: T1)
30830 where
30831 Self: CSlliEmitter<T0, T1>,
30832 {
30833 <Self as CSlliEmitter<T0, T1>>::c_slli(self, rd, imm);
30834 }
30835 /// Shift left logical immediate
30836 ///
30837 /// Shift the value in rd left by shamt, and store the result back in rd.
30838 /// C.SLLI expands into `slli rd, rd, shamt`.
30839 ///
30840 /// # Forms
30841 /// Assembly: `c.slli.rv32 xd, shamt`
30842 /// Rust: `c_slli_rv32(rd, imm)`
30843 ///
30844 /// # Arguments
30845 /// - `rd` — Destination/source register.
30846 /// - `imm` — Immediate encoding value.
30847 pub fn c_slli_rv32<T0, T1>(&mut self, rd: T0, imm: T1)
30848 where
30849 Self: CSlliRv32Emitter<T0, T1>,
30850 {
30851 <Self as CSlliRv32Emitter<T0, T1>>::c_slli_rv32(self, rd, imm);
30852 }
30853 /// Shift right arithmetical immediate
30854 ///
30855 /// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the value in rd right by shamt, and store the result in rd.
30856 /// The rd register index should be used as rd+8 (registers x8-x15).
30857 /// C.SRAI expands into `srai rd, rd, shamt`.
30858 ///
30859 /// # Forms
30860 /// Assembly: `c.srai xd, shamt`
30861 /// Rust: `c_srai(rd, imm)`
30862 ///
30863 /// # Arguments
30864 /// - `rd` — Destination/source register.
30865 /// - `imm` — Immediate encoding value.
30866 pub fn c_srai<T0, T1>(&mut self, rd: T0, imm: T1)
30867 where
30868 Self: CSraiEmitter<T0, T1>,
30869 {
30870 <Self as CSraiEmitter<T0, T1>>::c_srai(self, rd, imm);
30871 }
30872 /// Shift right arithmetical immediate
30873 ///
30874 /// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the value in rd right by shamt, and store the result in rd.
30875 /// The rd register index should be used as rd+8 (registers x8-x15).
30876 /// C.SRAI expands into `srai rd, rd, shamt`.
30877 ///
30878 /// # Forms
30879 /// Assembly: `c.srai.rv32 xd, shamt`
30880 /// Rust: `c_srai_rv32(rd, imm)`
30881 ///
30882 /// # Arguments
30883 /// - `rd` — Destination/source register.
30884 /// - `imm` — Immediate encoding value.
30885 pub fn c_srai_rv32<T0, T1>(&mut self, rd: T0, imm: T1)
30886 where
30887 Self: CSraiRv32Emitter<T0, T1>,
30888 {
30889 <Self as CSraiRv32Emitter<T0, T1>>::c_srai_rv32(self, rd, imm);
30890 }
30891 /// Shift right logical immediate
30892 ///
30893 /// Shift the value in rd right by shamt, and store the result back in rd.
30894 /// The rd register index should be used as rd+8 (registers x8-x15).
30895 /// C.SRLI expands into `srli rd, rd, shamt`.
30896 ///
30897 /// # Forms
30898 /// Assembly: `c.srli xd, shamt`
30899 /// Rust: `c_srli(rd, imm)`
30900 ///
30901 /// # Arguments
30902 /// - `rd` — Destination/source register.
30903 /// - `imm` — Immediate encoding value.
30904 pub fn c_srli<T0, T1>(&mut self, rd: T0, imm: T1)
30905 where
30906 Self: CSrliEmitter<T0, T1>,
30907 {
30908 <Self as CSrliEmitter<T0, T1>>::c_srli(self, rd, imm);
30909 }
30910 /// Shift right logical immediate
30911 ///
30912 /// Shift the value in rd right by shamt, and store the result back in rd.
30913 /// The rd register index should be used as rd+8 (registers x8-x15).
30914 /// C.SRLI expands into `srli rd, rd, shamt`.
30915 ///
30916 /// # Forms
30917 /// Assembly: `c.srli.rv32 xd, shamt`
30918 /// Rust: `c_srli_rv32(rd, imm)`
30919 ///
30920 /// # Arguments
30921 /// - `rd` — Destination/source register.
30922 /// - `imm` — Immediate encoding value.
30923 pub fn c_srli_rv32<T0, T1>(&mut self, rd: T0, imm: T1)
30924 where
30925 Self: CSrliRv32Emitter<T0, T1>,
30926 {
30927 <Self as CSrliRv32Emitter<T0, T1>>::c_srli_rv32(self, rd, imm);
30928 }
30929 /// RISC-V `c.sspopchk.x5` instruction.
30930 ///
30931 /// # Forms
30932 /// Assembly: `c.sspopchk.x5`
30933 /// Rust: `c_sspopchk_x5()`
30934 ///
30935 /// # Arguments
30936 pub fn c_sspopchk_x5(&mut self)
30937 where
30938 Self: CSspopchkX5Emitter,
30939 {
30940 <Self as CSspopchkX5Emitter>::c_sspopchk_x5(self);
30941 }
30942 /// RISC-V `c.sspush.x1` instruction.
30943 ///
30944 /// # Forms
30945 /// Assembly: `c.sspush.x1`
30946 /// Rust: `c_sspush_x1()`
30947 ///
30948 /// # Arguments
30949 pub fn c_sspush_x1(&mut self)
30950 where
30951 Self: CSspushX1Emitter,
30952 {
30953 <Self as CSspushX1Emitter>::c_sspush_x1(self);
30954 }
30955 /// Subtract
30956 ///
30957 /// Subtract the value in rs2 from rd, and store the result in rd.
30958 /// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
30959 /// C.SUB expands into `sub rd, rd, rs2`.
30960 ///
30961 /// # Forms
30962 /// Assembly: `c.sub xd, rs2`
30963 /// Rust: `c_sub(rd, rs2)`
30964 ///
30965 /// # Arguments
30966 /// - `rd` — Destination/source register.
30967 /// - `rs2` — Source register.
30968 pub fn c_sub<T0, T1>(&mut self, rd: T0, rs2: T1)
30969 where
30970 Self: CSubEmitter<T0, T1>,
30971 {
30972 <Self as CSubEmitter<T0, T1>>::c_sub(self, rd, rs2);
30973 }
30974 /// Subtract word
30975 ///
30976 /// Subtract the 32-bit values in rs2 from rd, and store the result in rd.
30977 /// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
30978 /// C.SUBW expands into `subw rd, rd, rs2`.
30979 ///
30980 /// # Forms
30981 /// Assembly: `c.subw xd, rs2`
30982 /// Rust: `c_subw(rd, rs2)`
30983 ///
30984 /// # Arguments
30985 /// - `rd` — Destination/source register.
30986 /// - `rs2` — Source register.
30987 pub fn c_subw<T0, T1>(&mut self, rd: T0, rs2: T1)
30988 where
30989 Self: CSubwEmitter<T0, T1>,
30990 {
30991 <Self as CSubwEmitter<T0, T1>>::c_subw(self, rd, rs2);
30992 }
30993 /// Store word
30994 ///
30995 /// Stores a 32-bit value in register rs2 to memory.
30996 /// It computes an effective address by adding the zero-extended offset, scaled by 4,
30997 /// to the base address in register rs1.
30998 /// It expands to `sw` `rs2, offset(rs1)`.
30999 ///
31000 /// # Forms
31001 /// Assembly: `c.sw xs2, imm(xs1)`
31002 /// Rust: `c_sw(rs1, rs2, imm)`
31003 ///
31004 /// # Arguments
31005 /// - `rs1` — Memory base register.
31006 /// - `rs2` — Source register.
31007 /// - `imm` — Immediate encoding value.
31008 pub fn c_sw<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
31009 where
31010 Self: CSwEmitter<T0, T1, T2>,
31011 {
31012 <Self as CSwEmitter<T0, T1, T2>>::c_sw(self, rs1, rs2, imm);
31013 }
31014 /// Store word to stack
31015 ///
31016 /// Stores a 32-bit value in register rs2 to memory.
31017 /// It computes an effective address by adding the zero-extended offset, scaled by 4,
31018 /// to the stack pointer, x2.
31019 /// It expands to `sw` `rs2, offset(x2)`.
31020 ///
31021 /// # Forms
31022 /// Assembly: `c.swsp xs2, imm(sp)`
31023 /// Rust: `c_swsp(rs2, imm)`
31024 ///
31025 /// # Arguments
31026 /// - `rs2` — Instruction operand.
31027 /// - `imm` — Immediate encoding value.
31028 pub fn c_swsp<T0, T1>(&mut self, rs2: T0, imm: T1)
31029 where
31030 Self: CSwspEmitter<T0, T1>,
31031 {
31032 <Self as CSwspEmitter<T0, T1>>::c_swsp(self, rs2, imm);
31033 }
31034 /// Exclusive Or
31035 ///
31036 /// Exclusive or rd with rs2, and store the result in rd
31037 /// The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
31038 /// C.XOR expands into `xor rd, rd, rs2`.
31039 ///
31040 /// # Forms
31041 /// Assembly: `c.xor xd, rs2`
31042 /// Rust: `c_xor(rd, rs2)`
31043 ///
31044 /// # Arguments
31045 /// - `rd` — Destination/source register.
31046 /// - `rs2` — Source register.
31047 pub fn c_xor<T0, T1>(&mut self, rd: T0, rs2: T1)
31048 where
31049 Self: CXorEmitter<T0, T1>,
31050 {
31051 <Self as CXorEmitter<T0, T1>>::c_xor(self, rd, rs2);
31052 }
31053 /// Zero-extend byte, 16-bit encoding
31054 ///
31055 /// This instruction takes a single source/destination operand.
31056 /// This instruction zero-extends the least-significant byte of the source to XLEN by inserting
31057 /// 0's into all of the bits more significant than 7.
31058 ///
31059 /// # Forms
31060 /// Assembly: `c.zext.b xd`
31061 /// Rust: `c_zext_b(rd)`
31062 ///
31063 /// # Arguments
31064 /// - `rd` — Destination/source register.
31065 pub fn c_zext_b<T0>(&mut self, rd: T0)
31066 where
31067 Self: CZextBEmitter<T0>,
31068 {
31069 <Self as CZextBEmitter<T0>>::c_zext_b(self, rd);
31070 }
31071 /// Zero-extend halfword, 16-bit encoding
31072 ///
31073 /// This instruction takes a single source/destination operand.
31074 /// This instruction zero-extends the least-significant halfword of the source to XLEN by inserting
31075 /// 0's into all of the bits more significant than 15.
31076 ///
31077 /// # Forms
31078 /// Assembly: `c.zext.h xd`
31079 /// Rust: `c_zext_h(rd)`
31080 ///
31081 /// # Arguments
31082 /// - `rd` — Destination/source register.
31083 pub fn c_zext_h<T0>(&mut self, rd: T0)
31084 where
31085 Self: CZextHEmitter<T0>,
31086 {
31087 <Self as CZextHEmitter<T0>>::c_zext_h(self, rd);
31088 }
31089 /// Zero-extend word, 16-bit encoding
31090 ///
31091 /// This instruction takes a single source/destination operand.
31092 /// It zero-extends the least-significant word of the operand to XLEN bits by inserting zeros into all of the bits more significant than 31.
31093 ///
31094 /// # Forms
31095 /// Assembly: `c.zext.w xd`
31096 /// Rust: `c_zext_w(rd)`
31097 ///
31098 /// # Arguments
31099 /// - `rd` — Destination/source register.
31100 pub fn c_zext_w<T0>(&mut self, rd: T0)
31101 where
31102 Self: CZextWEmitter<T0>,
31103 {
31104 <Self as CZextWEmitter<T0>>::c_zext_w(self, rd);
31105 }
31106 /// Cache Block Clean
31107 ///
31108 /// Cleans an entire cache block globally throughout the system.
31109 ///
31110 /// Exactly what happens is coherence protocol-dependent, but in general it is expected that after this
31111 /// operation():
31112 ///
31113 /// * The cache block will be in the clean (not dirty) state in any coherent cache holding a valid copy of the line.
31114 /// * The data will be cleaned to a point such that an incoherent load can observe the cleaned data.
31115 ///
31116 /// `cbo.clean` is ordered by `FENCE` instructions but not `FENCE.I` or `SFENCE.VMA`.
31117 ///
31118 /// <%- if CACHE_BLOCK_SIZE.bit_length > \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
31119 /// Both PMP and PMA access control must be the same for all bytes in the block; otherwise, `cbo.clean` has UNSPECIFIED behavior.
31120 /// <%- end -%>
31121 ///
31122 /// Clean operations are treated as stores for page and access permissions. If permission checks fail,
31123 /// one of the following exceptions will occur:
31124 ///
31125 /// <%- if ext?(:H) -%>
31126 /// * `Store/AMO Guest-Page Fault` if virtual memory translation fails during G-stage translation.
31127 /// <%- end -%>
31128 /// * `Store/AMO Page Fault` if virtual memory translation fails <% if ext?(:H) %>when V=0 or during VS-stage translation<% end %>
31129 /// * `Store/AMO Access Fault` if a PMP or PMA access check fails
31130 ///
31131 /// <%- if CACHE_BLOCK_SIZE.bit_length <= \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
31132 /// Because cache blocks are naturally aligned and always fit in a single PMP or PMA regions, the PMP
31133 /// and PMA access checks only need to check a single address in the line.
31134 /// <%- end -%>
31135 ///
31136 /// CBO operations never raise a misaligned address fault.
31137 ///
31138 /// # Forms
31139 /// Assembly: `cbo.clean "TODO"`
31140 /// Rust: `cbo_clean(rs1)`
31141 ///
31142 /// # Arguments
31143 /// - `rs1` — Source register.
31144 pub fn cbo_clean<T0>(&mut self, rs1: T0)
31145 where
31146 Self: CboCleanEmitter<T0>,
31147 {
31148 <Self as CboCleanEmitter<T0>>::cbo_clean(self, rs1);
31149 }
31150 /// Cache Block Flush
31151 ///
31152 /// Flushes an entire cache block by cleaning it and then invalidating it in all caches.
31153 ///
31154 /// `cbo.flush` is ordered by `FENCE` instructions but not `FENCE.I` or `SFENCE.VMA`.
31155 ///
31156 /// <%- if CACHE_BLOCK_SIZE.bit_length > \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
31157 /// Both PMP and PMA access control must be the same for all bytes in the block; otherwise, `cbo.flush` has UNSPECIFIED behavior.
31158 /// <%- end -%>
31159 ///
31160 /// Flush operations are treated as stores for page and access permissions. If permission checks fail,
31161 /// one of the following exceptions will occur:
31162 ///
31163 /// <%- if ext?(:H) -%>
31164 /// * `Store/AMO Guest-Page Fault` if virtual memory translation fails during G-stage translation.
31165 /// <%- end -%>
31166 /// * `Store/AMO Page Fault` if virtual memory translation fails <% if ext?(:H) %>when V=0 or during VS-stage translation<% end %>
31167 /// * `Store/AMO Access Fault` if a PMP or PMA access check fails.
31168 ///
31169 /// <%- if CACHE_BLOCK_SIZE.bit_length <= \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
31170 /// Because cache blocks are naturally aligned and always fit in a single PMP or PMA regions, the PMP
31171 /// and PMA access checks only need to check a single address in the line.
31172 /// <%- end -%>
31173 ///
31174 /// CBO operations never raise a misaligned address fault.
31175 ///
31176 /// # Forms
31177 /// Assembly: `cbo.flush "TODO"`
31178 /// Rust: `cbo_flush(rs1)`
31179 ///
31180 /// # Arguments
31181 /// - `rs1` — Source register.
31182 pub fn cbo_flush<T0>(&mut self, rs1: T0)
31183 where
31184 Self: CboFlushEmitter<T0>,
31185 {
31186 <Self as CboFlushEmitter<T0>>::cbo_flush(self, rs1);
31187 }
31188 /// Cache Block Invalidate
31189 ///
31190 /// Either invalidates or flushes (clean + invalidate) a cache block, depending on the current mode and value of
31191 /// `menvcfg.CBIE`, `senvcfg.CBIE`, and/or `henvcfg.CBIE`.
31192 ///
31193 /// The instruction is an invalidate (without a clean) when:
31194 ///
31195 /// * In M-mode
31196 /// * In (H)S-mode and `menvcfg.CBIE` == 11
31197 /// * In U-mode and `menvcfg.CBIE` == 11 and `senvcfg.CBIE` == 11
31198 /// * In VS-mode and `menvcfg.CBIE` == 11 and `henvcfg.CBIE` == 11
31199 /// * In VU-mode and `menvcfg.CBIE` == 11 and `henvcfg.CBIE` == 11 and `senvcfg.CBIE` == 11
31200 ///
31201 /// Otherwise, if the instruction does not trap (see Access section), the operation is a flush.
31202 /// The table below summarizes the options.
31203 ///
31204 /// \[%autowidth,cols="1,1,1,1,1,1,1,1",separator="!"\]
31205 /// !===
31206 /// .2+h!\[.rotate\]#`menvcfg.CBIE`# .2+h! \[.rotate\]#`senvcfg.CBIE`# .2+h! \[.rotate\]#`henvcfg.CBIE`#
31207 /// 5+^.>h! `cbe.inval` Operation
31208 /// .^h! M-mode .^h! S-mode .^h! U-mode .^h! VS-mode .^h! VU-mode
31209 ///
31210 /// ! 00 ! - ! - ! Invalidate ! `Illegal Instruction` ! `Illegal Instruction` ! `Virtual Instruction` ! `Virtual Instruction`
31211 /// ! 01 ! 00 ! 00 ! Invalidate ! Flush ! `Illegal Instruction` ! `Virtual Instruction` ! `Virtual Instruction`
31212 /// ! 01 ! 00 ! 01 ! Invalidate ! Flush ! `Illegal Instruction` ! Flush ! `Virtual Instruction`
31213 /// ! 01 ! 00 ! 11 ! Invalidate ! Flush ! `Illegal Instruction` ! Flush ! `Virtual Instruction`
31214 /// ! 01 ! 01 ! 00 ! Invalidate ! Flush ! Flush ! `Virtual Instruction` ! `Virtual Instruction`
31215 /// ! 01 ! 01 ! 01 ! Invalidate ! Flush ! Flush ! Flush ! Flush
31216 /// ! 01 ! 01 ! 11 ! Invalidate ! Flush ! Flush ! Flush ! Flush
31217 /// ! 01 ! 11 ! 00 ! Invalidate ! Flush ! Flush ! `Virtual Instruction` ! `Virtual Instruction`
31218 /// ! 01 ! 11 ! 01 ! Invalidate ! Flush ! Flush ! Flush ! Flush
31219 /// ! 01 ! 11 ! 11 ! Invalidate ! Flush ! Flush ! Flush ! Flush
31220 /// ! 11 ! 00 ! 00 ! Invalidate ! Invalidate ! `Illegal Instruction` ! `Virtual Instruction` ! `Virtual Instruction`
31221 /// ! 11 ! 00 ! 01 ! Invalidate ! Invalidate ! `Illegal Instruction` ! Flush ! `Virtual Instruction`
31222 /// ! 11 ! 00 ! 11 ! Invalidate ! Invalidate ! `Illegal Instruction` ! Invalidate ! `Virtual Instruction`
31223 /// ! 11 ! 01 ! 00 ! Invalidate ! Invalidate ! Flush ! `Virtual Instruction` ! `Virtual Instruction`
31224 /// ! 11 ! 01 ! 01 ! Invalidate ! Invalidate ! Flush ! Flush ! Flush
31225 /// ! 11 ! 01 ! 11 ! Invalidate ! Invalidate ! Flush ! Invalidate ! Flush
31226 /// ! 11 ! 11 ! 00 ! Invalidate ! Invalidate ! Invalidate ! `Virtual Instruction` ! `Virtual Instruction`
31227 /// ! 11 ! 11 ! 01 ! Invalidate ! Invalidate ! Invalidate ! Flush ! Flush
31228 /// ! 11 ! 11 ! 11 ! Invalidate ! Invalidate ! Invalidate ! Invalidate ! Invalidate
31229 /// !===
31230 ///
31231 /// `cbo.inval` is ordered by `FENCE` instructions but not `FENCE.I` or `SFENCE.VMA`.
31232 ///
31233 /// <%- if CACHE_BLOCK_SIZE.bit_length > \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
31234 /// Both PMP and PMA access control must be the same for all bytes in the block; otherwise, `cbo.zero` has UNSPECIFIED behavior.
31235 /// <%- end -%>
31236 ///
31237 /// Invalidate operations are treated as stores for page and access permissions. If permission checks fail,
31238 /// one of the following exceptions will occur:
31239 ///
31240 /// <%- if ext?(:H) -%>
31241 /// * `Store/AMO Guest-Page Fault` if virtual memory translation fails during G-stage translation.
31242 /// <%- end -%>
31243 /// * `Store/AMO Page Fault` if virtual memory translation fails <% if ext?(:H) %>when V=0 or during VS-stage translation<% end %>
31244 /// * `Store/AMO Access Fault` if a PMP or PMA access check fails.
31245 ///
31246 /// <%- if CACHE_BLOCK_SIZE.bit_length <= \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
31247 /// Because cache blocks are naturally aligned and always fit in a single PMP or PMA regions, the PMP
31248 /// and PMA access checks only need to check a single address in the line.
31249 /// <%- end -%>
31250 ///
31251 /// CBO operations never raise a misaligned address fault.
31252 ///
31253 /// # Forms
31254 /// Assembly: `cbo.inval "TODO"`
31255 /// Rust: `cbo_inval(rs1)`
31256 ///
31257 /// # Arguments
31258 /// - `rs1` — Source register.
31259 pub fn cbo_inval<T0>(&mut self, rs1: T0)
31260 where
31261 Self: CboInvalEmitter<T0>,
31262 {
31263 <Self as CboInvalEmitter<T0>>::cbo_inval(self, rs1);
31264 }
31265 /// Cache Block Zero
31266 ///
31267 /// Zeros an entire cache block
31268 ///
31269 /// The block zeroing does not need to be atomic.
31270 ///
31271 /// `cbo.zero` is ordered by `FENCE` instructions but not `FENCE.I` or `SFENCE.VMA`.
31272 ///
31273 /// <%- if CACHE_BLOCK_SIZE.bit_length > \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
31274 /// Both PMP and PMA access control must be the same for all bytes in the block; otherwise, `cbo.zero` has UNSPECIFIED behavior.
31275 /// <%- end -%>
31276 ///
31277 /// Clean operations are treated as stores for page and access permissions. If permission checks fail,
31278 /// one of the following exceptions will occur:
31279 ///
31280 /// <%- if ext?(:H) -%>
31281 /// * `Store/AMO Guest-Page Fault` if virtual memory translation fails during G-stage translation.
31282 /// <%- end -%>
31283 /// * `Store/AMO Page Fault` if virtual memory translation fails <% if ext?(:H) %>when V=0 or during VS-stage translation<% end %>
31284 /// * `Store/AMO Access Fault` if a PMP or PMA access check fails.
31285 ///
31286 /// <%- if CACHE_BLOCK_SIZE.bit_length <= \[PMP_GRANULARITY, PMA_GRANULARITY\].min -%>
31287 /// Because cache blocks are naturally aligned and always fit in a single PMP or PMA regions, the PMP
31288 /// and PMA access checks only need to check a single address in the line.
31289 /// <%- end -%>
31290 ///
31291 /// CBO operations never raise a misaligned address fault.
31292 ///
31293 /// # Forms
31294 /// Assembly: `cbo.zero "TODO"`
31295 /// Rust: `cbo_zero(rs1)`
31296 ///
31297 /// # Arguments
31298 /// - `rs1` — Source register.
31299 pub fn cbo_zero<T0>(&mut self, rs1: T0)
31300 where
31301 Self: CboZeroEmitter<T0>,
31302 {
31303 <Self as CboZeroEmitter<T0>>::cbo_zero(self, rs1);
31304 }
31305 /// Carry-less multiply (low-part)
31306 ///
31307 /// `clmul` produces the lower half of the 2*XLEN carry-less product
31308 ///
31309 /// # Forms
31310 /// Assembly: `clmul xd, xs1, xs2`
31311 /// Rust: `clmul(rd, rs1, rs2)`
31312 ///
31313 /// # Arguments
31314 /// - `rd` — Destination register.
31315 /// - `rs1` — Source register.
31316 /// - `rs2` — Source register.
31317 pub fn clmul<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31318 where
31319 Self: ClmulEmitter<T0, T1, T2>,
31320 {
31321 <Self as ClmulEmitter<T0, T1, T2>>::clmul(self, rd, rs1, rs2);
31322 }
31323 /// Carry-less multiply (high-part)
31324 ///
31325 /// `clmulh` produces the upper half of the 2*XLEN carry-less product
31326 ///
31327 /// # Forms
31328 /// Assembly: `clmulh xd, xs1, xs2`
31329 /// Rust: `clmulh(rd, rs1, rs2)`
31330 ///
31331 /// # Arguments
31332 /// - `rd` — Destination register.
31333 /// - `rs1` — Source register.
31334 /// - `rs2` — Source register.
31335 pub fn clmulh<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31336 where
31337 Self: ClmulhEmitter<T0, T1, T2>,
31338 {
31339 <Self as ClmulhEmitter<T0, T1, T2>>::clmulh(self, rd, rs1, rs2);
31340 }
31341 /// Carry-less multiply (reversed)
31342 ///
31343 /// `clmulr` produces bits 2*XLEN-2:XLEN-1 of the 2*XLEN carry-less product
31344 ///
31345 /// # Forms
31346 /// Assembly: `clmulr xd, xs1, xs2`
31347 /// Rust: `clmulr(rd, rs1, rs2)`
31348 ///
31349 /// # Arguments
31350 /// - `rd` — Destination register.
31351 /// - `rs1` — Source register.
31352 /// - `rs2` — Source register.
31353 pub fn clmulr<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31354 where
31355 Self: ClmulrEmitter<T0, T1, T2>,
31356 {
31357 <Self as ClmulrEmitter<T0, T1, T2>>::clmulr(self, rd, rs1, rs2);
31358 }
31359 /// Count leading zero bits
31360 ///
31361 /// This instruction counts the number of 0's before the first 1,
31362 /// starting at the most-significant bit (i.e., XLEN-1) and progressing to bit 0.
31363 /// Accordingly, if the input is 0, the output is XLEN, and if the most-significant
31364 /// bit of the input is a 1, the output is 0.
31365 ///
31366 /// # Forms
31367 /// Assembly: `clz xd, xs1`
31368 /// Rust: `clz(rd, rs1)`
31369 ///
31370 /// # Arguments
31371 /// - `rd` — Destination register.
31372 /// - `rs1` — Source register.
31373 pub fn clz<T0, T1>(&mut self, rd: T0, rs1: T1)
31374 where
31375 Self: ClzEmitter<T0, T1>,
31376 {
31377 <Self as ClzEmitter<T0, T1>>::clz(self, rd, rs1);
31378 }
31379 /// Count leading zero bits in word
31380 ///
31381 /// This instruction counts the number of 0's before the first 1 starting at bit 31 and progressing to bit 0.
31382 /// Accordingly, if the least-significant word is 0, the output is 32, and if the most-significant
31383 /// bit of the word (_i.e._, bit 31) is a 1, the output is 0.
31384 ///
31385 /// # Forms
31386 /// Assembly: `clzw xd, xs1`
31387 /// Rust: `clzw(rd, rs1)`
31388 ///
31389 /// # Arguments
31390 /// - `rd` — Destination register.
31391 /// - `rs1` — Source register.
31392 pub fn clzw<T0, T1>(&mut self, rd: T0, rs1: T1)
31393 where
31394 Self: ClzwEmitter<T0, T1>,
31395 {
31396 <Self as ClzwEmitter<T0, T1>>::clzw(self, rd, rs1);
31397 }
31398 /// RISC-V `cm.jalt` instruction.
31399 ///
31400 /// # Forms
31401 /// Assembly: `cm.jalt c_index`
31402 /// Rust: `cm_jalt(index)`
31403 ///
31404 /// # Arguments
31405 /// - `index` — Instruction operand.
31406 pub fn cm_jalt<T0>(&mut self, index: T0)
31407 where
31408 Self: CmJaltEmitter<T0>,
31409 {
31410 <Self as CmJaltEmitter<T0>>::cm_jalt(self, index);
31411 }
31412 /// Count set bits
31413 ///
31414 /// This instructions counts the number of 1's (i.e., set bits) in the source register.
31415 ///
31416 /// .Software Hint
31417 /// \[NOTE\]
31418 /// ----
31419 /// This operations is known as population count, popcount, sideways sum,
31420 /// bit summation, or Hamming weight.
31421 ///
31422 /// The GCC builtin function `__builtin_popcount (unsigned int x)` is
31423 /// implemented by cpop on RV32 and by cpopw on RV64. The GCC builtin
31424 /// function `__builtin_popcountl (unsigned long x)` for LP64 is
31425 /// implemented by cpop on RV64.
31426 /// ----
31427 ///
31428 /// # Forms
31429 /// Assembly: `cpop xd, xs1`
31430 /// Rust: `cpop(rd, rs1)`
31431 ///
31432 /// # Arguments
31433 /// - `rd` — Destination register.
31434 /// - `rs1` — Source register.
31435 pub fn cpop<T0, T1>(&mut self, rd: T0, rs1: T1)
31436 where
31437 Self: CpopEmitter<T0, T1>,
31438 {
31439 <Self as CpopEmitter<T0, T1>>::cpop(self, rd, rs1);
31440 }
31441 /// Count set bits in word
31442 ///
31443 /// This instructions counts the number of 1's (i.e., set bits) in the least-significant word of the source register.
31444 ///
31445 /// .Software Hint
31446 /// \[NOTE\]
31447 /// ----
31448 /// This operations is known as population count, popcount, sideways sum,
31449 /// bit summation, or Hamming weight.
31450 ///
31451 /// The GCC builtin function `__builtin_popcount (unsigned int x)` is
31452 /// implemented by cpop on RV32 and by cpopw on RV64. The GCC builtin
31453 /// function `__builtin_popcountl (unsigned long x)` for LP64 is
31454 /// implemented by cpop on RV64.
31455 /// ----
31456 ///
31457 /// # Forms
31458 /// Assembly: `cpopw xd, xs1`
31459 /// Rust: `cpopw(rd, rs1)`
31460 ///
31461 /// # Arguments
31462 /// - `rd` — Destination register.
31463 /// - `rs1` — Source register.
31464 pub fn cpopw<T0, T1>(&mut self, rd: T0, rs1: T1)
31465 where
31466 Self: CpopwEmitter<T0, T1>,
31467 {
31468 <Self as CpopwEmitter<T0, T1>>::cpopw(self, rd, rs1);
31469 }
31470 /// RISC-V `csrc` instruction.
31471 ///
31472 /// # Forms
31473 /// Assembly: `csrc rs1 csr`
31474 /// Rust: `csrc(rs1, csr)`
31475 ///
31476 /// # Arguments
31477 /// - `rs1` — Source register.
31478 /// - `csr` — Control and status register number.
31479 pub fn csrc<T0, T1>(&mut self, rs1: T0, csr: T1)
31480 where
31481 Self: CsrcEmitter<T0, T1>,
31482 {
31483 <Self as CsrcEmitter<T0, T1>>::csrc(self, rs1, csr);
31484 }
31485 /// RISC-V `csrci` instruction.
31486 ///
31487 /// # Forms
31488 /// Assembly: `csrci csr zimm5`
31489 /// Rust: `csrci(csr, zimm5)`
31490 ///
31491 /// # Arguments
31492 /// - `csr` — Control and status register number.
31493 /// - `zimm5` — Immediate encoding value.
31494 pub fn csrci<T0, T1>(&mut self, csr: T0, zimm5: T1)
31495 where
31496 Self: CsrciEmitter<T0, T1>,
31497 {
31498 <Self as CsrciEmitter<T0, T1>>::csrci(self, csr, zimm5);
31499 }
31500 /// RISC-V `csrr` instruction.
31501 ///
31502 /// # Forms
31503 /// Assembly: `csrr rd csr`
31504 /// Rust: `csrr(rd, csr)`
31505 ///
31506 /// # Arguments
31507 /// - `rd` — Destination register.
31508 /// - `csr` — Control and status register number.
31509 pub fn csrr<T0, T1>(&mut self, rd: T0, csr: T1)
31510 where
31511 Self: CsrrEmitter<T0, T1>,
31512 {
31513 <Self as CsrrEmitter<T0, T1>>::csrr(self, rd, csr);
31514 }
31515 /// RISC-V `csrrc` instruction.
31516 ///
31517 /// # Forms
31518 /// Assembly: `csrrc xd, xs1, csr`
31519 /// Rust: `csrrc(rd, rs1, csr)`
31520 ///
31521 /// # Arguments
31522 /// - `rd` — Destination register.
31523 /// - `rs1` — Source register.
31524 /// - `csr` — Control and status register number.
31525 pub fn csrrc<T0, T1, T2>(&mut self, rd: T0, rs1: T1, csr: T2)
31526 where
31527 Self: CsrrcEmitter<T0, T1, T2>,
31528 {
31529 <Self as CsrrcEmitter<T0, T1, T2>>::csrrc(self, rd, rs1, csr);
31530 }
31531 /// RISC-V `csrrci` instruction.
31532 ///
31533 /// # Forms
31534 /// Assembly: `csrrci xd, csr, imm`
31535 /// Rust: `csrrci(rd, csr, zimm5)`
31536 ///
31537 /// # Arguments
31538 /// - `rd` — Destination register.
31539 /// - `csr` — Control and status register number.
31540 /// - `zimm5` — Immediate encoding value.
31541 pub fn csrrci<T0, T1, T2>(&mut self, rd: T0, csr: T1, zimm5: T2)
31542 where
31543 Self: CsrrciEmitter<T0, T1, T2>,
31544 {
31545 <Self as CsrrciEmitter<T0, T1, T2>>::csrrci(self, rd, csr, zimm5);
31546 }
31547 /// Atomic Read and Set Bits in CSR
31548 ///
31549 /// Atomically read and set bits in a CSR.
31550 ///
31551 /// Reads the value of the CSR, zero-extends the value to `XLEN` bits,
31552 /// and writes it to integer register `rd`. The initial value in integer
31553 /// register `rs1` is treated as a bit mask that specifies bit positions
31554 /// to be set in the CSR. Any bit that is high in `rs1` will cause the
31555 /// corresponding bit to be set in the CSR, if that CSR bit is writable.
31556 /// Other bits in the CSR are not explicitly written.
31557 ///
31558 /// # Forms
31559 /// Assembly: `csrrs xd, xs1, csr`
31560 /// Rust: `csrrs(rd, rs1, csr)`
31561 ///
31562 /// # Arguments
31563 /// - `rd` — Destination register.
31564 /// - `rs1` — Source register.
31565 /// - `csr` — Control and status register number.
31566 pub fn csrrs<T0, T1, T2>(&mut self, rd: T0, rs1: T1, csr: T2)
31567 where
31568 Self: CsrrsEmitter<T0, T1, T2>,
31569 {
31570 <Self as CsrrsEmitter<T0, T1, T2>>::csrrs(self, rd, rs1, csr);
31571 }
31572 /// RISC-V `csrrsi` instruction.
31573 ///
31574 /// # Forms
31575 /// Assembly: `csrrsi xd, csr, imm`
31576 /// Rust: `csrrsi(rd, csr, zimm5)`
31577 ///
31578 /// # Arguments
31579 /// - `rd` — Destination register.
31580 /// - `csr` — Control and status register number.
31581 /// - `zimm5` — Immediate encoding value.
31582 pub fn csrrsi<T0, T1, T2>(&mut self, rd: T0, csr: T1, zimm5: T2)
31583 where
31584 Self: CsrrsiEmitter<T0, T1, T2>,
31585 {
31586 <Self as CsrrsiEmitter<T0, T1, T2>>::csrrsi(self, rd, csr, zimm5);
31587 }
31588 /// Atomic Read/Write CSR
31589 ///
31590 /// Atomically swap values in the CSRs and integer registers.
31591 ///
31592 /// Read the old value of the CSR, zero-extends the value to `XLEN` bits,
31593 /// and then write it to integer register rd.
31594 /// The initial value in rs1 is written to the CSR.
31595 /// If `rd=x0`, then the instruction shall not read the CSR and shall not
31596 /// cause any of the side effects that might occur on a CSR read.
31597 ///
31598 /// # Forms
31599 /// Assembly: `csrrw xd, xs1, csr`
31600 /// Rust: `csrrw(rd, rs1, csr)`
31601 ///
31602 /// # Arguments
31603 /// - `rd` — Destination register.
31604 /// - `rs1` — Source register.
31605 /// - `csr` — Control and status register number.
31606 pub fn csrrw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, csr: T2)
31607 where
31608 Self: CsrrwEmitter<T0, T1, T2>,
31609 {
31610 <Self as CsrrwEmitter<T0, T1, T2>>::csrrw(self, rd, rs1, csr);
31611 }
31612 /// Atomic Read/Write CSR Immediate
31613 ///
31614 /// Atomically write CSR using a 5-bit immediate, and load the previous value into 'rd'.
31615 ///
31616 /// Read the old value of the CSR, zero-extends the value to `XLEN` bits,
31617 /// and then write it to integer register rd.
31618 /// The 5-bit uimm field is zero-extended and written to the CSR.
31619 /// If `rd=x0`, then the instruction shall not read the CSR and shall not
31620 /// cause any of the side effects that might occur on a CSR read.
31621 ///
31622 /// # Forms
31623 /// Assembly: `csrrwi xd, zimm, csr`
31624 /// Rust: `csrrwi(rd, csr, zimm5)`
31625 ///
31626 /// # Arguments
31627 /// - `rd` — Destination register.
31628 /// - `csr` — Control and status register number.
31629 /// - `zimm5` — Immediate encoding value.
31630 pub fn csrrwi<T0, T1, T2>(&mut self, rd: T0, csr: T1, zimm5: T2)
31631 where
31632 Self: CsrrwiEmitter<T0, T1, T2>,
31633 {
31634 <Self as CsrrwiEmitter<T0, T1, T2>>::csrrwi(self, rd, csr, zimm5);
31635 }
31636 /// RISC-V `csrs` instruction.
31637 ///
31638 /// # Forms
31639 /// Assembly: `csrs rs1 csr`
31640 /// Rust: `csrs(rs1, csr)`
31641 ///
31642 /// # Arguments
31643 /// - `rs1` — Source register.
31644 /// - `csr` — Control and status register number.
31645 pub fn csrs<T0, T1>(&mut self, rs1: T0, csr: T1)
31646 where
31647 Self: CsrsEmitter<T0, T1>,
31648 {
31649 <Self as CsrsEmitter<T0, T1>>::csrs(self, rs1, csr);
31650 }
31651 /// RISC-V `csrsi` instruction.
31652 ///
31653 /// # Forms
31654 /// Assembly: `csrsi csr zimm5`
31655 /// Rust: `csrsi(csr, zimm5)`
31656 ///
31657 /// # Arguments
31658 /// - `csr` — Control and status register number.
31659 /// - `zimm5` — Immediate encoding value.
31660 pub fn csrsi<T0, T1>(&mut self, csr: T0, zimm5: T1)
31661 where
31662 Self: CsrsiEmitter<T0, T1>,
31663 {
31664 <Self as CsrsiEmitter<T0, T1>>::csrsi(self, csr, zimm5);
31665 }
31666 /// RISC-V `csrw` instruction.
31667 ///
31668 /// # Forms
31669 /// Assembly: `csrw rs1 csr`
31670 /// Rust: `csrw(rs1, csr)`
31671 ///
31672 /// # Arguments
31673 /// - `rs1` — Source register.
31674 /// - `csr` — Control and status register number.
31675 pub fn csrw<T0, T1>(&mut self, rs1: T0, csr: T1)
31676 where
31677 Self: CsrwEmitter<T0, T1>,
31678 {
31679 <Self as CsrwEmitter<T0, T1>>::csrw(self, rs1, csr);
31680 }
31681 /// RISC-V `csrwi` instruction.
31682 ///
31683 /// # Forms
31684 /// Assembly: `csrwi csr zimm5`
31685 /// Rust: `csrwi(csr, zimm5)`
31686 ///
31687 /// # Arguments
31688 /// - `csr` — Control and status register number.
31689 /// - `zimm5` — Immediate encoding value.
31690 pub fn csrwi<T0, T1>(&mut self, csr: T0, zimm5: T1)
31691 where
31692 Self: CsrwiEmitter<T0, T1>,
31693 {
31694 <Self as CsrwiEmitter<T0, T1>>::csrwi(self, csr, zimm5);
31695 }
31696 /// Count trailing zero bits
31697 ///
31698 /// This instruction counts the number of 0's before the first 1,
31699 /// starting at the least-significant bit (i.e., 0) and progressing
31700 /// to the most-significant bit (i.e., XLEN-1). Accordingly, if the
31701 /// input is 0, the output is XLEN, and if the least-significant bit
31702 /// of the input is a 1, the output is 0.
31703 ///
31704 /// # Forms
31705 /// Assembly: `ctz xd, xs1`
31706 /// Rust: `ctz(rd, rs1)`
31707 ///
31708 /// # Arguments
31709 /// - `rd` — Destination register.
31710 /// - `rs1` — Source register.
31711 pub fn ctz<T0, T1>(&mut self, rd: T0, rs1: T1)
31712 where
31713 Self: CtzEmitter<T0, T1>,
31714 {
31715 <Self as CtzEmitter<T0, T1>>::ctz(self, rd, rs1);
31716 }
31717 /// Count trailing zero bits in word
31718 ///
31719 /// This instruction counts the number of 0's before the first 1,
31720 /// starting at the least-significant bit (i.e., 0) and progressing
31721 /// to the most-significant bit of the least-significant word (i.e., 31). Accordingly, if the
31722 /// least-significant word is 0, the output is 32, and if the least-significant bit
31723 /// of the input is a 1, the output is 0.
31724 ///
31725 /// # Forms
31726 /// Assembly: `ctzw xd, xs1`
31727 /// Rust: `ctzw(rd, rs1)`
31728 ///
31729 /// # Arguments
31730 /// - `rd` — Destination register.
31731 /// - `rs1` — Source register.
31732 pub fn ctzw<T0, T1>(&mut self, rd: T0, rs1: T1)
31733 where
31734 Self: CtzwEmitter<T0, T1>,
31735 {
31736 <Self as CtzwEmitter<T0, T1>>::ctzw(self, rd, rs1);
31737 }
31738 /// RISC-V `czero.eqz` instruction.
31739 ///
31740 /// # Forms
31741 /// Assembly: `czero.eqz xd, xs1, xs2`
31742 /// Rust: `czero_eqz(rd, rs1, rs2)`
31743 ///
31744 /// # Arguments
31745 /// - `rd` — Destination register.
31746 /// - `rs1` — Source register.
31747 /// - `rs2` — Source register.
31748 pub fn czero_eqz<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31749 where
31750 Self: CzeroEqzEmitter<T0, T1, T2>,
31751 {
31752 <Self as CzeroEqzEmitter<T0, T1, T2>>::czero_eqz(self, rd, rs1, rs2);
31753 }
31754 /// RISC-V `czero.nez` instruction.
31755 ///
31756 /// # Forms
31757 /// Assembly: `czero.nez xd, xs1, xs2`
31758 /// Rust: `czero_nez(rd, rs1, rs2)`
31759 ///
31760 /// # Arguments
31761 /// - `rd` — Destination register.
31762 /// - `rs1` — Source register.
31763 /// - `rs2` — Source register.
31764 pub fn czero_nez<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31765 where
31766 Self: CzeroNezEmitter<T0, T1, T2>,
31767 {
31768 <Self as CzeroNezEmitter<T0, T1, T2>>::czero_nez(self, rd, rs1, rs2);
31769 }
31770 /// Signed division
31771 ///
31772 /// Divide rs1 by rs2, and store the result in rd. The remainder is discarded.
31773 ///
31774 /// Division by zero will put -1 into rd.
31775 ///
31776 /// Division resulting in signed overflow (when most negative number is divided by -1)
31777 /// will put the most negative number into rd;
31778 ///
31779 /// # Forms
31780 /// Assembly: `div xd, xs1, xs2`
31781 /// Rust: `div(rd, rs1, rs2)`
31782 ///
31783 /// # Arguments
31784 /// - `rd` — Destination register.
31785 /// - `rs1` — Source register.
31786 /// - `rs2` — Source register.
31787 pub fn div<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31788 where
31789 Self: DivEmitter<T0, T1, T2>,
31790 {
31791 <Self as DivEmitter<T0, T1, T2>>::div(self, rd, rs1, rs2);
31792 }
31793 /// Unsigned division
31794 ///
31795 /// Divide unsigned values in rs1 by rs2, and store the result in rd.
31796 ///
31797 /// The remainder is discarded.
31798 ///
31799 /// If the value in rs2 is zero, rd gets the largest unsigned value.
31800 ///
31801 /// # Forms
31802 /// Assembly: `divu xd, xs1, xs2`
31803 /// Rust: `divu(rd, rs1, rs2)`
31804 ///
31805 /// # Arguments
31806 /// - `rd` — Destination register.
31807 /// - `rs1` — Source register.
31808 /// - `rs2` — Source register.
31809 pub fn divu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31810 where
31811 Self: DivuEmitter<T0, T1, T2>,
31812 {
31813 <Self as DivuEmitter<T0, T1, T2>>::divu(self, rd, rs1, rs2);
31814 }
31815 /// Unsigned 32-bit division
31816 ///
31817 /// Divide the unsigned 32-bit values in rs1 and rs2, and store the sign-extended result in rd.
31818 ///
31819 /// The remainder is discarded.
31820 ///
31821 /// If the value in rs2 is zero, rd is written with all 1s.
31822 ///
31823 /// # Forms
31824 /// Assembly: `divuw xd, xs1, xs2`
31825 /// Rust: `divuw(rd, rs1, rs2)`
31826 ///
31827 /// # Arguments
31828 /// - `rd` — Destination register.
31829 /// - `rs1` — Source register.
31830 /// - `rs2` — Source register.
31831 pub fn divuw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31832 where
31833 Self: DivuwEmitter<T0, T1, T2>,
31834 {
31835 <Self as DivuwEmitter<T0, T1, T2>>::divuw(self, rd, rs1, rs2);
31836 }
31837 /// Signed 32-bit division
31838 ///
31839 /// Divide the lower 32-bits of register rs1 by the lower 32-bits of register rs2,
31840 /// and store the sign-extended result in rd.
31841 ///
31842 /// The remainder is discarded.
31843 ///
31844 /// Division by zero will put -1 into rd.
31845 ///
31846 /// Division resulting in signed overflow (when most negative number is divided by -1)
31847 /// will put the most negative number into rd;
31848 ///
31849 /// # Forms
31850 /// Assembly: `divw xd, xs1, xs2`
31851 /// Rust: `divw(rd, rs1, rs2)`
31852 ///
31853 /// # Arguments
31854 /// - `rd` — Destination register.
31855 /// - `rs1` — Source register.
31856 /// - `rs2` — Source register.
31857 pub fn divw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31858 where
31859 Self: DivwEmitter<T0, T1, T2>,
31860 {
31861 <Self as DivwEmitter<T0, T1, T2>>::divw(self, rd, rs1, rs2);
31862 }
31863 /// RISC-V `dret` instruction.
31864 ///
31865 /// # Forms
31866 /// Assembly: `dret dret`
31867 /// Rust: `dret()`
31868 ///
31869 /// # Arguments
31870 pub fn dret(&mut self)
31871 where
31872 Self: DretEmitter,
31873 {
31874 <Self as DretEmitter>::dret(self);
31875 }
31876 /// Breakpoint exception
31877 ///
31878 /// The EBREAK instruction is used by debuggers to cause control to be transferred back to
31879 /// a debugging environment. Unless overridden by an external debug environment,
31880 /// EBREAK raises a breakpoint exception and performs no other operation.
31881 ///
31882 /// \[NOTE\]
31883 /// As described in the `C` Standard Extension for Compressed Instructions, the `c.ebreak`
31884 /// instruction performs the same operation as the EBREAK instruction.
31885 ///
31886 /// EBREAK causes the receiving privilege mode's epc register to be set to the address of
31887 /// the EBREAK instruction itself, not the address of the following instruction.
31888 /// As EBREAK causes a synchronous exception, it is not considered to retire,
31889 /// and should not increment the `minstret` CSR.
31890 ///
31891 /// # Forms
31892 /// Assembly: `ebreak ""`
31893 /// Rust: `ebreak()`
31894 ///
31895 /// # Arguments
31896 pub fn ebreak(&mut self)
31897 where
31898 Self: EbreakEmitter,
31899 {
31900 <Self as EbreakEmitter>::ebreak(self);
31901 }
31902 /// Environment call
31903 ///
31904 /// The ECALL instruction is used to make a request to the supporting execution environment.
31905 /// When executed in U-mode, S-mode, or M-mode, it generates an environment-call-from-U-mode
31906 /// exception, environment-call-from-S-mode exception, or environment-call-from-M-mode
31907 /// exception, respectively, and performs no other operation.
31908 ///
31909 /// \[NOTE\]
31910 /// ECALL generates a different exception for each originating privilege mode so that
31911 /// environment call exceptions can be selectively delegated.
31912 /// A typical use case for Unix-like operating systems is to delegate to S-mode
31913 /// the environment-call-from-U-mode exception but not the others.
31914 ///
31915 /// ECALL causes the receiving privilege mode's epc register to be set to the address of
31916 /// the ECALL instruction itself, not the address of the following instruction.
31917 /// As ECALL causes a synchronous exception, it is not considered to retire,
31918 /// and should not increment the `minstret` CSR.
31919 ///
31920 /// # Forms
31921 /// Assembly: `ecall ""`
31922 /// Rust: `ecall()`
31923 ///
31924 /// # Arguments
31925 pub fn ecall(&mut self)
31926 where
31927 Self: EcallEmitter,
31928 {
31929 <Self as EcallEmitter>::ecall(self);
31930 }
31931 /// RISC-V `fabs.d` instruction.
31932 ///
31933 /// # Forms
31934 /// Assembly: `fabs.d rd rs1 rs2_eq_rs1`
31935 /// Rust: `fabs_d(rd, rs1, rs2)`
31936 ///
31937 /// # Arguments
31938 /// - `rd` — Destination register.
31939 /// - `rs1` — Source register.
31940 /// - `rs2` — Source register.
31941 pub fn fabs_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31942 where
31943 Self: FabsDEmitter<T0, T1, T2>,
31944 {
31945 <Self as FabsDEmitter<T0, T1, T2>>::fabs_d(self, rd, rs1, rs2);
31946 }
31947 /// RISC-V `fabs.h` instruction.
31948 ///
31949 /// # Forms
31950 /// Assembly: `fabs.h rd rs1 rs2_eq_rs1`
31951 /// Rust: `fabs_h(rd, rs1, rs2)`
31952 ///
31953 /// # Arguments
31954 /// - `rd` — Destination register.
31955 /// - `rs1` — Source register.
31956 /// - `rs2` — Source register.
31957 pub fn fabs_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31958 where
31959 Self: FabsHEmitter<T0, T1, T2>,
31960 {
31961 <Self as FabsHEmitter<T0, T1, T2>>::fabs_h(self, rd, rs1, rs2);
31962 }
31963 /// RISC-V `fabs.q` instruction.
31964 ///
31965 /// # Forms
31966 /// Assembly: `fabs.q rd rs1 rs2_eq_rs1`
31967 /// Rust: `fabs_q(rd, rs1, rs2)`
31968 ///
31969 /// # Arguments
31970 /// - `rd` — Destination register.
31971 /// - `rs1` — Source register.
31972 /// - `rs2` — Source register.
31973 pub fn fabs_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31974 where
31975 Self: FabsQEmitter<T0, T1, T2>,
31976 {
31977 <Self as FabsQEmitter<T0, T1, T2>>::fabs_q(self, rd, rs1, rs2);
31978 }
31979 /// RISC-V `fabs.s` instruction.
31980 ///
31981 /// # Forms
31982 /// Assembly: `fabs.s rd rs1 rs2_eq_rs1`
31983 /// Rust: `fabs_s(rd, rs1, rs2)`
31984 ///
31985 /// # Arguments
31986 /// - `rd` — Destination register.
31987 /// - `rs1` — Source register.
31988 /// - `rs2` — Source register.
31989 pub fn fabs_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
31990 where
31991 Self: FabsSEmitter<T0, T1, T2>,
31992 {
31993 <Self as FabsSEmitter<T0, T1, T2>>::fabs_s(self, rd, rs1, rs2);
31994 }
31995 /// RISC-V `fadd.d` instruction.
31996 ///
31997 /// # Forms
31998 /// Assembly: `fadd.d xd, xs1, xs2, rm`
31999 /// Rust: `fadd_d(rd, rs1, rs2, rm)`
32000 ///
32001 /// # Arguments
32002 /// - `rd` — Destination register.
32003 /// - `rs1` — Source register.
32004 /// - `rs2` — Source register.
32005 /// - `rm` — Rounding mode.
32006 pub fn fadd_d<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
32007 where
32008 Self: FaddDEmitter<T0, T1, T2, T3>,
32009 {
32010 <Self as FaddDEmitter<T0, T1, T2, T3>>::fadd_d(self, rd, rs1, rs2, rm);
32011 }
32012 /// RISC-V `fadd.h` instruction.
32013 ///
32014 /// # Forms
32015 /// Assembly: `fadd.h xd, xs1, xs2, rm`
32016 /// Rust: `fadd_h(rd, rs1, rs2, rm)`
32017 ///
32018 /// # Arguments
32019 /// - `rd` — Destination register.
32020 /// - `rs1` — Source register.
32021 /// - `rs2` — Source register.
32022 /// - `rm` — Rounding mode.
32023 pub fn fadd_h<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
32024 where
32025 Self: FaddHEmitter<T0, T1, T2, T3>,
32026 {
32027 <Self as FaddHEmitter<T0, T1, T2, T3>>::fadd_h(self, rd, rs1, rs2, rm);
32028 }
32029 /// RISC-V `fadd.q` instruction.
32030 ///
32031 /// # Forms
32032 /// Assembly: `fadd.q qd, qs1, qs2, rm`
32033 /// Rust: `fadd_q(rd, rs1, rs2, rm)`
32034 ///
32035 /// # Arguments
32036 /// - `rd` — Destination register.
32037 /// - `rs1` — Source register.
32038 /// - `rs2` — Source register.
32039 /// - `rm` — Rounding mode.
32040 pub fn fadd_q<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
32041 where
32042 Self: FaddQEmitter<T0, T1, T2, T3>,
32043 {
32044 <Self as FaddQEmitter<T0, T1, T2, T3>>::fadd_q(self, rd, rs1, rs2, rm);
32045 }
32046 /// Single-precision floating-point addition
32047 ///
32048 /// Do the single-precision floating-point addition of fs1 and fs2 and store the result in fd.
32049 /// rm is the dynamic Rounding Mode.
32050 ///
32051 /// # Forms
32052 /// Assembly: `fadd.s fd, fs1, fs2, rm`
32053 /// Rust: `fadd_s(rd, rs1, rs2, rm)`
32054 ///
32055 /// # Arguments
32056 /// - `rd` — Destination register.
32057 /// - `rs1` — Source register.
32058 /// - `rs2` — Source register.
32059 /// - `rm` — Rounding mode.
32060 pub fn fadd_s<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
32061 where
32062 Self: FaddSEmitter<T0, T1, T2, T3>,
32063 {
32064 <Self as FaddSEmitter<T0, T1, T2, T3>>::fadd_s(self, rd, rs1, rs2, rm);
32065 }
32066 /// RISC-V `fclass.d` instruction.
32067 ///
32068 /// # Forms
32069 /// Assembly: `fclass.d xd, xs1`
32070 /// Rust: `fclass_d(rd, rs1)`
32071 ///
32072 /// # Arguments
32073 /// - `rd` — Destination register.
32074 /// - `rs1` — Source register.
32075 pub fn fclass_d<T0, T1>(&mut self, rd: T0, rs1: T1)
32076 where
32077 Self: FclassDEmitter<T0, T1>,
32078 {
32079 <Self as FclassDEmitter<T0, T1>>::fclass_d(self, rd, rs1);
32080 }
32081 /// RISC-V `fclass.h` instruction.
32082 ///
32083 /// # Forms
32084 /// Assembly: `fclass.h xd, xs1`
32085 /// Rust: `fclass_h(rd, rs1)`
32086 ///
32087 /// # Arguments
32088 /// - `rd` — Destination register.
32089 /// - `rs1` — Source register.
32090 pub fn fclass_h<T0, T1>(&mut self, rd: T0, rs1: T1)
32091 where
32092 Self: FclassHEmitter<T0, T1>,
32093 {
32094 <Self as FclassHEmitter<T0, T1>>::fclass_h(self, rd, rs1);
32095 }
32096 /// RISC-V `fclass.q` instruction.
32097 ///
32098 /// # Forms
32099 /// Assembly: `fclass.q xd, qs1`
32100 /// Rust: `fclass_q(rd, rs1)`
32101 ///
32102 /// # Arguments
32103 /// - `rd` — Destination register.
32104 /// - `rs1` — Source register.
32105 pub fn fclass_q<T0, T1>(&mut self, rd: T0, rs1: T1)
32106 where
32107 Self: FclassQEmitter<T0, T1>,
32108 {
32109 <Self as FclassQEmitter<T0, T1>>::fclass_q(self, rd, rs1);
32110 }
32111 /// Single-precision floating-point classify.
32112 ///
32113 /// The `fclass.s` instruction examines the value in floating-point register
32114 /// _fs1_ and writes to integer register _rd_ a 10-bit mask that indicates
32115 /// the class of the floating-point number.
32116 /// The format of the mask is described in the table below.
32117 /// The corresponding bit in _rd_ will be set if the property is true and
32118 /// clear otherwise.
32119 /// All other bits in _rd_ are cleared.
32120 /// Note that exactly one bit in rd will be set.
32121 /// `fclass.s` does not set the floating-point exception flags.
32122 ///
32123 /// .Format of result of `fclass` instruction.
32124 /// \[%autowidth,float="center",align="center",cols="^,<",options="header",\]
32125 /// |===
32126 /// |_rd_ bit |Meaning
32127 /// |0 |_rs1_ is latexmath:\[$-\infty$\].
32128 /// |1 |_rs1_ is a negative normal number.
32129 /// |2 |_rs1_ is a negative subnormal number.
32130 /// |3 |_rs1_ is latexmath:\[$-0$\].
32131 /// |4 |_rs1_ is latexmath:\[$+0$\].
32132 /// |5 |_rs1_ is a positive subnormal number.
32133 /// |6 |_rs1_ is a positive normal number.
32134 /// |7 |_rs1_ is latexmath:\[$+\infty$\].
32135 /// |8 |_rs1_ is a signaling NaN.
32136 /// |9 |_rs1_ is a quiet NaN.
32137 /// |===
32138 ///
32139 /// # Forms
32140 /// Assembly: `fclass.s xd, fs1`
32141 /// Rust: `fclass_s(rd, rs1)`
32142 ///
32143 /// # Arguments
32144 /// - `rd` — Destination register.
32145 /// - `rs1` — Source register.
32146 pub fn fclass_s<T0, T1>(&mut self, rd: T0, rs1: T1)
32147 where
32148 Self: FclassSEmitter<T0, T1>,
32149 {
32150 <Self as FclassSEmitter<T0, T1>>::fclass_s(self, rd, rs1);
32151 }
32152 /// RISC-V `fcvt.bf16.s` instruction.
32153 ///
32154 /// # Forms
32155 /// Assembly: `fcvt.bf16.s xd, xs1, rm`
32156 /// Rust: `fcvt_bf16_s(rd, rs1, rm)`
32157 ///
32158 /// # Arguments
32159 /// - `rd` — Destination register.
32160 /// - `rs1` — Source register.
32161 /// - `rm` — Rounding mode.
32162 pub fn fcvt_bf16_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32163 where
32164 Self: FcvtBf16SEmitter<T0, T1, T2>,
32165 {
32166 <Self as FcvtBf16SEmitter<T0, T1, T2>>::fcvt_bf16_s(self, rd, rs1, rm);
32167 }
32168 /// RISC-V `fcvt.d.h` instruction.
32169 ///
32170 /// # Forms
32171 /// Assembly: `fcvt.d.h xd, xs1, rm`
32172 /// Rust: `fcvt_d_h(rd, rs1, rm)`
32173 ///
32174 /// # Arguments
32175 /// - `rd` — Destination register.
32176 /// - `rs1` — Source register.
32177 /// - `rm` — Rounding mode.
32178 pub fn fcvt_d_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32179 where
32180 Self: FcvtDHEmitter<T0, T1, T2>,
32181 {
32182 <Self as FcvtDHEmitter<T0, T1, T2>>::fcvt_d_h(self, rd, rs1, rm);
32183 }
32184 /// RISC-V `fcvt.d.l` instruction.
32185 ///
32186 /// # Forms
32187 /// Assembly: `fcvt.d.l xd, xs1, rm`
32188 /// Rust: `fcvt_d_l(rd, rs1, rm)`
32189 ///
32190 /// # Arguments
32191 /// - `rd` — Destination register.
32192 /// - `rs1` — Source register.
32193 /// - `rm` — Rounding mode.
32194 pub fn fcvt_d_l<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32195 where
32196 Self: FcvtDLEmitter<T0, T1, T2>,
32197 {
32198 <Self as FcvtDLEmitter<T0, T1, T2>>::fcvt_d_l(self, rd, rs1, rm);
32199 }
32200 /// RISC-V `fcvt.d.lu` instruction.
32201 ///
32202 /// # Forms
32203 /// Assembly: `fcvt.d.lu xd, xs1, rm`
32204 /// Rust: `fcvt_d_lu(rd, rs1, rm)`
32205 ///
32206 /// # Arguments
32207 /// - `rd` — Destination register.
32208 /// - `rs1` — Source register.
32209 /// - `rm` — Rounding mode.
32210 pub fn fcvt_d_lu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32211 where
32212 Self: FcvtDLuEmitter<T0, T1, T2>,
32213 {
32214 <Self as FcvtDLuEmitter<T0, T1, T2>>::fcvt_d_lu(self, rd, rs1, rm);
32215 }
32216 /// RISC-V `fcvt.d.q` instruction.
32217 ///
32218 /// # Forms
32219 /// Assembly: `fcvt.d.q xd, qs1, rm`
32220 /// Rust: `fcvt_d_q(rd, rs1, rm)`
32221 ///
32222 /// # Arguments
32223 /// - `rd` — Destination register.
32224 /// - `rs1` — Source register.
32225 /// - `rm` — Rounding mode.
32226 pub fn fcvt_d_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32227 where
32228 Self: FcvtDQEmitter<T0, T1, T2>,
32229 {
32230 <Self as FcvtDQEmitter<T0, T1, T2>>::fcvt_d_q(self, rd, rs1, rm);
32231 }
32232 /// RISC-V `fcvt.d.s` instruction.
32233 ///
32234 /// # Forms
32235 /// Assembly: `fcvt.d.s xd, xs1, rm`
32236 /// Rust: `fcvt_d_s(rd, rs1, rm)`
32237 ///
32238 /// # Arguments
32239 /// - `rd` — Destination register.
32240 /// - `rs1` — Source register.
32241 /// - `rm` — Rounding mode.
32242 pub fn fcvt_d_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32243 where
32244 Self: FcvtDSEmitter<T0, T1, T2>,
32245 {
32246 <Self as FcvtDSEmitter<T0, T1, T2>>::fcvt_d_s(self, rd, rs1, rm);
32247 }
32248 /// RISC-V `fcvt.d.w` instruction.
32249 ///
32250 /// # Forms
32251 /// Assembly: `fcvt.d.w xd, xs1, rm`
32252 /// Rust: `fcvt_d_w(rd, rs1, rm)`
32253 ///
32254 /// # Arguments
32255 /// - `rd` — Destination register.
32256 /// - `rs1` — Source register.
32257 /// - `rm` — Rounding mode.
32258 pub fn fcvt_d_w<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32259 where
32260 Self: FcvtDWEmitter<T0, T1, T2>,
32261 {
32262 <Self as FcvtDWEmitter<T0, T1, T2>>::fcvt_d_w(self, rd, rs1, rm);
32263 }
32264 /// RISC-V `fcvt.d.wu` instruction.
32265 ///
32266 /// # Forms
32267 /// Assembly: `fcvt.d.wu xd, xs1, rm`
32268 /// Rust: `fcvt_d_wu(rd, rs1, rm)`
32269 ///
32270 /// # Arguments
32271 /// - `rd` — Destination register.
32272 /// - `rs1` — Source register.
32273 /// - `rm` — Rounding mode.
32274 pub fn fcvt_d_wu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32275 where
32276 Self: FcvtDWuEmitter<T0, T1, T2>,
32277 {
32278 <Self as FcvtDWuEmitter<T0, T1, T2>>::fcvt_d_wu(self, rd, rs1, rm);
32279 }
32280 /// RISC-V `fcvt.h.d` instruction.
32281 ///
32282 /// # Forms
32283 /// Assembly: `fcvt.h.d xd, xs1, rm`
32284 /// Rust: `fcvt_h_d(rd, rs1, rm)`
32285 ///
32286 /// # Arguments
32287 /// - `rd` — Destination register.
32288 /// - `rs1` — Source register.
32289 /// - `rm` — Rounding mode.
32290 pub fn fcvt_h_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32291 where
32292 Self: FcvtHDEmitter<T0, T1, T2>,
32293 {
32294 <Self as FcvtHDEmitter<T0, T1, T2>>::fcvt_h_d(self, rd, rs1, rm);
32295 }
32296 /// RISC-V `fcvt.h.l` instruction.
32297 ///
32298 /// # Forms
32299 /// Assembly: `fcvt.h.l xd, xs1, rm`
32300 /// Rust: `fcvt_h_l(rd, rs1, rm)`
32301 ///
32302 /// # Arguments
32303 /// - `rd` — Destination register.
32304 /// - `rs1` — Source register.
32305 /// - `rm` — Rounding mode.
32306 pub fn fcvt_h_l<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32307 where
32308 Self: FcvtHLEmitter<T0, T1, T2>,
32309 {
32310 <Self as FcvtHLEmitter<T0, T1, T2>>::fcvt_h_l(self, rd, rs1, rm);
32311 }
32312 /// RISC-V `fcvt.h.lu` instruction.
32313 ///
32314 /// # Forms
32315 /// Assembly: `fcvt.h.lu xd, xs1, rm`
32316 /// Rust: `fcvt_h_lu(rd, rs1, rm)`
32317 ///
32318 /// # Arguments
32319 /// - `rd` — Destination register.
32320 /// - `rs1` — Source register.
32321 /// - `rm` — Rounding mode.
32322 pub fn fcvt_h_lu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32323 where
32324 Self: FcvtHLuEmitter<T0, T1, T2>,
32325 {
32326 <Self as FcvtHLuEmitter<T0, T1, T2>>::fcvt_h_lu(self, rd, rs1, rm);
32327 }
32328 /// RISC-V `fcvt.h.q` instruction.
32329 ///
32330 /// # Forms
32331 /// Assembly: `fcvt.h.q xd, qs1, rm`
32332 /// Rust: `fcvt_h_q(rd, rs1, rm)`
32333 ///
32334 /// # Arguments
32335 /// - `rd` — Destination register.
32336 /// - `rs1` — Source register.
32337 /// - `rm` — Rounding mode.
32338 pub fn fcvt_h_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32339 where
32340 Self: FcvtHQEmitter<T0, T1, T2>,
32341 {
32342 <Self as FcvtHQEmitter<T0, T1, T2>>::fcvt_h_q(self, rd, rs1, rm);
32343 }
32344 /// Convert half-precision float to a single-precision float
32345 ///
32346 /// Converts a half-precision number in floating-point register _fs1_ into a single-precision floating-point number in
32347 /// floating-point register _fd_.
32348 ///
32349 /// `fcvt.h.s` rounds according to the _rm_ field.
32350 ///
32351 /// All floating-point conversion instructions set the Inexact exception flag if the rounded
32352 /// result differs from the operand value and the Invalid exception flag is not set.
32353 ///
32354 /// # Forms
32355 /// Assembly: `fcvt.h.s fd, xs1`
32356 /// Rust: `fcvt_h_s(rd, rs1, rm)`
32357 ///
32358 /// # Arguments
32359 /// - `rd` — Destination register.
32360 /// - `rs1` — Source register.
32361 /// - `rm` — Rounding mode.
32362 pub fn fcvt_h_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32363 where
32364 Self: FcvtHSEmitter<T0, T1, T2>,
32365 {
32366 <Self as FcvtHSEmitter<T0, T1, T2>>::fcvt_h_s(self, rd, rs1, rm);
32367 }
32368 /// RISC-V `fcvt.h.w` instruction.
32369 ///
32370 /// # Forms
32371 /// Assembly: `fcvt.h.w xd, xs1, rm`
32372 /// Rust: `fcvt_h_w(rd, rs1, rm)`
32373 ///
32374 /// # Arguments
32375 /// - `rd` — Destination register.
32376 /// - `rs1` — Source register.
32377 /// - `rm` — Rounding mode.
32378 pub fn fcvt_h_w<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32379 where
32380 Self: FcvtHWEmitter<T0, T1, T2>,
32381 {
32382 <Self as FcvtHWEmitter<T0, T1, T2>>::fcvt_h_w(self, rd, rs1, rm);
32383 }
32384 /// RISC-V `fcvt.h.wu` instruction.
32385 ///
32386 /// # Forms
32387 /// Assembly: `fcvt.h.wu xd, xs1, rm`
32388 /// Rust: `fcvt_h_wu(rd, rs1, rm)`
32389 ///
32390 /// # Arguments
32391 /// - `rd` — Destination register.
32392 /// - `rs1` — Source register.
32393 /// - `rm` — Rounding mode.
32394 pub fn fcvt_h_wu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32395 where
32396 Self: FcvtHWuEmitter<T0, T1, T2>,
32397 {
32398 <Self as FcvtHWuEmitter<T0, T1, T2>>::fcvt_h_wu(self, rd, rs1, rm);
32399 }
32400 /// RISC-V `fcvt.l.d` instruction.
32401 ///
32402 /// # Forms
32403 /// Assembly: `fcvt.l.d xd, xs1, rm`
32404 /// Rust: `fcvt_l_d(rd, rs1, rm)`
32405 ///
32406 /// # Arguments
32407 /// - `rd` — Destination register.
32408 /// - `rs1` — Source register.
32409 /// - `rm` — Rounding mode.
32410 pub fn fcvt_l_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32411 where
32412 Self: FcvtLDEmitter<T0, T1, T2>,
32413 {
32414 <Self as FcvtLDEmitter<T0, T1, T2>>::fcvt_l_d(self, rd, rs1, rm);
32415 }
32416 /// RISC-V `fcvt.l.h` instruction.
32417 ///
32418 /// # Forms
32419 /// Assembly: `fcvt.l.h xd, xs1, rm`
32420 /// Rust: `fcvt_l_h(rd, rs1, rm)`
32421 ///
32422 /// # Arguments
32423 /// - `rd` — Destination register.
32424 /// - `rs1` — Source register.
32425 /// - `rm` — Rounding mode.
32426 pub fn fcvt_l_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32427 where
32428 Self: FcvtLHEmitter<T0, T1, T2>,
32429 {
32430 <Self as FcvtLHEmitter<T0, T1, T2>>::fcvt_l_h(self, rd, rs1, rm);
32431 }
32432 /// RISC-V `fcvt.l.q` instruction.
32433 ///
32434 /// # Forms
32435 /// Assembly: `fcvt.l.q xd, qs1, rm`
32436 /// Rust: `fcvt_l_q(rd, rs1, rm)`
32437 ///
32438 /// # Arguments
32439 /// - `rd` — Destination register.
32440 /// - `rs1` — Source register.
32441 /// - `rm` — Rounding mode.
32442 pub fn fcvt_l_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32443 where
32444 Self: FcvtLQEmitter<T0, T1, T2>,
32445 {
32446 <Self as FcvtLQEmitter<T0, T1, T2>>::fcvt_l_q(self, rd, rs1, rm);
32447 }
32448 /// RISC-V `fcvt.l.s` instruction.
32449 ///
32450 /// # Forms
32451 /// Assembly: `fcvt.l.s xd, fs1, rm`
32452 /// Rust: `fcvt_l_s(rd, rs1, rm)`
32453 ///
32454 /// # Arguments
32455 /// - `rd` — Destination register.
32456 /// - `rs1` — Source register.
32457 /// - `rm` — Rounding mode.
32458 pub fn fcvt_l_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32459 where
32460 Self: FcvtLSEmitter<T0, T1, T2>,
32461 {
32462 <Self as FcvtLSEmitter<T0, T1, T2>>::fcvt_l_s(self, rd, rs1, rm);
32463 }
32464 /// RISC-V `fcvt.lu.d` instruction.
32465 ///
32466 /// # Forms
32467 /// Assembly: `fcvt.lu.d xd, xs1, rm`
32468 /// Rust: `fcvt_lu_d(rd, rs1, rm)`
32469 ///
32470 /// # Arguments
32471 /// - `rd` — Destination register.
32472 /// - `rs1` — Source register.
32473 /// - `rm` — Rounding mode.
32474 pub fn fcvt_lu_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32475 where
32476 Self: FcvtLuDEmitter<T0, T1, T2>,
32477 {
32478 <Self as FcvtLuDEmitter<T0, T1, T2>>::fcvt_lu_d(self, rd, rs1, rm);
32479 }
32480 /// RISC-V `fcvt.lu.h` instruction.
32481 ///
32482 /// # Forms
32483 /// Assembly: `fcvt.lu.h xd, xs1, rm`
32484 /// Rust: `fcvt_lu_h(rd, rs1, rm)`
32485 ///
32486 /// # Arguments
32487 /// - `rd` — Destination register.
32488 /// - `rs1` — Source register.
32489 /// - `rm` — Rounding mode.
32490 pub fn fcvt_lu_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32491 where
32492 Self: FcvtLuHEmitter<T0, T1, T2>,
32493 {
32494 <Self as FcvtLuHEmitter<T0, T1, T2>>::fcvt_lu_h(self, rd, rs1, rm);
32495 }
32496 /// RISC-V `fcvt.lu.q` instruction.
32497 ///
32498 /// # Forms
32499 /// Assembly: `fcvt.lu.q qd, hs1, rm`
32500 /// Rust: `fcvt_lu_q(rd, rs1, rm)`
32501 ///
32502 /// # Arguments
32503 /// - `rd` — Destination register.
32504 /// - `rs1` — Source register.
32505 /// - `rm` — Rounding mode.
32506 pub fn fcvt_lu_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32507 where
32508 Self: FcvtLuQEmitter<T0, T1, T2>,
32509 {
32510 <Self as FcvtLuQEmitter<T0, T1, T2>>::fcvt_lu_q(self, rd, rs1, rm);
32511 }
32512 /// RISC-V `fcvt.lu.s` instruction.
32513 ///
32514 /// # Forms
32515 /// Assembly: `fcvt.lu.s xd, fs1, rm`
32516 /// Rust: `fcvt_lu_s(rd, rs1, rm)`
32517 ///
32518 /// # Arguments
32519 /// - `rd` — Destination register.
32520 /// - `rs1` — Source register.
32521 /// - `rm` — Rounding mode.
32522 pub fn fcvt_lu_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32523 where
32524 Self: FcvtLuSEmitter<T0, T1, T2>,
32525 {
32526 <Self as FcvtLuSEmitter<T0, T1, T2>>::fcvt_lu_s(self, rd, rs1, rm);
32527 }
32528 /// RISC-V `fcvt.q.d` instruction.
32529 ///
32530 /// # Forms
32531 /// Assembly: `fcvt.q.d dd, fs1, rm`
32532 /// Rust: `fcvt_q_d(rd, rs1, rm)`
32533 ///
32534 /// # Arguments
32535 /// - `rd` — Destination register.
32536 /// - `rs1` — Source register.
32537 /// - `rm` — Rounding mode.
32538 pub fn fcvt_q_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32539 where
32540 Self: FcvtQDEmitter<T0, T1, T2>,
32541 {
32542 <Self as FcvtQDEmitter<T0, T1, T2>>::fcvt_q_d(self, rd, rs1, rm);
32543 }
32544 /// RISC-V `fcvt.q.h` instruction.
32545 ///
32546 /// # Forms
32547 /// Assembly: `fcvt.q.h hd, qs1, rm`
32548 /// Rust: `fcvt_q_h(rd, rs1, rm)`
32549 ///
32550 /// # Arguments
32551 /// - `rd` — Destination register.
32552 /// - `rs1` — Source register.
32553 /// - `rm` — Rounding mode.
32554 pub fn fcvt_q_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32555 where
32556 Self: FcvtQHEmitter<T0, T1, T2>,
32557 {
32558 <Self as FcvtQHEmitter<T0, T1, T2>>::fcvt_q_h(self, rd, rs1, rm);
32559 }
32560 /// RISC-V `fcvt.q.l` instruction.
32561 ///
32562 /// # Forms
32563 /// Assembly: `fcvt.q.l qd, xs1, rm`
32564 /// Rust: `fcvt_q_l(rd, rs1, rm)`
32565 ///
32566 /// # Arguments
32567 /// - `rd` — Destination register.
32568 /// - `rs1` — Source register.
32569 /// - `rm` — Rounding mode.
32570 pub fn fcvt_q_l<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32571 where
32572 Self: FcvtQLEmitter<T0, T1, T2>,
32573 {
32574 <Self as FcvtQLEmitter<T0, T1, T2>>::fcvt_q_l(self, rd, rs1, rm);
32575 }
32576 /// RISC-V `fcvt.q.lu` instruction.
32577 ///
32578 /// # Forms
32579 /// Assembly: `fcvt.q.lu qd, xs1, rm`
32580 /// Rust: `fcvt_q_lu(rd, rs1, rm)`
32581 ///
32582 /// # Arguments
32583 /// - `rd` — Destination register.
32584 /// - `rs1` — Source register.
32585 /// - `rm` — Rounding mode.
32586 pub fn fcvt_q_lu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32587 where
32588 Self: FcvtQLuEmitter<T0, T1, T2>,
32589 {
32590 <Self as FcvtQLuEmitter<T0, T1, T2>>::fcvt_q_lu(self, rd, rs1, rm);
32591 }
32592 /// RISC-V `fcvt.q.s` instruction.
32593 ///
32594 /// # Forms
32595 /// Assembly: `fcvt.q.s qd, fs1, rm`
32596 /// Rust: `fcvt_q_s(rd, rs1, rm)`
32597 ///
32598 /// # Arguments
32599 /// - `rd` — Destination register.
32600 /// - `rs1` — Source register.
32601 /// - `rm` — Rounding mode.
32602 pub fn fcvt_q_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32603 where
32604 Self: FcvtQSEmitter<T0, T1, T2>,
32605 {
32606 <Self as FcvtQSEmitter<T0, T1, T2>>::fcvt_q_s(self, rd, rs1, rm);
32607 }
32608 /// RISC-V `fcvt.q.w` instruction.
32609 ///
32610 /// # Forms
32611 /// Assembly: `fcvt.q.w fd, xs1, rm`
32612 /// Rust: `fcvt_q_w(rd, rs1, rm)`
32613 ///
32614 /// # Arguments
32615 /// - `rd` — Destination register.
32616 /// - `rs1` — Source register.
32617 /// - `rm` — Rounding mode.
32618 pub fn fcvt_q_w<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32619 where
32620 Self: FcvtQWEmitter<T0, T1, T2>,
32621 {
32622 <Self as FcvtQWEmitter<T0, T1, T2>>::fcvt_q_w(self, rd, rs1, rm);
32623 }
32624 /// RISC-V `fcvt.q.wu` instruction.
32625 ///
32626 /// # Forms
32627 /// Assembly: `fcvt.q.wu qd, xs1, rm`
32628 /// Rust: `fcvt_q_wu(rd, rs1, rm)`
32629 ///
32630 /// # Arguments
32631 /// - `rd` — Destination register.
32632 /// - `rs1` — Source register.
32633 /// - `rm` — Rounding mode.
32634 pub fn fcvt_q_wu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32635 where
32636 Self: FcvtQWuEmitter<T0, T1, T2>,
32637 {
32638 <Self as FcvtQWuEmitter<T0, T1, T2>>::fcvt_q_wu(self, rd, rs1, rm);
32639 }
32640 /// RISC-V `fcvt.s.bf16` instruction.
32641 ///
32642 /// # Forms
32643 /// Assembly: `fcvt.s.bf16 xd, xs1, rm`
32644 /// Rust: `fcvt_s_bf16(rd, rs1, rm)`
32645 ///
32646 /// # Arguments
32647 /// - `rd` — Destination register.
32648 /// - `rs1` — Source register.
32649 /// - `rm` — Rounding mode.
32650 pub fn fcvt_s_bf16<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32651 where
32652 Self: FcvtSBf16Emitter<T0, T1, T2>,
32653 {
32654 <Self as FcvtSBf16Emitter<T0, T1, T2>>::fcvt_s_bf16(self, rd, rs1, rm);
32655 }
32656 /// RISC-V `fcvt.s.d` instruction.
32657 ///
32658 /// # Forms
32659 /// Assembly: `fcvt.s.d xd, xs1, rm`
32660 /// Rust: `fcvt_s_d(rd, rs1, rm)`
32661 ///
32662 /// # Arguments
32663 /// - `rd` — Destination register.
32664 /// - `rs1` — Source register.
32665 /// - `rm` — Rounding mode.
32666 pub fn fcvt_s_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32667 where
32668 Self: FcvtSDEmitter<T0, T1, T2>,
32669 {
32670 <Self as FcvtSDEmitter<T0, T1, T2>>::fcvt_s_d(self, rd, rs1, rm);
32671 }
32672 /// Convert single-precision float to a half-precision float
32673 ///
32674 /// Converts a single-precision number in floating-point register _fs1_ into a half-precision floating-point number in
32675 /// floating-point register _fd_.
32676 ///
32677 /// `fcvt.s.h` will never round, and so the 'rm' field is effectively ignored.
32678 ///
32679 /// # Forms
32680 /// Assembly: `fcvt.s.h fd, xs1`
32681 /// Rust: `fcvt_s_h(rd, rs1, rm)`
32682 ///
32683 /// # Arguments
32684 /// - `rd` — Destination register.
32685 /// - `rs1` — Source register.
32686 /// - `rm` — Rounding mode.
32687 pub fn fcvt_s_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32688 where
32689 Self: FcvtSHEmitter<T0, T1, T2>,
32690 {
32691 <Self as FcvtSHEmitter<T0, T1, T2>>::fcvt_s_h(self, rd, rs1, rm);
32692 }
32693 /// RISC-V `fcvt.s.l` instruction.
32694 ///
32695 /// # Forms
32696 /// Assembly: `fcvt.s.l fd, xs1, rm`
32697 /// Rust: `fcvt_s_l(rd, rs1, rm)`
32698 ///
32699 /// # Arguments
32700 /// - `rd` — Destination register.
32701 /// - `rs1` — Source register.
32702 /// - `rm` — Rounding mode.
32703 pub fn fcvt_s_l<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32704 where
32705 Self: FcvtSLEmitter<T0, T1, T2>,
32706 {
32707 <Self as FcvtSLEmitter<T0, T1, T2>>::fcvt_s_l(self, rd, rs1, rm);
32708 }
32709 /// RISC-V `fcvt.s.lu` instruction.
32710 ///
32711 /// # Forms
32712 /// Assembly: `fcvt.s.lu fd, xs1, rm`
32713 /// Rust: `fcvt_s_lu(rd, rs1, rm)`
32714 ///
32715 /// # Arguments
32716 /// - `rd` — Destination register.
32717 /// - `rs1` — Source register.
32718 /// - `rm` — Rounding mode.
32719 pub fn fcvt_s_lu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32720 where
32721 Self: FcvtSLuEmitter<T0, T1, T2>,
32722 {
32723 <Self as FcvtSLuEmitter<T0, T1, T2>>::fcvt_s_lu(self, rd, rs1, rm);
32724 }
32725 /// RISC-V `fcvt.s.q` instruction.
32726 ///
32727 /// # Forms
32728 /// Assembly: `fcvt.s.q fd, qs1, rm`
32729 /// Rust: `fcvt_s_q(rd, rs1, rm)`
32730 ///
32731 /// # Arguments
32732 /// - `rd` — Destination register.
32733 /// - `rs1` — Source register.
32734 /// - `rm` — Rounding mode.
32735 pub fn fcvt_s_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32736 where
32737 Self: FcvtSQEmitter<T0, T1, T2>,
32738 {
32739 <Self as FcvtSQEmitter<T0, T1, T2>>::fcvt_s_q(self, rd, rs1, rm);
32740 }
32741 /// Convert signed 32-bit integer to single-precision float
32742 ///
32743 /// Converts a 32-bit signed integer in integer register _rs1_ into a floating-point number in
32744 /// floating-point register _fd_.
32745 ///
32746 /// All floating-point to integer and integer to floating-point conversion instructions round
32747 /// according to the _rm_ field.
32748 /// A floating-point register can be initialized to floating-point positive zero using
32749 /// `fcvt.s.w rd, x0`, which will never set any exception flags.
32750 ///
32751 /// All floating-point conversion instructions set the Inexact exception flag if the rounded
32752 /// result differs from the operand value and the Invalid exception flag is not set.
32753 ///
32754 /// # Forms
32755 /// Assembly: `fcvt.s.w fd, xs1`
32756 /// Rust: `fcvt_s_w(rd, rs1, rm)`
32757 ///
32758 /// # Arguments
32759 /// - `rd` — Destination register.
32760 /// - `rs1` — Source register.
32761 /// - `rm` — Rounding mode.
32762 pub fn fcvt_s_w<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32763 where
32764 Self: FcvtSWEmitter<T0, T1, T2>,
32765 {
32766 <Self as FcvtSWEmitter<T0, T1, T2>>::fcvt_s_w(self, rd, rs1, rm);
32767 }
32768 /// RISC-V `fcvt.s.wu` instruction.
32769 ///
32770 /// # Forms
32771 /// Assembly: `fcvt.s.wu fd, xs1, rm`
32772 /// Rust: `fcvt_s_wu(rd, rs1, rm)`
32773 ///
32774 /// # Arguments
32775 /// - `rd` — Destination register.
32776 /// - `rs1` — Source register.
32777 /// - `rm` — Rounding mode.
32778 pub fn fcvt_s_wu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32779 where
32780 Self: FcvtSWuEmitter<T0, T1, T2>,
32781 {
32782 <Self as FcvtSWuEmitter<T0, T1, T2>>::fcvt_s_wu(self, rd, rs1, rm);
32783 }
32784 /// RISC-V `fcvt.w.d` instruction.
32785 ///
32786 /// # Forms
32787 /// Assembly: `fcvt.w.d xd, xs1, rm`
32788 /// Rust: `fcvt_w_d(rd, rs1, rm)`
32789 ///
32790 /// # Arguments
32791 /// - `rd` — Destination register.
32792 /// - `rs1` — Source register.
32793 /// - `rm` — Rounding mode.
32794 pub fn fcvt_w_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32795 where
32796 Self: FcvtWDEmitter<T0, T1, T2>,
32797 {
32798 <Self as FcvtWDEmitter<T0, T1, T2>>::fcvt_w_d(self, rd, rs1, rm);
32799 }
32800 /// RISC-V `fcvt.w.h` instruction.
32801 ///
32802 /// # Forms
32803 /// Assembly: `fcvt.w.h xd, xs1, rm`
32804 /// Rust: `fcvt_w_h(rd, rs1, rm)`
32805 ///
32806 /// # Arguments
32807 /// - `rd` — Destination register.
32808 /// - `rs1` — Source register.
32809 /// - `rm` — Rounding mode.
32810 pub fn fcvt_w_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32811 where
32812 Self: FcvtWHEmitter<T0, T1, T2>,
32813 {
32814 <Self as FcvtWHEmitter<T0, T1, T2>>::fcvt_w_h(self, rd, rs1, rm);
32815 }
32816 /// RISC-V `fcvt.w.q` instruction.
32817 ///
32818 /// # Forms
32819 /// Assembly: `fcvt.w.q xd, qs1, rm`
32820 /// Rust: `fcvt_w_q(rd, rs1, rm)`
32821 ///
32822 /// # Arguments
32823 /// - `rd` — Destination register.
32824 /// - `rs1` — Source register.
32825 /// - `rm` — Rounding mode.
32826 pub fn fcvt_w_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32827 where
32828 Self: FcvtWQEmitter<T0, T1, T2>,
32829 {
32830 <Self as FcvtWQEmitter<T0, T1, T2>>::fcvt_w_q(self, rd, rs1, rm);
32831 }
32832 /// Convert single-precision float to integer word to signed 32-bit integer.
32833 ///
32834 /// Converts a floating-point number in floating-point register _fs1_ to a signed 32-bit integer indicates
32835 /// integer register _rd_.
32836 ///
32837 /// For XLEN >32, `fcvt.w.s` sign-extends the 32-bit result to the destination register width.
32838 ///
32839 /// If the rounded result is not representable as a 32-bit signed integer, it is clipped to the
32840 /// nearest value and the invalid flag is set.
32841 ///
32842 /// The range of valid inputs and behavior for invalid inputs are:
32843 ///
32844 /// \[separator="!"\]
32845 /// !===
32846 /// ! ! Value
32847 ///
32848 /// h! Minimum valid input (after rounding) ! `-2^31`
32849 /// h! Maximum valid input (after rounding) ! `2^31 - 1`
32850 /// h! Output for out-of-range negative input ! `-2^31`
32851 /// h! Output for `-∞` ! `-2^31`
32852 /// h! Output for out-of-range positive input ! `2^31 - 1`
32853 /// h! Output for `+∞` for `NaN` ! `2^31 - 1`
32854 /// !===
32855 ///
32856 /// All floating-point to integer and integer to floating-point conversion instructions round
32857 /// according to the _rm_ field.
32858 /// A floating-point register can be initialized to floating-point positive zero using
32859 /// `fcvt.s.w rd, x0`, which will never set any exception flags.
32860 ///
32861 /// All floating-point conversion instructions set the Inexact exception flag if the rounded
32862 /// result differs from the operand value and the Invalid exception flag is not set.
32863 ///
32864 /// # Forms
32865 /// Assembly: `fcvt.w.s xd, fs1`
32866 /// Rust: `fcvt_w_s(rd, rs1, rm)`
32867 ///
32868 /// # Arguments
32869 /// - `rd` — Destination register.
32870 /// - `rs1` — Source register.
32871 /// - `rm` — Rounding mode.
32872 pub fn fcvt_w_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32873 where
32874 Self: FcvtWSEmitter<T0, T1, T2>,
32875 {
32876 <Self as FcvtWSEmitter<T0, T1, T2>>::fcvt_w_s(self, rd, rs1, rm);
32877 }
32878 /// RISC-V `fcvt.wu.d` instruction.
32879 ///
32880 /// # Forms
32881 /// Assembly: `fcvt.wu.d xd, xs1, rm`
32882 /// Rust: `fcvt_wu_d(rd, rs1, rm)`
32883 ///
32884 /// # Arguments
32885 /// - `rd` — Destination register.
32886 /// - `rs1` — Source register.
32887 /// - `rm` — Rounding mode.
32888 pub fn fcvt_wu_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32889 where
32890 Self: FcvtWuDEmitter<T0, T1, T2>,
32891 {
32892 <Self as FcvtWuDEmitter<T0, T1, T2>>::fcvt_wu_d(self, rd, rs1, rm);
32893 }
32894 /// RISC-V `fcvt.wu.h` instruction.
32895 ///
32896 /// # Forms
32897 /// Assembly: `fcvt.wu.h xd, xs1, rm`
32898 /// Rust: `fcvt_wu_h(rd, rs1, rm)`
32899 ///
32900 /// # Arguments
32901 /// - `rd` — Destination register.
32902 /// - `rs1` — Source register.
32903 /// - `rm` — Rounding mode.
32904 pub fn fcvt_wu_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32905 where
32906 Self: FcvtWuHEmitter<T0, T1, T2>,
32907 {
32908 <Self as FcvtWuHEmitter<T0, T1, T2>>::fcvt_wu_h(self, rd, rs1, rm);
32909 }
32910 /// RISC-V `fcvt.wu.q` instruction.
32911 ///
32912 /// # Forms
32913 /// Assembly: `fcvt.wu.q xd, xs1, rm`
32914 /// Rust: `fcvt_wu_q(rd, rs1, rm)`
32915 ///
32916 /// # Arguments
32917 /// - `rd` — Destination register.
32918 /// - `rs1` — Source register.
32919 /// - `rm` — Rounding mode.
32920 pub fn fcvt_wu_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32921 where
32922 Self: FcvtWuQEmitter<T0, T1, T2>,
32923 {
32924 <Self as FcvtWuQEmitter<T0, T1, T2>>::fcvt_wu_q(self, rd, rs1, rm);
32925 }
32926 /// RISC-V `fcvt.wu.s` instruction.
32927 ///
32928 /// # Forms
32929 /// Assembly: `fcvt.wu.s xd, fs1, rm`
32930 /// Rust: `fcvt_wu_s(rd, rs1, rm)`
32931 ///
32932 /// # Arguments
32933 /// - `rd` — Destination register.
32934 /// - `rs1` — Source register.
32935 /// - `rm` — Rounding mode.
32936 pub fn fcvt_wu_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
32937 where
32938 Self: FcvtWuSEmitter<T0, T1, T2>,
32939 {
32940 <Self as FcvtWuSEmitter<T0, T1, T2>>::fcvt_wu_s(self, rd, rs1, rm);
32941 }
32942 /// RISC-V `fcvtmod.w.d` instruction.
32943 ///
32944 /// # Forms
32945 /// Assembly: `fcvtmod.w.d xd, xs1`
32946 /// Rust: `fcvtmod_w_d(rd, rs1)`
32947 ///
32948 /// # Arguments
32949 /// - `rd` — Destination register.
32950 /// - `rs1` — Source register.
32951 pub fn fcvtmod_w_d<T0, T1>(&mut self, rd: T0, rs1: T1)
32952 where
32953 Self: FcvtmodWDEmitter<T0, T1>,
32954 {
32955 <Self as FcvtmodWDEmitter<T0, T1>>::fcvtmod_w_d(self, rd, rs1);
32956 }
32957 /// RISC-V `fdiv.d` instruction.
32958 ///
32959 /// # Forms
32960 /// Assembly: `fdiv.d xd, xs1, xs2, rm`
32961 /// Rust: `fdiv_d(rd, rs1, rs2, rm)`
32962 ///
32963 /// # Arguments
32964 /// - `rd` — Destination register.
32965 /// - `rs1` — Source register.
32966 /// - `rs2` — Source register.
32967 /// - `rm` — Rounding mode.
32968 pub fn fdiv_d<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
32969 where
32970 Self: FdivDEmitter<T0, T1, T2, T3>,
32971 {
32972 <Self as FdivDEmitter<T0, T1, T2, T3>>::fdiv_d(self, rd, rs1, rs2, rm);
32973 }
32974 /// RISC-V `fdiv.h` instruction.
32975 ///
32976 /// # Forms
32977 /// Assembly: `fdiv.h xd, xs1, xs2, rm`
32978 /// Rust: `fdiv_h(rd, rs1, rs2, rm)`
32979 ///
32980 /// # Arguments
32981 /// - `rd` — Destination register.
32982 /// - `rs1` — Source register.
32983 /// - `rs2` — Source register.
32984 /// - `rm` — Rounding mode.
32985 pub fn fdiv_h<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
32986 where
32987 Self: FdivHEmitter<T0, T1, T2, T3>,
32988 {
32989 <Self as FdivHEmitter<T0, T1, T2, T3>>::fdiv_h(self, rd, rs1, rs2, rm);
32990 }
32991 /// RISC-V `fdiv.q` instruction.
32992 ///
32993 /// # Forms
32994 /// Assembly: `fdiv.q qd, qs1, qs2, rm`
32995 /// Rust: `fdiv_q(rd, rs1, rs2, rm)`
32996 ///
32997 /// # Arguments
32998 /// - `rd` — Destination register.
32999 /// - `rs1` — Source register.
33000 /// - `rs2` — Source register.
33001 /// - `rm` — Rounding mode.
33002 pub fn fdiv_q<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
33003 where
33004 Self: FdivQEmitter<T0, T1, T2, T3>,
33005 {
33006 <Self as FdivQEmitter<T0, T1, T2, T3>>::fdiv_q(self, rd, rs1, rs2, rm);
33007 }
33008 /// RISC-V `fdiv.s` instruction.
33009 ///
33010 /// # Forms
33011 /// Assembly: `fdiv.s fd, fs1, fs2, rm`
33012 /// Rust: `fdiv_s(rd, rs1, rs2, rm)`
33013 ///
33014 /// # Arguments
33015 /// - `rd` — Destination register.
33016 /// - `rs1` — Source register.
33017 /// - `rs2` — Source register.
33018 /// - `rm` — Rounding mode.
33019 pub fn fdiv_s<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
33020 where
33021 Self: FdivSEmitter<T0, T1, T2, T3>,
33022 {
33023 <Self as FdivSEmitter<T0, T1, T2, T3>>::fdiv_s(self, rd, rs1, rs2, rm);
33024 }
33025 /// Memory ordering fence
33026 ///
33027 /// Orders memory operations.
33028 ///
33029 /// The `fence` instruction is used to order device I/O and memory accesses as
33030 /// viewed by other RISC-V harts and external devices or coprocessors. Any
33031 /// combination of device input (I), device output (O), memory reads \(R),
33032 /// and memory writes (W) may be ordered with respect to any combination of
33033 /// the same. Informally, no other RISC-V hart or external device can
33034 /// observe any operation in the _successor_ set following a `fence` before
33035 /// any operation in the _predecessor_ set preceding the `fence`.
33036 ///
33037 /// The predecessor and successor fields have the same format to specify operation types:
33038 ///
33039 /// \[%autowidth\]
33040 /// |===
33041 /// 4+| `pred` 4+| `succ`
33042 ///
33043 /// | 27 | 26 |25 | 24 | 23 | 22 | 21| 20
33044 /// | PI | PO |PR | PW | SI | SO |SR | SW
33045 /// |===
33046 ///
33047 /// \[%autowidth,align="center",cols="^1,^1,<3",options="header"\]
33048 /// .Fence mode encoding
33049 /// |===
33050 /// |_fm_ field |Mnemonic |Meaning
33051 /// |0000 |_none_ |Normal Fence
33052 /// |1000 |TSO |With `FENCE RW,RW`: exclude write-to-read ordering; otherwise: _Reserved for future use._
33053 /// 2+|_other_ |_Reserved for future use._
33054 /// |===
33055 ///
33056 /// When the mode field _fm_ is `0001` and both the predecessor and successor sets are 'RW',
33057 /// then the instruction acts as a special-case `fence.tso`. `fence.tso` orders all load operations
33058 /// in its predecessor set before all memory operations in its successor set, and all store operations
33059 /// in its predecessor set before all store operations in its successor set. This leaves non-AMO store
33060 /// operations in the 'fence.tso's predecessor set unordered with non-AMO loads in its successor set.
33061 ///
33062 /// When mode field _fm_ is not `0001`, or when mode field _fm_ is `0001` but the _pred_ and
33063 /// _succ_ fields are not both 'RW' (0x3), then the fence acts as a baseline fence (_e.g._, _fm_ is
33064 /// effectively `0000`). This is unaffected by the FIOM bits, described below (implicit promotion does
33065 /// not change how `fence.tso` is decoded).
33066 ///
33067 /// The `rs1` and `rd` fields are unused and ignored.
33068 ///
33069 /// In modes other than M-mode, `fence` is further affected by `menvcfg.FIOM`,
33070 /// `senvcfg.FIOM`<% if ext?(:H) %>, and/or `henvcfg.FIOM`<% end %>
33071 /// as follows:
33072 ///
33073 /// .Effective PR/PW/SR/SW in (H)S-mode
33074 /// \[%autowidth,cols=",,,",options="header",separator="!"\]
33075 /// !===
33076 /// ! \[.rotate\]#`menvcfg.FIOM`# ! `pred.PI` +
33077 /// `pred.PO` +
33078 /// `succ.SI` +
33079 /// `succ.SO`
33080 /// ! -> +
33081 /// -> +
33082 /// -> +
33083 /// ->
33084 /// ! effective `PR` +
33085 /// effective `PW` +
33086 /// effective `SR` +
33087 /// effective `SW`
33088 ///
33089 /// ! 0 ! - ! ! from encoding
33090 /// ! 1 ! 0 ! ! from encoding
33091 /// ! 1 ! 1 ! ! 1
33092 /// !===
33093 ///
33094 /// .Effective PR/PW/SR/SW in U-mode
33095 /// \[%autowidth,options="header",separator="!",cols=",,,,"\]
33096 /// !===
33097 /// ! \[.rotate\]#`menvcfg.FIOM`# ! \[.rotate\]#`senvcfg.FIOM`# ! `pred.PI` +
33098 /// `pred.PO` +
33099 /// `succ.SI` +
33100 /// `succ.SO`
33101 /// ! -> +
33102 /// -> +
33103 /// -> +
33104 /// ->
33105 /// ! effective `PR` +
33106 /// effective `PW` +
33107 /// effective `SR` +
33108 /// effective `SW`
33109 ///
33110 /// ! 0 ! 0 ! - ! ! from encoding
33111 /// ! 0 ! 1 ! 0 ! ! from encoding
33112 /// ! 0 ! 1 ! 1 ! ! 1
33113 /// ! 1 ! - ! 0 ! ! from encoding
33114 /// ! 1 ! - ! 1 ! ! 1
33115 /// !===
33116 ///
33117 /// <%- if ext?(:H) -%>
33118 /// .Effective PR/PW/SR/SW in VS-mode and VU-mode
33119 /// \[%autowidth,options="header",separator="!",cols=",,,,"\]
33120 /// !===
33121 /// ! \[.rotate\]#`menvcfg.FIOM`# ! \[.rotate\]#`henvcfg.FIOM`# ! `pred.PI` +
33122 /// `pred.PO` +
33123 /// `succ.SI` +
33124 /// `succ.SO`
33125 /// ! -> +
33126 /// -> +
33127 /// -> +
33128 /// ->
33129 /// ! effective `PR` +
33130 /// effective `PW` +
33131 /// effective `SR` +
33132 /// effective `SW`
33133 ///
33134 /// ! 0 ! 0 ! - ! ! from encoding
33135 /// ! 0 ! 1 ! 0 ! ! from encoding
33136 /// ! 0 ! 1 ! 1 ! ! 1
33137 /// ! 1 ! - ! 0 ! ! from encoding
33138 /// ! 1 ! - ! 1 ! ! 1
33139 /// !===
33140 /// <%- end -%>
33141 ///
33142 /// # Forms
33143 /// Assembly: `fence "TODO"`
33144 /// Rust: `fence(fm, pred, succ, rs1, rd)`
33145 ///
33146 /// # Arguments
33147 /// - `fm` — Immediate encoding value.
33148 /// - `pred` — Immediate encoding value.
33149 /// - `succ` — Immediate encoding value.
33150 /// - `rs1` — Source register.
33151 /// - `rd` — Destination/source register.
33152 pub fn fence<T0, T1, T2, T3, T4>(&mut self, fm: T0, pred: T1, succ: T2, rs1: T3, rd: T4)
33153 where
33154 Self: FenceEmitter<T0, T1, T2, T3, T4>,
33155 {
33156 <Self as FenceEmitter<T0, T1, T2, T3, T4>>::fence(self, fm, pred, succ, rs1, rd);
33157 }
33158 /// Instruction fence
33159 ///
33160 /// The FENCE.I instruction is used to synchronize the instruction and data
33161 /// streams. RISC-V does not guarantee that stores to instruction memory
33162 /// will be made visible to instruction fetches on a RISC-V hart until that
33163 /// hart executes a FENCE.I instruction. A FENCE.I instruction ensures that
33164 /// a subsequent instruction fetch on a RISC-V hart will see any previous
33165 /// data stores already visible to the same RISC-V hart. FENCE.I does _not_
33166 /// ensure that other RISC-V harts' instruction fetches will observe the
33167 /// local hart's stores in a multiprocessor system. To make a store to
33168 /// instruction memory visible to all RISC-V harts, the writing hart also
33169 /// has to execute a data FENCE before requesting that all remote RISC-V
33170 /// harts execute a FENCE.I.
33171 ///
33172 /// The unused fields in the FENCE.I instruction, _imm\[11:0\]_, _rs1_, and
33173 /// _rd_, are reserved for finer-grain fences in future extensions. For
33174 /// forward compatibility, base implementations shall ignore these fields,
33175 /// and standard software shall zero these fields.
33176 /// (((FENCE.I, finer-grained)))
33177 /// (((FENCE.I, forward compatibility)))
33178 ///
33179 /// \[NOTE\]
33180 /// ====
33181 /// Because FENCE.I only orders stores with a hart's own instruction
33182 /// fetches, application code should only rely upon FENCE.I if the
33183 /// application thread will not be migrated to a different hart. The EEI can
33184 /// provide mechanisms for efficient multiprocessor instruction-stream
33185 /// synchronization.
33186 /// ====
33187 ///
33188 /// # Forms
33189 /// Assembly: `fence.i ""`
33190 /// Rust: `fence_i()`
33191 ///
33192 /// # Arguments
33193 pub fn fence_i(&mut self)
33194 where
33195 Self: FenceIEmitter,
33196 {
33197 <Self as FenceIEmitter>::fence_i(self);
33198 }
33199 /// RISC-V `fence.tso` instruction.
33200 ///
33201 /// # Forms
33202 /// Assembly: `fence.tso`
33203 /// Rust: `fence_tso()`
33204 ///
33205 /// # Arguments
33206 pub fn fence_tso(&mut self)
33207 where
33208 Self: FenceTsoEmitter,
33209 {
33210 <Self as FenceTsoEmitter>::fence_tso(self);
33211 }
33212 /// RISC-V `feq.d` instruction.
33213 ///
33214 /// # Forms
33215 /// Assembly: `feq.d xd, xs1, xs2`
33216 /// Rust: `feq_d(rd, rs1, rs2)`
33217 ///
33218 /// # Arguments
33219 /// - `rd` — Destination register.
33220 /// - `rs1` — Source register.
33221 /// - `rs2` — Source register.
33222 pub fn feq_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33223 where
33224 Self: FeqDEmitter<T0, T1, T2>,
33225 {
33226 <Self as FeqDEmitter<T0, T1, T2>>::feq_d(self, rd, rs1, rs2);
33227 }
33228 /// RISC-V `feq.h` instruction.
33229 ///
33230 /// # Forms
33231 /// Assembly: `feq.h xd, xs1, xs2`
33232 /// Rust: `feq_h(rd, rs1, rs2)`
33233 ///
33234 /// # Arguments
33235 /// - `rd` — Destination register.
33236 /// - `rs1` — Source register.
33237 /// - `rs2` — Source register.
33238 pub fn feq_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33239 where
33240 Self: FeqHEmitter<T0, T1, T2>,
33241 {
33242 <Self as FeqHEmitter<T0, T1, T2>>::feq_h(self, rd, rs1, rs2);
33243 }
33244 /// RISC-V `feq.q` instruction.
33245 ///
33246 /// # Forms
33247 /// Assembly: `feq.q xd, qs1, qs2`
33248 /// Rust: `feq_q(rd, rs1, rs2)`
33249 ///
33250 /// # Arguments
33251 /// - `rd` — Destination register.
33252 /// - `rs1` — Source register.
33253 /// - `rs2` — Source register.
33254 pub fn feq_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33255 where
33256 Self: FeqQEmitter<T0, T1, T2>,
33257 {
33258 <Self as FeqQEmitter<T0, T1, T2>>::feq_q(self, rd, rs1, rs2);
33259 }
33260 /// Single-precision floating-point equal
33261 ///
33262 /// Writes 1 to _rd_ if _fs1_ and _fs2_ are equal, and 0 otherwise.
33263 ///
33264 /// If either operand is NaN, the result is 0 (not equal). If either operand is a signaling NaN, the invalid flag is set.
33265 ///
33266 /// Positive zero is considered equal to negative zero.
33267 ///
33268 /// # Forms
33269 /// Assembly: `feq.s xd, fs1, fs2`
33270 /// Rust: `feq_s(rd, rs1, rs2)`
33271 ///
33272 /// # Arguments
33273 /// - `rd` — Destination register.
33274 /// - `rs1` — Source register.
33275 /// - `rs2` — Source register.
33276 pub fn feq_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33277 where
33278 Self: FeqSEmitter<T0, T1, T2>,
33279 {
33280 <Self as FeqSEmitter<T0, T1, T2>>::feq_s(self, rd, rs1, rs2);
33281 }
33282 /// RISC-V `fld` instruction.
33283 ///
33284 /// # Forms
33285 /// Assembly: `fld xd, xs1, imm`
33286 /// Rust: `fld(rd, rs1, imm)`
33287 ///
33288 /// # Arguments
33289 /// - `rd` — Destination register.
33290 /// - `rs1` — Memory base register.
33291 /// - `imm` — Immediate encoding value.
33292 pub fn fld<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
33293 where
33294 Self: FldEmitter<T0, T1, T2>,
33295 {
33296 <Self as FldEmitter<T0, T1, T2>>::fld(self, rd, rs1, imm);
33297 }
33298 /// RISC-V `fle.d` instruction.
33299 ///
33300 /// # Forms
33301 /// Assembly: `fle.d xd, xs1, xs2`
33302 /// Rust: `fle_d(rd, rs1, rs2)`
33303 ///
33304 /// # Arguments
33305 /// - `rd` — Destination register.
33306 /// - `rs1` — Source register.
33307 /// - `rs2` — Source register.
33308 pub fn fle_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33309 where
33310 Self: FleDEmitter<T0, T1, T2>,
33311 {
33312 <Self as FleDEmitter<T0, T1, T2>>::fle_d(self, rd, rs1, rs2);
33313 }
33314 /// RISC-V `fle.h` instruction.
33315 ///
33316 /// # Forms
33317 /// Assembly: `fle.h xd, xs1, xs2`
33318 /// Rust: `fle_h(rd, rs1, rs2)`
33319 ///
33320 /// # Arguments
33321 /// - `rd` — Destination register.
33322 /// - `rs1` — Source register.
33323 /// - `rs2` — Source register.
33324 pub fn fle_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33325 where
33326 Self: FleHEmitter<T0, T1, T2>,
33327 {
33328 <Self as FleHEmitter<T0, T1, T2>>::fle_h(self, rd, rs1, rs2);
33329 }
33330 /// RISC-V `fle.q` instruction.
33331 ///
33332 /// # Forms
33333 /// Assembly: `fle.q xd, qs1, qs2`
33334 /// Rust: `fle_q(rd, rs1, rs2)`
33335 ///
33336 /// # Arguments
33337 /// - `rd` — Destination register.
33338 /// - `rs1` — Source register.
33339 /// - `rs2` — Source register.
33340 pub fn fle_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33341 where
33342 Self: FleQEmitter<T0, T1, T2>,
33343 {
33344 <Self as FleQEmitter<T0, T1, T2>>::fle_q(self, rd, rs1, rs2);
33345 }
33346 /// Single-precision floating-point less than or equal
33347 ///
33348 /// Writes 1 to _rd_ if _fs1_ is less than or equal to _fs2_, and 0 otherwise.
33349 ///
33350 /// If either operand is NaN, the result is 0 (not equal).
33351 /// If either operand is a NaN (signaling or quiet), the invalid flag is set.
33352 ///
33353 /// Positive zero and negative zero are considered equal.
33354 ///
33355 /// # Forms
33356 /// Assembly: `fle.s xd, fs1, fs2`
33357 /// Rust: `fle_s(rd, rs1, rs2)`
33358 ///
33359 /// # Arguments
33360 /// - `rd` — Destination register.
33361 /// - `rs1` — Source register.
33362 /// - `rs2` — Source register.
33363 pub fn fle_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33364 where
33365 Self: FleSEmitter<T0, T1, T2>,
33366 {
33367 <Self as FleSEmitter<T0, T1, T2>>::fle_s(self, rd, rs1, rs2);
33368 }
33369 /// RISC-V `fleq.d` instruction.
33370 ///
33371 /// # Forms
33372 /// Assembly: `fleq.d xd, xs1, xs2`
33373 /// Rust: `fleq_d(rd, rs1, rs2)`
33374 ///
33375 /// # Arguments
33376 /// - `rd` — Destination register.
33377 /// - `rs1` — Source register.
33378 /// - `rs2` — Source register.
33379 pub fn fleq_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33380 where
33381 Self: FleqDEmitter<T0, T1, T2>,
33382 {
33383 <Self as FleqDEmitter<T0, T1, T2>>::fleq_d(self, rd, rs1, rs2);
33384 }
33385 /// RISC-V `fleq.h` instruction.
33386 ///
33387 /// # Forms
33388 /// Assembly: `fleq.h xd, xs1, xs2`
33389 /// Rust: `fleq_h(rd, rs1, rs2)`
33390 ///
33391 /// # Arguments
33392 /// - `rd` — Destination register.
33393 /// - `rs1` — Source register.
33394 /// - `rs2` — Source register.
33395 pub fn fleq_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33396 where
33397 Self: FleqHEmitter<T0, T1, T2>,
33398 {
33399 <Self as FleqHEmitter<T0, T1, T2>>::fleq_h(self, rd, rs1, rs2);
33400 }
33401 /// RISC-V `fleq.q` instruction.
33402 ///
33403 /// # Forms
33404 /// Assembly: `fleq.q xd, qs1, qs2`
33405 /// Rust: `fleq_q(rd, rs1, rs2)`
33406 ///
33407 /// # Arguments
33408 /// - `rd` — Destination register.
33409 /// - `rs1` — Source register.
33410 /// - `rs2` — Source register.
33411 pub fn fleq_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33412 where
33413 Self: FleqQEmitter<T0, T1, T2>,
33414 {
33415 <Self as FleqQEmitter<T0, T1, T2>>::fleq_q(self, rd, rs1, rs2);
33416 }
33417 /// RISC-V `fleq.s` instruction.
33418 ///
33419 /// # Forms
33420 /// Assembly: `fleq.s xd, fs1, fs2`
33421 /// Rust: `fleq_s(rd, rs1, rs2)`
33422 ///
33423 /// # Arguments
33424 /// - `rd` — Destination register.
33425 /// - `rs1` — Source register.
33426 /// - `rs2` — Source register.
33427 pub fn fleq_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33428 where
33429 Self: FleqSEmitter<T0, T1, T2>,
33430 {
33431 <Self as FleqSEmitter<T0, T1, T2>>::fleq_s(self, rd, rs1, rs2);
33432 }
33433 /// Half-precision floating-point load
33434 ///
33435 /// The `flh` instruction loads a single-precision floating-point value from memory at address _rs1_ + _imm_ into floating-point register _rd_.
33436 ///
33437 /// `flh` does not modify the bits being transferred; in particular, the payloads of non-canonical NaNs are preserved.
33438 ///
33439 /// `flh` is only guaranteed to execute atomically if the effective address is naturally aligned.
33440 ///
33441 /// # Forms
33442 /// Assembly: `flh fd, imm(xs1)`
33443 /// Rust: `flh(rd, rs1, imm)`
33444 ///
33445 /// # Arguments
33446 /// - `rd` — Destination register.
33447 /// - `rs1` — Memory base register.
33448 /// - `imm` — Immediate encoding value.
33449 pub fn flh<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
33450 where
33451 Self: FlhEmitter<T0, T1, T2>,
33452 {
33453 <Self as FlhEmitter<T0, T1, T2>>::flh(self, rd, rs1, imm);
33454 }
33455 /// RISC-V `fli.d` instruction.
33456 ///
33457 /// # Forms
33458 /// Assembly: `fli.d xd, xs1`
33459 /// Rust: `fli_d(rd, rs1)`
33460 ///
33461 /// # Arguments
33462 /// - `rd` — Destination register.
33463 /// - `rs1` — Source register.
33464 pub fn fli_d<T0, T1>(&mut self, rd: T0, rs1: T1)
33465 where
33466 Self: FliDEmitter<T0, T1>,
33467 {
33468 <Self as FliDEmitter<T0, T1>>::fli_d(self, rd, rs1);
33469 }
33470 /// RISC-V `fli.h` instruction.
33471 ///
33472 /// # Forms
33473 /// Assembly: `fli.h xd, xs1`
33474 /// Rust: `fli_h(rd, rs1)`
33475 ///
33476 /// # Arguments
33477 /// - `rd` — Destination register.
33478 /// - `rs1` — Source register.
33479 pub fn fli_h<T0, T1>(&mut self, rd: T0, rs1: T1)
33480 where
33481 Self: FliHEmitter<T0, T1>,
33482 {
33483 <Self as FliHEmitter<T0, T1>>::fli_h(self, rd, rs1);
33484 }
33485 /// RISC-V `fli.q` instruction.
33486 ///
33487 /// # Forms
33488 /// Assembly: `fli.q fd, qs1`
33489 /// Rust: `fli_q(rd, rs1)`
33490 ///
33491 /// # Arguments
33492 /// - `rd` — Destination register.
33493 /// - `rs1` — Source register.
33494 pub fn fli_q<T0, T1>(&mut self, rd: T0, rs1: T1)
33495 where
33496 Self: FliQEmitter<T0, T1>,
33497 {
33498 <Self as FliQEmitter<T0, T1>>::fli_q(self, rd, rs1);
33499 }
33500 /// RISC-V `fli.s` instruction.
33501 ///
33502 /// # Forms
33503 /// Assembly: `fli.s fd, fs1`
33504 /// Rust: `fli_s(rd, rs1)`
33505 ///
33506 /// # Arguments
33507 /// - `rd` — Destination register.
33508 /// - `rs1` — Source register.
33509 pub fn fli_s<T0, T1>(&mut self, rd: T0, rs1: T1)
33510 where
33511 Self: FliSEmitter<T0, T1>,
33512 {
33513 <Self as FliSEmitter<T0, T1>>::fli_s(self, rd, rs1);
33514 }
33515 /// RISC-V `flq` instruction.
33516 ///
33517 /// # Forms
33518 /// Assembly: `flq qd, xs1, imm`
33519 /// Rust: `flq(rd, rs1, imm)`
33520 ///
33521 /// # Arguments
33522 /// - `rd` — Destination register.
33523 /// - `rs1` — Memory base register.
33524 /// - `imm` — Immediate encoding value.
33525 pub fn flq<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
33526 where
33527 Self: FlqEmitter<T0, T1, T2>,
33528 {
33529 <Self as FlqEmitter<T0, T1, T2>>::flq(self, rd, rs1, imm);
33530 }
33531 /// RISC-V `flt.d` instruction.
33532 ///
33533 /// # Forms
33534 /// Assembly: `flt.d xd, xs1, xs2`
33535 /// Rust: `flt_d(rd, rs1, rs2)`
33536 ///
33537 /// # Arguments
33538 /// - `rd` — Destination register.
33539 /// - `rs1` — Source register.
33540 /// - `rs2` — Source register.
33541 pub fn flt_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33542 where
33543 Self: FltDEmitter<T0, T1, T2>,
33544 {
33545 <Self as FltDEmitter<T0, T1, T2>>::flt_d(self, rd, rs1, rs2);
33546 }
33547 /// RISC-V `flt.h` instruction.
33548 ///
33549 /// # Forms
33550 /// Assembly: `flt.h xd, xs1, xs2`
33551 /// Rust: `flt_h(rd, rs1, rs2)`
33552 ///
33553 /// # Arguments
33554 /// - `rd` — Destination register.
33555 /// - `rs1` — Source register.
33556 /// - `rs2` — Source register.
33557 pub fn flt_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33558 where
33559 Self: FltHEmitter<T0, T1, T2>,
33560 {
33561 <Self as FltHEmitter<T0, T1, T2>>::flt_h(self, rd, rs1, rs2);
33562 }
33563 /// RISC-V `flt.q` instruction.
33564 ///
33565 /// # Forms
33566 /// Assembly: `flt.q xd, qs1, qs2`
33567 /// Rust: `flt_q(rd, rs1, rs2)`
33568 ///
33569 /// # Arguments
33570 /// - `rd` — Destination register.
33571 /// - `rs1` — Source register.
33572 /// - `rs2` — Source register.
33573 pub fn flt_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33574 where
33575 Self: FltQEmitter<T0, T1, T2>,
33576 {
33577 <Self as FltQEmitter<T0, T1, T2>>::flt_q(self, rd, rs1, rs2);
33578 }
33579 /// Single-precision floating-point less than
33580 ///
33581 /// Writes 1 to _rd_ if _fs1_ is less than _fs2_, and 0 otherwise.
33582 ///
33583 /// If either operand is NaN, the result is 0 (not equal).
33584 /// If either operand is a NaN (signaling or quiet), the invalid flag is set.
33585 ///
33586 /// # Forms
33587 /// Assembly: `flt.s xd, fs1, fs2`
33588 /// Rust: `flt_s(rd, rs1, rs2)`
33589 ///
33590 /// # Arguments
33591 /// - `rd` — Destination register.
33592 /// - `rs1` — Source register.
33593 /// - `rs2` — Source register.
33594 pub fn flt_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33595 where
33596 Self: FltSEmitter<T0, T1, T2>,
33597 {
33598 <Self as FltSEmitter<T0, T1, T2>>::flt_s(self, rd, rs1, rs2);
33599 }
33600 /// RISC-V `fltq.d` instruction.
33601 ///
33602 /// # Forms
33603 /// Assembly: `fltq.d xd, xs1, xs2`
33604 /// Rust: `fltq_d(rd, rs1, rs2)`
33605 ///
33606 /// # Arguments
33607 /// - `rd` — Destination register.
33608 /// - `rs1` — Source register.
33609 /// - `rs2` — Source register.
33610 pub fn fltq_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33611 where
33612 Self: FltqDEmitter<T0, T1, T2>,
33613 {
33614 <Self as FltqDEmitter<T0, T1, T2>>::fltq_d(self, rd, rs1, rs2);
33615 }
33616 /// RISC-V `fltq.h` instruction.
33617 ///
33618 /// # Forms
33619 /// Assembly: `fltq.h xd, xs1, xs2`
33620 /// Rust: `fltq_h(rd, rs1, rs2)`
33621 ///
33622 /// # Arguments
33623 /// - `rd` — Destination register.
33624 /// - `rs1` — Source register.
33625 /// - `rs2` — Source register.
33626 pub fn fltq_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33627 where
33628 Self: FltqHEmitter<T0, T1, T2>,
33629 {
33630 <Self as FltqHEmitter<T0, T1, T2>>::fltq_h(self, rd, rs1, rs2);
33631 }
33632 /// RISC-V `fltq.q` instruction.
33633 ///
33634 /// # Forms
33635 /// Assembly: `fltq.q qd, qs1, qs2`
33636 /// Rust: `fltq_q(rd, rs1, rs2)`
33637 ///
33638 /// # Arguments
33639 /// - `rd` — Destination register.
33640 /// - `rs1` — Source register.
33641 /// - `rs2` — Source register.
33642 pub fn fltq_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33643 where
33644 Self: FltqQEmitter<T0, T1, T2>,
33645 {
33646 <Self as FltqQEmitter<T0, T1, T2>>::fltq_q(self, rd, rs1, rs2);
33647 }
33648 /// RISC-V `fltq.s` instruction.
33649 ///
33650 /// # Forms
33651 /// Assembly: `fltq.s xd, fs1, fs2`
33652 /// Rust: `fltq_s(rd, rs1, rs2)`
33653 ///
33654 /// # Arguments
33655 /// - `rd` — Destination register.
33656 /// - `rs1` — Source register.
33657 /// - `rs2` — Source register.
33658 pub fn fltq_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33659 where
33660 Self: FltqSEmitter<T0, T1, T2>,
33661 {
33662 <Self as FltqSEmitter<T0, T1, T2>>::fltq_s(self, rd, rs1, rs2);
33663 }
33664 /// Single-precision floating-point load
33665 ///
33666 /// The `flw` instruction loads a single-precision floating-point value from memory at address _rs1_ + _imm_ into floating-point register _fd_.
33667 ///
33668 /// `flw` does not modify the bits being transferred; in particular, the payloads of non-canonical NaNs are preserved.
33669 ///
33670 /// # Forms
33671 /// Assembly: `flw fd, xs1, imm`
33672 /// Rust: `flw(rd, rs1, imm)`
33673 ///
33674 /// # Arguments
33675 /// - `rd` — Destination register.
33676 /// - `rs1` — Memory base register.
33677 /// - `imm` — Immediate encoding value.
33678 pub fn flw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
33679 where
33680 Self: FlwEmitter<T0, T1, T2>,
33681 {
33682 <Self as FlwEmitter<T0, T1, T2>>::flw(self, rd, rs1, imm);
33683 }
33684 /// RISC-V `fmadd.d` instruction.
33685 ///
33686 /// # Forms
33687 /// Assembly: `fmadd.d xd, xs1, xs2, xs3, rm`
33688 /// Rust: `fmadd_d(rd, rs1, rs2, rs3, rm)`
33689 ///
33690 /// # Arguments
33691 /// - `rd` — Destination register.
33692 /// - `rs1` — Source register.
33693 /// - `rs2` — Source register.
33694 /// - `rs3` — Source register.
33695 /// - `rm` — Rounding mode.
33696 pub fn fmadd_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
33697 where
33698 Self: FmaddDEmitter<T0, T1, T2, T3, T4>,
33699 {
33700 <Self as FmaddDEmitter<T0, T1, T2, T3, T4>>::fmadd_d(self, rd, rs1, rs2, rs3, rm);
33701 }
33702 /// RISC-V `fmadd.h` instruction.
33703 ///
33704 /// # Forms
33705 /// Assembly: `fmadd.h xd, xs1, xs2, xs3, rm`
33706 /// Rust: `fmadd_h(rd, rs1, rs2, rs3, rm)`
33707 ///
33708 /// # Arguments
33709 /// - `rd` — Destination register.
33710 /// - `rs1` — Source register.
33711 /// - `rs2` — Source register.
33712 /// - `rs3` — Source register.
33713 /// - `rm` — Rounding mode.
33714 pub fn fmadd_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
33715 where
33716 Self: FmaddHEmitter<T0, T1, T2, T3, T4>,
33717 {
33718 <Self as FmaddHEmitter<T0, T1, T2, T3, T4>>::fmadd_h(self, rd, rs1, rs2, rs3, rm);
33719 }
33720 /// RISC-V `fmadd.q` instruction.
33721 ///
33722 /// # Forms
33723 /// Assembly: `fmadd.q qd, qs1, qs2, qs3, rm`
33724 /// Rust: `fmadd_q(rd, rs1, rs2, rs3, rm)`
33725 ///
33726 /// # Arguments
33727 /// - `rd` — Destination register.
33728 /// - `rs1` — Source register.
33729 /// - `rs2` — Source register.
33730 /// - `rs3` — Source register.
33731 /// - `rm` — Rounding mode.
33732 pub fn fmadd_q<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
33733 where
33734 Self: FmaddQEmitter<T0, T1, T2, T3, T4>,
33735 {
33736 <Self as FmaddQEmitter<T0, T1, T2, T3, T4>>::fmadd_q(self, rd, rs1, rs2, rs3, rm);
33737 }
33738 /// RISC-V `fmadd.s` instruction.
33739 ///
33740 /// # Forms
33741 /// Assembly: `fmadd.s fd, fs1, fs2, fs3, rm`
33742 /// Rust: `fmadd_s(rd, rs1, rs2, rs3, rm)`
33743 ///
33744 /// # Arguments
33745 /// - `rd` — Destination register.
33746 /// - `rs1` — Source register.
33747 /// - `rs2` — Source register.
33748 /// - `rs3` — Source register.
33749 /// - `rm` — Rounding mode.
33750 pub fn fmadd_s<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
33751 where
33752 Self: FmaddSEmitter<T0, T1, T2, T3, T4>,
33753 {
33754 <Self as FmaddSEmitter<T0, T1, T2, T3, T4>>::fmadd_s(self, rd, rs1, rs2, rs3, rm);
33755 }
33756 /// RISC-V `fmax.d` instruction.
33757 ///
33758 /// # Forms
33759 /// Assembly: `fmax.d xd, xs1, xs2`
33760 /// Rust: `fmax_d(rd, rs1, rs2)`
33761 ///
33762 /// # Arguments
33763 /// - `rd` — Destination register.
33764 /// - `rs1` — Source register.
33765 /// - `rs2` — Source register.
33766 pub fn fmax_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33767 where
33768 Self: FmaxDEmitter<T0, T1, T2>,
33769 {
33770 <Self as FmaxDEmitter<T0, T1, T2>>::fmax_d(self, rd, rs1, rs2);
33771 }
33772 /// RISC-V `fmax.h` instruction.
33773 ///
33774 /// # Forms
33775 /// Assembly: `fmax.h xd, xs1, xs2`
33776 /// Rust: `fmax_h(rd, rs1, rs2)`
33777 ///
33778 /// # Arguments
33779 /// - `rd` — Destination register.
33780 /// - `rs1` — Source register.
33781 /// - `rs2` — Source register.
33782 pub fn fmax_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33783 where
33784 Self: FmaxHEmitter<T0, T1, T2>,
33785 {
33786 <Self as FmaxHEmitter<T0, T1, T2>>::fmax_h(self, rd, rs1, rs2);
33787 }
33788 /// RISC-V `fmax.q` instruction.
33789 ///
33790 /// # Forms
33791 /// Assembly: `fmax.q qd, qs1, qs2`
33792 /// Rust: `fmax_q(rd, rs1, rs2)`
33793 ///
33794 /// # Arguments
33795 /// - `rd` — Destination register.
33796 /// - `rs1` — Source register.
33797 /// - `rs2` — Source register.
33798 pub fn fmax_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33799 where
33800 Self: FmaxQEmitter<T0, T1, T2>,
33801 {
33802 <Self as FmaxQEmitter<T0, T1, T2>>::fmax_q(self, rd, rs1, rs2);
33803 }
33804 /// RISC-V `fmax.s` instruction.
33805 ///
33806 /// # Forms
33807 /// Assembly: `fmax.s fd, fs1, fs2`
33808 /// Rust: `fmax_s(rd, rs1, rs2)`
33809 ///
33810 /// # Arguments
33811 /// - `rd` — Destination register.
33812 /// - `rs1` — Source register.
33813 /// - `rs2` — Source register.
33814 pub fn fmax_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33815 where
33816 Self: FmaxSEmitter<T0, T1, T2>,
33817 {
33818 <Self as FmaxSEmitter<T0, T1, T2>>::fmax_s(self, rd, rs1, rs2);
33819 }
33820 /// RISC-V `fmaxm.d` instruction.
33821 ///
33822 /// # Forms
33823 /// Assembly: `fmaxm.d xd, xs1, xs2`
33824 /// Rust: `fmaxm_d(rd, rs1, rs2)`
33825 ///
33826 /// # Arguments
33827 /// - `rd` — Destination register.
33828 /// - `rs1` — Source register.
33829 /// - `rs2` — Source register.
33830 pub fn fmaxm_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33831 where
33832 Self: FmaxmDEmitter<T0, T1, T2>,
33833 {
33834 <Self as FmaxmDEmitter<T0, T1, T2>>::fmaxm_d(self, rd, rs1, rs2);
33835 }
33836 /// RISC-V `fmaxm.h` instruction.
33837 ///
33838 /// # Forms
33839 /// Assembly: `fmaxm.h xd, xs1, xs2`
33840 /// Rust: `fmaxm_h(rd, rs1, rs2)`
33841 ///
33842 /// # Arguments
33843 /// - `rd` — Destination register.
33844 /// - `rs1` — Source register.
33845 /// - `rs2` — Source register.
33846 pub fn fmaxm_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33847 where
33848 Self: FmaxmHEmitter<T0, T1, T2>,
33849 {
33850 <Self as FmaxmHEmitter<T0, T1, T2>>::fmaxm_h(self, rd, rs1, rs2);
33851 }
33852 /// RISC-V `fmaxm.q` instruction.
33853 ///
33854 /// # Forms
33855 /// Assembly: `fmaxm.q qd, qs1, qs2`
33856 /// Rust: `fmaxm_q(rd, rs1, rs2)`
33857 ///
33858 /// # Arguments
33859 /// - `rd` — Destination register.
33860 /// - `rs1` — Source register.
33861 /// - `rs2` — Source register.
33862 pub fn fmaxm_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33863 where
33864 Self: FmaxmQEmitter<T0, T1, T2>,
33865 {
33866 <Self as FmaxmQEmitter<T0, T1, T2>>::fmaxm_q(self, rd, rs1, rs2);
33867 }
33868 /// RISC-V `fmaxm.s` instruction.
33869 ///
33870 /// # Forms
33871 /// Assembly: `fmaxm.s xd, xs1, xs2`
33872 /// Rust: `fmaxm_s(rd, rs1, rs2)`
33873 ///
33874 /// # Arguments
33875 /// - `rd` — Destination register.
33876 /// - `rs1` — Source register.
33877 /// - `rs2` — Source register.
33878 pub fn fmaxm_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33879 where
33880 Self: FmaxmSEmitter<T0, T1, T2>,
33881 {
33882 <Self as FmaxmSEmitter<T0, T1, T2>>::fmaxm_s(self, rd, rs1, rs2);
33883 }
33884 /// RISC-V `fmin.d` instruction.
33885 ///
33886 /// # Forms
33887 /// Assembly: `fmin.d xd, xs1, xs2`
33888 /// Rust: `fmin_d(rd, rs1, rs2)`
33889 ///
33890 /// # Arguments
33891 /// - `rd` — Destination register.
33892 /// - `rs1` — Source register.
33893 /// - `rs2` — Source register.
33894 pub fn fmin_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33895 where
33896 Self: FminDEmitter<T0, T1, T2>,
33897 {
33898 <Self as FminDEmitter<T0, T1, T2>>::fmin_d(self, rd, rs1, rs2);
33899 }
33900 /// RISC-V `fmin.h` instruction.
33901 ///
33902 /// # Forms
33903 /// Assembly: `fmin.h xd, xs1, xs2`
33904 /// Rust: `fmin_h(rd, rs1, rs2)`
33905 ///
33906 /// # Arguments
33907 /// - `rd` — Destination register.
33908 /// - `rs1` — Source register.
33909 /// - `rs2` — Source register.
33910 pub fn fmin_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33911 where
33912 Self: FminHEmitter<T0, T1, T2>,
33913 {
33914 <Self as FminHEmitter<T0, T1, T2>>::fmin_h(self, rd, rs1, rs2);
33915 }
33916 /// RISC-V `fmin.q` instruction.
33917 ///
33918 /// # Forms
33919 /// Assembly: `fmin.q xd, xs1, xs2`
33920 /// Rust: `fmin_q(rd, rs1, rs2)`
33921 ///
33922 /// # Arguments
33923 /// - `rd` — Destination register.
33924 /// - `rs1` — Source register.
33925 /// - `rs2` — Source register.
33926 pub fn fmin_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33927 where
33928 Self: FminQEmitter<T0, T1, T2>,
33929 {
33930 <Self as FminQEmitter<T0, T1, T2>>::fmin_q(self, rd, rs1, rs2);
33931 }
33932 /// RISC-V `fmin.s` instruction.
33933 ///
33934 /// # Forms
33935 /// Assembly: `fmin.s xd, xs1, xs2`
33936 /// Rust: `fmin_s(rd, rs1, rs2)`
33937 ///
33938 /// # Arguments
33939 /// - `rd` — Destination register.
33940 /// - `rs1` — Source register.
33941 /// - `rs2` — Source register.
33942 pub fn fmin_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33943 where
33944 Self: FminSEmitter<T0, T1, T2>,
33945 {
33946 <Self as FminSEmitter<T0, T1, T2>>::fmin_s(self, rd, rs1, rs2);
33947 }
33948 /// RISC-V `fminm.d` instruction.
33949 ///
33950 /// # Forms
33951 /// Assembly: `fminm.d xd, xs1, xs2`
33952 /// Rust: `fminm_d(rd, rs1, rs2)`
33953 ///
33954 /// # Arguments
33955 /// - `rd` — Destination register.
33956 /// - `rs1` — Source register.
33957 /// - `rs2` — Source register.
33958 pub fn fminm_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33959 where
33960 Self: FminmDEmitter<T0, T1, T2>,
33961 {
33962 <Self as FminmDEmitter<T0, T1, T2>>::fminm_d(self, rd, rs1, rs2);
33963 }
33964 /// RISC-V `fminm.h` instruction.
33965 ///
33966 /// # Forms
33967 /// Assembly: `fminm.h xd, xs1, xs2`
33968 /// Rust: `fminm_h(rd, rs1, rs2)`
33969 ///
33970 /// # Arguments
33971 /// - `rd` — Destination register.
33972 /// - `rs1` — Source register.
33973 /// - `rs2` — Source register.
33974 pub fn fminm_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33975 where
33976 Self: FminmHEmitter<T0, T1, T2>,
33977 {
33978 <Self as FminmHEmitter<T0, T1, T2>>::fminm_h(self, rd, rs1, rs2);
33979 }
33980 /// RISC-V `fminm.q` instruction.
33981 ///
33982 /// # Forms
33983 /// Assembly: `fminm.q qd, qs1, qs2`
33984 /// Rust: `fminm_q(rd, rs1, rs2)`
33985 ///
33986 /// # Arguments
33987 /// - `rd` — Destination register.
33988 /// - `rs1` — Source register.
33989 /// - `rs2` — Source register.
33990 pub fn fminm_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
33991 where
33992 Self: FminmQEmitter<T0, T1, T2>,
33993 {
33994 <Self as FminmQEmitter<T0, T1, T2>>::fminm_q(self, rd, rs1, rs2);
33995 }
33996 /// RISC-V `fminm.s` instruction.
33997 ///
33998 /// # Forms
33999 /// Assembly: `fminm.s fd, fs1, fs2`
34000 /// Rust: `fminm_s(rd, rs1, rs2)`
34001 ///
34002 /// # Arguments
34003 /// - `rd` — Destination register.
34004 /// - `rs1` — Source register.
34005 /// - `rs2` — Source register.
34006 pub fn fminm_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34007 where
34008 Self: FminmSEmitter<T0, T1, T2>,
34009 {
34010 <Self as FminmSEmitter<T0, T1, T2>>::fminm_s(self, rd, rs1, rs2);
34011 }
34012 /// RISC-V `fmsub.d` instruction.
34013 ///
34014 /// # Forms
34015 /// Assembly: `fmsub.d xd, xs1, xs2, xs3, rm`
34016 /// Rust: `fmsub_d(rd, rs1, rs2, rs3, rm)`
34017 ///
34018 /// # Arguments
34019 /// - `rd` — Destination register.
34020 /// - `rs1` — Source register.
34021 /// - `rs2` — Source register.
34022 /// - `rs3` — Source register.
34023 /// - `rm` — Rounding mode.
34024 pub fn fmsub_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34025 where
34026 Self: FmsubDEmitter<T0, T1, T2, T3, T4>,
34027 {
34028 <Self as FmsubDEmitter<T0, T1, T2, T3, T4>>::fmsub_d(self, rd, rs1, rs2, rs3, rm);
34029 }
34030 /// RISC-V `fmsub.h` instruction.
34031 ///
34032 /// # Forms
34033 /// Assembly: `fmsub.h xd, xs1, xs2, xs3, rm`
34034 /// Rust: `fmsub_h(rd, rs1, rs2, rs3, rm)`
34035 ///
34036 /// # Arguments
34037 /// - `rd` — Destination register.
34038 /// - `rs1` — Source register.
34039 /// - `rs2` — Source register.
34040 /// - `rs3` — Source register.
34041 /// - `rm` — Rounding mode.
34042 pub fn fmsub_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34043 where
34044 Self: FmsubHEmitter<T0, T1, T2, T3, T4>,
34045 {
34046 <Self as FmsubHEmitter<T0, T1, T2, T3, T4>>::fmsub_h(self, rd, rs1, rs2, rs3, rm);
34047 }
34048 /// RISC-V `fmsub.q` instruction.
34049 ///
34050 /// # Forms
34051 /// Assembly: `fmsub.q qd, qs1, qs2, qs3, rm`
34052 /// Rust: `fmsub_q(rd, rs1, rs2, rs3, rm)`
34053 ///
34054 /// # Arguments
34055 /// - `rd` — Destination register.
34056 /// - `rs1` — Source register.
34057 /// - `rs2` — Source register.
34058 /// - `rs3` — Source register.
34059 /// - `rm` — Rounding mode.
34060 pub fn fmsub_q<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34061 where
34062 Self: FmsubQEmitter<T0, T1, T2, T3, T4>,
34063 {
34064 <Self as FmsubQEmitter<T0, T1, T2, T3, T4>>::fmsub_q(self, rd, rs1, rs2, rs3, rm);
34065 }
34066 /// RISC-V `fmsub.s` instruction.
34067 ///
34068 /// # Forms
34069 /// Assembly: `fmsub.s fd, fs1, fs2, fs3, rm`
34070 /// Rust: `fmsub_s(rd, rs1, rs2, rs3, rm)`
34071 ///
34072 /// # Arguments
34073 /// - `rd` — Destination register.
34074 /// - `rs1` — Source register.
34075 /// - `rs2` — Source register.
34076 /// - `rs3` — Source register.
34077 /// - `rm` — Rounding mode.
34078 pub fn fmsub_s<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34079 where
34080 Self: FmsubSEmitter<T0, T1, T2, T3, T4>,
34081 {
34082 <Self as FmsubSEmitter<T0, T1, T2, T3, T4>>::fmsub_s(self, rd, rs1, rs2, rs3, rm);
34083 }
34084 /// RISC-V `fmul.d` instruction.
34085 ///
34086 /// # Forms
34087 /// Assembly: `fmul.d xd, xs1, xs2, rm`
34088 /// Rust: `fmul_d(rd, rs1, rs2, rm)`
34089 ///
34090 /// # Arguments
34091 /// - `rd` — Destination register.
34092 /// - `rs1` — Source register.
34093 /// - `rs2` — Source register.
34094 /// - `rm` — Rounding mode.
34095 pub fn fmul_d<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
34096 where
34097 Self: FmulDEmitter<T0, T1, T2, T3>,
34098 {
34099 <Self as FmulDEmitter<T0, T1, T2, T3>>::fmul_d(self, rd, rs1, rs2, rm);
34100 }
34101 /// RISC-V `fmul.h` instruction.
34102 ///
34103 /// # Forms
34104 /// Assembly: `fmul.h xd, xs1, xs2, rm`
34105 /// Rust: `fmul_h(rd, rs1, rs2, rm)`
34106 ///
34107 /// # Arguments
34108 /// - `rd` — Destination register.
34109 /// - `rs1` — Source register.
34110 /// - `rs2` — Source register.
34111 /// - `rm` — Rounding mode.
34112 pub fn fmul_h<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
34113 where
34114 Self: FmulHEmitter<T0, T1, T2, T3>,
34115 {
34116 <Self as FmulHEmitter<T0, T1, T2, T3>>::fmul_h(self, rd, rs1, rs2, rm);
34117 }
34118 /// RISC-V `fmul.q` instruction.
34119 ///
34120 /// # Forms
34121 /// Assembly: `fmul.q qd, qs1, qs2, rm`
34122 /// Rust: `fmul_q(rd, rs1, rs2, rm)`
34123 ///
34124 /// # Arguments
34125 /// - `rd` — Destination register.
34126 /// - `rs1` — Source register.
34127 /// - `rs2` — Source register.
34128 /// - `rm` — Rounding mode.
34129 pub fn fmul_q<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
34130 where
34131 Self: FmulQEmitter<T0, T1, T2, T3>,
34132 {
34133 <Self as FmulQEmitter<T0, T1, T2, T3>>::fmul_q(self, rd, rs1, rs2, rm);
34134 }
34135 /// RISC-V `fmul.s` instruction.
34136 ///
34137 /// # Forms
34138 /// Assembly: `fmul.s fd, fs1, fs2, rm`
34139 /// Rust: `fmul_s(rd, rs1, rs2, rm)`
34140 ///
34141 /// # Arguments
34142 /// - `rd` — Destination register.
34143 /// - `rs1` — Source register.
34144 /// - `rs2` — Source register.
34145 /// - `rm` — Rounding mode.
34146 pub fn fmul_s<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
34147 where
34148 Self: FmulSEmitter<T0, T1, T2, T3>,
34149 {
34150 <Self as FmulSEmitter<T0, T1, T2, T3>>::fmul_s(self, rd, rs1, rs2, rm);
34151 }
34152 /// RISC-V `fmv.d` instruction.
34153 ///
34154 /// # Forms
34155 /// Assembly: `fmv.d rd rs1 rs2_eq_rs1`
34156 /// Rust: `fmv_d(rd, rs1, rs2)`
34157 ///
34158 /// # Arguments
34159 /// - `rd` — Destination register.
34160 /// - `rs1` — Source register.
34161 /// - `rs2` — Source register.
34162 pub fn fmv_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34163 where
34164 Self: FmvDEmitter<T0, T1, T2>,
34165 {
34166 <Self as FmvDEmitter<T0, T1, T2>>::fmv_d(self, rd, rs1, rs2);
34167 }
34168 /// RISC-V `fmv.d.x` instruction.
34169 ///
34170 /// # Forms
34171 /// Assembly: `fmv.d.x xd, xs1`
34172 /// Rust: `fmv_d_x(rd, rs1)`
34173 ///
34174 /// # Arguments
34175 /// - `rd` — Destination register.
34176 /// - `rs1` — Source register.
34177 pub fn fmv_d_x<T0, T1>(&mut self, rd: T0, rs1: T1)
34178 where
34179 Self: FmvDXEmitter<T0, T1>,
34180 {
34181 <Self as FmvDXEmitter<T0, T1>>::fmv_d_x(self, rd, rs1);
34182 }
34183 /// RISC-V `fmv.h` instruction.
34184 ///
34185 /// # Forms
34186 /// Assembly: `fmv.h rd rs1 rs2_eq_rs1`
34187 /// Rust: `fmv_h(rd, rs1, rs2)`
34188 ///
34189 /// # Arguments
34190 /// - `rd` — Destination register.
34191 /// - `rs1` — Source register.
34192 /// - `rs2` — Source register.
34193 pub fn fmv_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34194 where
34195 Self: FmvHEmitter<T0, T1, T2>,
34196 {
34197 <Self as FmvHEmitter<T0, T1, T2>>::fmv_h(self, rd, rs1, rs2);
34198 }
34199 /// Half-precision floating-point move from integer
34200 ///
34201 /// Moves the half-precision value encoded in IEEE 754-2008 standard encoding
34202 /// from the lower 16 bits of integer register `rs1` to the floating-point
34203 /// register `fd`. The bits are not modified in the transfer, and in particular,
34204 /// the payloads of non-canonical NaNs are preserved.
34205 ///
34206 /// # Forms
34207 /// Assembly: `fmv.h.x fd, xs1`
34208 /// Rust: `fmv_h_x(rd, rs1)`
34209 ///
34210 /// # Arguments
34211 /// - `rd` — Destination register.
34212 /// - `rs1` — Source register.
34213 pub fn fmv_h_x<T0, T1>(&mut self, rd: T0, rs1: T1)
34214 where
34215 Self: FmvHXEmitter<T0, T1>,
34216 {
34217 <Self as FmvHXEmitter<T0, T1>>::fmv_h_x(self, rd, rs1);
34218 }
34219 /// RISC-V `fmv.q` instruction.
34220 ///
34221 /// # Forms
34222 /// Assembly: `fmv.q rd rs1 rs2_eq_rs1`
34223 /// Rust: `fmv_q(rd, rs1, rs2)`
34224 ///
34225 /// # Arguments
34226 /// - `rd` — Destination register.
34227 /// - `rs1` — Source register.
34228 /// - `rs2` — Source register.
34229 pub fn fmv_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34230 where
34231 Self: FmvQEmitter<T0, T1, T2>,
34232 {
34233 <Self as FmvQEmitter<T0, T1, T2>>::fmv_q(self, rd, rs1, rs2);
34234 }
34235 /// RISC-V `fmv.s` instruction.
34236 ///
34237 /// # Forms
34238 /// Assembly: `fmv.s rd rs1 rs2_eq_rs1`
34239 /// Rust: `fmv_s(rd, rs1, rs2)`
34240 ///
34241 /// # Arguments
34242 /// - `rd` — Destination register.
34243 /// - `rs1` — Source register.
34244 /// - `rs2` — Source register.
34245 pub fn fmv_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34246 where
34247 Self: FmvSEmitter<T0, T1, T2>,
34248 {
34249 <Self as FmvSEmitter<T0, T1, T2>>::fmv_s(self, rd, rs1, rs2);
34250 }
34251 /// RISC-V `fmv.s.x` instruction.
34252 ///
34253 /// # Forms
34254 /// Assembly: `fmv.s.x rd rs1`
34255 /// Rust: `fmv_s_x(rd, rs1)`
34256 ///
34257 /// # Arguments
34258 /// - `rd` — Destination register.
34259 /// - `rs1` — Source register.
34260 pub fn fmv_s_x<T0, T1>(&mut self, rd: T0, rs1: T1)
34261 where
34262 Self: FmvSXEmitter<T0, T1>,
34263 {
34264 <Self as FmvSXEmitter<T0, T1>>::fmv_s_x(self, rd, rs1);
34265 }
34266 /// Single-precision floating-point move from integer
34267 ///
34268 /// Moves the single-precision value encoded in IEEE 754-2008 standard encoding
34269 /// from the lower 32 bits of integer register `rs1` to the floating-point
34270 /// register `fd`. The bits are not modified in the transfer, and in particular,
34271 /// the payloads of non-canonical NaNs are preserved.
34272 ///
34273 /// # Forms
34274 /// Assembly: `fmv.w.x fd, xs1`
34275 /// Rust: `fmv_w_x(rd, rs1)`
34276 ///
34277 /// # Arguments
34278 /// - `rd` — Destination register.
34279 /// - `rs1` — Source register.
34280 pub fn fmv_w_x<T0, T1>(&mut self, rd: T0, rs1: T1)
34281 where
34282 Self: FmvWXEmitter<T0, T1>,
34283 {
34284 <Self as FmvWXEmitter<T0, T1>>::fmv_w_x(self, rd, rs1);
34285 }
34286 /// RISC-V `fmv.x.d` instruction.
34287 ///
34288 /// # Forms
34289 /// Assembly: `fmv.x.d xd, xs1`
34290 /// Rust: `fmv_x_d(rd, rs1)`
34291 ///
34292 /// # Arguments
34293 /// - `rd` — Destination register.
34294 /// - `rs1` — Source register.
34295 pub fn fmv_x_d<T0, T1>(&mut self, rd: T0, rs1: T1)
34296 where
34297 Self: FmvXDEmitter<T0, T1>,
34298 {
34299 <Self as FmvXDEmitter<T0, T1>>::fmv_x_d(self, rd, rs1);
34300 }
34301 /// Move half-precision value from floating-point to integer register
34302 ///
34303 /// Moves the half-precision value in floating-point register rs1 represented in IEEE 754-2008
34304 /// encoding to the lower 16 bits of integer register rd.
34305 ///
34306 /// The bits are not modified in the transfer, and in particular, the payloads of non-canonical
34307 /// NaNs are preserved.
34308 ///
34309 /// The highest XLEN-16 bits of the destination register are filled with copies of the
34310 /// floating-point number's sign bit.
34311 ///
34312 /// # Forms
34313 /// Assembly: `fmv.x.h rd, fs1`
34314 /// Rust: `fmv_x_h(rd, rs1)`
34315 ///
34316 /// # Arguments
34317 /// - `rd` — Destination register.
34318 /// - `rs1` — Source register.
34319 pub fn fmv_x_h<T0, T1>(&mut self, rd: T0, rs1: T1)
34320 where
34321 Self: FmvXHEmitter<T0, T1>,
34322 {
34323 <Self as FmvXHEmitter<T0, T1>>::fmv_x_h(self, rd, rs1);
34324 }
34325 /// RISC-V `fmv.x.s` instruction.
34326 ///
34327 /// # Forms
34328 /// Assembly: `fmv.x.s rd rs1`
34329 /// Rust: `fmv_x_s(rd, rs1)`
34330 ///
34331 /// # Arguments
34332 /// - `rd` — Destination register.
34333 /// - `rs1` — Source register.
34334 pub fn fmv_x_s<T0, T1>(&mut self, rd: T0, rs1: T1)
34335 where
34336 Self: FmvXSEmitter<T0, T1>,
34337 {
34338 <Self as FmvXSEmitter<T0, T1>>::fmv_x_s(self, rd, rs1);
34339 }
34340 /// Move single-precision value from floating-point to integer register
34341 ///
34342 /// Moves the single-precision value in floating-point register rs1 represented in IEEE 754-2008
34343 /// encoding to the lower 32 bits of integer register rd.
34344 /// The bits are not modified in the transfer, and in particular, the payloads of non-canonical
34345 /// NaNs are preserved.
34346 /// For RV64, the higher 32 bits of the destination register are filled with copies of the
34347 /// floating-point number's sign bit.
34348 ///
34349 /// # Forms
34350 /// Assembly: `fmv.x.w xd, fs1`
34351 /// Rust: `fmv_x_w(rd, rs1)`
34352 ///
34353 /// # Arguments
34354 /// - `rd` — Destination register.
34355 /// - `rs1` — Source register.
34356 pub fn fmv_x_w<T0, T1>(&mut self, rd: T0, rs1: T1)
34357 where
34358 Self: FmvXWEmitter<T0, T1>,
34359 {
34360 <Self as FmvXWEmitter<T0, T1>>::fmv_x_w(self, rd, rs1);
34361 }
34362 /// RISC-V `fmvh.x.d` instruction.
34363 ///
34364 /// # Forms
34365 /// Assembly: `fmvh.x.d xd, xs1`
34366 /// Rust: `fmvh_x_d(rd, rs1)`
34367 ///
34368 /// # Arguments
34369 /// - `rd` — Destination register.
34370 /// - `rs1` — Source register.
34371 pub fn fmvh_x_d<T0, T1>(&mut self, rd: T0, rs1: T1)
34372 where
34373 Self: FmvhXDEmitter<T0, T1>,
34374 {
34375 <Self as FmvhXDEmitter<T0, T1>>::fmvh_x_d(self, rd, rs1);
34376 }
34377 /// RISC-V `fmvh.x.q` instruction.
34378 ///
34379 /// # Forms
34380 /// Assembly: `fmvh.x.q xd, qs1`
34381 /// Rust: `fmvh_x_q(rd, rs1)`
34382 ///
34383 /// # Arguments
34384 /// - `rd` — Destination register.
34385 /// - `rs1` — Source register.
34386 pub fn fmvh_x_q<T0, T1>(&mut self, rd: T0, rs1: T1)
34387 where
34388 Self: FmvhXQEmitter<T0, T1>,
34389 {
34390 <Self as FmvhXQEmitter<T0, T1>>::fmvh_x_q(self, rd, rs1);
34391 }
34392 /// RISC-V `fmvp.d.x` instruction.
34393 ///
34394 /// # Forms
34395 /// Assembly: `fmvp.d.x xd, xs1, xs2`
34396 /// Rust: `fmvp_d_x(rd, rs1, rs2)`
34397 ///
34398 /// # Arguments
34399 /// - `rd` — Destination register.
34400 /// - `rs1` — Source register.
34401 /// - `rs2` — Source register.
34402 pub fn fmvp_d_x<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34403 where
34404 Self: FmvpDXEmitter<T0, T1, T2>,
34405 {
34406 <Self as FmvpDXEmitter<T0, T1, T2>>::fmvp_d_x(self, rd, rs1, rs2);
34407 }
34408 /// RISC-V `fmvp.q.x` instruction.
34409 ///
34410 /// # Forms
34411 /// Assembly: `fmvp.q.x qd, xs1, xs2`
34412 /// Rust: `fmvp_q_x(rd, rs1, rs2)`
34413 ///
34414 /// # Arguments
34415 /// - `rd` — Destination register.
34416 /// - `rs1` — Source register.
34417 /// - `rs2` — Source register.
34418 pub fn fmvp_q_x<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34419 where
34420 Self: FmvpQXEmitter<T0, T1, T2>,
34421 {
34422 <Self as FmvpQXEmitter<T0, T1, T2>>::fmvp_q_x(self, rd, rs1, rs2);
34423 }
34424 /// RISC-V `fneg.d` instruction.
34425 ///
34426 /// # Forms
34427 /// Assembly: `fneg.d rd rs1 rs2_eq_rs1`
34428 /// Rust: `fneg_d(rd, rs1, rs2)`
34429 ///
34430 /// # Arguments
34431 /// - `rd` — Destination register.
34432 /// - `rs1` — Source register.
34433 /// - `rs2` — Source register.
34434 pub fn fneg_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34435 where
34436 Self: FnegDEmitter<T0, T1, T2>,
34437 {
34438 <Self as FnegDEmitter<T0, T1, T2>>::fneg_d(self, rd, rs1, rs2);
34439 }
34440 /// RISC-V `fneg.h` instruction.
34441 ///
34442 /// # Forms
34443 /// Assembly: `fneg.h rd rs1 rs2_eq_rs1`
34444 /// Rust: `fneg_h(rd, rs1, rs2)`
34445 ///
34446 /// # Arguments
34447 /// - `rd` — Destination register.
34448 /// - `rs1` — Source register.
34449 /// - `rs2` — Source register.
34450 pub fn fneg_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34451 where
34452 Self: FnegHEmitter<T0, T1, T2>,
34453 {
34454 <Self as FnegHEmitter<T0, T1, T2>>::fneg_h(self, rd, rs1, rs2);
34455 }
34456 /// RISC-V `fneg.q` instruction.
34457 ///
34458 /// # Forms
34459 /// Assembly: `fneg.q rd rs1 rs2_eq_rs1`
34460 /// Rust: `fneg_q(rd, rs1, rs2)`
34461 ///
34462 /// # Arguments
34463 /// - `rd` — Destination register.
34464 /// - `rs1` — Source register.
34465 /// - `rs2` — Source register.
34466 pub fn fneg_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34467 where
34468 Self: FnegQEmitter<T0, T1, T2>,
34469 {
34470 <Self as FnegQEmitter<T0, T1, T2>>::fneg_q(self, rd, rs1, rs2);
34471 }
34472 /// RISC-V `fneg.s` instruction.
34473 ///
34474 /// # Forms
34475 /// Assembly: `fneg.s rd rs1 rs2_eq_rs1`
34476 /// Rust: `fneg_s(rd, rs1, rs2)`
34477 ///
34478 /// # Arguments
34479 /// - `rd` — Destination register.
34480 /// - `rs1` — Source register.
34481 /// - `rs2` — Source register.
34482 pub fn fneg_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34483 where
34484 Self: FnegSEmitter<T0, T1, T2>,
34485 {
34486 <Self as FnegSEmitter<T0, T1, T2>>::fneg_s(self, rd, rs1, rs2);
34487 }
34488 /// RISC-V `fnmadd.d` instruction.
34489 ///
34490 /// # Forms
34491 /// Assembly: `fnmadd.d xd, xs1, xs2, xs3, rm`
34492 /// Rust: `fnmadd_d(rd, rs1, rs2, rs3, rm)`
34493 ///
34494 /// # Arguments
34495 /// - `rd` — Destination register.
34496 /// - `rs1` — Source register.
34497 /// - `rs2` — Source register.
34498 /// - `rs3` — Source register.
34499 /// - `rm` — Rounding mode.
34500 pub fn fnmadd_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34501 where
34502 Self: FnmaddDEmitter<T0, T1, T2, T3, T4>,
34503 {
34504 <Self as FnmaddDEmitter<T0, T1, T2, T3, T4>>::fnmadd_d(self, rd, rs1, rs2, rs3, rm);
34505 }
34506 /// RISC-V `fnmadd.h` instruction.
34507 ///
34508 /// # Forms
34509 /// Assembly: `fnmadd.h xd, xs1, xs2, xs3, rm`
34510 /// Rust: `fnmadd_h(rd, rs1, rs2, rs3, rm)`
34511 ///
34512 /// # Arguments
34513 /// - `rd` — Destination register.
34514 /// - `rs1` — Source register.
34515 /// - `rs2` — Source register.
34516 /// - `rs3` — Source register.
34517 /// - `rm` — Rounding mode.
34518 pub fn fnmadd_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34519 where
34520 Self: FnmaddHEmitter<T0, T1, T2, T3, T4>,
34521 {
34522 <Self as FnmaddHEmitter<T0, T1, T2, T3, T4>>::fnmadd_h(self, rd, rs1, rs2, rs3, rm);
34523 }
34524 /// RISC-V `fnmadd.q` instruction.
34525 ///
34526 /// # Forms
34527 /// Assembly: `fnmadd.q qd, qs1, qs2, qs3, rm`
34528 /// Rust: `fnmadd_q(rd, rs1, rs2, rs3, rm)`
34529 ///
34530 /// # Arguments
34531 /// - `rd` — Destination register.
34532 /// - `rs1` — Source register.
34533 /// - `rs2` — Source register.
34534 /// - `rs3` — Source register.
34535 /// - `rm` — Rounding mode.
34536 pub fn fnmadd_q<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34537 where
34538 Self: FnmaddQEmitter<T0, T1, T2, T3, T4>,
34539 {
34540 <Self as FnmaddQEmitter<T0, T1, T2, T3, T4>>::fnmadd_q(self, rd, rs1, rs2, rs3, rm);
34541 }
34542 /// RISC-V `fnmadd.s` instruction.
34543 ///
34544 /// # Forms
34545 /// Assembly: `fnmadd.s fd, fs1, fs2, fs3, rm`
34546 /// Rust: `fnmadd_s(rd, rs1, rs2, rs3, rm)`
34547 ///
34548 /// # Arguments
34549 /// - `rd` — Destination register.
34550 /// - `rs1` — Source register.
34551 /// - `rs2` — Source register.
34552 /// - `rs3` — Source register.
34553 /// - `rm` — Rounding mode.
34554 pub fn fnmadd_s<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34555 where
34556 Self: FnmaddSEmitter<T0, T1, T2, T3, T4>,
34557 {
34558 <Self as FnmaddSEmitter<T0, T1, T2, T3, T4>>::fnmadd_s(self, rd, rs1, rs2, rs3, rm);
34559 }
34560 /// RISC-V `fnmsub.d` instruction.
34561 ///
34562 /// # Forms
34563 /// Assembly: `fnmsub.d xd, xs1, xs2, xs3, rm`
34564 /// Rust: `fnmsub_d(rd, rs1, rs2, rs3, rm)`
34565 ///
34566 /// # Arguments
34567 /// - `rd` — Destination register.
34568 /// - `rs1` — Source register.
34569 /// - `rs2` — Source register.
34570 /// - `rs3` — Source register.
34571 /// - `rm` — Rounding mode.
34572 pub fn fnmsub_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34573 where
34574 Self: FnmsubDEmitter<T0, T1, T2, T3, T4>,
34575 {
34576 <Self as FnmsubDEmitter<T0, T1, T2, T3, T4>>::fnmsub_d(self, rd, rs1, rs2, rs3, rm);
34577 }
34578 /// RISC-V `fnmsub.h` instruction.
34579 ///
34580 /// # Forms
34581 /// Assembly: `fnmsub.h xd, xs1, xs2, xs3, rm`
34582 /// Rust: `fnmsub_h(rd, rs1, rs2, rs3, rm)`
34583 ///
34584 /// # Arguments
34585 /// - `rd` — Destination register.
34586 /// - `rs1` — Source register.
34587 /// - `rs2` — Source register.
34588 /// - `rs3` — Source register.
34589 /// - `rm` — Rounding mode.
34590 pub fn fnmsub_h<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34591 where
34592 Self: FnmsubHEmitter<T0, T1, T2, T3, T4>,
34593 {
34594 <Self as FnmsubHEmitter<T0, T1, T2, T3, T4>>::fnmsub_h(self, rd, rs1, rs2, rs3, rm);
34595 }
34596 /// RISC-V `fnmsub.q` instruction.
34597 ///
34598 /// # Forms
34599 /// Assembly: `fnmsub.q qd, qs1, qs2, qs3, rm`
34600 /// Rust: `fnmsub_q(rd, rs1, rs2, rs3, rm)`
34601 ///
34602 /// # Arguments
34603 /// - `rd` — Destination register.
34604 /// - `rs1` — Source register.
34605 /// - `rs2` — Source register.
34606 /// - `rs3` — Source register.
34607 /// - `rm` — Rounding mode.
34608 pub fn fnmsub_q<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34609 where
34610 Self: FnmsubQEmitter<T0, T1, T2, T3, T4>,
34611 {
34612 <Self as FnmsubQEmitter<T0, T1, T2, T3, T4>>::fnmsub_q(self, rd, rs1, rs2, rs3, rm);
34613 }
34614 /// RISC-V `fnmsub.s` instruction.
34615 ///
34616 /// # Forms
34617 /// Assembly: `fnmsub.s xd, xs1, xs2, xs3, rm`
34618 /// Rust: `fnmsub_s(rd, rs1, rs2, rs3, rm)`
34619 ///
34620 /// # Arguments
34621 /// - `rd` — Destination register.
34622 /// - `rs1` — Source register.
34623 /// - `rs2` — Source register.
34624 /// - `rs3` — Source register.
34625 /// - `rm` — Rounding mode.
34626 pub fn fnmsub_s<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, rs3: T3, rm: T4)
34627 where
34628 Self: FnmsubSEmitter<T0, T1, T2, T3, T4>,
34629 {
34630 <Self as FnmsubSEmitter<T0, T1, T2, T3, T4>>::fnmsub_s(self, rd, rs1, rs2, rs3, rm);
34631 }
34632 /// RISC-V `frcsr` instruction.
34633 ///
34634 /// # Forms
34635 /// Assembly: `frcsr rd`
34636 /// Rust: `frcsr(rd)`
34637 ///
34638 /// # Arguments
34639 /// - `rd` — Destination register.
34640 pub fn frcsr<T0>(&mut self, rd: T0)
34641 where
34642 Self: FrcsrEmitter<T0>,
34643 {
34644 <Self as FrcsrEmitter<T0>>::frcsr(self, rd);
34645 }
34646 /// RISC-V `frflags` instruction.
34647 ///
34648 /// # Forms
34649 /// Assembly: `frflags rd`
34650 /// Rust: `frflags(rd)`
34651 ///
34652 /// # Arguments
34653 /// - `rd` — Destination register.
34654 pub fn frflags<T0>(&mut self, rd: T0)
34655 where
34656 Self: FrflagsEmitter<T0>,
34657 {
34658 <Self as FrflagsEmitter<T0>>::frflags(self, rd);
34659 }
34660 /// RISC-V `fround.d` instruction.
34661 ///
34662 /// # Forms
34663 /// Assembly: `fround.d xd, xs1, rm`
34664 /// Rust: `fround_d(rd, rs1, rm)`
34665 ///
34666 /// # Arguments
34667 /// - `rd` — Destination register.
34668 /// - `rs1` — Source register.
34669 /// - `rm` — Rounding mode.
34670 pub fn fround_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
34671 where
34672 Self: FroundDEmitter<T0, T1, T2>,
34673 {
34674 <Self as FroundDEmitter<T0, T1, T2>>::fround_d(self, rd, rs1, rm);
34675 }
34676 /// RISC-V `fround.h` instruction.
34677 ///
34678 /// # Forms
34679 /// Assembly: `fround.h xd, xs1, rm`
34680 /// Rust: `fround_h(rd, rs1, rm)`
34681 ///
34682 /// # Arguments
34683 /// - `rd` — Destination register.
34684 /// - `rs1` — Source register.
34685 /// - `rm` — Rounding mode.
34686 pub fn fround_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
34687 where
34688 Self: FroundHEmitter<T0, T1, T2>,
34689 {
34690 <Self as FroundHEmitter<T0, T1, T2>>::fround_h(self, rd, rs1, rm);
34691 }
34692 /// RISC-V `fround.q` instruction.
34693 ///
34694 /// # Forms
34695 /// Assembly: `fround.q qd, qs1, rm`
34696 /// Rust: `fround_q(rd, rs1, rm)`
34697 ///
34698 /// # Arguments
34699 /// - `rd` — Destination register.
34700 /// - `rs1` — Source register.
34701 /// - `rm` — Rounding mode.
34702 pub fn fround_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
34703 where
34704 Self: FroundQEmitter<T0, T1, T2>,
34705 {
34706 <Self as FroundQEmitter<T0, T1, T2>>::fround_q(self, rd, rs1, rm);
34707 }
34708 /// RISC-V `fround.s` instruction.
34709 ///
34710 /// # Forms
34711 /// Assembly: `fround.s fd, xs1, rm`
34712 /// Rust: `fround_s(rd, rs1, rm)`
34713 ///
34714 /// # Arguments
34715 /// - `rd` — Destination register.
34716 /// - `rs1` — Source register.
34717 /// - `rm` — Rounding mode.
34718 pub fn fround_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
34719 where
34720 Self: FroundSEmitter<T0, T1, T2>,
34721 {
34722 <Self as FroundSEmitter<T0, T1, T2>>::fround_s(self, rd, rs1, rm);
34723 }
34724 /// RISC-V `froundnx.d` instruction.
34725 ///
34726 /// # Forms
34727 /// Assembly: `froundnx.d xd, xs1, rm`
34728 /// Rust: `froundnx_d(rd, rs1, rm)`
34729 ///
34730 /// # Arguments
34731 /// - `rd` — Destination register.
34732 /// - `rs1` — Source register.
34733 /// - `rm` — Rounding mode.
34734 pub fn froundnx_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
34735 where
34736 Self: FroundnxDEmitter<T0, T1, T2>,
34737 {
34738 <Self as FroundnxDEmitter<T0, T1, T2>>::froundnx_d(self, rd, rs1, rm);
34739 }
34740 /// RISC-V `froundnx.h` instruction.
34741 ///
34742 /// # Forms
34743 /// Assembly: `froundnx.h xd, xs1, rm`
34744 /// Rust: `froundnx_h(rd, rs1, rm)`
34745 ///
34746 /// # Arguments
34747 /// - `rd` — Destination register.
34748 /// - `rs1` — Source register.
34749 /// - `rm` — Rounding mode.
34750 pub fn froundnx_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
34751 where
34752 Self: FroundnxHEmitter<T0, T1, T2>,
34753 {
34754 <Self as FroundnxHEmitter<T0, T1, T2>>::froundnx_h(self, rd, rs1, rm);
34755 }
34756 /// RISC-V `froundnx.q` instruction.
34757 ///
34758 /// # Forms
34759 /// Assembly: `froundnx.q qd, qs1, rm`
34760 /// Rust: `froundnx_q(rd, rs1, rm)`
34761 ///
34762 /// # Arguments
34763 /// - `rd` — Destination register.
34764 /// - `rs1` — Source register.
34765 /// - `rm` — Rounding mode.
34766 pub fn froundnx_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
34767 where
34768 Self: FroundnxQEmitter<T0, T1, T2>,
34769 {
34770 <Self as FroundnxQEmitter<T0, T1, T2>>::froundnx_q(self, rd, rs1, rm);
34771 }
34772 /// RISC-V `froundnx.s` instruction.
34773 ///
34774 /// # Forms
34775 /// Assembly: `froundnx.s fd, rs1, rm`
34776 /// Rust: `froundnx_s(rd, rs1, rm)`
34777 ///
34778 /// # Arguments
34779 /// - `rd` — Destination register.
34780 /// - `rs1` — Source register.
34781 /// - `rm` — Rounding mode.
34782 pub fn froundnx_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
34783 where
34784 Self: FroundnxSEmitter<T0, T1, T2>,
34785 {
34786 <Self as FroundnxSEmitter<T0, T1, T2>>::froundnx_s(self, rd, rs1, rm);
34787 }
34788 /// RISC-V `frrm` instruction.
34789 ///
34790 /// # Forms
34791 /// Assembly: `frrm rd`
34792 /// Rust: `frrm(rd)`
34793 ///
34794 /// # Arguments
34795 /// - `rd` — Destination register.
34796 pub fn frrm<T0>(&mut self, rd: T0)
34797 where
34798 Self: FrrmEmitter<T0>,
34799 {
34800 <Self as FrrmEmitter<T0>>::frrm(self, rd);
34801 }
34802 /// RISC-V `fscsr` instruction.
34803 ///
34804 /// # Forms
34805 /// Assembly: `fscsr rd rs1`
34806 /// Rust: `fscsr(rd, rs1)`
34807 ///
34808 /// # Arguments
34809 /// - `rd` — Destination register.
34810 /// - `rs1` — Source register.
34811 pub fn fscsr<T0, T1>(&mut self, rd: T0, rs1: T1)
34812 where
34813 Self: FscsrEmitter<T0, T1>,
34814 {
34815 <Self as FscsrEmitter<T0, T1>>::fscsr(self, rd, rs1);
34816 }
34817 /// RISC-V `fsd` instruction.
34818 ///
34819 /// # Forms
34820 /// Assembly: `fsd xs1, xs2, imm`
34821 /// Rust: `fsd(rs1, rs2, imm)`
34822 ///
34823 /// # Arguments
34824 /// - `rs1` — Memory base register.
34825 /// - `rs2` — Source register.
34826 /// - `imm` — Immediate encoding value.
34827 pub fn fsd<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
34828 where
34829 Self: FsdEmitter<T0, T1, T2>,
34830 {
34831 <Self as FsdEmitter<T0, T1, T2>>::fsd(self, rs1, rs2, imm);
34832 }
34833 /// RISC-V `fsflags` instruction.
34834 ///
34835 /// # Forms
34836 /// Assembly: `fsflags rd rs1`
34837 /// Rust: `fsflags(rd, rs1)`
34838 ///
34839 /// # Arguments
34840 /// - `rd` — Destination register.
34841 /// - `rs1` — Source register.
34842 pub fn fsflags<T0, T1>(&mut self, rd: T0, rs1: T1)
34843 where
34844 Self: FsflagsEmitter<T0, T1>,
34845 {
34846 <Self as FsflagsEmitter<T0, T1>>::fsflags(self, rd, rs1);
34847 }
34848 /// RISC-V `fsflagsi` instruction.
34849 ///
34850 /// # Forms
34851 /// Assembly: `fsflagsi rd zimm5`
34852 /// Rust: `fsflagsi(rd, zimm5)`
34853 ///
34854 /// # Arguments
34855 /// - `rd` — Destination register.
34856 /// - `zimm5` — Immediate encoding value.
34857 pub fn fsflagsi<T0, T1>(&mut self, rd: T0, zimm5: T1)
34858 where
34859 Self: FsflagsiEmitter<T0, T1>,
34860 {
34861 <Self as FsflagsiEmitter<T0, T1>>::fsflagsi(self, rd, zimm5);
34862 }
34863 /// RISC-V `fsgnj.d` instruction.
34864 ///
34865 /// # Forms
34866 /// Assembly: `fsgnj.d xd, xs1, xs2`
34867 /// Rust: `fsgnj_d(rd, rs1, rs2)`
34868 ///
34869 /// # Arguments
34870 /// - `rd` — Destination register.
34871 /// - `rs1` — Source register.
34872 /// - `rs2` — Source register.
34873 pub fn fsgnj_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34874 where
34875 Self: FsgnjDEmitter<T0, T1, T2>,
34876 {
34877 <Self as FsgnjDEmitter<T0, T1, T2>>::fsgnj_d(self, rd, rs1, rs2);
34878 }
34879 /// RISC-V `fsgnj.h` instruction.
34880 ///
34881 /// # Forms
34882 /// Assembly: `fsgnj.h xd, xs1, xs2`
34883 /// Rust: `fsgnj_h(rd, rs1, rs2)`
34884 ///
34885 /// # Arguments
34886 /// - `rd` — Destination register.
34887 /// - `rs1` — Source register.
34888 /// - `rs2` — Source register.
34889 pub fn fsgnj_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34890 where
34891 Self: FsgnjHEmitter<T0, T1, T2>,
34892 {
34893 <Self as FsgnjHEmitter<T0, T1, T2>>::fsgnj_h(self, rd, rs1, rs2);
34894 }
34895 /// RISC-V `fsgnj.q` instruction.
34896 ///
34897 /// # Forms
34898 /// Assembly: `fsgnj.q qd, qs1, qs2`
34899 /// Rust: `fsgnj_q(rd, rs1, rs2)`
34900 ///
34901 /// # Arguments
34902 /// - `rd` — Destination register.
34903 /// - `rs1` — Source register.
34904 /// - `rs2` — Source register.
34905 pub fn fsgnj_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34906 where
34907 Self: FsgnjQEmitter<T0, T1, T2>,
34908 {
34909 <Self as FsgnjQEmitter<T0, T1, T2>>::fsgnj_q(self, rd, rs1, rs2);
34910 }
34911 /// Single-precision sign inject
34912 ///
34913 /// Writes _fd_ with sign bit of _fs2_ and the exponent and mantissa of _fs1_.
34914 ///
34915 /// Sign-injection instructions do not set floating-point exception flags, nor do they canonicalize NaNs.
34916 ///
34917 /// # Forms
34918 /// Assembly: `fsgnj.s fd, fs1, fs2`
34919 /// Rust: `fsgnj_s(rd, rs1, rs2)`
34920 ///
34921 /// # Arguments
34922 /// - `rd` — Destination register.
34923 /// - `rs1` — Source register.
34924 /// - `rs2` — Source register.
34925 pub fn fsgnj_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34926 where
34927 Self: FsgnjSEmitter<T0, T1, T2>,
34928 {
34929 <Self as FsgnjSEmitter<T0, T1, T2>>::fsgnj_s(self, rd, rs1, rs2);
34930 }
34931 /// RISC-V `fsgnjn.d` instruction.
34932 ///
34933 /// # Forms
34934 /// Assembly: `fsgnjn.d xd, xs1, xs2`
34935 /// Rust: `fsgnjn_d(rd, rs1, rs2)`
34936 ///
34937 /// # Arguments
34938 /// - `rd` — Destination register.
34939 /// - `rs1` — Source register.
34940 /// - `rs2` — Source register.
34941 pub fn fsgnjn_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34942 where
34943 Self: FsgnjnDEmitter<T0, T1, T2>,
34944 {
34945 <Self as FsgnjnDEmitter<T0, T1, T2>>::fsgnjn_d(self, rd, rs1, rs2);
34946 }
34947 /// RISC-V `fsgnjn.h` instruction.
34948 ///
34949 /// # Forms
34950 /// Assembly: `fsgnjn.h xd, xs1, xs2`
34951 /// Rust: `fsgnjn_h(rd, rs1, rs2)`
34952 ///
34953 /// # Arguments
34954 /// - `rd` — Destination register.
34955 /// - `rs1` — Source register.
34956 /// - `rs2` — Source register.
34957 pub fn fsgnjn_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34958 where
34959 Self: FsgnjnHEmitter<T0, T1, T2>,
34960 {
34961 <Self as FsgnjnHEmitter<T0, T1, T2>>::fsgnjn_h(self, rd, rs1, rs2);
34962 }
34963 /// RISC-V `fsgnjn.q` instruction.
34964 ///
34965 /// # Forms
34966 /// Assembly: `fsgnjn.q qd, qs1, qs2`
34967 /// Rust: `fsgnjn_q(rd, rs1, rs2)`
34968 ///
34969 /// # Arguments
34970 /// - `rd` — Destination register.
34971 /// - `rs1` — Source register.
34972 /// - `rs2` — Source register.
34973 pub fn fsgnjn_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34974 where
34975 Self: FsgnjnQEmitter<T0, T1, T2>,
34976 {
34977 <Self as FsgnjnQEmitter<T0, T1, T2>>::fsgnjn_q(self, rd, rs1, rs2);
34978 }
34979 /// Single-precision sign inject negate
34980 ///
34981 /// Writes _fd_ with the opposite of the sign bit of _fs2_ and the exponent and mantissa of _fs1_.
34982 ///
34983 /// Sign-injection instructions do not set floating-point exception flags, nor do they canonicalize NaNs.
34984 ///
34985 /// # Forms
34986 /// Assembly: `fsgnjn.s fd, fs1, fs2`
34987 /// Rust: `fsgnjn_s(rd, rs1, rs2)`
34988 ///
34989 /// # Arguments
34990 /// - `rd` — Destination register.
34991 /// - `rs1` — Source register.
34992 /// - `rs2` — Source register.
34993 pub fn fsgnjn_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
34994 where
34995 Self: FsgnjnSEmitter<T0, T1, T2>,
34996 {
34997 <Self as FsgnjnSEmitter<T0, T1, T2>>::fsgnjn_s(self, rd, rs1, rs2);
34998 }
34999 /// RISC-V `fsgnjx.d` instruction.
35000 ///
35001 /// # Forms
35002 /// Assembly: `fsgnjx.d xd, xs1, xs2`
35003 /// Rust: `fsgnjx_d(rd, rs1, rs2)`
35004 ///
35005 /// # Arguments
35006 /// - `rd` — Destination register.
35007 /// - `rs1` — Source register.
35008 /// - `rs2` — Source register.
35009 pub fn fsgnjx_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
35010 where
35011 Self: FsgnjxDEmitter<T0, T1, T2>,
35012 {
35013 <Self as FsgnjxDEmitter<T0, T1, T2>>::fsgnjx_d(self, rd, rs1, rs2);
35014 }
35015 /// RISC-V `fsgnjx.h` instruction.
35016 ///
35017 /// # Forms
35018 /// Assembly: `fsgnjx.h xd, xs1, xs2`
35019 /// Rust: `fsgnjx_h(rd, rs1, rs2)`
35020 ///
35021 /// # Arguments
35022 /// - `rd` — Destination register.
35023 /// - `rs1` — Source register.
35024 /// - `rs2` — Source register.
35025 pub fn fsgnjx_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
35026 where
35027 Self: FsgnjxHEmitter<T0, T1, T2>,
35028 {
35029 <Self as FsgnjxHEmitter<T0, T1, T2>>::fsgnjx_h(self, rd, rs1, rs2);
35030 }
35031 /// RISC-V `fsgnjx.q` instruction.
35032 ///
35033 /// # Forms
35034 /// Assembly: `fsgnjx.q qd, qs1, qs2`
35035 /// Rust: `fsgnjx_q(rd, rs1, rs2)`
35036 ///
35037 /// # Arguments
35038 /// - `rd` — Destination register.
35039 /// - `rs1` — Source register.
35040 /// - `rs2` — Source register.
35041 pub fn fsgnjx_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
35042 where
35043 Self: FsgnjxQEmitter<T0, T1, T2>,
35044 {
35045 <Self as FsgnjxQEmitter<T0, T1, T2>>::fsgnjx_q(self, rd, rs1, rs2);
35046 }
35047 /// Single-precision sign inject exclusive or
35048 ///
35049 /// Writes _fd_ with the xor of the sign bits of _fs2_ and _fs1_ and the exponent and mantissa of _fs1_.
35050 ///
35051 /// Sign-injection instructions do not set floating-point exception flags, nor do they canonicalize NaNs.
35052 ///
35053 /// # Forms
35054 /// Assembly: `fsgnjx.s fd, fs1, fs2`
35055 /// Rust: `fsgnjx_s(rd, rs1, rs2)`
35056 ///
35057 /// # Arguments
35058 /// - `rd` — Destination register.
35059 /// - `rs1` — Source register.
35060 /// - `rs2` — Source register.
35061 pub fn fsgnjx_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
35062 where
35063 Self: FsgnjxSEmitter<T0, T1, T2>,
35064 {
35065 <Self as FsgnjxSEmitter<T0, T1, T2>>::fsgnjx_s(self, rd, rs1, rs2);
35066 }
35067 /// Half-precision floating-point store
35068 ///
35069 /// The `fsh` instruction stores a half-precision floating-point value
35070 /// from register _rd_ to memory at address _rs1_ + _imm_.
35071 ///
35072 /// `fsh` does not modify the bits being transferred; in particular, the payloads of non-canonical NaNs are preserved.
35073 ///
35074 /// `fsh` ignores all but the lower 16 bits in _rs2_.
35075 ///
35076 /// `fsh` is only guaranteed to execute atomically if the effective address is naturally aligned.
35077 ///
35078 /// # Forms
35079 /// Assembly: `fsh fs2, imm(xs1)`
35080 /// Rust: `fsh(rs1, rs2, imm)`
35081 ///
35082 /// # Arguments
35083 /// - `rs1` — Memory base register.
35084 /// - `rs2` — Source register.
35085 /// - `imm` — Immediate encoding value.
35086 pub fn fsh<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
35087 where
35088 Self: FshEmitter<T0, T1, T2>,
35089 {
35090 <Self as FshEmitter<T0, T1, T2>>::fsh(self, rs1, rs2, imm);
35091 }
35092 /// RISC-V `fsq` instruction.
35093 ///
35094 /// # Forms
35095 /// Assembly: `fsq xs1, qs2, imm`
35096 /// Rust: `fsq(rs1, rs2, imm)`
35097 ///
35098 /// # Arguments
35099 /// - `rs1` — Memory base register.
35100 /// - `rs2` — Source register.
35101 /// - `imm` — Immediate encoding value.
35102 pub fn fsq<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
35103 where
35104 Self: FsqEmitter<T0, T1, T2>,
35105 {
35106 <Self as FsqEmitter<T0, T1, T2>>::fsq(self, rs1, rs2, imm);
35107 }
35108 /// RISC-V `fsqrt.d` instruction.
35109 ///
35110 /// # Forms
35111 /// Assembly: `fsqrt.d xd, xs1, rm`
35112 /// Rust: `fsqrt_d(rd, rs1, rm)`
35113 ///
35114 /// # Arguments
35115 /// - `rd` — Destination register.
35116 /// - `rs1` — Source register.
35117 /// - `rm` — Rounding mode.
35118 pub fn fsqrt_d<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
35119 where
35120 Self: FsqrtDEmitter<T0, T1, T2>,
35121 {
35122 <Self as FsqrtDEmitter<T0, T1, T2>>::fsqrt_d(self, rd, rs1, rm);
35123 }
35124 /// RISC-V `fsqrt.h` instruction.
35125 ///
35126 /// # Forms
35127 /// Assembly: `fsqrt.h xd, xs1, rm`
35128 /// Rust: `fsqrt_h(rd, rs1, rm)`
35129 ///
35130 /// # Arguments
35131 /// - `rd` — Destination register.
35132 /// - `rs1` — Source register.
35133 /// - `rm` — Rounding mode.
35134 pub fn fsqrt_h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
35135 where
35136 Self: FsqrtHEmitter<T0, T1, T2>,
35137 {
35138 <Self as FsqrtHEmitter<T0, T1, T2>>::fsqrt_h(self, rd, rs1, rm);
35139 }
35140 /// RISC-V `fsqrt.q` instruction.
35141 ///
35142 /// # Forms
35143 /// Assembly: `fsqrt.q qd, qs1, rm`
35144 /// Rust: `fsqrt_q(rd, rs1, rm)`
35145 ///
35146 /// # Arguments
35147 /// - `rd` — Destination register.
35148 /// - `rs1` — Source register.
35149 /// - `rm` — Rounding mode.
35150 pub fn fsqrt_q<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
35151 where
35152 Self: FsqrtQEmitter<T0, T1, T2>,
35153 {
35154 <Self as FsqrtQEmitter<T0, T1, T2>>::fsqrt_q(self, rd, rs1, rm);
35155 }
35156 /// RISC-V `fsqrt.s` instruction.
35157 ///
35158 /// # Forms
35159 /// Assembly: `fsqrt.s fd, fs1, rm`
35160 /// Rust: `fsqrt_s(rd, rs1, rm)`
35161 ///
35162 /// # Arguments
35163 /// - `rd` — Destination register.
35164 /// - `rs1` — Source register.
35165 /// - `rm` — Rounding mode.
35166 pub fn fsqrt_s<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rm: T2)
35167 where
35168 Self: FsqrtSEmitter<T0, T1, T2>,
35169 {
35170 <Self as FsqrtSEmitter<T0, T1, T2>>::fsqrt_s(self, rd, rs1, rm);
35171 }
35172 /// RISC-V `fsrm` instruction.
35173 ///
35174 /// # Forms
35175 /// Assembly: `fsrm rd rs1`
35176 /// Rust: `fsrm(rd, rs1)`
35177 ///
35178 /// # Arguments
35179 /// - `rd` — Destination register.
35180 /// - `rs1` — Source register.
35181 pub fn fsrm<T0, T1>(&mut self, rd: T0, rs1: T1)
35182 where
35183 Self: FsrmEmitter<T0, T1>,
35184 {
35185 <Self as FsrmEmitter<T0, T1>>::fsrm(self, rd, rs1);
35186 }
35187 /// RISC-V `fsrmi` instruction.
35188 ///
35189 /// # Forms
35190 /// Assembly: `fsrmi rd zimm5`
35191 /// Rust: `fsrmi(rd, zimm5)`
35192 ///
35193 /// # Arguments
35194 /// - `rd` — Destination register.
35195 /// - `zimm5` — Immediate encoding value.
35196 pub fn fsrmi<T0, T1>(&mut self, rd: T0, zimm5: T1)
35197 where
35198 Self: FsrmiEmitter<T0, T1>,
35199 {
35200 <Self as FsrmiEmitter<T0, T1>>::fsrmi(self, rd, zimm5);
35201 }
35202 /// RISC-V `fsub.d` instruction.
35203 ///
35204 /// # Forms
35205 /// Assembly: `fsub.d xd, xs1, xs2, rm`
35206 /// Rust: `fsub_d(rd, rs1, rs2, rm)`
35207 ///
35208 /// # Arguments
35209 /// - `rd` — Destination register.
35210 /// - `rs1` — Source register.
35211 /// - `rs2` — Source register.
35212 /// - `rm` — Rounding mode.
35213 pub fn fsub_d<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
35214 where
35215 Self: FsubDEmitter<T0, T1, T2, T3>,
35216 {
35217 <Self as FsubDEmitter<T0, T1, T2, T3>>::fsub_d(self, rd, rs1, rs2, rm);
35218 }
35219 /// RISC-V `fsub.h` instruction.
35220 ///
35221 /// # Forms
35222 /// Assembly: `fsub.h xd, xs1, xs2, rm`
35223 /// Rust: `fsub_h(rd, rs1, rs2, rm)`
35224 ///
35225 /// # Arguments
35226 /// - `rd` — Destination register.
35227 /// - `rs1` — Source register.
35228 /// - `rs2` — Source register.
35229 /// - `rm` — Rounding mode.
35230 pub fn fsub_h<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
35231 where
35232 Self: FsubHEmitter<T0, T1, T2, T3>,
35233 {
35234 <Self as FsubHEmitter<T0, T1, T2, T3>>::fsub_h(self, rd, rs1, rs2, rm);
35235 }
35236 /// RISC-V `fsub.q` instruction.
35237 ///
35238 /// # Forms
35239 /// Assembly: `fsub.q qd, qs1, qs2, rm`
35240 /// Rust: `fsub_q(rd, rs1, rs2, rm)`
35241 ///
35242 /// # Arguments
35243 /// - `rd` — Destination register.
35244 /// - `rs1` — Source register.
35245 /// - `rs2` — Source register.
35246 /// - `rm` — Rounding mode.
35247 pub fn fsub_q<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
35248 where
35249 Self: FsubQEmitter<T0, T1, T2, T3>,
35250 {
35251 <Self as FsubQEmitter<T0, T1, T2, T3>>::fsub_q(self, rd, rs1, rs2, rm);
35252 }
35253 /// Single-precision floating-point subtraction
35254 ///
35255 /// Do the single-precision floating-point subtraction of fs2 from fs1 and store the result in fd.
35256 /// rm is the dynamic Rounding Mode.
35257 ///
35258 /// # Forms
35259 /// Assembly: `fsub.s fd, fs1, fs2, rm`
35260 /// Rust: `fsub_s(rd, rs1, rs2, rm)`
35261 ///
35262 /// # Arguments
35263 /// - `rd` — Destination register.
35264 /// - `rs1` — Source register.
35265 /// - `rs2` — Source register.
35266 /// - `rm` — Rounding mode.
35267 pub fn fsub_s<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, rm: T3)
35268 where
35269 Self: FsubSEmitter<T0, T1, T2, T3>,
35270 {
35271 <Self as FsubSEmitter<T0, T1, T2, T3>>::fsub_s(self, rd, rs1, rs2, rm);
35272 }
35273 /// Single-precision floating-point store
35274 ///
35275 /// The `fsw` instruction stores a single-precision floating-point value in _fs2_ to memory at address _rs1_ + _imm_.
35276 ///
35277 /// `fsw` does not modify the bits being transferred; in particular, the payloads of non-canonical NaNs are preserved.
35278 ///
35279 /// # Forms
35280 /// Assembly: `fsw fs2, xs1, imm`
35281 /// Rust: `fsw(rs1, rs2, imm)`
35282 ///
35283 /// # Arguments
35284 /// - `rs1` — Memory base register.
35285 /// - `rs2` — Source register.
35286 /// - `imm` — Immediate encoding value.
35287 pub fn fsw<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
35288 where
35289 Self: FswEmitter<T0, T1, T2>,
35290 {
35291 <Self as FswEmitter<T0, T1, T2>>::fsw(self, rs1, rs2, imm);
35292 }
35293 /// RISC-V `hfence.gvma` instruction.
35294 ///
35295 /// # Forms
35296 /// Assembly: `hfence.gvma xs1, xs2`
35297 /// Rust: `hfence_gvma(rs1, rs2)`
35298 ///
35299 /// # Arguments
35300 /// - `rs1` — Source register.
35301 /// - `rs2` — Source register.
35302 pub fn hfence_gvma<T0, T1>(&mut self, rs1: T0, rs2: T1)
35303 where
35304 Self: HfenceGvmaEmitter<T0, T1>,
35305 {
35306 <Self as HfenceGvmaEmitter<T0, T1>>::hfence_gvma(self, rs1, rs2);
35307 }
35308 /// RISC-V `hfence.vvma` instruction.
35309 ///
35310 /// # Forms
35311 /// Assembly: `hfence.vvma xs1, xs2`
35312 /// Rust: `hfence_vvma(rs1, rs2)`
35313 ///
35314 /// # Arguments
35315 /// - `rs1` — Source register.
35316 /// - `rs2` — Source register.
35317 pub fn hfence_vvma<T0, T1>(&mut self, rs1: T0, rs2: T1)
35318 where
35319 Self: HfenceVvmaEmitter<T0, T1>,
35320 {
35321 <Self as HfenceVvmaEmitter<T0, T1>>::hfence_vvma(self, rs1, rs2);
35322 }
35323 /// Invalidate cached address translations
35324 ///
35325 /// `hinval.gvma` has the same semantics as `sinval.vma` except that it combines with
35326 /// `sfence.w.inval` and `sfence.inval.ir` to replace `hfence.gvma` and uses VMID instead of ASID.
35327 ///
35328 /// # Forms
35329 /// Assembly: `hinval.gvma xs1, xs2`
35330 /// Rust: `hinval_gvma(rs1, rs2)`
35331 ///
35332 /// # Arguments
35333 /// - `rs1` — Source register.
35334 /// - `rs2` — Source register.
35335 pub fn hinval_gvma<T0, T1>(&mut self, rs1: T0, rs2: T1)
35336 where
35337 Self: HinvalGvmaEmitter<T0, T1>,
35338 {
35339 <Self as HinvalGvmaEmitter<T0, T1>>::hinval_gvma(self, rs1, rs2);
35340 }
35341 /// Invalidate cached address translations
35342 ///
35343 /// `hinval.vvma` has the same semantics as `sinval.vma` except that it combines with
35344 /// `sfence.w.inval` and `sfence.inval.ir` to replace `hfence.vvma`.
35345 ///
35346 /// # Forms
35347 /// Assembly: `hinval.vvma xs1, xs2`
35348 /// Rust: `hinval_vvma(rs1, rs2)`
35349 ///
35350 /// # Arguments
35351 /// - `rs1` — Source register.
35352 /// - `rs2` — Source register.
35353 pub fn hinval_vvma<T0, T1>(&mut self, rs1: T0, rs2: T1)
35354 where
35355 Self: HinvalVvmaEmitter<T0, T1>,
35356 {
35357 <Self as HinvalVvmaEmitter<T0, T1>>::hinval_vvma(self, rs1, rs2);
35358 }
35359 /// RISC-V `hlv.b` instruction.
35360 ///
35361 /// # Forms
35362 /// Assembly: `hlv.b xd, xs1`
35363 /// Rust: `hlv_b(rd, rs1)`
35364 ///
35365 /// # Arguments
35366 /// - `rd` — Destination register.
35367 /// - `rs1` — Source register.
35368 pub fn hlv_b<T0, T1>(&mut self, rd: T0, rs1: T1)
35369 where
35370 Self: HlvBEmitter<T0, T1>,
35371 {
35372 <Self as HlvBEmitter<T0, T1>>::hlv_b(self, rd, rs1);
35373 }
35374 /// RISC-V `hlv.bu` instruction.
35375 ///
35376 /// # Forms
35377 /// Assembly: `hlv.bu xd, xs1`
35378 /// Rust: `hlv_bu(rd, rs1)`
35379 ///
35380 /// # Arguments
35381 /// - `rd` — Destination register.
35382 /// - `rs1` — Source register.
35383 pub fn hlv_bu<T0, T1>(&mut self, rd: T0, rs1: T1)
35384 where
35385 Self: HlvBuEmitter<T0, T1>,
35386 {
35387 <Self as HlvBuEmitter<T0, T1>>::hlv_bu(self, rd, rs1);
35388 }
35389 /// RISC-V `hlv.d` instruction.
35390 ///
35391 /// # Forms
35392 /// Assembly: `hlv.d xd, xs1`
35393 /// Rust: `hlv_d(rd, rs1)`
35394 ///
35395 /// # Arguments
35396 /// - `rd` — Destination register.
35397 /// - `rs1` — Source register.
35398 pub fn hlv_d<T0, T1>(&mut self, rd: T0, rs1: T1)
35399 where
35400 Self: HlvDEmitter<T0, T1>,
35401 {
35402 <Self as HlvDEmitter<T0, T1>>::hlv_d(self, rd, rs1);
35403 }
35404 /// RISC-V `hlv.h` instruction.
35405 ///
35406 /// # Forms
35407 /// Assembly: `hlv.h xd, xs1`
35408 /// Rust: `hlv_h(rd, rs1)`
35409 ///
35410 /// # Arguments
35411 /// - `rd` — Destination register.
35412 /// - `rs1` — Source register.
35413 pub fn hlv_h<T0, T1>(&mut self, rd: T0, rs1: T1)
35414 where
35415 Self: HlvHEmitter<T0, T1>,
35416 {
35417 <Self as HlvHEmitter<T0, T1>>::hlv_h(self, rd, rs1);
35418 }
35419 /// RISC-V `hlv.hu` instruction.
35420 ///
35421 /// # Forms
35422 /// Assembly: `hlv.hu xd, xs1`
35423 /// Rust: `hlv_hu(rd, rs1)`
35424 ///
35425 /// # Arguments
35426 /// - `rd` — Destination register.
35427 /// - `rs1` — Source register.
35428 pub fn hlv_hu<T0, T1>(&mut self, rd: T0, rs1: T1)
35429 where
35430 Self: HlvHuEmitter<T0, T1>,
35431 {
35432 <Self as HlvHuEmitter<T0, T1>>::hlv_hu(self, rd, rs1);
35433 }
35434 /// RISC-V `hlv.w` instruction.
35435 ///
35436 /// # Forms
35437 /// Assembly: `hlv.w xd, xs1`
35438 /// Rust: `hlv_w(rd, rs1)`
35439 ///
35440 /// # Arguments
35441 /// - `rd` — Destination register.
35442 /// - `rs1` — Source register.
35443 pub fn hlv_w<T0, T1>(&mut self, rd: T0, rs1: T1)
35444 where
35445 Self: HlvWEmitter<T0, T1>,
35446 {
35447 <Self as HlvWEmitter<T0, T1>>::hlv_w(self, rd, rs1);
35448 }
35449 /// RISC-V `hlv.wu` instruction.
35450 ///
35451 /// # Forms
35452 /// Assembly: `hlv.wu xd, xs1`
35453 /// Rust: `hlv_wu(rd, rs1)`
35454 ///
35455 /// # Arguments
35456 /// - `rd` — Destination register.
35457 /// - `rs1` — Source register.
35458 pub fn hlv_wu<T0, T1>(&mut self, rd: T0, rs1: T1)
35459 where
35460 Self: HlvWuEmitter<T0, T1>,
35461 {
35462 <Self as HlvWuEmitter<T0, T1>>::hlv_wu(self, rd, rs1);
35463 }
35464 /// RISC-V `hlvx.hu` instruction.
35465 ///
35466 /// # Forms
35467 /// Assembly: `hlvx.hu xd, xs1`
35468 /// Rust: `hlvx_hu(rd, rs1)`
35469 ///
35470 /// # Arguments
35471 /// - `rd` — Destination register.
35472 /// - `rs1` — Source register.
35473 pub fn hlvx_hu<T0, T1>(&mut self, rd: T0, rs1: T1)
35474 where
35475 Self: HlvxHuEmitter<T0, T1>,
35476 {
35477 <Self as HlvxHuEmitter<T0, T1>>::hlvx_hu(self, rd, rs1);
35478 }
35479 /// RISC-V `hlvx.wu` instruction.
35480 ///
35481 /// # Forms
35482 /// Assembly: `hlvx.wu xd, xs1`
35483 /// Rust: `hlvx_wu(rd, rs1)`
35484 ///
35485 /// # Arguments
35486 /// - `rd` — Destination register.
35487 /// - `rs1` — Source register.
35488 pub fn hlvx_wu<T0, T1>(&mut self, rd: T0, rs1: T1)
35489 where
35490 Self: HlvxWuEmitter<T0, T1>,
35491 {
35492 <Self as HlvxWuEmitter<T0, T1>>::hlvx_wu(self, rd, rs1);
35493 }
35494 /// RISC-V `hsv.b` instruction.
35495 ///
35496 /// # Forms
35497 /// Assembly: `hsv.b xs1, xs2`
35498 /// Rust: `hsv_b(rs1, rs2)`
35499 ///
35500 /// # Arguments
35501 /// - `rs1` — Source register.
35502 /// - `rs2` — Source register.
35503 pub fn hsv_b<T0, T1>(&mut self, rs1: T0, rs2: T1)
35504 where
35505 Self: HsvBEmitter<T0, T1>,
35506 {
35507 <Self as HsvBEmitter<T0, T1>>::hsv_b(self, rs1, rs2);
35508 }
35509 /// RISC-V `hsv.d` instruction.
35510 ///
35511 /// # Forms
35512 /// Assembly: `hsv.d xs1, xs2`
35513 /// Rust: `hsv_d(rs1, rs2)`
35514 ///
35515 /// # Arguments
35516 /// - `rs1` — Source register.
35517 /// - `rs2` — Source register.
35518 pub fn hsv_d<T0, T1>(&mut self, rs1: T0, rs2: T1)
35519 where
35520 Self: HsvDEmitter<T0, T1>,
35521 {
35522 <Self as HsvDEmitter<T0, T1>>::hsv_d(self, rs1, rs2);
35523 }
35524 /// RISC-V `hsv.h` instruction.
35525 ///
35526 /// # Forms
35527 /// Assembly: `hsv.h xs1, xs2`
35528 /// Rust: `hsv_h(rs1, rs2)`
35529 ///
35530 /// # Arguments
35531 /// - `rs1` — Source register.
35532 /// - `rs2` — Source register.
35533 pub fn hsv_h<T0, T1>(&mut self, rs1: T0, rs2: T1)
35534 where
35535 Self: HsvHEmitter<T0, T1>,
35536 {
35537 <Self as HsvHEmitter<T0, T1>>::hsv_h(self, rs1, rs2);
35538 }
35539 /// RISC-V `hsv.w` instruction.
35540 ///
35541 /// # Forms
35542 /// Assembly: `hsv.w xs1, xs2`
35543 /// Rust: `hsv_w(rs1, rs2)`
35544 ///
35545 /// # Arguments
35546 /// - `rs1` — Source register.
35547 /// - `rs2` — Source register.
35548 pub fn hsv_w<T0, T1>(&mut self, rs1: T0, rs2: T1)
35549 where
35550 Self: HsvWEmitter<T0, T1>,
35551 {
35552 <Self as HsvWEmitter<T0, T1>>::hsv_w(self, rs1, rs2);
35553 }
35554 /// RISC-V `j` instruction.
35555 ///
35556 /// # Forms
35557 /// Assembly: `j jimm20`
35558 /// Rust: `j(imm)`
35559 ///
35560 /// # Arguments
35561 /// - `imm` — Immediate encoding value.
35562 pub fn j<T0>(&mut self, imm: T0)
35563 where
35564 Self: JEmitter<T0>,
35565 {
35566 <Self as JEmitter<T0>>::j(self, imm);
35567 }
35568 /// Jump and link
35569 ///
35570 /// Jump to a PC-relative offset and store the return
35571 /// address in rd.
35572 ///
35573 /// # Forms
35574 /// Assembly: `jal xd, imm`
35575 /// Rust: `jal(rd, imm)`
35576 ///
35577 /// # Arguments
35578 /// - `rd` — Destination register.
35579 /// - `imm` — Immediate encoding value.
35580 pub fn jal<T0, T1>(&mut self, rd: T0, imm: T1)
35581 where
35582 Self: JalEmitter<T0, T1>,
35583 {
35584 <Self as JalEmitter<T0, T1>>::jal(self, rd, imm);
35585 }
35586 /// RISC-V `jal.pseudo` instruction.
35587 ///
35588 /// # Forms
35589 /// Assembly: `jal.pseudo jimm20`
35590 /// Rust: `jal_pseudo(imm)`
35591 ///
35592 /// # Arguments
35593 /// - `imm` — Immediate encoding value.
35594 pub fn jal_pseudo<T0>(&mut self, imm: T0)
35595 where
35596 Self: JalPseudoEmitter<T0>,
35597 {
35598 <Self as JalPseudoEmitter<T0>>::jal_pseudo(self, imm);
35599 }
35600 /// Jump and link register
35601 ///
35602 /// Jump to an address formed by adding rs1
35603 /// to a signed offset then clearing the least
35604 /// significant bit, and store the return address
35605 /// in rd.
35606 ///
35607 /// # Forms
35608 /// Assembly: `jalr xd, imm(rs1)`
35609 /// Rust: `jalr(rd, rs1, imm)`
35610 ///
35611 /// # Arguments
35612 /// - `rd` — Destination register.
35613 /// - `rs1` — Source register.
35614 /// - `imm` — Immediate encoding value.
35615 pub fn jalr<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
35616 where
35617 Self: JalrEmitter<T0, T1, T2>,
35618 {
35619 <Self as JalrEmitter<T0, T1, T2>>::jalr(self, rd, rs1, imm);
35620 }
35621 /// RISC-V `jalr.pseudo` instruction.
35622 ///
35623 /// # Forms
35624 /// Assembly: `jalr.pseudo rs1`
35625 /// Rust: `jalr_pseudo(rs1)`
35626 ///
35627 /// # Arguments
35628 /// - `rs1` — Source register.
35629 pub fn jalr_pseudo<T0>(&mut self, rs1: T0)
35630 where
35631 Self: JalrPseudoEmitter<T0>,
35632 {
35633 <Self as JalrPseudoEmitter<T0>>::jalr_pseudo(self, rs1);
35634 }
35635 /// RISC-V `jr` instruction.
35636 ///
35637 /// # Forms
35638 /// Assembly: `jr rs1`
35639 /// Rust: `jr(rs1)`
35640 ///
35641 /// # Arguments
35642 /// - `rs1` — Source register.
35643 pub fn jr<T0>(&mut self, rs1: T0)
35644 where
35645 Self: JrEmitter<T0>,
35646 {
35647 <Self as JrEmitter<T0>>::jr(self, rs1);
35648 }
35649 /// Load byte
35650 ///
35651 /// Load 8 bits of data into register `rd` from an
35652 /// address formed by adding `rs1` to a signed offset.
35653 /// Sign extend the result.
35654 ///
35655 /// # Forms
35656 /// Assembly: `lb xd, imm(rs1)`
35657 /// Rust: `lb(rd, rs1, imm)`
35658 ///
35659 /// # Arguments
35660 /// - `rd` — Destination register.
35661 /// - `rs1` — Memory base register.
35662 /// - `imm` — Immediate encoding value.
35663 pub fn lb<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
35664 where
35665 Self: LbEmitter<T0, T1, T2>,
35666 {
35667 <Self as LbEmitter<T0, T1, T2>>::lb(self, rd, rs1, imm);
35668 }
35669 /// Load byte unsigned
35670 ///
35671 /// Load 8 bits of data into register `rd` from an
35672 /// address formed by adding `rs1` to a signed offset.
35673 /// Zero extend the result.
35674 ///
35675 /// # Forms
35676 /// Assembly: `lbu xd, imm(rs1)`
35677 /// Rust: `lbu(rd, rs1, imm)`
35678 ///
35679 /// # Arguments
35680 /// - `rd` — Destination register.
35681 /// - `rs1` — Memory base register.
35682 /// - `imm` — Immediate encoding value.
35683 pub fn lbu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
35684 where
35685 Self: LbuEmitter<T0, T1, T2>,
35686 {
35687 <Self as LbuEmitter<T0, T1, T2>>::lbu(self, rd, rs1, imm);
35688 }
35689 /// Load doubleword
35690 ///
35691 /// Load 64 bits of data into register `rd` from an
35692 /// address formed by adding `rs1` to a signed offset.
35693 ///
35694 /// # Forms
35695 /// Assembly: `ld xd, imm(rs1)`
35696 /// Rust: `ld(rd, rs1, imm)`
35697 ///
35698 /// # Arguments
35699 /// - `rd` — Destination register.
35700 /// - `rs1` — Memory base register.
35701 /// - `imm` — Immediate encoding value.
35702 pub fn ld<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
35703 where
35704 Self: LdEmitter<T0, T1, T2>,
35705 {
35706 <Self as LdEmitter<T0, T1, T2>>::ld(self, rd, rs1, imm);
35707 }
35708 /// Load halfword
35709 ///
35710 /// Load 16 bits of data into register `rd` from an
35711 /// address formed by adding `rs1` to a signed offset.
35712 /// Sign extend the result.
35713 ///
35714 /// # Forms
35715 /// Assembly: `lh xd, imm(rs1)`
35716 /// Rust: `lh(rd, rs1, imm)`
35717 ///
35718 /// # Arguments
35719 /// - `rd` — Destination register.
35720 /// - `rs1` — Memory base register.
35721 /// - `imm` — Immediate encoding value.
35722 pub fn lh<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
35723 where
35724 Self: LhEmitter<T0, T1, T2>,
35725 {
35726 <Self as LhEmitter<T0, T1, T2>>::lh(self, rd, rs1, imm);
35727 }
35728 /// Load halfword unsigned
35729 ///
35730 /// Load 16 bits of data into register `rd` from an
35731 /// address formed by adding `rs1` to a signed offset.
35732 /// Zero extend the result.
35733 ///
35734 /// # Forms
35735 /// Assembly: `lhu xd, imm(rs1)`
35736 /// Rust: `lhu(rd, rs1, imm)`
35737 ///
35738 /// # Arguments
35739 /// - `rd` — Destination register.
35740 /// - `rs1` — Memory base register.
35741 /// - `imm` — Immediate encoding value.
35742 pub fn lhu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
35743 where
35744 Self: LhuEmitter<T0, T1, T2>,
35745 {
35746 <Self as LhuEmitter<T0, T1, T2>>::lhu(self, rd, rs1, imm);
35747 }
35748 /// RISC-V `lpad` instruction.
35749 ///
35750 /// # Forms
35751 /// Assembly: `lpad imm`
35752 /// Rust: `lpad(imm)`
35753 ///
35754 /// # Arguments
35755 /// - `imm` — Immediate encoding value.
35756 pub fn lpad<T0>(&mut self, imm: T0)
35757 where
35758 Self: LpadEmitter<T0>,
35759 {
35760 <Self as LpadEmitter<T0>>::lpad(self, imm);
35761 }
35762 /// Load reserved doubleword
35763 ///
35764 /// Loads a word from the address in rs1, places the value in rd,
35765 /// and registers a _reservation set_ -- a set of bytes that subsumes the bytes in the
35766 /// addressed word.
35767 ///
35768 /// The address in rs1 must be 8-byte aligned.
35769 ///
35770 /// If the address is not naturally aligned, a `LoadAddressMisaligned` exception or an
35771 /// `LoadAccessFault` exception will be generated. The access-fault exception can be generated
35772 /// for a memory access that would otherwise be able to complete except for the misalignment,
35773 /// if the misaligned access should not be emulated.
35774 ///
35775 /// An implementation can register an arbitrarily large reservation set on each LR, provided the
35776 /// reservation set includes all bytes of the addressed data word or doubleword.
35777 /// An SC can only pair with the most recent LR in program order.
35778 /// An SC may succeed only if no store from another hart to the reservation set can be
35779 /// observed to have occurred between the LR and the SC, and if there is no other SC between the
35780 /// LR and itself in program order.
35781 /// An SC may succeed only if no write from a device other than a hart to the bytes accessed by
35782 /// the LR instruction can be observed to have occurred between the LR and SC. Note this LR
35783 /// might have had a different effective address and data size, but reserved the SC's
35784 /// address as part of the reservation set.
35785 ///
35786 /// \[NOTE\]
35787 /// ----
35788 /// Following this model, in systems with memory translation, an SC is allowed to succeed if the
35789 /// earlier LR reserved the same location using an alias with a different virtual address, but is
35790 /// also allowed to fail if the virtual address is different.
35791 ///
35792 /// To accommodate legacy devices and buses, writes from devices other than RISC-V harts are only
35793 /// required to invalidate reservations when they overlap the bytes accessed by the LR.
35794 /// These writes are not required to invalidate the reservation when they access other bytes in
35795 /// the reservation set.
35796 /// ----
35797 ///
35798 /// Software should not set the _rl_ bit on an LR instruction unless the _aq_ bit is also set.
35799 /// LR.rl and SC.aq instructions are not guaranteed to provide any stronger ordering than those
35800 /// with both bits clear, but may result in lower performance.
35801 ///
35802 /// # Forms
35803 /// Assembly: `lr.d xd, xs1`
35804 /// Rust: `lr_d(rd, rs1, aq, rl)`
35805 ///
35806 /// # Arguments
35807 /// - `rd` — Destination register.
35808 /// - `rs1` — Memory base register.
35809 /// - `aq` — Acquire-order bit.
35810 /// - `rl` — Release-order bit; retained for the existing emitter API.
35811 pub fn lr_d<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, aq: T2, rl: T3)
35812 where
35813 Self: LrDEmitter<T0, T1, T2, T3>,
35814 {
35815 <Self as LrDEmitter<T0, T1, T2, T3>>::lr_d(self, rd, rs1, aq, rl);
35816 }
35817 /// Load reserved word
35818 ///
35819 /// Loads a word from the address in rs1, places the sign-extended value in rd,
35820 /// and registers a _reservation set_ -- a set of bytes that subsumes the bytes in the
35821 /// addressed word.
35822 ///
35823 /// <%- if XLEN == 64 -%>
35824 /// The 32-bit load result is sign-extended to 64-bits.
35825 /// <%- end -%>
35826 ///
35827 /// The address in rs1 must be naturally aligned to the size of the operand
35828 /// (_i.e._, eight-byte aligned for doublewords and four-byte aligned for words).
35829 ///
35830 /// If the address is not naturally aligned, a `LoadAddressMisaligned` exception or an
35831 /// `LoadAccessFault` exception will be generated. The access-fault exception can be generated
35832 /// for a memory access that would otherwise be able to complete except for the misalignment,
35833 /// if the misaligned access should not be emulated.
35834 ///
35835 /// An implementation can register an arbitrarily large reservation set on each LR, provided the
35836 /// reservation set includes all bytes of the addressed data word or doubleword.
35837 /// An SC can only pair with the most recent LR in program order.
35838 /// An SC may succeed only if no store from another hart to the reservation set can be
35839 /// observed to have occurred between the LR and the SC, and if there is no other SC between the
35840 /// LR and itself in program order.
35841 /// An SC may succeed only if no write from a device other than a hart to the bytes accessed by
35842 /// the LR instruction can be observed to have occurred between the LR and SC. Note this LR
35843 /// might have had a different effective address and data size, but reserved the SC's
35844 /// address as part of the reservation set.
35845 ///
35846 /// \[NOTE\]
35847 /// ----
35848 /// Following this model, in systems with memory translation, an SC is allowed to succeed if the
35849 /// earlier LR reserved the same location using an alias with a different virtual address, but is
35850 /// also allowed to fail if the virtual address is different.
35851 ///
35852 /// To accommodate legacy devices and buses, writes from devices other than RISC-V harts are only
35853 /// required to invalidate reservations when they overlap the bytes accessed by the LR.
35854 /// These writes are not required to invalidate the reservation when they access other bytes in
35855 /// the reservation set.
35856 /// ----
35857 ///
35858 /// Software should not set the _rl_ bit on an LR instruction unless the _aq_ bit is also set.
35859 /// LR.rl and SC.aq instructions are not guaranteed to provide any stronger ordering than those
35860 /// with both bits clear, but may result in lower performance.
35861 ///
35862 /// # Forms
35863 /// Assembly: `lr.w xd, xs1`
35864 /// Rust: `lr_w(rd, rs1, aq, rl)`
35865 ///
35866 /// # Arguments
35867 /// - `rd` — Destination register.
35868 /// - `rs1` — Memory base register.
35869 /// - `aq` — Acquire-order bit.
35870 /// - `rl` — Release-order bit; retained for the existing emitter API.
35871 pub fn lr_w<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, aq: T2, rl: T3)
35872 where
35873 Self: LrWEmitter<T0, T1, T2, T3>,
35874 {
35875 <Self as LrWEmitter<T0, T1, T2, T3>>::lr_w(self, rd, rs1, aq, rl);
35876 }
35877 /// Load upper immediate
35878 ///
35879 /// Load the zero-extended imm into rd.
35880 ///
35881 /// # Forms
35882 /// Assembly: `lui xd, imm`
35883 /// Rust: `lui(rd, imm)`
35884 ///
35885 /// # Arguments
35886 /// - `rd` — Destination register.
35887 /// - `imm` — Immediate encoding value.
35888 pub fn lui<T0, T1>(&mut self, rd: T0, imm: T1)
35889 where
35890 Self: LuiEmitter<T0, T1>,
35891 {
35892 <Self as LuiEmitter<T0, T1>>::lui(self, rd, imm);
35893 }
35894 /// Load word
35895 ///
35896 /// Load 32 bits of data into register `rd` from an
35897 /// address formed by adding `rs1` to a signed offset.
35898 /// Sign extend the result.
35899 ///
35900 /// # Forms
35901 /// Assembly: `lw xd, imm(rs1)`
35902 /// Rust: `lw(rd, rs1, imm)`
35903 ///
35904 /// # Arguments
35905 /// - `rd` — Destination register.
35906 /// - `rs1` — Memory base register.
35907 /// - `imm` — Immediate encoding value.
35908 pub fn lw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
35909 where
35910 Self: LwEmitter<T0, T1, T2>,
35911 {
35912 <Self as LwEmitter<T0, T1, T2>>::lw(self, rd, rs1, imm);
35913 }
35914 /// Load word unsigned
35915 ///
35916 /// Load 64 bits of data into register `rd` from an
35917 /// address formed by adding `rs1` to a signed offset.
35918 /// Zero extend the result.
35919 ///
35920 /// # Forms
35921 /// Assembly: `lwu xd, imm(rs1)`
35922 /// Rust: `lwu(rd, rs1, imm)`
35923 ///
35924 /// # Arguments
35925 /// - `rd` — Destination register.
35926 /// - `rs1` — Memory base register.
35927 /// - `imm` — Immediate encoding value.
35928 pub fn lwu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
35929 where
35930 Self: LwuEmitter<T0, T1, T2>,
35931 {
35932 <Self as LwuEmitter<T0, T1, T2>>::lwu(self, rd, rs1, imm);
35933 }
35934 /// Maximum
35935 ///
35936 /// This instruction returns the larger of two signed integers.
35937 ///
35938 /// .Software Hint
35939 /// \[NOTE\]
35940 /// Calculating the absolute value of a signed integer can be performed using the
35941 /// following sequence: `neg rD,rS` followed by `max rD,rS,rD. When using this
35942 /// common sequence, it is suggested that they are scheduled with no intervening
35943 /// instructions so that implementations that are so optimized can fuse them
35944 /// together.
35945 ///
35946 /// # Forms
35947 /// Assembly: `max xd, xs1, xs2`
35948 /// Rust: `max(rd, rs1, rs2)`
35949 ///
35950 /// # Arguments
35951 /// - `rd` — Destination register.
35952 /// - `rs1` — Source register.
35953 /// - `rs2` — Source register.
35954 pub fn max<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
35955 where
35956 Self: MaxEmitter<T0, T1, T2>,
35957 {
35958 <Self as MaxEmitter<T0, T1, T2>>::max(self, rd, rs1, rs2);
35959 }
35960 /// Unsigned maximum
35961 ///
35962 /// This instruction returns the larger of two unsigned integers.
35963 ///
35964 /// # Forms
35965 /// Assembly: `maxu xd, xs1, xs2`
35966 /// Rust: `maxu(rd, rs1, rs2)`
35967 ///
35968 /// # Arguments
35969 /// - `rd` — Destination register.
35970 /// - `rs1` — Source register.
35971 /// - `rs2` — Source register.
35972 pub fn maxu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
35973 where
35974 Self: MaxuEmitter<T0, T1, T2>,
35975 {
35976 <Self as MaxuEmitter<T0, T1, T2>>::maxu(self, rd, rs1, rs2);
35977 }
35978 /// Minimum
35979 ///
35980 /// This instruction returns the smaller of two signed integers.
35981 ///
35982 /// # Forms
35983 /// Assembly: `min xd, xs1, xs2`
35984 /// Rust: `min(rd, rs1, rs2)`
35985 ///
35986 /// # Arguments
35987 /// - `rd` — Destination register.
35988 /// - `rs1` — Source register.
35989 /// - `rs2` — Source register.
35990 pub fn min<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
35991 where
35992 Self: MinEmitter<T0, T1, T2>,
35993 {
35994 <Self as MinEmitter<T0, T1, T2>>::min(self, rd, rs1, rs2);
35995 }
35996 /// Unsigned minimum
35997 ///
35998 /// This instruction returns the smaller of two unsigned integers.
35999 ///
36000 /// # Forms
36001 /// Assembly: `minu xd, xs1, xs2`
36002 /// Rust: `minu(rd, rs1, rs2)`
36003 ///
36004 /// # Arguments
36005 /// - `rd` — Destination register.
36006 /// - `rs1` — Source register.
36007 /// - `rs2` — Source register.
36008 pub fn minu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36009 where
36010 Self: MinuEmitter<T0, T1, T2>,
36011 {
36012 <Self as MinuEmitter<T0, T1, T2>>::minu(self, rd, rs1, rs2);
36013 }
36014 /// RISC-V `mnret` instruction.
36015 ///
36016 /// # Forms
36017 /// Assembly: `mnret mnret`
36018 /// Rust: `mnret()`
36019 ///
36020 /// # Arguments
36021 pub fn mnret(&mut self)
36022 where
36023 Self: MnretEmitter,
36024 {
36025 <Self as MnretEmitter>::mnret(self);
36026 }
36027 /// RISC-V `mop.r.0` instruction.
36028 ///
36029 /// # Forms
36030 /// Assembly: `mop.r.0 rd rs1`
36031 /// Rust: `mop_r_0(rd, rs1)`
36032 ///
36033 /// # Arguments
36034 /// - `rd` — Destination register.
36035 /// - `rs1` — Source register.
36036 pub fn mop_r_0<T0, T1>(&mut self, rd: T0, rs1: T1)
36037 where
36038 Self: MopR0Emitter<T0, T1>,
36039 {
36040 <Self as MopR0Emitter<T0, T1>>::mop_r_0(self, rd, rs1);
36041 }
36042 /// RISC-V `mop.r.1` instruction.
36043 ///
36044 /// # Forms
36045 /// Assembly: `mop.r.1 rd rs1`
36046 /// Rust: `mop_r_1(rd, rs1)`
36047 ///
36048 /// # Arguments
36049 /// - `rd` — Destination register.
36050 /// - `rs1` — Source register.
36051 pub fn mop_r_1<T0, T1>(&mut self, rd: T0, rs1: T1)
36052 where
36053 Self: MopR1Emitter<T0, T1>,
36054 {
36055 <Self as MopR1Emitter<T0, T1>>::mop_r_1(self, rd, rs1);
36056 }
36057 /// RISC-V `mop.r.10` instruction.
36058 ///
36059 /// # Forms
36060 /// Assembly: `mop.r.10 rd rs1`
36061 /// Rust: `mop_r_10(rd, rs1)`
36062 ///
36063 /// # Arguments
36064 /// - `rd` — Destination register.
36065 /// - `rs1` — Source register.
36066 pub fn mop_r_10<T0, T1>(&mut self, rd: T0, rs1: T1)
36067 where
36068 Self: MopR10Emitter<T0, T1>,
36069 {
36070 <Self as MopR10Emitter<T0, T1>>::mop_r_10(self, rd, rs1);
36071 }
36072 /// RISC-V `mop.r.11` instruction.
36073 ///
36074 /// # Forms
36075 /// Assembly: `mop.r.11 rd rs1`
36076 /// Rust: `mop_r_11(rd, rs1)`
36077 ///
36078 /// # Arguments
36079 /// - `rd` — Destination register.
36080 /// - `rs1` — Source register.
36081 pub fn mop_r_11<T0, T1>(&mut self, rd: T0, rs1: T1)
36082 where
36083 Self: MopR11Emitter<T0, T1>,
36084 {
36085 <Self as MopR11Emitter<T0, T1>>::mop_r_11(self, rd, rs1);
36086 }
36087 /// RISC-V `mop.r.12` instruction.
36088 ///
36089 /// # Forms
36090 /// Assembly: `mop.r.12 rd rs1`
36091 /// Rust: `mop_r_12(rd, rs1)`
36092 ///
36093 /// # Arguments
36094 /// - `rd` — Destination register.
36095 /// - `rs1` — Source register.
36096 pub fn mop_r_12<T0, T1>(&mut self, rd: T0, rs1: T1)
36097 where
36098 Self: MopR12Emitter<T0, T1>,
36099 {
36100 <Self as MopR12Emitter<T0, T1>>::mop_r_12(self, rd, rs1);
36101 }
36102 /// RISC-V `mop.r.13` instruction.
36103 ///
36104 /// # Forms
36105 /// Assembly: `mop.r.13 rd rs1`
36106 /// Rust: `mop_r_13(rd, rs1)`
36107 ///
36108 /// # Arguments
36109 /// - `rd` — Destination register.
36110 /// - `rs1` — Source register.
36111 pub fn mop_r_13<T0, T1>(&mut self, rd: T0, rs1: T1)
36112 where
36113 Self: MopR13Emitter<T0, T1>,
36114 {
36115 <Self as MopR13Emitter<T0, T1>>::mop_r_13(self, rd, rs1);
36116 }
36117 /// RISC-V `mop.r.14` instruction.
36118 ///
36119 /// # Forms
36120 /// Assembly: `mop.r.14 rd rs1`
36121 /// Rust: `mop_r_14(rd, rs1)`
36122 ///
36123 /// # Arguments
36124 /// - `rd` — Destination register.
36125 /// - `rs1` — Source register.
36126 pub fn mop_r_14<T0, T1>(&mut self, rd: T0, rs1: T1)
36127 where
36128 Self: MopR14Emitter<T0, T1>,
36129 {
36130 <Self as MopR14Emitter<T0, T1>>::mop_r_14(self, rd, rs1);
36131 }
36132 /// RISC-V `mop.r.15` instruction.
36133 ///
36134 /// # Forms
36135 /// Assembly: `mop.r.15 rd rs1`
36136 /// Rust: `mop_r_15(rd, rs1)`
36137 ///
36138 /// # Arguments
36139 /// - `rd` — Destination register.
36140 /// - `rs1` — Source register.
36141 pub fn mop_r_15<T0, T1>(&mut self, rd: T0, rs1: T1)
36142 where
36143 Self: MopR15Emitter<T0, T1>,
36144 {
36145 <Self as MopR15Emitter<T0, T1>>::mop_r_15(self, rd, rs1);
36146 }
36147 /// RISC-V `mop.r.16` instruction.
36148 ///
36149 /// # Forms
36150 /// Assembly: `mop.r.16 rd rs1`
36151 /// Rust: `mop_r_16(rd, rs1)`
36152 ///
36153 /// # Arguments
36154 /// - `rd` — Destination register.
36155 /// - `rs1` — Source register.
36156 pub fn mop_r_16<T0, T1>(&mut self, rd: T0, rs1: T1)
36157 where
36158 Self: MopR16Emitter<T0, T1>,
36159 {
36160 <Self as MopR16Emitter<T0, T1>>::mop_r_16(self, rd, rs1);
36161 }
36162 /// RISC-V `mop.r.17` instruction.
36163 ///
36164 /// # Forms
36165 /// Assembly: `mop.r.17 rd rs1`
36166 /// Rust: `mop_r_17(rd, rs1)`
36167 ///
36168 /// # Arguments
36169 /// - `rd` — Destination register.
36170 /// - `rs1` — Source register.
36171 pub fn mop_r_17<T0, T1>(&mut self, rd: T0, rs1: T1)
36172 where
36173 Self: MopR17Emitter<T0, T1>,
36174 {
36175 <Self as MopR17Emitter<T0, T1>>::mop_r_17(self, rd, rs1);
36176 }
36177 /// RISC-V `mop.r.18` instruction.
36178 ///
36179 /// # Forms
36180 /// Assembly: `mop.r.18 rd rs1`
36181 /// Rust: `mop_r_18(rd, rs1)`
36182 ///
36183 /// # Arguments
36184 /// - `rd` — Destination register.
36185 /// - `rs1` — Source register.
36186 pub fn mop_r_18<T0, T1>(&mut self, rd: T0, rs1: T1)
36187 where
36188 Self: MopR18Emitter<T0, T1>,
36189 {
36190 <Self as MopR18Emitter<T0, T1>>::mop_r_18(self, rd, rs1);
36191 }
36192 /// RISC-V `mop.r.19` instruction.
36193 ///
36194 /// # Forms
36195 /// Assembly: `mop.r.19 rd rs1`
36196 /// Rust: `mop_r_19(rd, rs1)`
36197 ///
36198 /// # Arguments
36199 /// - `rd` — Destination register.
36200 /// - `rs1` — Source register.
36201 pub fn mop_r_19<T0, T1>(&mut self, rd: T0, rs1: T1)
36202 where
36203 Self: MopR19Emitter<T0, T1>,
36204 {
36205 <Self as MopR19Emitter<T0, T1>>::mop_r_19(self, rd, rs1);
36206 }
36207 /// RISC-V `mop.r.2` instruction.
36208 ///
36209 /// # Forms
36210 /// Assembly: `mop.r.2 rd rs1`
36211 /// Rust: `mop_r_2(rd, rs1)`
36212 ///
36213 /// # Arguments
36214 /// - `rd` — Destination register.
36215 /// - `rs1` — Source register.
36216 pub fn mop_r_2<T0, T1>(&mut self, rd: T0, rs1: T1)
36217 where
36218 Self: MopR2Emitter<T0, T1>,
36219 {
36220 <Self as MopR2Emitter<T0, T1>>::mop_r_2(self, rd, rs1);
36221 }
36222 /// RISC-V `mop.r.20` instruction.
36223 ///
36224 /// # Forms
36225 /// Assembly: `mop.r.20 rd rs1`
36226 /// Rust: `mop_r_20(rd, rs1)`
36227 ///
36228 /// # Arguments
36229 /// - `rd` — Destination register.
36230 /// - `rs1` — Source register.
36231 pub fn mop_r_20<T0, T1>(&mut self, rd: T0, rs1: T1)
36232 where
36233 Self: MopR20Emitter<T0, T1>,
36234 {
36235 <Self as MopR20Emitter<T0, T1>>::mop_r_20(self, rd, rs1);
36236 }
36237 /// RISC-V `mop.r.21` instruction.
36238 ///
36239 /// # Forms
36240 /// Assembly: `mop.r.21 rd rs1`
36241 /// Rust: `mop_r_21(rd, rs1)`
36242 ///
36243 /// # Arguments
36244 /// - `rd` — Destination register.
36245 /// - `rs1` — Source register.
36246 pub fn mop_r_21<T0, T1>(&mut self, rd: T0, rs1: T1)
36247 where
36248 Self: MopR21Emitter<T0, T1>,
36249 {
36250 <Self as MopR21Emitter<T0, T1>>::mop_r_21(self, rd, rs1);
36251 }
36252 /// RISC-V `mop.r.22` instruction.
36253 ///
36254 /// # Forms
36255 /// Assembly: `mop.r.22 rd rs1`
36256 /// Rust: `mop_r_22(rd, rs1)`
36257 ///
36258 /// # Arguments
36259 /// - `rd` — Destination register.
36260 /// - `rs1` — Source register.
36261 pub fn mop_r_22<T0, T1>(&mut self, rd: T0, rs1: T1)
36262 where
36263 Self: MopR22Emitter<T0, T1>,
36264 {
36265 <Self as MopR22Emitter<T0, T1>>::mop_r_22(self, rd, rs1);
36266 }
36267 /// RISC-V `mop.r.23` instruction.
36268 ///
36269 /// # Forms
36270 /// Assembly: `mop.r.23 rd rs1`
36271 /// Rust: `mop_r_23(rd, rs1)`
36272 ///
36273 /// # Arguments
36274 /// - `rd` — Destination register.
36275 /// - `rs1` — Source register.
36276 pub fn mop_r_23<T0, T1>(&mut self, rd: T0, rs1: T1)
36277 where
36278 Self: MopR23Emitter<T0, T1>,
36279 {
36280 <Self as MopR23Emitter<T0, T1>>::mop_r_23(self, rd, rs1);
36281 }
36282 /// RISC-V `mop.r.24` instruction.
36283 ///
36284 /// # Forms
36285 /// Assembly: `mop.r.24 rd rs1`
36286 /// Rust: `mop_r_24(rd, rs1)`
36287 ///
36288 /// # Arguments
36289 /// - `rd` — Destination register.
36290 /// - `rs1` — Source register.
36291 pub fn mop_r_24<T0, T1>(&mut self, rd: T0, rs1: T1)
36292 where
36293 Self: MopR24Emitter<T0, T1>,
36294 {
36295 <Self as MopR24Emitter<T0, T1>>::mop_r_24(self, rd, rs1);
36296 }
36297 /// RISC-V `mop.r.25` instruction.
36298 ///
36299 /// # Forms
36300 /// Assembly: `mop.r.25 rd rs1`
36301 /// Rust: `mop_r_25(rd, rs1)`
36302 ///
36303 /// # Arguments
36304 /// - `rd` — Destination register.
36305 /// - `rs1` — Source register.
36306 pub fn mop_r_25<T0, T1>(&mut self, rd: T0, rs1: T1)
36307 where
36308 Self: MopR25Emitter<T0, T1>,
36309 {
36310 <Self as MopR25Emitter<T0, T1>>::mop_r_25(self, rd, rs1);
36311 }
36312 /// RISC-V `mop.r.26` instruction.
36313 ///
36314 /// # Forms
36315 /// Assembly: `mop.r.26 rd rs1`
36316 /// Rust: `mop_r_26(rd, rs1)`
36317 ///
36318 /// # Arguments
36319 /// - `rd` — Destination register.
36320 /// - `rs1` — Source register.
36321 pub fn mop_r_26<T0, T1>(&mut self, rd: T0, rs1: T1)
36322 where
36323 Self: MopR26Emitter<T0, T1>,
36324 {
36325 <Self as MopR26Emitter<T0, T1>>::mop_r_26(self, rd, rs1);
36326 }
36327 /// RISC-V `mop.r.27` instruction.
36328 ///
36329 /// # Forms
36330 /// Assembly: `mop.r.27 rd rs1`
36331 /// Rust: `mop_r_27(rd, rs1)`
36332 ///
36333 /// # Arguments
36334 /// - `rd` — Destination register.
36335 /// - `rs1` — Source register.
36336 pub fn mop_r_27<T0, T1>(&mut self, rd: T0, rs1: T1)
36337 where
36338 Self: MopR27Emitter<T0, T1>,
36339 {
36340 <Self as MopR27Emitter<T0, T1>>::mop_r_27(self, rd, rs1);
36341 }
36342 /// RISC-V `mop.r.28` instruction.
36343 ///
36344 /// # Forms
36345 /// Assembly: `mop.r.28 rd rs1`
36346 /// Rust: `mop_r_28(rd, rs1)`
36347 ///
36348 /// # Arguments
36349 /// - `rd` — Destination register.
36350 /// - `rs1` — Source register.
36351 pub fn mop_r_28<T0, T1>(&mut self, rd: T0, rs1: T1)
36352 where
36353 Self: MopR28Emitter<T0, T1>,
36354 {
36355 <Self as MopR28Emitter<T0, T1>>::mop_r_28(self, rd, rs1);
36356 }
36357 /// RISC-V `mop.r.29` instruction.
36358 ///
36359 /// # Forms
36360 /// Assembly: `mop.r.29 rd rs1`
36361 /// Rust: `mop_r_29(rd, rs1)`
36362 ///
36363 /// # Arguments
36364 /// - `rd` — Destination register.
36365 /// - `rs1` — Source register.
36366 pub fn mop_r_29<T0, T1>(&mut self, rd: T0, rs1: T1)
36367 where
36368 Self: MopR29Emitter<T0, T1>,
36369 {
36370 <Self as MopR29Emitter<T0, T1>>::mop_r_29(self, rd, rs1);
36371 }
36372 /// RISC-V `mop.r.3` instruction.
36373 ///
36374 /// # Forms
36375 /// Assembly: `mop.r.3 rd rs1`
36376 /// Rust: `mop_r_3(rd, rs1)`
36377 ///
36378 /// # Arguments
36379 /// - `rd` — Destination register.
36380 /// - `rs1` — Source register.
36381 pub fn mop_r_3<T0, T1>(&mut self, rd: T0, rs1: T1)
36382 where
36383 Self: MopR3Emitter<T0, T1>,
36384 {
36385 <Self as MopR3Emitter<T0, T1>>::mop_r_3(self, rd, rs1);
36386 }
36387 /// RISC-V `mop.r.30` instruction.
36388 ///
36389 /// # Forms
36390 /// Assembly: `mop.r.30 rd rs1`
36391 /// Rust: `mop_r_30(rd, rs1)`
36392 ///
36393 /// # Arguments
36394 /// - `rd` — Destination register.
36395 /// - `rs1` — Source register.
36396 pub fn mop_r_30<T0, T1>(&mut self, rd: T0, rs1: T1)
36397 where
36398 Self: MopR30Emitter<T0, T1>,
36399 {
36400 <Self as MopR30Emitter<T0, T1>>::mop_r_30(self, rd, rs1);
36401 }
36402 /// RISC-V `mop.r.31` instruction.
36403 ///
36404 /// # Forms
36405 /// Assembly: `mop.r.31 rd rs1`
36406 /// Rust: `mop_r_31(rd, rs1)`
36407 ///
36408 /// # Arguments
36409 /// - `rd` — Destination register.
36410 /// - `rs1` — Source register.
36411 pub fn mop_r_31<T0, T1>(&mut self, rd: T0, rs1: T1)
36412 where
36413 Self: MopR31Emitter<T0, T1>,
36414 {
36415 <Self as MopR31Emitter<T0, T1>>::mop_r_31(self, rd, rs1);
36416 }
36417 /// RISC-V `mop.r.4` instruction.
36418 ///
36419 /// # Forms
36420 /// Assembly: `mop.r.4 rd rs1`
36421 /// Rust: `mop_r_4(rd, rs1)`
36422 ///
36423 /// # Arguments
36424 /// - `rd` — Destination register.
36425 /// - `rs1` — Source register.
36426 pub fn mop_r_4<T0, T1>(&mut self, rd: T0, rs1: T1)
36427 where
36428 Self: MopR4Emitter<T0, T1>,
36429 {
36430 <Self as MopR4Emitter<T0, T1>>::mop_r_4(self, rd, rs1);
36431 }
36432 /// RISC-V `mop.r.5` instruction.
36433 ///
36434 /// # Forms
36435 /// Assembly: `mop.r.5 rd rs1`
36436 /// Rust: `mop_r_5(rd, rs1)`
36437 ///
36438 /// # Arguments
36439 /// - `rd` — Destination register.
36440 /// - `rs1` — Source register.
36441 pub fn mop_r_5<T0, T1>(&mut self, rd: T0, rs1: T1)
36442 where
36443 Self: MopR5Emitter<T0, T1>,
36444 {
36445 <Self as MopR5Emitter<T0, T1>>::mop_r_5(self, rd, rs1);
36446 }
36447 /// RISC-V `mop.r.6` instruction.
36448 ///
36449 /// # Forms
36450 /// Assembly: `mop.r.6 rd rs1`
36451 /// Rust: `mop_r_6(rd, rs1)`
36452 ///
36453 /// # Arguments
36454 /// - `rd` — Destination register.
36455 /// - `rs1` — Source register.
36456 pub fn mop_r_6<T0, T1>(&mut self, rd: T0, rs1: T1)
36457 where
36458 Self: MopR6Emitter<T0, T1>,
36459 {
36460 <Self as MopR6Emitter<T0, T1>>::mop_r_6(self, rd, rs1);
36461 }
36462 /// RISC-V `mop.r.7` instruction.
36463 ///
36464 /// # Forms
36465 /// Assembly: `mop.r.7 rd rs1`
36466 /// Rust: `mop_r_7(rd, rs1)`
36467 ///
36468 /// # Arguments
36469 /// - `rd` — Destination register.
36470 /// - `rs1` — Source register.
36471 pub fn mop_r_7<T0, T1>(&mut self, rd: T0, rs1: T1)
36472 where
36473 Self: MopR7Emitter<T0, T1>,
36474 {
36475 <Self as MopR7Emitter<T0, T1>>::mop_r_7(self, rd, rs1);
36476 }
36477 /// RISC-V `mop.r.8` instruction.
36478 ///
36479 /// # Forms
36480 /// Assembly: `mop.r.8 rd rs1`
36481 /// Rust: `mop_r_8(rd, rs1)`
36482 ///
36483 /// # Arguments
36484 /// - `rd` — Destination register.
36485 /// - `rs1` — Source register.
36486 pub fn mop_r_8<T0, T1>(&mut self, rd: T0, rs1: T1)
36487 where
36488 Self: MopR8Emitter<T0, T1>,
36489 {
36490 <Self as MopR8Emitter<T0, T1>>::mop_r_8(self, rd, rs1);
36491 }
36492 /// RISC-V `mop.r.9` instruction.
36493 ///
36494 /// # Forms
36495 /// Assembly: `mop.r.9 rd rs1`
36496 /// Rust: `mop_r_9(rd, rs1)`
36497 ///
36498 /// # Arguments
36499 /// - `rd` — Destination register.
36500 /// - `rs1` — Source register.
36501 pub fn mop_r_9<T0, T1>(&mut self, rd: T0, rs1: T1)
36502 where
36503 Self: MopR9Emitter<T0, T1>,
36504 {
36505 <Self as MopR9Emitter<T0, T1>>::mop_r_9(self, rd, rs1);
36506 }
36507 /// RISC-V `mop.rr.0` instruction.
36508 ///
36509 /// # Forms
36510 /// Assembly: `mop.rr.0 rd rs1 rs2`
36511 /// Rust: `mop_rr_0(rd, rs1, rs2)`
36512 ///
36513 /// # Arguments
36514 /// - `rd` — Destination register.
36515 /// - `rs1` — Source register.
36516 /// - `rs2` — Source register.
36517 pub fn mop_rr_0<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36518 where
36519 Self: MopRr0Emitter<T0, T1, T2>,
36520 {
36521 <Self as MopRr0Emitter<T0, T1, T2>>::mop_rr_0(self, rd, rs1, rs2);
36522 }
36523 /// RISC-V `mop.rr.1` instruction.
36524 ///
36525 /// # Forms
36526 /// Assembly: `mop.rr.1 rd rs1 rs2`
36527 /// Rust: `mop_rr_1(rd, rs1, rs2)`
36528 ///
36529 /// # Arguments
36530 /// - `rd` — Destination register.
36531 /// - `rs1` — Source register.
36532 /// - `rs2` — Source register.
36533 pub fn mop_rr_1<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36534 where
36535 Self: MopRr1Emitter<T0, T1, T2>,
36536 {
36537 <Self as MopRr1Emitter<T0, T1, T2>>::mop_rr_1(self, rd, rs1, rs2);
36538 }
36539 /// RISC-V `mop.rr.2` instruction.
36540 ///
36541 /// # Forms
36542 /// Assembly: `mop.rr.2 rd rs1 rs2`
36543 /// Rust: `mop_rr_2(rd, rs1, rs2)`
36544 ///
36545 /// # Arguments
36546 /// - `rd` — Destination register.
36547 /// - `rs1` — Source register.
36548 /// - `rs2` — Source register.
36549 pub fn mop_rr_2<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36550 where
36551 Self: MopRr2Emitter<T0, T1, T2>,
36552 {
36553 <Self as MopRr2Emitter<T0, T1, T2>>::mop_rr_2(self, rd, rs1, rs2);
36554 }
36555 /// RISC-V `mop.rr.3` instruction.
36556 ///
36557 /// # Forms
36558 /// Assembly: `mop.rr.3 rd rs1 rs2`
36559 /// Rust: `mop_rr_3(rd, rs1, rs2)`
36560 ///
36561 /// # Arguments
36562 /// - `rd` — Destination register.
36563 /// - `rs1` — Source register.
36564 /// - `rs2` — Source register.
36565 pub fn mop_rr_3<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36566 where
36567 Self: MopRr3Emitter<T0, T1, T2>,
36568 {
36569 <Self as MopRr3Emitter<T0, T1, T2>>::mop_rr_3(self, rd, rs1, rs2);
36570 }
36571 /// RISC-V `mop.rr.4` instruction.
36572 ///
36573 /// # Forms
36574 /// Assembly: `mop.rr.4 rd rs1 rs2`
36575 /// Rust: `mop_rr_4(rd, rs1, rs2)`
36576 ///
36577 /// # Arguments
36578 /// - `rd` — Destination register.
36579 /// - `rs1` — Source register.
36580 /// - `rs2` — Source register.
36581 pub fn mop_rr_4<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36582 where
36583 Self: MopRr4Emitter<T0, T1, T2>,
36584 {
36585 <Self as MopRr4Emitter<T0, T1, T2>>::mop_rr_4(self, rd, rs1, rs2);
36586 }
36587 /// RISC-V `mop.rr.5` instruction.
36588 ///
36589 /// # Forms
36590 /// Assembly: `mop.rr.5 rd rs1 rs2`
36591 /// Rust: `mop_rr_5(rd, rs1, rs2)`
36592 ///
36593 /// # Arguments
36594 /// - `rd` — Destination register.
36595 /// - `rs1` — Source register.
36596 /// - `rs2` — Source register.
36597 pub fn mop_rr_5<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36598 where
36599 Self: MopRr5Emitter<T0, T1, T2>,
36600 {
36601 <Self as MopRr5Emitter<T0, T1, T2>>::mop_rr_5(self, rd, rs1, rs2);
36602 }
36603 /// RISC-V `mop.rr.6` instruction.
36604 ///
36605 /// # Forms
36606 /// Assembly: `mop.rr.6 rd rs1 rs2`
36607 /// Rust: `mop_rr_6(rd, rs1, rs2)`
36608 ///
36609 /// # Arguments
36610 /// - `rd` — Destination register.
36611 /// - `rs1` — Source register.
36612 /// - `rs2` — Source register.
36613 pub fn mop_rr_6<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36614 where
36615 Self: MopRr6Emitter<T0, T1, T2>,
36616 {
36617 <Self as MopRr6Emitter<T0, T1, T2>>::mop_rr_6(self, rd, rs1, rs2);
36618 }
36619 /// RISC-V `mop.rr.7` instruction.
36620 ///
36621 /// # Forms
36622 /// Assembly: `mop.rr.7 rd rs1 rs2`
36623 /// Rust: `mop_rr_7(rd, rs1, rs2)`
36624 ///
36625 /// # Arguments
36626 /// - `rd` — Destination register.
36627 /// - `rs1` — Source register.
36628 /// - `rs2` — Source register.
36629 pub fn mop_rr_7<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36630 where
36631 Self: MopRr7Emitter<T0, T1, T2>,
36632 {
36633 <Self as MopRr7Emitter<T0, T1, T2>>::mop_rr_7(self, rd, rs1, rs2);
36634 }
36635 /// Machine Exception Return
36636 ///
36637 /// Returns from an exception in M-mode.
36638 ///
36639 /// # Forms
36640 /// Assembly: `mret ""`
36641 /// Rust: `mret()`
36642 ///
36643 /// # Arguments
36644 pub fn mret(&mut self)
36645 where
36646 Self: MretEmitter,
36647 {
36648 <Self as MretEmitter>::mret(self);
36649 }
36650 /// Signed multiply
36651 ///
36652 /// MUL performs an XLEN-bitxXLEN-bit multiplication of `rs1` by `rs2` and places the lower
36653 /// XLEN bits in the destination register.
36654 /// Any overflow is thrown away.
36655 ///
36656 /// \[NOTE\]
36657 /// If both the high and low bits of the same product are required, then the recommended code
36658 /// sequence is:
36659 /// MULH\[\[S\]U\] rdh, rs1, rs2; MUL rdl, rs1, rs2
36660 /// (source register specifiers must be in same order and rdh cannot be the same as rs1 or rs2).
36661 /// Microarchitectures can then fuse these into a single multiply operation instead of
36662 /// performing two separate multiplies.
36663 ///
36664 /// # Forms
36665 /// Assembly: `mul xd, xs1, xs2`
36666 /// Rust: `mul(rd, rs1, rs2)`
36667 ///
36668 /// # Arguments
36669 /// - `rd` — Destination register.
36670 /// - `rs1` — Source register.
36671 /// - `rs2` — Source register.
36672 pub fn mul<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36673 where
36674 Self: MulEmitter<T0, T1, T2>,
36675 {
36676 <Self as MulEmitter<T0, T1, T2>>::mul(self, rd, rs1, rs2);
36677 }
36678 /// Signed multiply high
36679 ///
36680 /// Multiply the signed values in rs1 to rs2, and store the upper half of the result in rd.
36681 /// The lower half is thrown away.
36682 ///
36683 /// If both the upper and lower halves are needed, it suggested to use the sequence:
36684 ///
36685 /// ---
36686 /// mulh rdh, rs1, rs2
36687 /// mul rdl, rs1, rs2
36688 /// ---
36689 ///
36690 /// Microarchitectures may look for that sequence and fuse the operations.
36691 ///
36692 /// # Forms
36693 /// Assembly: `mulh xd, xs1, xs2`
36694 /// Rust: `mulh(rd, rs1, rs2)`
36695 ///
36696 /// # Arguments
36697 /// - `rd` — Destination register.
36698 /// - `rs1` — Source register.
36699 /// - `rs2` — Source register.
36700 pub fn mulh<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36701 where
36702 Self: MulhEmitter<T0, T1, T2>,
36703 {
36704 <Self as MulhEmitter<T0, T1, T2>>::mulh(self, rd, rs1, rs2);
36705 }
36706 /// Signed/unsigned multiply high
36707 ///
36708 /// Multiply the signed value in rs1 by the unsigned value in rs2, and store the upper half of the result in rd.
36709 /// The lower half is thrown away.
36710 ///
36711 /// If both the upper and lower halves are needed, it suggested to use the sequence:
36712 ///
36713 /// ---
36714 /// mulhsu rdh, rs1, rs2
36715 /// mul rdl, rs1, rs2
36716 /// ---
36717 ///
36718 /// Microarchitectures may look for that sequence and fuse the operations.
36719 ///
36720 /// # Forms
36721 /// Assembly: `mulhsu xd, xs1, xs2`
36722 /// Rust: `mulhsu(rd, rs1, rs2)`
36723 ///
36724 /// # Arguments
36725 /// - `rd` — Destination register.
36726 /// - `rs1` — Source register.
36727 /// - `rs2` — Source register.
36728 pub fn mulhsu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36729 where
36730 Self: MulhsuEmitter<T0, T1, T2>,
36731 {
36732 <Self as MulhsuEmitter<T0, T1, T2>>::mulhsu(self, rd, rs1, rs2);
36733 }
36734 /// Unsigned multiply high
36735 ///
36736 /// Multiply the unsigned values in rs1 to rs2, and store the upper half of the result in rd.
36737 /// The lower half is thrown away.
36738 ///
36739 /// If both the upper and lower halves are needed, it suggested to use the sequence:
36740 ///
36741 /// ---
36742 /// mulhu rdh, rs1, rs2
36743 /// mul rdl, rs1, rs2
36744 /// ---
36745 ///
36746 /// Microarchitectures may look for that sequence and fuse the operations.
36747 ///
36748 /// # Forms
36749 /// Assembly: `mulhu xd, xs1, xs2`
36750 /// Rust: `mulhu(rd, rs1, rs2)`
36751 ///
36752 /// # Arguments
36753 /// - `rd` — Destination register.
36754 /// - `rs1` — Source register.
36755 /// - `rs2` — Source register.
36756 pub fn mulhu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36757 where
36758 Self: MulhuEmitter<T0, T1, T2>,
36759 {
36760 <Self as MulhuEmitter<T0, T1, T2>>::mulhu(self, rd, rs1, rs2);
36761 }
36762 /// Signed 32-bit multiply
36763 ///
36764 /// Multiplies the lower 32 bits of the source registers, placing the sign-extension of the
36765 /// lower 32 bits of the result into the destination register.
36766 ///
36767 /// Any overflow is thrown away.
36768 ///
36769 /// \[NOTE\]
36770 /// In RV64, MUL can be used to obtain the upper 32 bits of the 64-bit product,
36771 /// but signed arguments must be proper 32-bit signed values, whereas unsigned arguments
36772 /// must have their upper 32 bits clear. If the arguments are not known to be sign- or zero-extended,
36773 /// an alternative is to shift both arguments left by 32 bits, then use MULH\[\[S\]U\].
36774 ///
36775 /// # Forms
36776 /// Assembly: `mulw xd, xs1, xs2`
36777 /// Rust: `mulw(rd, rs1, rs2)`
36778 ///
36779 /// # Arguments
36780 /// - `rd` — Destination register.
36781 /// - `rs1` — Source register.
36782 /// - `rs2` — Source register.
36783 pub fn mulw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36784 where
36785 Self: MulwEmitter<T0, T1, T2>,
36786 {
36787 <Self as MulwEmitter<T0, T1, T2>>::mulw(self, rd, rs1, rs2);
36788 }
36789 /// RISC-V `mv` instruction.
36790 ///
36791 /// # Forms
36792 /// Assembly: `mv rd rs1`
36793 /// Rust: `mv(rd, rs1)`
36794 ///
36795 /// # Arguments
36796 /// - `rd` — Destination register.
36797 /// - `rs1` — Source register.
36798 pub fn mv<T0, T1>(&mut self, rd: T0, rs1: T1)
36799 where
36800 Self: MvEmitter<T0, T1>,
36801 {
36802 <Self as MvEmitter<T0, T1>>::mv(self, rd, rs1);
36803 }
36804 /// RISC-V `neg` instruction.
36805 ///
36806 /// # Forms
36807 /// Assembly: `neg rd rs1`
36808 /// Rust: `neg(rd, rs1)`
36809 ///
36810 /// # Arguments
36811 /// - `rd` — Destination register.
36812 /// - `rs1` — Source register.
36813 pub fn neg<T0, T1>(&mut self, rd: T0, rs1: T1)
36814 where
36815 Self: NegEmitter<T0, T1>,
36816 {
36817 <Self as NegEmitter<T0, T1>>::neg(self, rd, rs1);
36818 }
36819 /// RISC-V `nop` instruction.
36820 ///
36821 /// # Forms
36822 /// Assembly: `nop`
36823 /// Rust: `nop()`
36824 ///
36825 /// # Arguments
36826 pub fn nop(&mut self)
36827 where
36828 Self: NopEmitter,
36829 {
36830 <Self as NopEmitter>::nop(self);
36831 }
36832 /// RISC-V `ntl.all` instruction.
36833 ///
36834 /// # Forms
36835 /// Assembly: `ntl.all`
36836 /// Rust: `ntl_all()`
36837 ///
36838 /// # Arguments
36839 pub fn ntl_all(&mut self)
36840 where
36841 Self: NtlAllEmitter,
36842 {
36843 <Self as NtlAllEmitter>::ntl_all(self);
36844 }
36845 /// RISC-V `ntl.p1` instruction.
36846 ///
36847 /// # Forms
36848 /// Assembly: `ntl.p1`
36849 /// Rust: `ntl_p1()`
36850 ///
36851 /// # Arguments
36852 pub fn ntl_p1(&mut self)
36853 where
36854 Self: NtlP1Emitter,
36855 {
36856 <Self as NtlP1Emitter>::ntl_p1(self);
36857 }
36858 /// RISC-V `ntl.pall` instruction.
36859 ///
36860 /// # Forms
36861 /// Assembly: `ntl.pall`
36862 /// Rust: `ntl_pall()`
36863 ///
36864 /// # Arguments
36865 pub fn ntl_pall(&mut self)
36866 where
36867 Self: NtlPallEmitter,
36868 {
36869 <Self as NtlPallEmitter>::ntl_pall(self);
36870 }
36871 /// RISC-V `ntl.s1` instruction.
36872 ///
36873 /// # Forms
36874 /// Assembly: `ntl.s1`
36875 /// Rust: `ntl_s1()`
36876 ///
36877 /// # Arguments
36878 pub fn ntl_s1(&mut self)
36879 where
36880 Self: NtlS1Emitter,
36881 {
36882 <Self as NtlS1Emitter>::ntl_s1(self);
36883 }
36884 /// Or
36885 ///
36886 /// Or rs1 with rs2, and store the result in rd
36887 ///
36888 /// # Forms
36889 /// Assembly: `or xd, xs1, xs2`
36890 /// Rust: `or(rd, rs1, rs2)`
36891 ///
36892 /// # Arguments
36893 /// - `rd` — Destination register.
36894 /// - `rs1` — Source register.
36895 /// - `rs2` — Source register.
36896 pub fn or<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36897 where
36898 Self: OrEmitter<T0, T1, T2>,
36899 {
36900 <Self as OrEmitter<T0, T1, T2>>::or(self, rd, rs1, rs2);
36901 }
36902 /// Bitware OR-combine, byte granule
36903 ///
36904 /// Combines the bits within each byte using bitwise logical OR. This sets the bits
36905 /// of each byte in the result rd to all zeros if no bit within the respective byte
36906 /// of rs is set, or to all ones if any bit within the respective byte of rs is set.
36907 ///
36908 /// # Forms
36909 /// Assembly: `orc.b xd, xs1, xs2`
36910 /// Rust: `orc_b(rd, rs1)`
36911 ///
36912 /// # Arguments
36913 /// - `rd` — Destination register.
36914 /// - `rs1` — Source register.
36915 pub fn orc_b<T0, T1>(&mut self, rd: T0, rs1: T1)
36916 where
36917 Self: OrcBEmitter<T0, T1>,
36918 {
36919 <Self as OrcBEmitter<T0, T1>>::orc_b(self, rd, rs1);
36920 }
36921 /// Or immediate
36922 ///
36923 /// Or an immediate to the value in rs1, and store the result in rd
36924 ///
36925 /// # Forms
36926 /// Assembly: `ori xd, xs1, imm`
36927 /// Rust: `ori(rd, rs1, imm)`
36928 ///
36929 /// # Arguments
36930 /// - `rd` — Destination register.
36931 /// - `rs1` — Source register.
36932 /// - `imm` — Immediate encoding value.
36933 pub fn ori<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
36934 where
36935 Self: OriEmitter<T0, T1, T2>,
36936 {
36937 <Self as OriEmitter<T0, T1, T2>>::ori(self, rd, rs1, imm);
36938 }
36939 /// OR with inverted operand
36940 ///
36941 /// This instruction performs the bitwise logical OR operation between rs1 and the bitwise inversion of rs2.
36942 ///
36943 /// # Forms
36944 /// Assembly: `orn xd, xs1, xs2`
36945 /// Rust: `orn(rd, rs1, rs2)`
36946 ///
36947 /// # Arguments
36948 /// - `rd` — Destination register.
36949 /// - `rs1` — Source register.
36950 /// - `rs2` — Source register.
36951 pub fn orn<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36952 where
36953 Self: OrnEmitter<T0, T1, T2>,
36954 {
36955 <Self as OrnEmitter<T0, T1, T2>>::orn(self, rd, rs1, rs2);
36956 }
36957 /// RISC-V `pack` instruction.
36958 ///
36959 /// # Forms
36960 /// Assembly: `pack xd, xs1, xs2`
36961 /// Rust: `pack(rd, rs1, rs2)`
36962 ///
36963 /// # Arguments
36964 /// - `rd` — Destination register.
36965 /// - `rs1` — Source register.
36966 /// - `rs2` — Source register.
36967 pub fn pack<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36968 where
36969 Self: PackEmitter<T0, T1, T2>,
36970 {
36971 <Self as PackEmitter<T0, T1, T2>>::pack(self, rd, rs1, rs2);
36972 }
36973 /// RISC-V `packh` instruction.
36974 ///
36975 /// # Forms
36976 /// Assembly: `packh xd, xs1, xs2`
36977 /// Rust: `packh(rd, rs1, rs2)`
36978 ///
36979 /// # Arguments
36980 /// - `rd` — Destination register.
36981 /// - `rs1` — Source register.
36982 /// - `rs2` — Source register.
36983 pub fn packh<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
36984 where
36985 Self: PackhEmitter<T0, T1, T2>,
36986 {
36987 <Self as PackhEmitter<T0, T1, T2>>::packh(self, rd, rs1, rs2);
36988 }
36989 /// RISC-V `packw` instruction.
36990 ///
36991 /// # Forms
36992 /// Assembly: `packw xd, xs1, xs2`
36993 /// Rust: `packw(rd, rs1, rs2)`
36994 ///
36995 /// # Arguments
36996 /// - `rd` — Destination register.
36997 /// - `rs1` — Source register.
36998 /// - `rs2` — Source register.
36999 pub fn packw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
37000 where
37001 Self: PackwEmitter<T0, T1, T2>,
37002 {
37003 <Self as PackwEmitter<T0, T1, T2>>::packw(self, rd, rs1, rs2);
37004 }
37005 /// RISC-V `pause` instruction.
37006 ///
37007 /// # Forms
37008 /// Assembly: `pause`
37009 /// Rust: `pause()`
37010 ///
37011 /// # Arguments
37012 pub fn pause(&mut self)
37013 where
37014 Self: PauseEmitter,
37015 {
37016 <Self as PauseEmitter>::pause(self);
37017 }
37018 /// RISC-V `prefetch.i` instruction.
37019 ///
37020 /// # Forms
37021 /// Assembly: `prefetch.i rs1 imm12lohi`
37022 /// Rust: `prefetch_i(rs1, imm)`
37023 ///
37024 /// # Arguments
37025 /// - `rs1` — Source register.
37026 /// - `imm` — Immediate encoding value.
37027 pub fn prefetch_i<T0, T1>(&mut self, rs1: T0, imm: T1)
37028 where
37029 Self: PrefetchIEmitter<T0, T1>,
37030 {
37031 <Self as PrefetchIEmitter<T0, T1>>::prefetch_i(self, rs1, imm);
37032 }
37033 /// RISC-V `prefetch.r` instruction.
37034 ///
37035 /// # Forms
37036 /// Assembly: `prefetch.r rs1 imm12lohi`
37037 /// Rust: `prefetch_r(rs1, imm)`
37038 ///
37039 /// # Arguments
37040 /// - `rs1` — Source register.
37041 /// - `imm` — Immediate encoding value.
37042 pub fn prefetch_r<T0, T1>(&mut self, rs1: T0, imm: T1)
37043 where
37044 Self: PrefetchREmitter<T0, T1>,
37045 {
37046 <Self as PrefetchREmitter<T0, T1>>::prefetch_r(self, rs1, imm);
37047 }
37048 /// RISC-V `prefetch.w` instruction.
37049 ///
37050 /// # Forms
37051 /// Assembly: `prefetch.w rs1 imm12lohi`
37052 /// Rust: `prefetch_w(rs1, imm)`
37053 ///
37054 /// # Arguments
37055 /// - `rs1` — Source register.
37056 /// - `imm` — Immediate encoding value.
37057 pub fn prefetch_w<T0, T1>(&mut self, rs1: T0, imm: T1)
37058 where
37059 Self: PrefetchWEmitter<T0, T1>,
37060 {
37061 <Self as PrefetchWEmitter<T0, T1>>::prefetch_w(self, rs1, imm);
37062 }
37063 /// RISC-V `rdcycle` instruction.
37064 ///
37065 /// # Forms
37066 /// Assembly: `rdcycle rd`
37067 /// Rust: `rdcycle(rd)`
37068 ///
37069 /// # Arguments
37070 /// - `rd` — Destination register.
37071 pub fn rdcycle<T0>(&mut self, rd: T0)
37072 where
37073 Self: RdcycleEmitter<T0>,
37074 {
37075 <Self as RdcycleEmitter<T0>>::rdcycle(self, rd);
37076 }
37077 /// RISC-V `rdcycleh` instruction.
37078 ///
37079 /// # Forms
37080 /// Assembly: `rdcycleh rd`
37081 /// Rust: `rdcycleh(rd)`
37082 ///
37083 /// # Arguments
37084 /// - `rd` — Destination register.
37085 pub fn rdcycleh<T0>(&mut self, rd: T0)
37086 where
37087 Self: RdcyclehEmitter<T0>,
37088 {
37089 <Self as RdcyclehEmitter<T0>>::rdcycleh(self, rd);
37090 }
37091 /// RISC-V `rdinstret` instruction.
37092 ///
37093 /// # Forms
37094 /// Assembly: `rdinstret rd`
37095 /// Rust: `rdinstret(rd)`
37096 ///
37097 /// # Arguments
37098 /// - `rd` — Destination register.
37099 pub fn rdinstret<T0>(&mut self, rd: T0)
37100 where
37101 Self: RdinstretEmitter<T0>,
37102 {
37103 <Self as RdinstretEmitter<T0>>::rdinstret(self, rd);
37104 }
37105 /// RISC-V `rdinstreth` instruction.
37106 ///
37107 /// # Forms
37108 /// Assembly: `rdinstreth rd`
37109 /// Rust: `rdinstreth(rd)`
37110 ///
37111 /// # Arguments
37112 /// - `rd` — Destination register.
37113 pub fn rdinstreth<T0>(&mut self, rd: T0)
37114 where
37115 Self: RdinstrethEmitter<T0>,
37116 {
37117 <Self as RdinstrethEmitter<T0>>::rdinstreth(self, rd);
37118 }
37119 /// RISC-V `rdtime` instruction.
37120 ///
37121 /// # Forms
37122 /// Assembly: `rdtime rd`
37123 /// Rust: `rdtime(rd)`
37124 ///
37125 /// # Arguments
37126 /// - `rd` — Destination register.
37127 pub fn rdtime<T0>(&mut self, rd: T0)
37128 where
37129 Self: RdtimeEmitter<T0>,
37130 {
37131 <Self as RdtimeEmitter<T0>>::rdtime(self, rd);
37132 }
37133 /// RISC-V `rdtimeh` instruction.
37134 ///
37135 /// # Forms
37136 /// Assembly: `rdtimeh rd`
37137 /// Rust: `rdtimeh(rd)`
37138 ///
37139 /// # Arguments
37140 /// - `rd` — Destination register.
37141 pub fn rdtimeh<T0>(&mut self, rd: T0)
37142 where
37143 Self: RdtimehEmitter<T0>,
37144 {
37145 <Self as RdtimehEmitter<T0>>::rdtimeh(self, rd);
37146 }
37147 /// Signed remainder
37148 ///
37149 /// Calculate the remainder of signed division of rs1 by rs2, and store the result in rd.
37150 ///
37151 /// If the value in register rs2 is zero, write the value in rs1 into rd;
37152 ///
37153 /// If the result of the division overflows, write zero into rd;
37154 ///
37155 /// # Forms
37156 /// Assembly: `rem xd, xs1, xs2`
37157 /// Rust: `rem(rd, rs1, rs2)`
37158 ///
37159 /// # Arguments
37160 /// - `rd` — Destination register.
37161 /// - `rs1` — Source register.
37162 /// - `rs2` — Source register.
37163 pub fn rem<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
37164 where
37165 Self: RemEmitter<T0, T1, T2>,
37166 {
37167 <Self as RemEmitter<T0, T1, T2>>::rem(self, rd, rs1, rs2);
37168 }
37169 /// Unsigned remainder
37170 ///
37171 /// Calculate the remainder of unsigned division of rs1 by rs2, and store the result in rd.
37172 ///
37173 /// # Forms
37174 /// Assembly: `remu xd, xs1, xs2`
37175 /// Rust: `remu(rd, rs1, rs2)`
37176 ///
37177 /// # Arguments
37178 /// - `rd` — Destination register.
37179 /// - `rs1` — Source register.
37180 /// - `rs2` — Source register.
37181 pub fn remu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
37182 where
37183 Self: RemuEmitter<T0, T1, T2>,
37184 {
37185 <Self as RemuEmitter<T0, T1, T2>>::remu(self, rd, rs1, rs2);
37186 }
37187 /// Unsigned 32-bit remainder
37188 ///
37189 /// Calculate the remainder of unsigned division of the 32-bit values in rs1 by rs2,
37190 /// and store the sign-extended result in rd.
37191 ///
37192 /// If the value in rs2 is zero, rd gets the sign-extended value in rs1.
37193 ///
37194 /// # Forms
37195 /// Assembly: `remuw xd, xs1, xs2`
37196 /// Rust: `remuw(rd, rs1, rs2)`
37197 ///
37198 /// # Arguments
37199 /// - `rd` — Destination register.
37200 /// - `rs1` — Source register.
37201 /// - `rs2` — Source register.
37202 pub fn remuw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
37203 where
37204 Self: RemuwEmitter<T0, T1, T2>,
37205 {
37206 <Self as RemuwEmitter<T0, T1, T2>>::remuw(self, rd, rs1, rs2);
37207 }
37208 /// Signed 32-bit remainder
37209 ///
37210 /// Calculate the remainder of signed division of the 32-bit values rs1 by rs2,
37211 /// and store the sign-extended result in rd.
37212 ///
37213 /// If the value in register rs2 is zero, write the sign-extended 32-bit value in rs1 into rd;
37214 ///
37215 /// If the result of the division overflows, write zero into rd;
37216 ///
37217 /// # Forms
37218 /// Assembly: `remw xd, xs1, xs2`
37219 /// Rust: `remw(rd, rs1, rs2)`
37220 ///
37221 /// # Arguments
37222 /// - `rd` — Destination register.
37223 /// - `rs1` — Source register.
37224 /// - `rs2` — Source register.
37225 pub fn remw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
37226 where
37227 Self: RemwEmitter<T0, T1, T2>,
37228 {
37229 <Self as RemwEmitter<T0, T1, T2>>::remw(self, rd, rs1, rs2);
37230 }
37231 /// RISC-V `ret` instruction.
37232 ///
37233 /// # Forms
37234 /// Assembly: `ret`
37235 /// Rust: `ret()`
37236 ///
37237 /// # Arguments
37238 pub fn ret(&mut self)
37239 where
37240 Self: RetEmitter,
37241 {
37242 <Self as RetEmitter>::ret(self);
37243 }
37244 /// Byte-reverse register (RV64 encoding)
37245 ///
37246 /// This instruction reverses the order of the bytes in rs1.
37247 ///
37248 /// \[NOTE\]
37249 /// The rev8 mnemonic corresponds to different instruction encodings in RV32 and RV64.
37250 ///
37251 /// \[NOTE\]
37252 /// The byte-reverse operation is only available for the full register width. To emulate word-sized
37253 /// and halfword-sized byte-reversal, perform a `rev8 rd,rs` followed by a `srai rd,rd,K`, where K
37254 /// is XLEN-32 and XLEN-16, respectively.
37255 ///
37256 /// # Forms
37257 /// Assembly: `rev8 xd, xs1`
37258 /// Rust: `rev8(rd, rs1)`
37259 ///
37260 /// # Arguments
37261 /// - `rd` — Destination register.
37262 /// - `rs1` — Source register.
37263 pub fn rev8<T0, T1>(&mut self, rd: T0, rs1: T1)
37264 where
37265 Self: Rev8Emitter<T0, T1>,
37266 {
37267 <Self as Rev8Emitter<T0, T1>>::rev8(self, rd, rs1);
37268 }
37269 /// Byte-reverse register (RV64 encoding)
37270 ///
37271 /// This instruction reverses the order of the bytes in rs1.
37272 ///
37273 /// \[NOTE\]
37274 /// The rev8 mnemonic corresponds to different instruction encodings in RV32 and RV64.
37275 ///
37276 /// \[NOTE\]
37277 /// The byte-reverse operation is only available for the full register width. To emulate word-sized
37278 /// and halfword-sized byte-reversal, perform a `rev8 rd,rs` followed by a `srai rd,rd,K`, where K
37279 /// is XLEN-32 and XLEN-16, respectively.
37280 ///
37281 /// # Forms
37282 /// Assembly: `rev8.rv32 xd, xs1`
37283 /// Rust: `rev8_rv32(rd, rs1)`
37284 ///
37285 /// # Arguments
37286 /// - `rd` — Destination register.
37287 /// - `rs1` — Source register.
37288 pub fn rev8_rv32<T0, T1>(&mut self, rd: T0, rs1: T1)
37289 where
37290 Self: Rev8Rv32Emitter<T0, T1>,
37291 {
37292 <Self as Rev8Rv32Emitter<T0, T1>>::rev8_rv32(self, rd, rs1);
37293 }
37294 /// Rotate left (Register)
37295 ///
37296 /// This instruction performs a rotate left of rs1 by the amount in least-significant `log2(XLEN)` bits of rs2.
37297 ///
37298 /// # Forms
37299 /// Assembly: `rol xd, xs1, xs2`
37300 /// Rust: `rol(rd, rs1, rs2)`
37301 ///
37302 /// # Arguments
37303 /// - `rd` — Destination register.
37304 /// - `rs1` — Source register.
37305 /// - `rs2` — Source register.
37306 pub fn rol<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
37307 where
37308 Self: RolEmitter<T0, T1, T2>,
37309 {
37310 <Self as RolEmitter<T0, T1, T2>>::rol(self, rd, rs1, rs2);
37311 }
37312 /// Rotate left word (Register)
37313 ///
37314 /// This instruction performs a rotate left of the least-significant word of rs1 by the amount in least-significant 5 bits of rs2.
37315 /// The resulting word value is sign-extended by copying bit 31 to all of the more-significant bits.
37316 ///
37317 /// # Forms
37318 /// Assembly: `rolw xd, xs1, xs2`
37319 /// Rust: `rolw(rd, rs1, rs2)`
37320 ///
37321 /// # Arguments
37322 /// - `rd` — Destination register.
37323 /// - `rs1` — Source register.
37324 /// - `rs2` — Source register.
37325 pub fn rolw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
37326 where
37327 Self: RolwEmitter<T0, T1, T2>,
37328 {
37329 <Self as RolwEmitter<T0, T1, T2>>::rolw(self, rd, rs1, rs2);
37330 }
37331 /// Rotate right (Register)
37332 ///
37333 /// This instruction performs a rotate right of rs1 by the amount in least-significant `log2(XLEN)` bits of rs2.
37334 ///
37335 /// # Forms
37336 /// Assembly: `ror xd, xs1, xs2`
37337 /// Rust: `ror(rd, rs1, rs2)`
37338 ///
37339 /// # Arguments
37340 /// - `rd` — Destination register.
37341 /// - `rs1` — Source register.
37342 /// - `rs2` — Source register.
37343 pub fn ror<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
37344 where
37345 Self: RorEmitter<T0, T1, T2>,
37346 {
37347 <Self as RorEmitter<T0, T1, T2>>::ror(self, rd, rs1, rs2);
37348 }
37349 /// Rotate right (Immediate)
37350 ///
37351 /// This instruction performs a rotate right of rs1 by the amount in the least-significant log2(XLEN) bits of shamt.
37352 /// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
37353 ///
37354 /// # Forms
37355 /// Assembly: `rori xd, xs1, shamt`
37356 /// Rust: `rori(rd, rs1, shamtd)`
37357 ///
37358 /// # Arguments
37359 /// - `rd` — Destination register.
37360 /// - `rs1` — Source register.
37361 /// - `shamtd` — Immediate encoding value.
37362 pub fn rori<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtd: T2)
37363 where
37364 Self: RoriEmitter<T0, T1, T2>,
37365 {
37366 <Self as RoriEmitter<T0, T1, T2>>::rori(self, rd, rs1, shamtd);
37367 }
37368 /// Rotate right (Immediate)
37369 ///
37370 /// This instruction performs a rotate right of rs1 by the amount in the least-significant log2(XLEN) bits of shamt.
37371 /// For RV32, the encodings corresponding to shamt\[5\]=1 are reserved.
37372 ///
37373 /// # Forms
37374 /// Assembly: `rori.rv32 xd, xs1, shamt`
37375 /// Rust: `rori_rv32(rd, rs1, shamtw)`
37376 ///
37377 /// # Arguments
37378 /// - `rd` — Destination register.
37379 /// - `rs1` — Source register.
37380 /// - `shamtw` — Immediate encoding value.
37381 pub fn rori_rv32<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
37382 where
37383 Self: RoriRv32Emitter<T0, T1, T2>,
37384 {
37385 <Self as RoriRv32Emitter<T0, T1, T2>>::rori_rv32(self, rd, rs1, shamtw);
37386 }
37387 /// Rotate right word (Immediate)
37388 ///
37389 /// This instruction performs a rotate right on the least-significant word of rs1 by the amount in
37390 /// the least-significant log2(XLEN) bits of shamt. The resulting word value is sign-extended by
37391 /// copying bit 31 to all of the more-significant bits.
37392 ///
37393 /// # Forms
37394 /// Assembly: `roriw xd, xs1, shamt`
37395 /// Rust: `roriw(rd, rs1, shamtw)`
37396 ///
37397 /// # Arguments
37398 /// - `rd` — Destination register.
37399 /// - `rs1` — Source register.
37400 /// - `shamtw` — Immediate encoding value.
37401 pub fn roriw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
37402 where
37403 Self: RoriwEmitter<T0, T1, T2>,
37404 {
37405 <Self as RoriwEmitter<T0, T1, T2>>::roriw(self, rd, rs1, shamtw);
37406 }
37407 /// Rotate right word (Register)
37408 ///
37409 /// This instruction performs a rotate right on the least-significant word of rs1 by the amount in
37410 /// least-significant 5 bits of rs2. The resultant word is sign-extended by copying bit 31 to all
37411 /// of the more-significant bits.
37412 ///
37413 /// # Forms
37414 /// Assembly: `rorw xd, xs1, xs2`
37415 /// Rust: `rorw(rd, rs1, rs2)`
37416 ///
37417 /// # Arguments
37418 /// - `rd` — Destination register.
37419 /// - `rs1` — Source register.
37420 /// - `rs2` — Source register.
37421 pub fn rorw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
37422 where
37423 Self: RorwEmitter<T0, T1, T2>,
37424 {
37425 <Self as RorwEmitter<T0, T1, T2>>::rorw(self, rd, rs1, rs2);
37426 }
37427 /// Store byte
37428 ///
37429 /// Store 8 bits of data from register `rs2` to an
37430 /// address formed by adding `rs1` to a signed offset.
37431 ///
37432 /// # Forms
37433 /// Assembly: `sb xs2, imm(xs1)`
37434 /// Rust: `sb(rs1, rs2, imm)`
37435 ///
37436 /// # Arguments
37437 /// - `rs1` — Memory base register.
37438 /// - `rs2` — Source register.
37439 /// - `imm` — Immediate encoding value.
37440 pub fn sb<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
37441 where
37442 Self: SbEmitter<T0, T1, T2>,
37443 {
37444 <Self as SbEmitter<T0, T1, T2>>::sb(self, rs1, rs2, imm);
37445 }
37446 /// RISC-V `sbreak` instruction.
37447 ///
37448 /// # Forms
37449 /// Assembly: `sbreak`
37450 /// Rust: `sbreak()`
37451 ///
37452 /// # Arguments
37453 pub fn sbreak(&mut self)
37454 where
37455 Self: SbreakEmitter,
37456 {
37457 <Self as SbreakEmitter>::sbreak(self);
37458 }
37459 /// Store conditional doubleword
37460 ///
37461 /// `sc.d` conditionally writes a doubleword in _rs2_ to the address in _rs1_:
37462 /// the `sc.d` succeeds only if the reservation is still valid and the
37463 /// reservation set contains the bytes being written. If the `sc.d` succeeds,
37464 /// the instruction writes the doubleword in _rs2_ to memory, and it writes zero to _rd_.
37465 /// If the `sc.d` fails, the instruction does not write to memory, and it writes a
37466 /// nonzero value to _rd_. For the purposes of memory protection, a failed `sc.d`
37467 /// may be treated like a store. Regardless of success or failure, executing an
37468 /// `sc.d` instruction invalidates any reservation held by this hart.
37469 ///
37470 /// The failure code with value 1 encodes an unspecified failure.
37471 /// Other failure codes are reserved at this time.
37472 /// Portable software should only assume the failure code will be non-zero.
37473 ///
37474 /// The address held in _rs1_ must be naturally aligned to the size of the operand
37475 /// (_i.e._, eight-byte aligned).
37476 /// If the address is not naturally aligned, an address-misaligned exception or an
37477 /// access-fault exception will be generated.
37478 /// The access-fault exception can be generated for a memory access that would otherwise
37479 /// be able to complete except for the misalignment,
37480 /// if the misaligned access should not be emulated.
37481 ///
37482 /// \[NOTE\]
37483 /// --
37484 /// Emulating misaligned LR/SC sequences is impractical in most systems.
37485 ///
37486 /// Misaligned LR/SC sequences also raise the possibility of accessing multiple
37487 /// reservation sets at once, which present definitions do not provide for.
37488 /// --
37489 ///
37490 /// An implementation can register an arbitrarily large reservation set on each LR,
37491 /// provided the reservation set includes all bytes of the addressed data word or
37492 /// doubleword.
37493 /// An SC can only pair with the most recent LR in program order.
37494 /// An SC may succeed only if no store from another hart to the reservation set
37495 /// can be observed to have occurred between the LR and the SC,
37496 /// and if there is no other SC between the LR and itself in program order.
37497 /// An SC may succeed only if no write from a device other than a hart to the bytes
37498 /// accessed by the LR instruction can be observed to have occurred between the LR
37499 /// and SC.
37500 /// Note this LR might have had a different effective address and data size,
37501 /// but reserved the SC's address as part of the reservation set.
37502 ///
37503 /// \[NOTE\]
37504 /// ----
37505 /// Following this model, in systems with memory translation, an SC is allowed to succeed if the
37506 /// earlier LR reserved the same location using an alias with a different virtual address, but is
37507 /// also allowed to fail if the virtual address is different.
37508 ///
37509 /// To accommodate legacy devices and buses, writes from devices other than RISC-V harts are only
37510 /// required to invalidate reservations when they overlap the bytes accessed by the LR.
37511 /// These writes are not required to invalidate the reservation when they access other bytes in
37512 /// the reservation set.
37513 /// ----
37514 ///
37515 /// The SC must fail if the address is not within the reservation set of the most
37516 /// recent LR in program order.
37517 /// The SC must fail if a store to the reservation set from another hart can be
37518 /// observed to occur between the LR and SC.
37519 /// The SC must fail if a write from some other device to the bytes accessed by the
37520 /// LR can be observed to occur between the LR and SC.
37521 /// (If such a device writes the reservation set but does not write the bytes accessed
37522 /// by the LR, the SC may or may not fail.)
37523 /// An SC must fail if there is another SC (to any address) between the LR and the SC
37524 /// in program order.
37525 /// The precise statement of the atomicity requirements for successful LR/SC sequences
37526 /// is defined by the Atomicity Axiom of the memory model.
37527 ///
37528 /// \[NOTE\]
37529 /// --
37530 /// The platform should provide a means to determine the size and shape of the reservation set.
37531 ///
37532 /// A platform specification may constrain the size and shape of the reservation set.
37533 ///
37534 /// A store-conditional instruction to a scratch word of memory should be used to forcibly invalidate any existing load reservation:
37535 ///
37536 /// * during a preemptive context switch, and
37537 /// * if necessary when changing virtual to physical address mappings, such as when migrating pages that might contain an active reservation.
37538 ///
37539 /// The invalidation of a hart's reservation when it executes an LR or SC imply that a hart can only hold one reservation at a time, and that an SC can only pair with the most recent LR, and LR with the next following SC, in program order. This is a restriction to the Atomicity Axiom in Section 18.1 that ensures software runs correctly on expected common implementations that operate in this manner.
37540 /// --
37541 ///
37542 /// An SC instruction can never be observed by another RISC-V hart before the LR instruction that established the reservation.
37543 ///
37544 /// \[NOTE\]
37545 /// --
37546 /// The LR/SC sequence can be given acquire semantics by setting the aq bit on the LR instruction. The LR/SC sequence can be given release semantics by by setting the rl bit on the SC instruction. Assuming suitable mappings for other atomic operations, setting the aq bit on the LR instruction, and setting the rl bit on the SC instruction makes the LR/SC sequence sequentially consistent in the C++ memory_order_seq_cst sense. Such a sequence does not act as a fence for ordering ordinary load and store instructions before and after the sequence. Specific instruction mappings for other C++ atomic operations, or stronger notions of "sequential consistency", may require both bits to be set on either or both of the LR or SC instruction.
37547 ///
37548 /// If neither bit is set on either LR or SC, the LR/SC sequence can be observed to occur before or after surrounding memory operations from the same RISC-V hart. This can be appropriate when the LR/SC sequence is used to implement a parallel reduction operation.
37549 /// --
37550 ///
37551 /// Software should not set the _rl_ bit on an LR instruction unless the _aq_ bit is also set.
37552 /// LR.rl and SC.aq instructions are not guaranteed to provide any stronger ordering than those
37553 /// with both bits clear, but may result in lower performance.
37554 ///
37555 /// # Forms
37556 /// Assembly: `sc.d xd, xs2, xs1`
37557 /// Rust: `sc_d(rd, rs1, rs2, aq, rl)`
37558 ///
37559 /// # Arguments
37560 /// - `rd` — Destination register.
37561 /// - `rs1` — Memory base register.
37562 /// - `rs2` — Source register.
37563 /// - `aq` — Acquire-order bit.
37564 /// - `rl` — Release-order bit; retained for the existing emitter API.
37565 pub fn sc_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
37566 where
37567 Self: ScDEmitter<T0, T1, T2, T3, T4>,
37568 {
37569 <Self as ScDEmitter<T0, T1, T2, T3, T4>>::sc_d(self, rd, rs1, rs2, aq, rl);
37570 }
37571 /// Store conditional word
37572 ///
37573 /// `sc.w` conditionally writes a word in _rs2_ to the address in _rs1_:
37574 /// the `sc.w` succeeds only if the reservation is still valid and the
37575 /// reservation set contains the bytes being written. If the `sc.w` succeeds,
37576 /// the instruction writes the word in _rs2_ to memory, and it writes zero to _rd_.
37577 /// If the `sc.w` fails, the instruction does not write to memory, and it writes a
37578 /// nonzero value to _rd_. For the purposes of memory protection, a failed `sc.w`
37579 /// may be treated like a store. Regardless of success or failure, executing an
37580 /// `sc.w` instruction invalidates any reservation held by this hart.
37581 ///
37582 /// <%- if XLEN == 64 -%>
37583 /// \[NOTE\]
37584 /// If a value other than 0 or 1 is defined as a result for `sc.w`, the value will before
37585 /// sign-extended into _rd_.
37586 /// <%- end -%>
37587 ///
37588 /// The failure code with value 1 encodes an unspecified failure.
37589 /// Other failure codes are reserved at this time.
37590 /// Portable software should only assume the failure code will be non-zero.
37591 ///
37592 /// The address held in _rs1_ must be naturally aligned to the size of the operand
37593 /// (_i.e._, eight-byte aligned for doublewords and four-byte aligned for words).
37594 /// If the address is not naturally aligned, an address-misaligned exception or an
37595 /// access-fault exception will be generated.
37596 /// The access-fault exception can be generated for a memory access that would otherwise
37597 /// be able to complete except for the misalignment,
37598 /// if the misaligned access should not be emulated.
37599 ///
37600 /// \[NOTE\]
37601 /// --
37602 /// Emulating misaligned LR/SC sequences is impractical in most systems.
37603 ///
37604 /// Misaligned LR/SC sequences also raise the possibility of accessing multiple
37605 /// reservation sets at once, which present definitions do not provide for.
37606 /// --
37607 ///
37608 /// An implementation can register an arbitrarily large reservation set on each LR,
37609 /// provided the reservation set includes all bytes of the addressed data word or
37610 /// doubleword.
37611 /// An SC can only pair with the most recent LR in program order.
37612 /// An SC may succeed only if no store from another hart to the reservation set
37613 /// can be observed to have occurred between the LR and the SC,
37614 /// and if there is no other SC between the LR and itself in program order.
37615 /// An SC may succeed only if no write from a device other than a hart to the bytes
37616 /// accessed by the LR instruction can be observed to have occurred between the LR
37617 /// and SC.
37618 /// Note this LR might have had a different effective address and data size,
37619 /// but reserved the SC's address as part of the reservation set.
37620 ///
37621 /// \[NOTE\]
37622 /// ----
37623 /// Following this model, in systems with memory translation, an SC is allowed to succeed if the
37624 /// earlier LR reserved the same location using an alias with a different virtual address, but is
37625 /// also allowed to fail if the virtual address is different.
37626 ///
37627 /// To accommodate legacy devices and buses, writes from devices other than RISC-V harts are only
37628 /// required to invalidate reservations when they overlap the bytes accessed by the LR.
37629 /// These writes are not required to invalidate the reservation when they access other bytes in
37630 /// the reservation set.
37631 /// ----
37632 ///
37633 /// The SC must fail if the address is not within the reservation set of the most
37634 /// recent LR in program order.
37635 /// The SC must fail if a store to the reservation set from another hart can be
37636 /// observed to occur between the LR and SC.
37637 /// The SC must fail if a write from some other device to the bytes accessed by the
37638 /// LR can be observed to occur between the LR and SC.
37639 /// (If such a device writes the reservation set but does not write the bytes accessed
37640 /// by the LR, the SC may or may not fail.)
37641 /// An SC must fail if there is another SC (to any address) between the LR and the SC
37642 /// in program order.
37643 /// The precise statement of the atomicity requirements for successful LR/SC sequences
37644 /// is defined by the Atomicity Axiom of the memory model.
37645 ///
37646 /// \[NOTE\]
37647 /// --
37648 /// The platform should provide a means to determine the size and shape of the reservation set.
37649 ///
37650 /// A platform specification may constrain the size and shape of the reservation set.
37651 ///
37652 /// A store-conditional instruction to a scratch word of memory should be used to forcibly invalidate any existing load reservation:
37653 ///
37654 /// * during a preemptive context switch, and
37655 /// * if necessary when changing virtual to physical address mappings, such as when migrating pages that might contain an active reservation.
37656 ///
37657 /// The invalidation of a hart's reservation when it executes an LR or SC imply that a hart can only hold one reservation at a time, and that an SC can only pair with the most recent LR, and LR with the next following SC, in program order. This is a restriction to the Atomicity Axiom in Section 18.1 that ensures software runs correctly on expected common implementations that operate in this manner.
37658 /// --
37659 ///
37660 /// An SC instruction can never be observed by another RISC-V hart before the LR instruction that established the reservation.
37661 ///
37662 /// \[NOTE\]
37663 /// --
37664 /// The LR/SC sequence can be given acquire semantics by setting the aq bit on the LR instruction. The LR/SC sequence can be given release semantics by by setting the rl bit on the SC instruction. Assuming suitable mappings for other atomic operations, setting the aq bit on the LR instruction, and setting the rl bit on the SC instruction makes the LR/SC sequence sequentially consistent in the C++ memory_order_seq_cst sense. Such a sequence does not act as a fence for ordering ordinary load and store instructions before and after the sequence. Specific instruction mappings for other C++ atomic operations, or stronger notions of "sequential consistency", may require both bits to be set on either or both of the LR or SC instruction.
37665 ///
37666 /// If neither bit is set on either LR or SC, the LR/SC sequence can be observed to occur before or after surrounding memory operations from the same RISC-V hart. This can be appropriate when the LR/SC sequence is used to implement a parallel reduction operation.
37667 /// --
37668 ///
37669 /// Software should not set the _rl_ bit on an LR instruction unless the _aq_ bit is also set.
37670 /// LR.rl and SC.aq instructions are not guaranteed to provide any stronger ordering than those
37671 /// with both bits clear, but may result in lower performance.
37672 ///
37673 /// # Forms
37674 /// Assembly: `sc.w xd, xs2, xs1`
37675 /// Rust: `sc_w(rd, rs1, rs2, aq, rl)`
37676 ///
37677 /// # Arguments
37678 /// - `rd` — Destination register.
37679 /// - `rs1` — Memory base register.
37680 /// - `rs2` — Source register.
37681 /// - `aq` — Acquire-order bit.
37682 /// - `rl` — Release-order bit; retained for the existing emitter API.
37683 pub fn sc_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
37684 where
37685 Self: ScWEmitter<T0, T1, T2, T3, T4>,
37686 {
37687 <Self as ScWEmitter<T0, T1, T2, T3, T4>>::sc_w(self, rd, rs1, rs2, aq, rl);
37688 }
37689 /// RISC-V `scall` instruction.
37690 ///
37691 /// # Forms
37692 /// Assembly: `scall`
37693 /// Rust: `scall()`
37694 ///
37695 /// # Arguments
37696 pub fn scall(&mut self)
37697 where
37698 Self: ScallEmitter,
37699 {
37700 <Self as ScallEmitter>::scall(self);
37701 }
37702 /// RISC-V `sctrclr` instruction.
37703 ///
37704 /// # Forms
37705 /// Assembly: `sctrclr sctrclr`
37706 /// Rust: `sctrclr()`
37707 ///
37708 /// # Arguments
37709 pub fn sctrclr(&mut self)
37710 where
37711 Self: SctrclrEmitter,
37712 {
37713 <Self as SctrclrEmitter>::sctrclr(self);
37714 }
37715 /// Store doubleword
37716 ///
37717 /// Store 64 bits of data from register `rs2` to an
37718 /// address formed by adding `rs1` to a signed offset.
37719 ///
37720 /// # Forms
37721 /// Assembly: `sd xs2, imm(xs1)`
37722 /// Rust: `sd(rs1, rs2, imm)`
37723 ///
37724 /// # Arguments
37725 /// - `rs1` — Memory base register.
37726 /// - `rs2` — Source register.
37727 /// - `imm` — Immediate encoding value.
37728 pub fn sd<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
37729 where
37730 Self: SdEmitter<T0, T1, T2>,
37731 {
37732 <Self as SdEmitter<T0, T1, T2>>::sd(self, rs1, rs2, imm);
37733 }
37734 /// RISC-V `seqz` instruction.
37735 ///
37736 /// # Forms
37737 /// Assembly: `seqz rd rs1`
37738 /// Rust: `seqz(rd, rs1)`
37739 ///
37740 /// # Arguments
37741 /// - `rd` — Destination register.
37742 /// - `rs1` — Source register.
37743 pub fn seqz<T0, T1>(&mut self, rd: T0, rs1: T1)
37744 where
37745 Self: SeqzEmitter<T0, T1>,
37746 {
37747 <Self as SeqzEmitter<T0, T1>>::seqz(self, rd, rs1);
37748 }
37749 /// Sign-extend byte
37750 ///
37751 /// This instruction sign-extends the least-significant byte in the source to XLEN by copying the
37752 /// most-significant bit in the byte (i.e., bit 7) to all of the more-significant bits.
37753 ///
37754 /// # Forms
37755 /// Assembly: `sext.b xd, xs1`
37756 /// Rust: `sext_b(rd, rs1)`
37757 ///
37758 /// # Arguments
37759 /// - `rd` — Destination register.
37760 /// - `rs1` — Source register.
37761 pub fn sext_b<T0, T1>(&mut self, rd: T0, rs1: T1)
37762 where
37763 Self: SextBEmitter<T0, T1>,
37764 {
37765 <Self as SextBEmitter<T0, T1>>::sext_b(self, rd, rs1);
37766 }
37767 /// Sign-extend halfword
37768 ///
37769 /// This instruction sign-extends the least-significant halfword in the source to XLEN by copying the
37770 /// most-significant bit in the halfword (i.e., bit 15) to all of the more-significant bits.
37771 ///
37772 /// # Forms
37773 /// Assembly: `sext.h xd, xs1`
37774 /// Rust: `sext_h(rd, rs1)`
37775 ///
37776 /// # Arguments
37777 /// - `rd` — Destination register.
37778 /// - `rs1` — Source register.
37779 pub fn sext_h<T0, T1>(&mut self, rd: T0, rs1: T1)
37780 where
37781 Self: SextHEmitter<T0, T1>,
37782 {
37783 <Self as SextHEmitter<T0, T1>>::sext_h(self, rd, rs1);
37784 }
37785 /// RISC-V `sext.w` instruction.
37786 ///
37787 /// # Forms
37788 /// Assembly: `sext.w rd rs1`
37789 /// Rust: `sext_w(rd, rs1)`
37790 ///
37791 /// # Arguments
37792 /// - `rd` — Destination register.
37793 /// - `rs1` — Source register.
37794 pub fn sext_w<T0, T1>(&mut self, rd: T0, rs1: T1)
37795 where
37796 Self: SextWEmitter<T0, T1>,
37797 {
37798 <Self as SextWEmitter<T0, T1>>::sext_w(self, rd, rs1);
37799 }
37800 /// Order implicit page table reads after invalidation
37801 ///
37802 /// The `sfence.inval.ir` instruction guarantees that any previous `sinval.vma`
37803 /// instructions executed by the current hart are ordered before subsequent implicit references by
37804 /// that hart to the memory-management data structures.
37805 ///
37806 /// # Forms
37807 /// Assembly: `sfence.inval.ir ""`
37808 /// Rust: `sfence_inval_ir()`
37809 ///
37810 /// # Arguments
37811 pub fn sfence_inval_ir(&mut self)
37812 where
37813 Self: SfenceInvalIrEmitter,
37814 {
37815 <Self as SfenceInvalIrEmitter>::sfence_inval_ir(self);
37816 }
37817 /// Supervisor memory-management fence
37818 ///
37819 /// The supervisor memory-management fence instruction `SFENCE.VMA` is used to
37820 /// synchronize updates to in-memory memory-management data structures with
37821 /// current execution. Instruction execution causes implicit reads and
37822 /// writes to these data structures; however, these implicit references are
37823 /// ordinarily not ordered with respect to explicit loads and stores.
37824 /// Executing an SFENCE.VMA instruction guarantees that any previous stores
37825 /// already visible to the current RISC-V hart are ordered before certain
37826 /// implicit references by subsequent instructions in that hart to the
37827 /// memory-management data structures. The specific set of operations
37828 /// ordered by SFENCE.VMA is determined by _rs1_ and _rs2_, as described
37829 /// below. SFENCE.VMA is also used to invalidate entries in the
37830 /// address-translation cache associated with a hart (see <<sv32algorithm>>). Further details on the behavior of this instruction are described in <<virt-control>> and <<pmp-vmem>>.
37831 ///
37832 /// \[NOTE\]
37833 /// ====
37834 /// The SFENCE.VMA is used to flush any local hardware caches related to
37835 /// address translation. It is specified as a fence rather than a TLB flush
37836 /// to provide cleaner semantics with respect to which instructions are
37837 /// affected by the flush operation and to support a wider variety of
37838 /// dynamic caching structures and memory-management schemes. SFENCE.VMA is
37839 /// also used by higher privilege levels to synchronize page table writes
37840 /// and the address translation hardware.
37841 /// ====
37842 ///
37843 /// SFENCE.VMA orders only the local hart's implicit references to the
37844 /// memory-management data structures.
37845 ///
37846 /// \[NOTE\]
37847 /// ====
37848 /// Consequently, other harts must be notified separately when the
37849 /// memory-management data structures have been modified. One approach is to
37850 /// use 1) a local data fence to ensure local writes are visible globally,
37851 /// then 2) an interprocessor interrupt to the other thread, then 3) a local
37852 /// SFENCE.VMA in the interrupt handler of the remote thread, and finally 4)
37853 /// signal back to originating thread that operation is complete. This is,
37854 /// of course, the RISC-V analog to a TLB shootdown.
37855 /// ====
37856 ///
37857 /// For the common case that the translation data structures have only been
37858 /// modified for a single address mapping (i.e., one page or superpage),
37859 /// _rs1_ can specify a virtual address within that mapping to effect a
37860 /// translation fence for that mapping only. Furthermore, for the common
37861 /// case that the translation data structures have only been modified for a
37862 /// single address-space identifier, _rs2_ can specify the address space.
37863 /// The behavior of SFENCE.VMA depends on _rs1_ and _rs2_ as follows:
37864 ///
37865 /// * If __rs1__=`x0` and __rs2__=`x0`, the fence orders all reads and writes
37866 /// made to any level of the page tables, for all address spaces. The fence
37867 /// also invalidates all address-translation cache entries, for all address
37868 /// spaces.
37869 /// * If __rs1__=`x0` and __rs2__≠``x0``, the fence orders all
37870 /// reads and writes made to any level of the page tables, but only for the
37871 /// address space identified by integer register _rs2_. Accesses to _global_
37872 /// mappings (see <<translation>>) are not ordered. The
37873 /// fence also invalidates all address-translation cache entries matching
37874 /// the address space identified by integer register _rs2_, except for
37875 /// entries containing global mappings.
37876 /// * If __rs1__≠``x0`` and __rs2__=`x0`, the fence orders only
37877 /// reads and writes made to leaf page table entries corresponding to the
37878 /// virtual address in __rs1__, for all address spaces. The fence also
37879 /// invalidates all address-translation cache entries that contain leaf page
37880 /// table entries corresponding to the virtual address in _rs1_, for all
37881 /// address spaces.
37882 /// * If __rs1__≠``x0`` and __rs2__≠``x0``, the
37883 /// fence orders only reads and writes made to leaf page table entries
37884 /// corresponding to the virtual address in _rs1_, for the address space
37885 /// identified by integer register _rs2_. Accesses to global mappings are
37886 /// not ordered. The fence also invalidates all address-translation cache
37887 /// entries that contain leaf page table entries corresponding to the
37888 /// virtual address in _rs1_ and that match the address space identified by
37889 /// integer register _rs2_, except for entries containing global mappings.
37890 ///
37891 /// If the value held in _rs1_ is not a valid virtual address, then the
37892 /// SFENCE.VMA instruction has no effect. No exception is raised in this
37893 /// case.
37894 ///
37895 /// When __rs2__≠``x0``, bits SXLEN-1:ASIDMAX of the value held
37896 /// in _rs2_ are reserved for future standard use. Until their use is
37897 /// defined by a standard extension, they should be zeroed by software and
37898 /// ignored by current implementations. Furthermore, if
37899 /// ASIDLEN<ASIDMAX, the implementation shall ignore bits
37900 /// ASIDMAX-1:ASIDLEN of the value held in _rs2_.
37901 ///
37902 /// \[NOTE\]
37903 /// ====
37904 /// It is always legal to over-fence, e.g., by fencing only based on a
37905 /// subset of the bits in _rs1_ and/or _rs2_, and/or by simply treating all
37906 /// SFENCE.VMA instructions as having _rs1_=`x0` and/or _rs2_=`x0`. For
37907 /// example, simpler implementations can ignore the virtual address in _rs1_
37908 /// and the ASID value in _rs2_ and always perform a global fence. The
37909 /// choice not to raise an exception when an invalid virtual address is held
37910 /// in _rs1_ facilitates this type of simplification.
37911 /// ====
37912 ///
37913 /// An implicit read of the memory-management data structures may return any
37914 /// translation for an address that was valid at any time since the most
37915 /// recent SFENCE.VMA that subsumes that address. The ordering implied by
37916 /// SFENCE.VMA does not place implicit reads and writes to the
37917 /// memory-management data structures into the global memory order in a way
37918 /// that interacts cleanly with the standard RVWMO ordering rules. In
37919 /// particular, even though an SFENCE.VMA orders prior explicit accesses
37920 /// before subsequent implicit accesses, and those implicit accesses are
37921 /// ordered before their associated explicit accesses, SFENCE.VMA does not
37922 /// necessarily place prior explicit accesses before subsequent explicit
37923 /// accesses in the global memory order. These implicit loads also need not
37924 /// otherwise obey normal program order semantics with respect to prior
37925 /// loads or stores to the same address.
37926 ///
37927 /// \[NOTE\]
37928 /// ====
37929 /// A consequence of this specification is that an implementation may use
37930 /// any translation for an address that was valid at any time since the most
37931 /// recent SFENCE.VMA that subsumes that address. In particular, if a leaf
37932 /// PTE is modified but a subsuming SFENCE.VMA is not executed, either the
37933 /// old translation or the new translation will be used, but the choice is
37934 /// unpredictable. The behavior is otherwise well-defined.
37935 ///
37936 /// In a conventional TLB design, it is possible for multiple entries to
37937 /// match a single address if, for example, a page is upgraded to a
37938 /// superpage without first clearing the original non-leaf PTE's valid bit
37939 /// and executing an SFENCE.VMA with __rs1__=`x0`. In this case, a similar
37940 /// remark applies: it is unpredictable whether the old non-leaf PTE or the
37941 /// new leaf PTE is used, but the behavior is otherwise well defined.
37942 ///
37943 /// Another consequence of this specification is that it is generally unsafe
37944 /// to update a PTE using a set of stores of a width less than the width of
37945 /// the PTE, as it is legal for the implementation to read the PTE at any
37946 /// time, including when only some of the partial stores have taken effect.
37947 ///
37948 /// ***
37949 ///
37950 /// This specification permits the caching of PTEs whose V (Valid) bit is
37951 /// clear. Operating systems must be written to cope with this possibility,
37952 /// but implementers are reminded that eagerly caching invalid PTEs will
37953 /// reduce performance by causing additional page faults.
37954 /// ====
37955 ///
37956 /// Implementations must only perform implicit reads of the translation data
37957 /// structures pointed to by the current contents of the `satp` register or
37958 /// a subsequent valid (V=1) translation data structure entry, and must only
37959 /// raise exceptions for implicit accesses that are generated as a result of
37960 /// instruction execution, not those that are performed speculatively.
37961 ///
37962 /// Changes to the `sstatus` fields SUM and MXR take effect immediately,
37963 /// without the need to execute an SFENCE.VMA instruction. Changing
37964 /// `satp`.MODE from Bare to other modes and vice versa also takes effect
37965 /// immediately, without the need to execute an SFENCE.VMA instruction.
37966 /// Likewise, changes to `satp`.ASID take effect immediately.
37967 ///
37968 /// \[TIP\]
37969 /// ====
37970 /// The following common situations typically require executing an
37971 /// SFENCE.VMA instruction:
37972 ///
37973 /// * When software recycles an ASID (i.e., reassociates it with a different
37974 /// page table), it should _first_ change `satp` to point to the new page
37975 /// table using the recycled ASID, _then_ execute SFENCE.VMA with __rs1__=`x0`
37976 /// and _rs2_ set to the recycled ASID. Alternatively, software can execute
37977 /// the same SFENCE.VMA instruction while a different ASID is loaded into
37978 /// `satp`, provided the next time `satp` is loaded with the recycled ASID,
37979 /// it is simultaneously loaded with the new page table.
37980 /// * If the implementation does not provide ASIDs, or software chooses to
37981 /// always use ASID 0, then after every `satp` write, software should
37982 /// execute SFENCE.VMA with __rs1__=`x0`. In the common case that no global
37983 /// translations have been modified, _rs2_ should be set to a register other
37984 /// than `x0` but which contains the value zero, so that global translations
37985 /// are not flushed.
37986 /// * If software modifies a non-leaf PTE, it should execute SFENCE.VMA with
37987 /// __rs1__=`x0`. If any PTE along the traversal path had its G bit set, _rs2_
37988 /// must be `x0`; otherwise, _rs2_ should be set to the ASID for which the
37989 /// translation is being modified.
37990 /// * If software modifies a leaf PTE, it should execute SFENCE.VMA with
37991 /// _rs1_ set to a virtual address within the page. If any PTE along the
37992 /// traversal path had its G bit set, _rs2_ must be `x0`; otherwise, _rs2_
37993 /// should be set to the ASID for which the translation is being modified.
37994 /// * For the special cases of increasing the permissions on a leaf PTE and
37995 /// changing an invalid PTE to a valid leaf, software may choose to execute
37996 /// the SFENCE.VMA lazily. After modifying the PTE but before executing
37997 /// SFENCE.VMA, either the new or old permissions will be used. In the
37998 /// latter case, a page-fault exception might occur, at which point software
37999 /// should execute SFENCE.VMA in accordance with the previous bullet point.
38000 /// ====
38001 ///
38002 /// If a hart employs an address-translation cache, that cache must appear
38003 /// to be private to that hart. In particular, the meaning of an ASID is
38004 /// local to a hart; software may choose to use the same ASID to refer to
38005 /// different address spaces on different harts.
38006 ///
38007 /// \[NOTE\]
38008 /// ====
38009 /// A future extension could redefine ASIDs to be global across the SEE,
38010 /// enabling such options as shared translation caches and hardware support
38011 /// for broadcast TLB shootdown. However, as OSes have evolved to
38012 /// significantly reduce the scope of TLB shootdowns using novel
38013 /// ASID-management techniques, we expect the local-ASID scheme to remain
38014 /// attractive for its simplicity and possibly better scalability.
38015 /// ====
38016 ///
38017 /// For implementations that make `satp`.MODE read-only zero (always Bare),
38018 /// attempts to execute an SFENCE.VMA instruction might raise an
38019 /// illegal-instruction exception.
38020 ///
38021 /// # Forms
38022 /// Assembly: `sfence.vma xs1, xs2`
38023 /// Rust: `sfence_vma(rs1, rs2)`
38024 ///
38025 /// # Arguments
38026 /// - `rs1` — Source register.
38027 /// - `rs2` — Source register.
38028 pub fn sfence_vma<T0, T1>(&mut self, rs1: T0, rs2: T1)
38029 where
38030 Self: SfenceVmaEmitter<T0, T1>,
38031 {
38032 <Self as SfenceVmaEmitter<T0, T1>>::sfence_vma(self, rs1, rs2);
38033 }
38034 /// Order writes before sfence
38035 ///
38036 /// The `sfence.w.inval` instruction guarantees that any previous stores already visible to the
38037 /// current RISC-V hart are ordered before subsequent `sinval.vma` instructions executed by the
38038 /// same hart.
38039 ///
38040 /// # Forms
38041 /// Assembly: `sfence.w.inval ""`
38042 /// Rust: `sfence_w_inval()`
38043 ///
38044 /// # Arguments
38045 pub fn sfence_w_inval(&mut self)
38046 where
38047 Self: SfenceWInvalEmitter,
38048 {
38049 <Self as SfenceWInvalEmitter>::sfence_w_inval(self);
38050 }
38051 /// RISC-V `sgtz` instruction.
38052 ///
38053 /// # Forms
38054 /// Assembly: `sgtz rd rs2`
38055 /// Rust: `sgtz(rd, rs2)`
38056 ///
38057 /// # Arguments
38058 /// - `rd` — Destination register.
38059 /// - `rs2` — Source register.
38060 pub fn sgtz<T0, T1>(&mut self, rd: T0, rs2: T1)
38061 where
38062 Self: SgtzEmitter<T0, T1>,
38063 {
38064 <Self as SgtzEmitter<T0, T1>>::sgtz(self, rd, rs2);
38065 }
38066 /// Store halfword
38067 ///
38068 /// Store 16 bits of data from register `rs2` to an
38069 /// address formed by adding `rs1` to a signed offset.
38070 ///
38071 /// # Forms
38072 /// Assembly: `sh xs2, imm(xs1)`
38073 /// Rust: `sh(rs1, rs2, imm)`
38074 ///
38075 /// # Arguments
38076 /// - `rs1` — Memory base register.
38077 /// - `rs2` — Source register.
38078 /// - `imm` — Immediate encoding value.
38079 pub fn sh<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
38080 where
38081 Self: ShEmitter<T0, T1, T2>,
38082 {
38083 <Self as ShEmitter<T0, T1, T2>>::sh(self, rs1, rs2, imm);
38084 }
38085 /// Shift left by 1 and add
38086 ///
38087 /// This instruction shifts `rs1` to the left by 1 bit and adds it to `rs2`.
38088 ///
38089 /// # Forms
38090 /// Assembly: `sh1add xd, xs1, xs2`
38091 /// Rust: `sh1add(rd, rs1, rs2)`
38092 ///
38093 /// # Arguments
38094 /// - `rd` — Destination register.
38095 /// - `rs1` — Source register.
38096 /// - `rs2` — Source register.
38097 pub fn sh1add<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38098 where
38099 Self: Sh1AddEmitter<T0, T1, T2>,
38100 {
38101 <Self as Sh1AddEmitter<T0, T1, T2>>::sh1add(self, rd, rs1, rs2);
38102 }
38103 /// Shift unsigned word left by 1 and add
38104 ///
38105 /// This instruction performs an XLEN-wide addition of two addends. The first addend is rs2.
38106 /// The second addend is the unsigned value formed by extracting the least-significant word of rs1
38107 /// and shifting it left by 1 place.
38108 ///
38109 /// # Forms
38110 /// Assembly: `sh1add.uw xd, xs1, xs2`
38111 /// Rust: `sh1add_uw(rd, rs1, rs2)`
38112 ///
38113 /// # Arguments
38114 /// - `rd` — Destination register.
38115 /// - `rs1` — Source register.
38116 /// - `rs2` — Source register.
38117 pub fn sh1add_uw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38118 where
38119 Self: Sh1AddUwEmitter<T0, T1, T2>,
38120 {
38121 <Self as Sh1AddUwEmitter<T0, T1, T2>>::sh1add_uw(self, rd, rs1, rs2);
38122 }
38123 /// Shift left by 2 and add
38124 ///
38125 /// This instruction shifts `rs1` to the left by 2 places and adds it to `rs2`.
38126 ///
38127 /// # Forms
38128 /// Assembly: `sh2add xd, xs1, xs2`
38129 /// Rust: `sh2add(rd, rs1, rs2)`
38130 ///
38131 /// # Arguments
38132 /// - `rd` — Destination register.
38133 /// - `rs1` — Source register.
38134 /// - `rs2` — Source register.
38135 pub fn sh2add<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38136 where
38137 Self: Sh2AddEmitter<T0, T1, T2>,
38138 {
38139 <Self as Sh2AddEmitter<T0, T1, T2>>::sh2add(self, rd, rs1, rs2);
38140 }
38141 /// Shift unsigned word left by 2 and add
38142 ///
38143 /// This instruction performs an XLEN-wide addition of two addends. The first addend is rs2.
38144 /// The second addend is the unsigned value formed by extracting the least-significant word of rs1
38145 /// and shifting it left by 2 places.
38146 ///
38147 /// # Forms
38148 /// Assembly: `sh2add.uw xd, xs1, xs2`
38149 /// Rust: `sh2add_uw(rd, rs1, rs2)`
38150 ///
38151 /// # Arguments
38152 /// - `rd` — Destination register.
38153 /// - `rs1` — Source register.
38154 /// - `rs2` — Source register.
38155 pub fn sh2add_uw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38156 where
38157 Self: Sh2AddUwEmitter<T0, T1, T2>,
38158 {
38159 <Self as Sh2AddUwEmitter<T0, T1, T2>>::sh2add_uw(self, rd, rs1, rs2);
38160 }
38161 /// Shift left by 3 and add
38162 ///
38163 /// This instruction shifts `rs1` to the left by 3 places and adds it to `rs2`.
38164 ///
38165 /// # Forms
38166 /// Assembly: `sh3add xd, xs1, xs2`
38167 /// Rust: `sh3add(rd, rs1, rs2)`
38168 ///
38169 /// # Arguments
38170 /// - `rd` — Destination register.
38171 /// - `rs1` — Source register.
38172 /// - `rs2` — Source register.
38173 pub fn sh3add<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38174 where
38175 Self: Sh3AddEmitter<T0, T1, T2>,
38176 {
38177 <Self as Sh3AddEmitter<T0, T1, T2>>::sh3add(self, rd, rs1, rs2);
38178 }
38179 /// Shift unsigned word left by 3 and add
38180 ///
38181 /// This instruction performs an XLEN-wide addition of two addends. The first addend is rs2.
38182 /// The second addend is the unsigned value formed by extracting the least-significant word of rs1
38183 /// and shifting it left by 3 places.
38184 ///
38185 /// # Forms
38186 /// Assembly: `sh3add.uw xd, xs1, xs2`
38187 /// Rust: `sh3add_uw(rd, rs1, rs2)`
38188 ///
38189 /// # Arguments
38190 /// - `rd` — Destination register.
38191 /// - `rs1` — Source register.
38192 /// - `rs2` — Source register.
38193 pub fn sh3add_uw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38194 where
38195 Self: Sh3AddUwEmitter<T0, T1, T2>,
38196 {
38197 <Self as Sh3AddUwEmitter<T0, T1, T2>>::sh3add_uw(self, rd, rs1, rs2);
38198 }
38199 /// RISC-V `sha256sig0` instruction.
38200 ///
38201 /// # Forms
38202 /// Assembly: `sha256sig0 xd, xs1`
38203 /// Rust: `sha256sig0(rd, rs1)`
38204 ///
38205 /// # Arguments
38206 /// - `rd` — Destination register.
38207 /// - `rs1` — Source register.
38208 pub fn sha256sig0<T0, T1>(&mut self, rd: T0, rs1: T1)
38209 where
38210 Self: Sha256Sig0Emitter<T0, T1>,
38211 {
38212 <Self as Sha256Sig0Emitter<T0, T1>>::sha256sig0(self, rd, rs1);
38213 }
38214 /// RISC-V `sha256sig1` instruction.
38215 ///
38216 /// # Forms
38217 /// Assembly: `sha256sig1 xd, xs1`
38218 /// Rust: `sha256sig1(rd, rs1)`
38219 ///
38220 /// # Arguments
38221 /// - `rd` — Destination register.
38222 /// - `rs1` — Source register.
38223 pub fn sha256sig1<T0, T1>(&mut self, rd: T0, rs1: T1)
38224 where
38225 Self: Sha256Sig1Emitter<T0, T1>,
38226 {
38227 <Self as Sha256Sig1Emitter<T0, T1>>::sha256sig1(self, rd, rs1);
38228 }
38229 /// RISC-V `sha256sum0` instruction.
38230 ///
38231 /// # Forms
38232 /// Assembly: `sha256sum0 xd, xs1`
38233 /// Rust: `sha256sum0(rd, rs1)`
38234 ///
38235 /// # Arguments
38236 /// - `rd` — Destination register.
38237 /// - `rs1` — Source register.
38238 pub fn sha256sum0<T0, T1>(&mut self, rd: T0, rs1: T1)
38239 where
38240 Self: Sha256Sum0Emitter<T0, T1>,
38241 {
38242 <Self as Sha256Sum0Emitter<T0, T1>>::sha256sum0(self, rd, rs1);
38243 }
38244 /// RISC-V `sha256sum1` instruction.
38245 ///
38246 /// # Forms
38247 /// Assembly: `sha256sum1 xd, xs1`
38248 /// Rust: `sha256sum1(rd, rs1)`
38249 ///
38250 /// # Arguments
38251 /// - `rd` — Destination register.
38252 /// - `rs1` — Source register.
38253 pub fn sha256sum1<T0, T1>(&mut self, rd: T0, rs1: T1)
38254 where
38255 Self: Sha256Sum1Emitter<T0, T1>,
38256 {
38257 <Self as Sha256Sum1Emitter<T0, T1>>::sha256sum1(self, rd, rs1);
38258 }
38259 /// RISC-V `sha512sig0` instruction.
38260 ///
38261 /// # Forms
38262 /// Assembly: `sha512sig0 xd, xs1`
38263 /// Rust: `sha512sig0(rd, rs1)`
38264 ///
38265 /// # Arguments
38266 /// - `rd` — Destination register.
38267 /// - `rs1` — Source register.
38268 pub fn sha512sig0<T0, T1>(&mut self, rd: T0, rs1: T1)
38269 where
38270 Self: Sha512Sig0Emitter<T0, T1>,
38271 {
38272 <Self as Sha512Sig0Emitter<T0, T1>>::sha512sig0(self, rd, rs1);
38273 }
38274 /// RISC-V `sha512sig0h` instruction.
38275 ///
38276 /// # Forms
38277 /// Assembly: `sha512sig0h xd, xs1, xs2`
38278 /// Rust: `sha512sig0h(rd, rs1, rs2)`
38279 ///
38280 /// # Arguments
38281 /// - `rd` — Destination register.
38282 /// - `rs1` — Source register.
38283 /// - `rs2` — Source register.
38284 pub fn sha512sig0h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38285 where
38286 Self: Sha512Sig0HEmitter<T0, T1, T2>,
38287 {
38288 <Self as Sha512Sig0HEmitter<T0, T1, T2>>::sha512sig0h(self, rd, rs1, rs2);
38289 }
38290 /// RISC-V `sha512sig0l` instruction.
38291 ///
38292 /// # Forms
38293 /// Assembly: `sha512sig0l xd, xs1, xs2`
38294 /// Rust: `sha512sig0l(rd, rs1, rs2)`
38295 ///
38296 /// # Arguments
38297 /// - `rd` — Destination register.
38298 /// - `rs1` — Source register.
38299 /// - `rs2` — Source register.
38300 pub fn sha512sig0l<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38301 where
38302 Self: Sha512Sig0LEmitter<T0, T1, T2>,
38303 {
38304 <Self as Sha512Sig0LEmitter<T0, T1, T2>>::sha512sig0l(self, rd, rs1, rs2);
38305 }
38306 /// RISC-V `sha512sig1` instruction.
38307 ///
38308 /// # Forms
38309 /// Assembly: `sha512sig1 xd, xs1`
38310 /// Rust: `sha512sig1(rd, rs1)`
38311 ///
38312 /// # Arguments
38313 /// - `rd` — Destination register.
38314 /// - `rs1` — Source register.
38315 pub fn sha512sig1<T0, T1>(&mut self, rd: T0, rs1: T1)
38316 where
38317 Self: Sha512Sig1Emitter<T0, T1>,
38318 {
38319 <Self as Sha512Sig1Emitter<T0, T1>>::sha512sig1(self, rd, rs1);
38320 }
38321 /// RISC-V `sha512sig1h` instruction.
38322 ///
38323 /// # Forms
38324 /// Assembly: `sha512sig1h xd, xs1, xs2`
38325 /// Rust: `sha512sig1h(rd, rs1, rs2)`
38326 ///
38327 /// # Arguments
38328 /// - `rd` — Destination register.
38329 /// - `rs1` — Source register.
38330 /// - `rs2` — Source register.
38331 pub fn sha512sig1h<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38332 where
38333 Self: Sha512Sig1HEmitter<T0, T1, T2>,
38334 {
38335 <Self as Sha512Sig1HEmitter<T0, T1, T2>>::sha512sig1h(self, rd, rs1, rs2);
38336 }
38337 /// RISC-V `sha512sig1l` instruction.
38338 ///
38339 /// # Forms
38340 /// Assembly: `sha512sig1l xd, xs1, xs2`
38341 /// Rust: `sha512sig1l(rd, rs1, rs2)`
38342 ///
38343 /// # Arguments
38344 /// - `rd` — Destination register.
38345 /// - `rs1` — Source register.
38346 /// - `rs2` — Source register.
38347 pub fn sha512sig1l<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38348 where
38349 Self: Sha512Sig1LEmitter<T0, T1, T2>,
38350 {
38351 <Self as Sha512Sig1LEmitter<T0, T1, T2>>::sha512sig1l(self, rd, rs1, rs2);
38352 }
38353 /// RISC-V `sha512sum0` instruction.
38354 ///
38355 /// # Forms
38356 /// Assembly: `sha512sum0 xd, xs1`
38357 /// Rust: `sha512sum0(rd, rs1)`
38358 ///
38359 /// # Arguments
38360 /// - `rd` — Destination register.
38361 /// - `rs1` — Source register.
38362 pub fn sha512sum0<T0, T1>(&mut self, rd: T0, rs1: T1)
38363 where
38364 Self: Sha512Sum0Emitter<T0, T1>,
38365 {
38366 <Self as Sha512Sum0Emitter<T0, T1>>::sha512sum0(self, rd, rs1);
38367 }
38368 /// RISC-V `sha512sum0r` instruction.
38369 ///
38370 /// # Forms
38371 /// Assembly: `sha512sum0r xd, xs1, xs2`
38372 /// Rust: `sha512sum0r(rd, rs1, rs2)`
38373 ///
38374 /// # Arguments
38375 /// - `rd` — Destination register.
38376 /// - `rs1` — Source register.
38377 /// - `rs2` — Source register.
38378 pub fn sha512sum0r<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38379 where
38380 Self: Sha512Sum0REmitter<T0, T1, T2>,
38381 {
38382 <Self as Sha512Sum0REmitter<T0, T1, T2>>::sha512sum0r(self, rd, rs1, rs2);
38383 }
38384 /// RISC-V `sha512sum1` instruction.
38385 ///
38386 /// # Forms
38387 /// Assembly: `sha512sum1 xd, xs1`
38388 /// Rust: `sha512sum1(rd, rs1)`
38389 ///
38390 /// # Arguments
38391 /// - `rd` — Destination register.
38392 /// - `rs1` — Source register.
38393 pub fn sha512sum1<T0, T1>(&mut self, rd: T0, rs1: T1)
38394 where
38395 Self: Sha512Sum1Emitter<T0, T1>,
38396 {
38397 <Self as Sha512Sum1Emitter<T0, T1>>::sha512sum1(self, rd, rs1);
38398 }
38399 /// RISC-V `sha512sum1r` instruction.
38400 ///
38401 /// # Forms
38402 /// Assembly: `sha512sum1r xd, xs1, xs2`
38403 /// Rust: `sha512sum1r(rd, rs1, rs2)`
38404 ///
38405 /// # Arguments
38406 /// - `rd` — Destination register.
38407 /// - `rs1` — Source register.
38408 /// - `rs2` — Source register.
38409 pub fn sha512sum1r<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38410 where
38411 Self: Sha512Sum1REmitter<T0, T1, T2>,
38412 {
38413 <Self as Sha512Sum1REmitter<T0, T1, T2>>::sha512sum1r(self, rd, rs1, rs2);
38414 }
38415 /// Invalidate cached address translations
38416 ///
38417 /// # Forms
38418 /// Assembly: `sinval.vma xs1, xs2`
38419 /// Rust: `sinval_vma(rs1, rs2)`
38420 ///
38421 /// # Arguments
38422 /// - `rs1` — Source register.
38423 /// - `rs2` — Source register.
38424 pub fn sinval_vma<T0, T1>(&mut self, rs1: T0, rs2: T1)
38425 where
38426 Self: SinvalVmaEmitter<T0, T1>,
38427 {
38428 <Self as SinvalVmaEmitter<T0, T1>>::sinval_vma(self, rs1, rs2);
38429 }
38430 /// Shift left logical
38431 ///
38432 /// Shift the value in `rs1` left by the value in the lower 6 bits of `rs2`, and store the result in `rd`.
38433 ///
38434 /// # Forms
38435 /// Assembly: `sll xd, xs1, xs2`
38436 /// Rust: `sll(rd, rs1, rs2)`
38437 ///
38438 /// # Arguments
38439 /// - `rd` — Destination register.
38440 /// - `rs1` — Source register.
38441 /// - `rs2` — Source register.
38442 pub fn sll<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38443 where
38444 Self: SllEmitter<T0, T1, T2>,
38445 {
38446 <Self as SllEmitter<T0, T1, T2>>::sll(self, rd, rs1, rs2);
38447 }
38448 /// Shift left logical immediate
38449 ///
38450 /// Shift the value in rs1 left by shamt, and store the result in rd
38451 ///
38452 /// # Forms
38453 /// Assembly: `slli xd, xs1, shamt`
38454 /// Rust: `slli(rd, rs1, shamtd)`
38455 ///
38456 /// # Arguments
38457 /// - `rd` — Destination register.
38458 /// - `rs1` — Source register.
38459 /// - `shamtd` — Immediate encoding value.
38460 pub fn slli<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtd: T2)
38461 where
38462 Self: SlliEmitter<T0, T1, T2>,
38463 {
38464 <Self as SlliEmitter<T0, T1, T2>>::slli(self, rd, rs1, shamtd);
38465 }
38466 /// Shift left logical immediate
38467 ///
38468 /// Shift the value in rs1 left by shamt, and store the result in rd
38469 ///
38470 /// # Forms
38471 /// Assembly: `slli.rv32 xd, xs1, shamt`
38472 /// Rust: `slli_rv32(rd, rs1, shamtw)`
38473 ///
38474 /// # Arguments
38475 /// - `rd` — Destination register.
38476 /// - `rs1` — Source register.
38477 /// - `shamtw` — Immediate encoding value.
38478 pub fn slli_rv32<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
38479 where
38480 Self: SlliRv32Emitter<T0, T1, T2>,
38481 {
38482 <Self as SlliRv32Emitter<T0, T1, T2>>::slli_rv32(self, rd, rs1, shamtw);
38483 }
38484 /// Shift left unsigned word (Immediate)
38485 ///
38486 /// This instruction takes the least-significant word of rs1, zero-extends it, and shifts it
38487 /// left by the immediate.
38488 ///
38489 /// \[NOTE\]
38490 /// This instruction is the same as `slli` with `zext.w` performed on rs1 before shifting.
38491 ///
38492 /// # Forms
38493 /// Assembly: `slli.uw xd, xs1, shamt`
38494 /// Rust: `slli_uw(rd, rs1, shamtd)`
38495 ///
38496 /// # Arguments
38497 /// - `rd` — Destination register.
38498 /// - `rs1` — Source register.
38499 /// - `shamtd` — Immediate encoding value.
38500 pub fn slli_uw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtd: T2)
38501 where
38502 Self: SlliUwEmitter<T0, T1, T2>,
38503 {
38504 <Self as SlliUwEmitter<T0, T1, T2>>::slli_uw(self, rd, rs1, shamtd);
38505 }
38506 /// Shift left logical immediate word
38507 ///
38508 /// Shift the 32-bit value in rs1 left by shamt, and store the sign-extended result in rd
38509 ///
38510 /// # Forms
38511 /// Assembly: `slliw xd, xs1, shamt`
38512 /// Rust: `slliw(rd, rs1, shamtw)`
38513 ///
38514 /// # Arguments
38515 /// - `rd` — Destination register.
38516 /// - `rs1` — Source register.
38517 /// - `shamtw` — Immediate encoding value.
38518 pub fn slliw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
38519 where
38520 Self: SlliwEmitter<T0, T1, T2>,
38521 {
38522 <Self as SlliwEmitter<T0, T1, T2>>::slliw(self, rd, rs1, shamtw);
38523 }
38524 /// Shift left logical word
38525 ///
38526 /// Shift the 32-bit value in `rs1` left by the value in the lower 5 bits of `rs2`, and store the sign-extended result in `rd`.
38527 ///
38528 /// # Forms
38529 /// Assembly: `sllw xd, xs1, xs2`
38530 /// Rust: `sllw(rd, rs1, rs2)`
38531 ///
38532 /// # Arguments
38533 /// - `rd` — Destination register.
38534 /// - `rs1` — Source register.
38535 /// - `rs2` — Source register.
38536 pub fn sllw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38537 where
38538 Self: SllwEmitter<T0, T1, T2>,
38539 {
38540 <Self as SllwEmitter<T0, T1, T2>>::sllw(self, rd, rs1, rs2);
38541 }
38542 /// Set on less than
38543 ///
38544 /// Places the value 1 in register `rd` if register `rs1` is less than the value in register `rs2`, where
38545 /// both sources are treated as signed numbers, else 0 is written to `rd`.
38546 ///
38547 /// # Forms
38548 /// Assembly: `slt xd, xs1, rs2`
38549 /// Rust: `slt(rd, rs1, rs2)`
38550 ///
38551 /// # Arguments
38552 /// - `rd` — Destination register.
38553 /// - `rs1` — Source register.
38554 /// - `rs2` — Source register.
38555 pub fn slt<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38556 where
38557 Self: SltEmitter<T0, T1, T2>,
38558 {
38559 <Self as SltEmitter<T0, T1, T2>>::slt(self, rd, rs1, rs2);
38560 }
38561 /// Set on less than immediate
38562 ///
38563 /// Places the value 1 in register `rd` if register `rs1` is less than the sign-extended immediate
38564 /// when both are treated as signed numbers, else 0 is written to `rd`.
38565 ///
38566 /// # Forms
38567 /// Assembly: `slti xd, xs1, imm`
38568 /// Rust: `slti(rd, rs1, imm)`
38569 ///
38570 /// # Arguments
38571 /// - `rd` — Destination register.
38572 /// - `rs1` — Source register.
38573 /// - `imm` — Immediate encoding value.
38574 pub fn slti<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
38575 where
38576 Self: SltiEmitter<T0, T1, T2>,
38577 {
38578 <Self as SltiEmitter<T0, T1, T2>>::slti(self, rd, rs1, imm);
38579 }
38580 /// Set on less than immediate unsigned
38581 ///
38582 /// Places the value 1 in register `rd` if register `rs1` is less than the sign-extended immediate
38583 /// when both are treated as unsigned numbers (_i.e._, the immediate is first sign-extended to
38584 /// XLEN bits then treated as an unsigned number), else 0 is written to `rd`.
38585 ///
38586 /// NOTE: `sltiu rd, rs1, 1` sets `rd` to 1 if `rs1` equals zero, otherwise sets `rd` to 0
38587 /// (assembler pseudoinstruction `SEQZ rd, rs`).
38588 ///
38589 /// # Forms
38590 /// Assembly: `sltiu xd, xs1, imm`
38591 /// Rust: `sltiu(rd, rs1, imm)`
38592 ///
38593 /// # Arguments
38594 /// - `rd` — Destination register.
38595 /// - `rs1` — Source register.
38596 /// - `imm` — Immediate encoding value.
38597 pub fn sltiu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
38598 where
38599 Self: SltiuEmitter<T0, T1, T2>,
38600 {
38601 <Self as SltiuEmitter<T0, T1, T2>>::sltiu(self, rd, rs1, imm);
38602 }
38603 /// Set on less than unsigned
38604 ///
38605 /// Places the value 1 in register `rd` if register `rs1` is less than the value in register `rs2`, where
38606 /// both sources are treated as unsigned numbers, else 0 is written to `rd`.
38607 ///
38608 /// # Forms
38609 /// Assembly: `sltu xd, xs1, xs2`
38610 /// Rust: `sltu(rd, rs1, rs2)`
38611 ///
38612 /// # Arguments
38613 /// - `rd` — Destination register.
38614 /// - `rs1` — Source register.
38615 /// - `rs2` — Source register.
38616 pub fn sltu<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38617 where
38618 Self: SltuEmitter<T0, T1, T2>,
38619 {
38620 <Self as SltuEmitter<T0, T1, T2>>::sltu(self, rd, rs1, rs2);
38621 }
38622 /// RISC-V `sltz` instruction.
38623 ///
38624 /// # Forms
38625 /// Assembly: `sltz rd rs1`
38626 /// Rust: `sltz(rd, rs1)`
38627 ///
38628 /// # Arguments
38629 /// - `rd` — Destination register.
38630 /// - `rs1` — Source register.
38631 pub fn sltz<T0, T1>(&mut self, rd: T0, rs1: T1)
38632 where
38633 Self: SltzEmitter<T0, T1>,
38634 {
38635 <Self as SltzEmitter<T0, T1>>::sltz(self, rd, rs1);
38636 }
38637 /// RISC-V `sm3p0` instruction.
38638 ///
38639 /// # Forms
38640 /// Assembly: `sm3p0 xd, xs1`
38641 /// Rust: `sm3p0(rd, rs1)`
38642 ///
38643 /// # Arguments
38644 /// - `rd` — Destination register.
38645 /// - `rs1` — Source register.
38646 pub fn sm3p0<T0, T1>(&mut self, rd: T0, rs1: T1)
38647 where
38648 Self: Sm3P0Emitter<T0, T1>,
38649 {
38650 <Self as Sm3P0Emitter<T0, T1>>::sm3p0(self, rd, rs1);
38651 }
38652 /// RISC-V `sm3p1` instruction.
38653 ///
38654 /// # Forms
38655 /// Assembly: `sm3p1 xd, xs1`
38656 /// Rust: `sm3p1(rd, rs1)`
38657 ///
38658 /// # Arguments
38659 /// - `rd` — Destination register.
38660 /// - `rs1` — Source register.
38661 pub fn sm3p1<T0, T1>(&mut self, rd: T0, rs1: T1)
38662 where
38663 Self: Sm3P1Emitter<T0, T1>,
38664 {
38665 <Self as Sm3P1Emitter<T0, T1>>::sm3p1(self, rd, rs1);
38666 }
38667 /// RISC-V `sm4ed` instruction.
38668 ///
38669 /// # Forms
38670 /// Assembly: `sm4ed xd, xs1, xs2, bs`
38671 /// Rust: `sm4ed(rd, rs1, rs2, bs)`
38672 ///
38673 /// # Arguments
38674 /// - `rd` — Destination register.
38675 /// - `rs1` — Source register.
38676 /// - `rs2` — Source register.
38677 /// - `bs` — Immediate encoding value.
38678 pub fn sm4ed<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3)
38679 where
38680 Self: Sm4EdEmitter<T0, T1, T2, T3>,
38681 {
38682 <Self as Sm4EdEmitter<T0, T1, T2, T3>>::sm4ed(self, rd, rs1, rs2, bs);
38683 }
38684 /// RISC-V `sm4ks` instruction.
38685 ///
38686 /// # Forms
38687 /// Assembly: `sm4ks xd, xs1, xs2, bs`
38688 /// Rust: `sm4ks(rd, rs1, rs2, bs)`
38689 ///
38690 /// # Arguments
38691 /// - `rd` — Destination register.
38692 /// - `rs1` — Source register.
38693 /// - `rs2` — Source register.
38694 /// - `bs` — Immediate encoding value.
38695 pub fn sm4ks<T0, T1, T2, T3>(&mut self, rd: T0, rs1: T1, rs2: T2, bs: T3)
38696 where
38697 Self: Sm4KsEmitter<T0, T1, T2, T3>,
38698 {
38699 <Self as Sm4KsEmitter<T0, T1, T2, T3>>::sm4ks(self, rd, rs1, rs2, bs);
38700 }
38701 /// RISC-V `snez` instruction.
38702 ///
38703 /// # Forms
38704 /// Assembly: `snez rd rs2`
38705 /// Rust: `snez(rd, rs2)`
38706 ///
38707 /// # Arguments
38708 /// - `rd` — Destination register.
38709 /// - `rs2` — Source register.
38710 pub fn snez<T0, T1>(&mut self, rd: T0, rs2: T1)
38711 where
38712 Self: SnezEmitter<T0, T1>,
38713 {
38714 <Self as SnezEmitter<T0, T1>>::snez(self, rd, rs2);
38715 }
38716 /// Shift right arithmetic
38717 ///
38718 /// Arithmetic shift the value in `rs1` right by the value in the lower 5 bits of `rs2`, and store the result in `rd`.
38719 ///
38720 /// # Forms
38721 /// Assembly: `sra xd, xs1, xs2`
38722 /// Rust: `sra(rd, rs1, rs2)`
38723 ///
38724 /// # Arguments
38725 /// - `rd` — Destination register.
38726 /// - `rs1` — Source register.
38727 /// - `rs2` — Source register.
38728 pub fn sra<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38729 where
38730 Self: SraEmitter<T0, T1, T2>,
38731 {
38732 <Self as SraEmitter<T0, T1, T2>>::sra(self, rd, rs1, rs2);
38733 }
38734 /// Shift right arithmetic immediate
38735 ///
38736 /// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the
38737 /// value in rs1 right by shamt, and store the result in rd.
38738 ///
38739 /// # Forms
38740 /// Assembly: `srai xd, xs1, shamt`
38741 /// Rust: `srai(rd, rs1, shamtd)`
38742 ///
38743 /// # Arguments
38744 /// - `rd` — Destination register.
38745 /// - `rs1` — Source register.
38746 /// - `shamtd` — Immediate encoding value.
38747 pub fn srai<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtd: T2)
38748 where
38749 Self: SraiEmitter<T0, T1, T2>,
38750 {
38751 <Self as SraiEmitter<T0, T1, T2>>::srai(self, rd, rs1, shamtd);
38752 }
38753 /// Shift right arithmetic immediate
38754 ///
38755 /// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the
38756 /// value in rs1 right by shamt, and store the result in rd.
38757 ///
38758 /// # Forms
38759 /// Assembly: `srai.rv32 xd, xs1, shamt`
38760 /// Rust: `srai_rv32(rd, rs1, shamtw)`
38761 ///
38762 /// # Arguments
38763 /// - `rd` — Destination register.
38764 /// - `rs1` — Source register.
38765 /// - `shamtw` — Immediate encoding value.
38766 pub fn srai_rv32<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
38767 where
38768 Self: SraiRv32Emitter<T0, T1, T2>,
38769 {
38770 <Self as SraiRv32Emitter<T0, T1, T2>>::srai_rv32(self, rd, rs1, shamtw);
38771 }
38772 /// Shift right arithmetic immediate word
38773 ///
38774 /// Arithmetic shift (the original sign bit is copied into the vacated upper bits) the
38775 /// 32-bit value in rs1 right by shamt, and store the sign-extended result in rd.
38776 ///
38777 /// # Forms
38778 /// Assembly: `sraiw xd, xs1, shamt`
38779 /// Rust: `sraiw(rd, rs1, shamtw)`
38780 ///
38781 /// # Arguments
38782 /// - `rd` — Destination register.
38783 /// - `rs1` — Source register.
38784 /// - `shamtw` — Immediate encoding value.
38785 pub fn sraiw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
38786 where
38787 Self: SraiwEmitter<T0, T1, T2>,
38788 {
38789 <Self as SraiwEmitter<T0, T1, T2>>::sraiw(self, rd, rs1, shamtw);
38790 }
38791 /// Shift right arithmetic word
38792 ///
38793 /// Arithmetic shift the 32-bit value in `rs1` right by the value in the lower 5 bits of `rs2`, and store the sign-extended result in `rd`.
38794 ///
38795 /// # Forms
38796 /// Assembly: `sraw xd, xs1, xs2`
38797 /// Rust: `sraw(rd, rs1, rs2)`
38798 ///
38799 /// # Arguments
38800 /// - `rd` — Destination register.
38801 /// - `rs1` — Source register.
38802 /// - `rs2` — Source register.
38803 pub fn sraw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38804 where
38805 Self: SrawEmitter<T0, T1, T2>,
38806 {
38807 <Self as SrawEmitter<T0, T1, T2>>::sraw(self, rd, rs1, rs2);
38808 }
38809 /// Supervisor Exception Return
38810 ///
38811 /// Returns from an exception.
38812 ///
38813 /// When `sret` is allowed to execute, its behavior depends on whether or not the current privilege
38814 /// mode is virtualized.
38815 ///
38816 /// *When the current privilege mode is (H)S-mode or M-mode*
38817 ///
38818 /// `sret` sets `hstatus.HPV` = 0, `mstatus.SPP` = 0,
38819 /// `mstatus.SIE` = `mstatus.SPIE`, and `mstatus.SPIE` = 1,
38820 /// changes the privilege mode according to the table below,
38821 /// and then jumps to the address in `sepc`.
38822 ///
38823 /// .Next privilege mode following an `sret` in (H)S-mode or M-mode
38824 /// \[%autowidth\]
38825 /// |===
38826 /// | \[.rotate\]#`mstatus.SPP`# | \[.rotate\]#`hstatus.SPV`# .>| Mode after `sret`
38827 ///
38828 /// | 0 | 0 | U-mode
38829 /// | 0 | 1 | VU-mode
38830 /// | 1 | 0 | (H)S-mode
38831 /// | 1 | 1 | VS-mode
38832 /// |===
38833 ///
38834 /// *When the current privilege mode is VS-mode*
38835 ///
38836 /// `sret` sets
38837 /// `vsstatus.SPP` = 0, `vsstatus.SIE` = `vstatus.SPIE`, and `vsstatus.SPIE` = 1,
38838 /// changes the privilege mode according to the table below,
38839 /// and then jumps to the address in `vsepc`.
38840 ///
38841 /// .Next privilege mode following an `sret` in (H)S-mode or M-mode
38842 /// \[%autowidth\]
38843 /// |===
38844 /// | \[.rotate\]#`vsstatus.SPP`# .>| Mode after `sret`
38845 ///
38846 /// | 0 | VU-mode
38847 /// | 1 | VS-mode
38848 /// |===
38849 ///
38850 /// # Forms
38851 /// Assembly: `sret ""`
38852 /// Rust: `sret()`
38853 ///
38854 /// # Arguments
38855 pub fn sret(&mut self)
38856 where
38857 Self: SretEmitter,
38858 {
38859 <Self as SretEmitter>::sret(self);
38860 }
38861 /// Shift right logical
38862 ///
38863 /// Logical shift the value in `rs1` right by the value in the lower bits of `rs2`, and store the result in `rd`.
38864 ///
38865 /// # Forms
38866 /// Assembly: `srl xd, xs1, xs2`
38867 /// Rust: `srl(rd, rs1, rs2)`
38868 ///
38869 /// # Arguments
38870 /// - `rd` — Destination register.
38871 /// - `rs1` — Source register.
38872 /// - `rs2` — Source register.
38873 pub fn srl<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38874 where
38875 Self: SrlEmitter<T0, T1, T2>,
38876 {
38877 <Self as SrlEmitter<T0, T1, T2>>::srl(self, rd, rs1, rs2);
38878 }
38879 /// Shift right logical immediate
38880 ///
38881 /// Shift the value in rs1 right by shamt, and store the result in rd
38882 ///
38883 /// # Forms
38884 /// Assembly: `srli xd, xs1, shamt`
38885 /// Rust: `srli(rd, rs1, shamtd)`
38886 ///
38887 /// # Arguments
38888 /// - `rd` — Destination register.
38889 /// - `rs1` — Source register.
38890 /// - `shamtd` — Immediate encoding value.
38891 pub fn srli<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtd: T2)
38892 where
38893 Self: SrliEmitter<T0, T1, T2>,
38894 {
38895 <Self as SrliEmitter<T0, T1, T2>>::srli(self, rd, rs1, shamtd);
38896 }
38897 /// Shift right logical immediate
38898 ///
38899 /// Shift the value in rs1 right by shamt, and store the result in rd
38900 ///
38901 /// # Forms
38902 /// Assembly: `srli.rv32 xd, xs1, shamt`
38903 /// Rust: `srli_rv32(rd, rs1, shamtw)`
38904 ///
38905 /// # Arguments
38906 /// - `rd` — Destination register.
38907 /// - `rs1` — Source register.
38908 /// - `shamtw` — Immediate encoding value.
38909 pub fn srli_rv32<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
38910 where
38911 Self: SrliRv32Emitter<T0, T1, T2>,
38912 {
38913 <Self as SrliRv32Emitter<T0, T1, T2>>::srli_rv32(self, rd, rs1, shamtw);
38914 }
38915 /// Shift right logical immediate word
38916 ///
38917 /// Shift the 32-bit value in rs1 right by shamt, and store the sign-extended result in rd
38918 ///
38919 /// # Forms
38920 /// Assembly: `srliw xd, xs1, shamt`
38921 /// Rust: `srliw(rd, rs1, shamtw)`
38922 ///
38923 /// # Arguments
38924 /// - `rd` — Destination register.
38925 /// - `rs1` — Source register.
38926 /// - `shamtw` — Immediate encoding value.
38927 pub fn srliw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, shamtw: T2)
38928 where
38929 Self: SrliwEmitter<T0, T1, T2>,
38930 {
38931 <Self as SrliwEmitter<T0, T1, T2>>::srliw(self, rd, rs1, shamtw);
38932 }
38933 /// Shift right logical word
38934 ///
38935 /// Logical shift the 32-bit value in `rs1` right by the value in the lower 5 bits of `rs2`, and store the sign-extended result in `rd`.
38936 ///
38937 /// # Forms
38938 /// Assembly: `srlw xd, xs1, xs2`
38939 /// Rust: `srlw(rd, rs1, rs2)`
38940 ///
38941 /// # Arguments
38942 /// - `rd` — Destination register.
38943 /// - `rs1` — Source register.
38944 /// - `rs2` — Source register.
38945 pub fn srlw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
38946 where
38947 Self: SrlwEmitter<T0, T1, T2>,
38948 {
38949 <Self as SrlwEmitter<T0, T1, T2>>::srlw(self, rd, rs1, rs2);
38950 }
38951 /// RISC-V `ssamoswap.d` instruction.
38952 ///
38953 /// # Forms
38954 /// Assembly: `ssamoswap.d xd, xs1, xs2, aq, rl`
38955 /// Rust: `ssamoswap_d(rd, rs1, rs2, aq, rl)`
38956 ///
38957 /// # Arguments
38958 /// - `rd` — Destination register.
38959 /// - `rs1` — Memory base register.
38960 /// - `rs2` — Source register.
38961 /// - `aq` — Acquire-order bit.
38962 /// - `rl` — Release-order bit; retained for the existing emitter API.
38963 pub fn ssamoswap_d<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
38964 where
38965 Self: SsamoswapDEmitter<T0, T1, T2, T3, T4>,
38966 {
38967 <Self as SsamoswapDEmitter<T0, T1, T2, T3, T4>>::ssamoswap_d(self, rd, rs1, rs2, aq, rl);
38968 }
38969 /// RISC-V `ssamoswap.w` instruction.
38970 ///
38971 /// # Forms
38972 /// Assembly: `ssamoswap.w xd, xs1, xs2, aq, rl`
38973 /// Rust: `ssamoswap_w(rd, rs1, rs2, aq, rl)`
38974 ///
38975 /// # Arguments
38976 /// - `rd` — Destination register.
38977 /// - `rs1` — Memory base register.
38978 /// - `rs2` — Source register.
38979 /// - `aq` — Acquire-order bit.
38980 /// - `rl` — Release-order bit; retained for the existing emitter API.
38981 pub fn ssamoswap_w<T0, T1, T2, T3, T4>(&mut self, rd: T0, rs1: T1, rs2: T2, aq: T3, rl: T4)
38982 where
38983 Self: SsamoswapWEmitter<T0, T1, T2, T3, T4>,
38984 {
38985 <Self as SsamoswapWEmitter<T0, T1, T2, T3, T4>>::ssamoswap_w(self, rd, rs1, rs2, aq, rl);
38986 }
38987 /// RISC-V `sspopchk.x1` instruction.
38988 ///
38989 /// # Forms
38990 /// Assembly: `sspopchk.x1 sspopchk_x1`
38991 /// Rust: `sspopchk_x1()`
38992 ///
38993 /// # Arguments
38994 pub fn sspopchk_x1(&mut self)
38995 where
38996 Self: SspopchkX1Emitter,
38997 {
38998 <Self as SspopchkX1Emitter>::sspopchk_x1(self);
38999 }
39000 /// RISC-V `sspopchk.x5` instruction.
39001 ///
39002 /// # Forms
39003 /// Assembly: `sspopchk.x5 sspopchk_x5`
39004 /// Rust: `sspopchk_x5()`
39005 ///
39006 /// # Arguments
39007 pub fn sspopchk_x5(&mut self)
39008 where
39009 Self: SspopchkX5Emitter,
39010 {
39011 <Self as SspopchkX5Emitter>::sspopchk_x5(self);
39012 }
39013 /// RISC-V `sspush.x1` instruction.
39014 ///
39015 /// # Forms
39016 /// Assembly: `sspush.x1 sspush_x1`
39017 /// Rust: `sspush_x1()`
39018 ///
39019 /// # Arguments
39020 pub fn sspush_x1(&mut self)
39021 where
39022 Self: SspushX1Emitter,
39023 {
39024 <Self as SspushX1Emitter>::sspush_x1(self);
39025 }
39026 /// RISC-V `sspush.x5` instruction.
39027 ///
39028 /// # Forms
39029 /// Assembly: `sspush.x5 sspush_x5`
39030 /// Rust: `sspush_x5()`
39031 ///
39032 /// # Arguments
39033 pub fn sspush_x5(&mut self)
39034 where
39035 Self: SspushX5Emitter,
39036 {
39037 <Self as SspushX5Emitter>::sspush_x5(self);
39038 }
39039 /// RISC-V `ssrdp` instruction.
39040 ///
39041 /// # Forms
39042 /// Assembly: `ssrdp xd`
39043 /// Rust: `ssrdp(rd)`
39044 ///
39045 /// # Arguments
39046 /// - `rd` — Destination register.
39047 pub fn ssrdp<T0>(&mut self, rd: T0)
39048 where
39049 Self: SsrdpEmitter<T0>,
39050 {
39051 <Self as SsrdpEmitter<T0>>::ssrdp(self, rd);
39052 }
39053 /// Subtract
39054 ///
39055 /// Subtract the value in rs2 from rs1, and store the result in rd
39056 ///
39057 /// # Forms
39058 /// Assembly: `sub xd, xs1, xs2`
39059 /// Rust: `sub(rd, rs1, rs2)`
39060 ///
39061 /// # Arguments
39062 /// - `rd` — Destination register.
39063 /// - `rs1` — Source register.
39064 /// - `rs2` — Source register.
39065 pub fn sub<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
39066 where
39067 Self: SubEmitter<T0, T1, T2>,
39068 {
39069 <Self as SubEmitter<T0, T1, T2>>::sub(self, rd, rs1, rs2);
39070 }
39071 /// Subtract word
39072 ///
39073 /// Subtract the 32-bit values in rs2 from rs1, and store the sign-extended result in rd
39074 ///
39075 /// # Forms
39076 /// Assembly: `subw xd, xs1, xs2`
39077 /// Rust: `subw(rd, rs1, rs2)`
39078 ///
39079 /// # Arguments
39080 /// - `rd` — Destination register.
39081 /// - `rs1` — Source register.
39082 /// - `rs2` — Source register.
39083 pub fn subw<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
39084 where
39085 Self: SubwEmitter<T0, T1, T2>,
39086 {
39087 <Self as SubwEmitter<T0, T1, T2>>::subw(self, rd, rs1, rs2);
39088 }
39089 /// Store word
39090 ///
39091 /// Store 32 bits of data from register `rs2` to an
39092 /// address formed by adding `rs1` to a signed offset.
39093 ///
39094 /// # Forms
39095 /// Assembly: `sw xs2, imm(xs1)`
39096 /// Rust: `sw(rs1, rs2, imm)`
39097 ///
39098 /// # Arguments
39099 /// - `rs1` — Memory base register.
39100 /// - `rs2` — Source register.
39101 /// - `imm` — Immediate encoding value.
39102 pub fn sw<T0, T1, T2>(&mut self, rs1: T0, rs2: T1, imm: T2)
39103 where
39104 Self: SwEmitter<T0, T1, T2>,
39105 {
39106 <Self as SwEmitter<T0, T1, T2>>::sw(self, rs1, rs2, imm);
39107 }
39108 /// Bit deinterleave
39109 ///
39110 /// This instruction gathers bits from the high and low halves of the source word into odd/even bit
39111 /// positions in the destination word. It is the inverse of the zip instruction. This instruction is
39112 /// available only on RV32.
39113 ///
39114 /// # Forms
39115 /// Assembly: `unzip xd, xs1`
39116 /// Rust: `unzip(rd, rs1)`
39117 ///
39118 /// # Arguments
39119 /// - `rd` — Destination register.
39120 /// - `rs1` — Source register.
39121 pub fn unzip<T0, T1>(&mut self, rd: T0, rs1: T1)
39122 where
39123 Self: UnzipEmitter<T0, T1>,
39124 {
39125 <Self as UnzipEmitter<T0, T1>>::unzip(self, rd, rs1);
39126 }
39127 /// RISC-V `vaadd.vv` instruction.
39128 ///
39129 /// # Forms
39130 /// Assembly: `vaadd.vv vm, vs2, vs1, vd`
39131 /// Rust: `vaadd_vv(vd, vs1, vs2, vm)`
39132 ///
39133 /// # Arguments
39134 /// - `vd` — Vector register operand.
39135 /// - `vs1` — Vector register operand.
39136 /// - `vs2` — Vector register operand.
39137 /// - `vm` — Vector mask control.
39138 pub fn vaadd_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39139 where
39140 Self: VaaddVvEmitter<T0, T1, T2, T3>,
39141 {
39142 <Self as VaaddVvEmitter<T0, T1, T2, T3>>::vaadd_vv(self, vd, vs1, vs2, vm);
39143 }
39144 /// RISC-V `vaadd.vx` instruction.
39145 ///
39146 /// # Forms
39147 /// Assembly: `vaadd.vx vm, vs2, xs1, vd`
39148 /// Rust: `vaadd_vx(vd, vs2, rs1, vm)`
39149 ///
39150 /// # Arguments
39151 /// - `vd` — Vector register operand.
39152 /// - `vs2` — Vector register operand.
39153 /// - `rs1` — Source register.
39154 /// - `vm` — Vector mask control.
39155 pub fn vaadd_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39156 where
39157 Self: VaaddVxEmitter<T0, T1, T2, T3>,
39158 {
39159 <Self as VaaddVxEmitter<T0, T1, T2, T3>>::vaadd_vx(self, vd, vs2, rs1, vm);
39160 }
39161 /// RISC-V `vaaddu.vv` instruction.
39162 ///
39163 /// # Forms
39164 /// Assembly: `vaaddu.vv vm, vs2, vs1, vd`
39165 /// Rust: `vaaddu_vv(vd, vs1, vs2, vm)`
39166 ///
39167 /// # Arguments
39168 /// - `vd` — Vector register operand.
39169 /// - `vs1` — Vector register operand.
39170 /// - `vs2` — Vector register operand.
39171 /// - `vm` — Vector mask control.
39172 pub fn vaaddu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39173 where
39174 Self: VaadduVvEmitter<T0, T1, T2, T3>,
39175 {
39176 <Self as VaadduVvEmitter<T0, T1, T2, T3>>::vaaddu_vv(self, vd, vs1, vs2, vm);
39177 }
39178 /// RISC-V `vaaddu.vx` instruction.
39179 ///
39180 /// # Forms
39181 /// Assembly: `vaaddu.vx vm, vs2, xs1, vd`
39182 /// Rust: `vaaddu_vx(vd, vs2, rs1, vm)`
39183 ///
39184 /// # Arguments
39185 /// - `vd` — Vector register operand.
39186 /// - `vs2` — Vector register operand.
39187 /// - `rs1` — Source register.
39188 /// - `vm` — Vector mask control.
39189 pub fn vaaddu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39190 where
39191 Self: VaadduVxEmitter<T0, T1, T2, T3>,
39192 {
39193 <Self as VaadduVxEmitter<T0, T1, T2, T3>>::vaaddu_vx(self, vd, vs2, rs1, vm);
39194 }
39195 /// RISC-V `vadc.vim` instruction.
39196 ///
39197 /// # Forms
39198 /// Assembly: `vadc.vim vs2, vd, imm`
39199 /// Rust: `vadc_vim(vd, vs2, simm5)`
39200 ///
39201 /// # Arguments
39202 /// - `vd` — Vector register operand.
39203 /// - `vs2` — Vector register operand.
39204 /// - `simm5` — Immediate encoding value.
39205 pub fn vadc_vim<T0, T1, T2>(&mut self, vd: T0, vs2: T1, simm5: T2)
39206 where
39207 Self: VadcVimEmitter<T0, T1, T2>,
39208 {
39209 <Self as VadcVimEmitter<T0, T1, T2>>::vadc_vim(self, vd, vs2, simm5);
39210 }
39211 /// RISC-V `vadc.vvm` instruction.
39212 ///
39213 /// # Forms
39214 /// Assembly: `vadc.vvm vs2, vs1, vd`
39215 /// Rust: `vadc_vvm(vd, vs1, vs2)`
39216 ///
39217 /// # Arguments
39218 /// - `vd` — Vector register operand.
39219 /// - `vs1` — Vector register operand.
39220 /// - `vs2` — Vector register operand.
39221 pub fn vadc_vvm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
39222 where
39223 Self: VadcVvmEmitter<T0, T1, T2>,
39224 {
39225 <Self as VadcVvmEmitter<T0, T1, T2>>::vadc_vvm(self, vd, vs1, vs2);
39226 }
39227 /// RISC-V `vadc.vxm` instruction.
39228 ///
39229 /// # Forms
39230 /// Assembly: `vadc.vxm vs2, xs1, vd`
39231 /// Rust: `vadc_vxm(vd, rs1, vs2)`
39232 ///
39233 /// # Arguments
39234 /// - `vd` — Vector register operand.
39235 /// - `rs1` — Source register.
39236 /// - `vs2` — Vector register operand.
39237 pub fn vadc_vxm<T0, T1, T2>(&mut self, vd: T0, rs1: T1, vs2: T2)
39238 where
39239 Self: VadcVxmEmitter<T0, T1, T2>,
39240 {
39241 <Self as VadcVxmEmitter<T0, T1, T2>>::vadc_vxm(self, vd, rs1, vs2);
39242 }
39243 /// RISC-V `vadd.vi` instruction.
39244 ///
39245 /// # Forms
39246 /// Assembly: `vadd.vi vm, vs2, vd, imm`
39247 /// Rust: `vadd_vi(vd, vs2, simm5, vm)`
39248 ///
39249 /// # Arguments
39250 /// - `vd` — Vector register operand.
39251 /// - `vs2` — Vector register operand.
39252 /// - `simm5` — Immediate encoding value.
39253 /// - `vm` — Vector mask control.
39254 pub fn vadd_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
39255 where
39256 Self: VaddViEmitter<T0, T1, T2, T3>,
39257 {
39258 <Self as VaddViEmitter<T0, T1, T2, T3>>::vadd_vi(self, vd, vs2, simm5, vm);
39259 }
39260 /// RISC-V `vadd.vv` instruction.
39261 ///
39262 /// # Forms
39263 /// Assembly: `vadd.vv vm, vs2, vs1, vd`
39264 /// Rust: `vadd_vv(vd, vs1, vs2, vm)`
39265 ///
39266 /// # Arguments
39267 /// - `vd` — Vector register operand.
39268 /// - `vs1` — Vector register operand.
39269 /// - `vs2` — Vector register operand.
39270 /// - `vm` — Vector mask control.
39271 pub fn vadd_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39272 where
39273 Self: VaddVvEmitter<T0, T1, T2, T3>,
39274 {
39275 <Self as VaddVvEmitter<T0, T1, T2, T3>>::vadd_vv(self, vd, vs1, vs2, vm);
39276 }
39277 /// RISC-V `vadd.vx` instruction.
39278 ///
39279 /// # Forms
39280 /// Assembly: `vadd.vx vm, vs2, xs1, vd`
39281 /// Rust: `vadd_vx(vd, vs2, rs1, vm)`
39282 ///
39283 /// # Arguments
39284 /// - `vd` — Vector register operand.
39285 /// - `vs2` — Vector register operand.
39286 /// - `rs1` — Source register.
39287 /// - `vm` — Vector mask control.
39288 pub fn vadd_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39289 where
39290 Self: VaddVxEmitter<T0, T1, T2, T3>,
39291 {
39292 <Self as VaddVxEmitter<T0, T1, T2, T3>>::vadd_vx(self, vd, vs2, rs1, vm);
39293 }
39294 /// RISC-V `vaesdf.vs` instruction.
39295 ///
39296 /// # Forms
39297 /// Assembly: `vaesdf.vs vs2, vd`
39298 /// Rust: `vaesdf_vs(vd, vs2)`
39299 ///
39300 /// # Arguments
39301 /// - `vd` — Vector register operand.
39302 /// - `vs2` — Vector register operand.
39303 pub fn vaesdf_vs<T0, T1>(&mut self, vd: T0, vs2: T1)
39304 where
39305 Self: VaesdfVsEmitter<T0, T1>,
39306 {
39307 <Self as VaesdfVsEmitter<T0, T1>>::vaesdf_vs(self, vd, vs2);
39308 }
39309 /// RISC-V `vaesdf.vv` instruction.
39310 ///
39311 /// # Forms
39312 /// Assembly: `vaesdf.vv vs2, vd`
39313 /// Rust: `vaesdf_vv(vd, vs2)`
39314 ///
39315 /// # Arguments
39316 /// - `vd` — Vector register operand.
39317 /// - `vs2` — Vector register operand.
39318 pub fn vaesdf_vv<T0, T1>(&mut self, vd: T0, vs2: T1)
39319 where
39320 Self: VaesdfVvEmitter<T0, T1>,
39321 {
39322 <Self as VaesdfVvEmitter<T0, T1>>::vaesdf_vv(self, vd, vs2);
39323 }
39324 /// RISC-V `vaesdm.vs` instruction.
39325 ///
39326 /// # Forms
39327 /// Assembly: `vaesdm.vs vs2, vd`
39328 /// Rust: `vaesdm_vs(vd, vs2)`
39329 ///
39330 /// # Arguments
39331 /// - `vd` — Vector register operand.
39332 /// - `vs2` — Vector register operand.
39333 pub fn vaesdm_vs<T0, T1>(&mut self, vd: T0, vs2: T1)
39334 where
39335 Self: VaesdmVsEmitter<T0, T1>,
39336 {
39337 <Self as VaesdmVsEmitter<T0, T1>>::vaesdm_vs(self, vd, vs2);
39338 }
39339 /// RISC-V `vaesdm.vv` instruction.
39340 ///
39341 /// # Forms
39342 /// Assembly: `vaesdm.vv vs2, vd`
39343 /// Rust: `vaesdm_vv(vd, vs2)`
39344 ///
39345 /// # Arguments
39346 /// - `vd` — Vector register operand.
39347 /// - `vs2` — Vector register operand.
39348 pub fn vaesdm_vv<T0, T1>(&mut self, vd: T0, vs2: T1)
39349 where
39350 Self: VaesdmVvEmitter<T0, T1>,
39351 {
39352 <Self as VaesdmVvEmitter<T0, T1>>::vaesdm_vv(self, vd, vs2);
39353 }
39354 /// RISC-V `vaesef.vs` instruction.
39355 ///
39356 /// # Forms
39357 /// Assembly: `vaesef.vs vs2, vd`
39358 /// Rust: `vaesef_vs(vd, vs2)`
39359 ///
39360 /// # Arguments
39361 /// - `vd` — Vector register operand.
39362 /// - `vs2` — Vector register operand.
39363 pub fn vaesef_vs<T0, T1>(&mut self, vd: T0, vs2: T1)
39364 where
39365 Self: VaesefVsEmitter<T0, T1>,
39366 {
39367 <Self as VaesefVsEmitter<T0, T1>>::vaesef_vs(self, vd, vs2);
39368 }
39369 /// RISC-V `vaesef.vv` instruction.
39370 ///
39371 /// # Forms
39372 /// Assembly: `vaesef.vv vs2, vd`
39373 /// Rust: `vaesef_vv(vd, vs2)`
39374 ///
39375 /// # Arguments
39376 /// - `vd` — Vector register operand.
39377 /// - `vs2` — Vector register operand.
39378 pub fn vaesef_vv<T0, T1>(&mut self, vd: T0, vs2: T1)
39379 where
39380 Self: VaesefVvEmitter<T0, T1>,
39381 {
39382 <Self as VaesefVvEmitter<T0, T1>>::vaesef_vv(self, vd, vs2);
39383 }
39384 /// RISC-V `vaesem.vs` instruction.
39385 ///
39386 /// # Forms
39387 /// Assembly: `vaesem.vs vs2, vd`
39388 /// Rust: `vaesem_vs(vd, vs2)`
39389 ///
39390 /// # Arguments
39391 /// - `vd` — Vector register operand.
39392 /// - `vs2` — Vector register operand.
39393 pub fn vaesem_vs<T0, T1>(&mut self, vd: T0, vs2: T1)
39394 where
39395 Self: VaesemVsEmitter<T0, T1>,
39396 {
39397 <Self as VaesemVsEmitter<T0, T1>>::vaesem_vs(self, vd, vs2);
39398 }
39399 /// RISC-V `vaesem.vv` instruction.
39400 ///
39401 /// # Forms
39402 /// Assembly: `vaesem.vv vs2, vd`
39403 /// Rust: `vaesem_vv(vd, vs2)`
39404 ///
39405 /// # Arguments
39406 /// - `vd` — Vector register operand.
39407 /// - `vs2` — Vector register operand.
39408 pub fn vaesem_vv<T0, T1>(&mut self, vd: T0, vs2: T1)
39409 where
39410 Self: VaesemVvEmitter<T0, T1>,
39411 {
39412 <Self as VaesemVvEmitter<T0, T1>>::vaesem_vv(self, vd, vs2);
39413 }
39414 /// RISC-V `vaeskf1.vi` instruction.
39415 ///
39416 /// # Forms
39417 /// Assembly: `vaeskf1.vi vs2, vd, imm`
39418 /// Rust: `vaeskf1_vi(vd, vs2, zimm5)`
39419 ///
39420 /// # Arguments
39421 /// - `vd` — Vector register operand.
39422 /// - `vs2` — Vector register operand.
39423 /// - `zimm5` — Immediate encoding value.
39424 pub fn vaeskf1_vi<T0, T1, T2>(&mut self, vd: T0, vs2: T1, zimm5: T2)
39425 where
39426 Self: Vaeskf1ViEmitter<T0, T1, T2>,
39427 {
39428 <Self as Vaeskf1ViEmitter<T0, T1, T2>>::vaeskf1_vi(self, vd, vs2, zimm5);
39429 }
39430 /// RISC-V `vaeskf2.vi` instruction.
39431 ///
39432 /// # Forms
39433 /// Assembly: `vaeskf2.vi vs2, vd, imm`
39434 /// Rust: `vaeskf2_vi(vd, vs2, zimm5)`
39435 ///
39436 /// # Arguments
39437 /// - `vd` — Vector register operand.
39438 /// - `vs2` — Vector register operand.
39439 /// - `zimm5` — Immediate encoding value.
39440 pub fn vaeskf2_vi<T0, T1, T2>(&mut self, vd: T0, vs2: T1, zimm5: T2)
39441 where
39442 Self: Vaeskf2ViEmitter<T0, T1, T2>,
39443 {
39444 <Self as Vaeskf2ViEmitter<T0, T1, T2>>::vaeskf2_vi(self, vd, vs2, zimm5);
39445 }
39446 /// Vector AES round zero
39447 ///
39448 /// # Forms
39449 /// Assembly: `vaesz.vs vs2, vd`
39450 /// Rust: `vaesz_vs(vd, vs2)`
39451 ///
39452 /// # Arguments
39453 /// - `vd` — Vector register operand.
39454 /// - `vs2` — Vector register operand.
39455 pub fn vaesz_vs<T0, T1>(&mut self, vd: T0, vs2: T1)
39456 where
39457 Self: VaeszVsEmitter<T0, T1>,
39458 {
39459 <Self as VaeszVsEmitter<T0, T1>>::vaesz_vs(self, vd, vs2);
39460 }
39461 /// RISC-V `vand.vi` instruction.
39462 ///
39463 /// # Forms
39464 /// Assembly: `vand.vi vm, vs2, vd, imm`
39465 /// Rust: `vand_vi(vd, vs2, simm5, vm)`
39466 ///
39467 /// # Arguments
39468 /// - `vd` — Vector register operand.
39469 /// - `vs2` — Vector register operand.
39470 /// - `simm5` — Immediate encoding value.
39471 /// - `vm` — Vector mask control.
39472 pub fn vand_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
39473 where
39474 Self: VandViEmitter<T0, T1, T2, T3>,
39475 {
39476 <Self as VandViEmitter<T0, T1, T2, T3>>::vand_vi(self, vd, vs2, simm5, vm);
39477 }
39478 /// RISC-V `vand.vv` instruction.
39479 ///
39480 /// # Forms
39481 /// Assembly: `vand.vv vm, vs2, vs1, vd`
39482 /// Rust: `vand_vv(vd, vs1, vs2, vm)`
39483 ///
39484 /// # Arguments
39485 /// - `vd` — Vector register operand.
39486 /// - `vs1` — Vector register operand.
39487 /// - `vs2` — Vector register operand.
39488 /// - `vm` — Vector mask control.
39489 pub fn vand_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39490 where
39491 Self: VandVvEmitter<T0, T1, T2, T3>,
39492 {
39493 <Self as VandVvEmitter<T0, T1, T2, T3>>::vand_vv(self, vd, vs1, vs2, vm);
39494 }
39495 /// RISC-V `vand.vx` instruction.
39496 ///
39497 /// # Forms
39498 /// Assembly: `vand.vx vm, vs2, xs1, vd`
39499 /// Rust: `vand_vx(vd, vs2, rs1, vm)`
39500 ///
39501 /// # Arguments
39502 /// - `vd` — Vector register operand.
39503 /// - `vs2` — Vector register operand.
39504 /// - `rs1` — Source register.
39505 /// - `vm` — Vector mask control.
39506 pub fn vand_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39507 where
39508 Self: VandVxEmitter<T0, T1, T2, T3>,
39509 {
39510 <Self as VandVxEmitter<T0, T1, T2, T3>>::vand_vx(self, vd, vs2, rs1, vm);
39511 }
39512 /// RISC-V `vandn.vv` instruction.
39513 ///
39514 /// # Forms
39515 /// Assembly: `vandn.vv vm, vs2, vs1, vd`
39516 /// Rust: `vandn_vv(vd, vs1, vs2, vm)`
39517 ///
39518 /// # Arguments
39519 /// - `vd` — Vector register operand.
39520 /// - `vs1` — Vector register operand.
39521 /// - `vs2` — Vector register operand.
39522 /// - `vm` — Vector mask control.
39523 pub fn vandn_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39524 where
39525 Self: VandnVvEmitter<T0, T1, T2, T3>,
39526 {
39527 <Self as VandnVvEmitter<T0, T1, T2, T3>>::vandn_vv(self, vd, vs1, vs2, vm);
39528 }
39529 /// RISC-V `vandn.vx` instruction.
39530 ///
39531 /// # Forms
39532 /// Assembly: `vandn.vx vm, vs2, xs1, vd`
39533 /// Rust: `vandn_vx(vd, vs2, rs1, vm)`
39534 ///
39535 /// # Arguments
39536 /// - `vd` — Vector register operand.
39537 /// - `vs2` — Vector register operand.
39538 /// - `rs1` — Source register.
39539 /// - `vm` — Vector mask control.
39540 pub fn vandn_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39541 where
39542 Self: VandnVxEmitter<T0, T1, T2, T3>,
39543 {
39544 <Self as VandnVxEmitter<T0, T1, T2, T3>>::vandn_vx(self, vd, vs2, rs1, vm);
39545 }
39546 /// RISC-V `vasub.vv` instruction.
39547 ///
39548 /// # Forms
39549 /// Assembly: `vasub.vv vm, vs2, vs1, vd`
39550 /// Rust: `vasub_vv(vd, vs1, vs2, vm)`
39551 ///
39552 /// # Arguments
39553 /// - `vd` — Vector register operand.
39554 /// - `vs1` — Vector register operand.
39555 /// - `vs2` — Vector register operand.
39556 /// - `vm` — Vector mask control.
39557 pub fn vasub_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39558 where
39559 Self: VasubVvEmitter<T0, T1, T2, T3>,
39560 {
39561 <Self as VasubVvEmitter<T0, T1, T2, T3>>::vasub_vv(self, vd, vs1, vs2, vm);
39562 }
39563 /// RISC-V `vasub.vx` instruction.
39564 ///
39565 /// # Forms
39566 /// Assembly: `vasub.vx vm, vs2, xs1, vd`
39567 /// Rust: `vasub_vx(vd, vs2, rs1, vm)`
39568 ///
39569 /// # Arguments
39570 /// - `vd` — Vector register operand.
39571 /// - `vs2` — Vector register operand.
39572 /// - `rs1` — Source register.
39573 /// - `vm` — Vector mask control.
39574 pub fn vasub_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39575 where
39576 Self: VasubVxEmitter<T0, T1, T2, T3>,
39577 {
39578 <Self as VasubVxEmitter<T0, T1, T2, T3>>::vasub_vx(self, vd, vs2, rs1, vm);
39579 }
39580 /// RISC-V `vasubu.vv` instruction.
39581 ///
39582 /// # Forms
39583 /// Assembly: `vasubu.vv vm, vs2, vs1, vd`
39584 /// Rust: `vasubu_vv(vd, vs1, vs2, vm)`
39585 ///
39586 /// # Arguments
39587 /// - `vd` — Vector register operand.
39588 /// - `vs1` — Vector register operand.
39589 /// - `vs2` — Vector register operand.
39590 /// - `vm` — Vector mask control.
39591 pub fn vasubu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39592 where
39593 Self: VasubuVvEmitter<T0, T1, T2, T3>,
39594 {
39595 <Self as VasubuVvEmitter<T0, T1, T2, T3>>::vasubu_vv(self, vd, vs1, vs2, vm);
39596 }
39597 /// RISC-V `vasubu.vx` instruction.
39598 ///
39599 /// # Forms
39600 /// Assembly: `vasubu.vx vm, vs2, xs1, vd`
39601 /// Rust: `vasubu_vx(vd, vs2, rs1, vm)`
39602 ///
39603 /// # Arguments
39604 /// - `vd` — Vector register operand.
39605 /// - `vs2` — Vector register operand.
39606 /// - `rs1` — Source register.
39607 /// - `vm` — Vector mask control.
39608 pub fn vasubu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39609 where
39610 Self: VasubuVxEmitter<T0, T1, T2, T3>,
39611 {
39612 <Self as VasubuVxEmitter<T0, T1, T2, T3>>::vasubu_vx(self, vd, vs2, rs1, vm);
39613 }
39614 /// RISC-V `vbrev8.v` instruction.
39615 ///
39616 /// # Forms
39617 /// Assembly: `vbrev8.v vm, vs2, vd`
39618 /// Rust: `vbrev8_v(vd, vs2, vm)`
39619 ///
39620 /// # Arguments
39621 /// - `vd` — Vector register operand.
39622 /// - `vs2` — Vector register operand.
39623 /// - `vm` — Vector mask control.
39624 pub fn vbrev8_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39625 where
39626 Self: Vbrev8VEmitter<T0, T1, T2>,
39627 {
39628 <Self as Vbrev8VEmitter<T0, T1, T2>>::vbrev8_v(self, vd, vs2, vm);
39629 }
39630 /// RISC-V `vbrev.v` instruction.
39631 ///
39632 /// # Forms
39633 /// Assembly: `vbrev.v vm, vs2, vd`
39634 /// Rust: `vbrev_v(vd, vs2, vm)`
39635 ///
39636 /// # Arguments
39637 /// - `vd` — Vector register operand.
39638 /// - `vs2` — Vector register operand.
39639 /// - `vm` — Vector mask control.
39640 pub fn vbrev_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39641 where
39642 Self: VbrevVEmitter<T0, T1, T2>,
39643 {
39644 <Self as VbrevVEmitter<T0, T1, T2>>::vbrev_v(self, vd, vs2, vm);
39645 }
39646 /// RISC-V `vclmul.vv` instruction.
39647 ///
39648 /// # Forms
39649 /// Assembly: `vclmul.vv vm, vs2, vs1, vd`
39650 /// Rust: `vclmul_vv(vd, vs1, vs2, vm)`
39651 ///
39652 /// # Arguments
39653 /// - `vd` — Vector register operand.
39654 /// - `vs1` — Vector register operand.
39655 /// - `vs2` — Vector register operand.
39656 /// - `vm` — Vector mask control.
39657 pub fn vclmul_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39658 where
39659 Self: VclmulVvEmitter<T0, T1, T2, T3>,
39660 {
39661 <Self as VclmulVvEmitter<T0, T1, T2, T3>>::vclmul_vv(self, vd, vs1, vs2, vm);
39662 }
39663 /// RISC-V `vclmul.vx` instruction.
39664 ///
39665 /// # Forms
39666 /// Assembly: `vclmul.vx vm, vs2, xs1, vd`
39667 /// Rust: `vclmul_vx(vd, vs2, rs1, vm)`
39668 ///
39669 /// # Arguments
39670 /// - `vd` — Vector register operand.
39671 /// - `vs2` — Vector register operand.
39672 /// - `rs1` — Source register.
39673 /// - `vm` — Vector mask control.
39674 pub fn vclmul_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39675 where
39676 Self: VclmulVxEmitter<T0, T1, T2, T3>,
39677 {
39678 <Self as VclmulVxEmitter<T0, T1, T2, T3>>::vclmul_vx(self, vd, vs2, rs1, vm);
39679 }
39680 /// RISC-V `vclmulh.vv` instruction.
39681 ///
39682 /// # Forms
39683 /// Assembly: `vclmulh.vv vm, vs2, vs1, vd`
39684 /// Rust: `vclmulh_vv(vd, vs1, vs2, vm)`
39685 ///
39686 /// # Arguments
39687 /// - `vd` — Vector register operand.
39688 /// - `vs1` — Vector register operand.
39689 /// - `vs2` — Vector register operand.
39690 /// - `vm` — Vector mask control.
39691 pub fn vclmulh_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39692 where
39693 Self: VclmulhVvEmitter<T0, T1, T2, T3>,
39694 {
39695 <Self as VclmulhVvEmitter<T0, T1, T2, T3>>::vclmulh_vv(self, vd, vs1, vs2, vm);
39696 }
39697 /// RISC-V `vclmulh.vx` instruction.
39698 ///
39699 /// # Forms
39700 /// Assembly: `vclmulh.vx vm, vs2, xs1, vd`
39701 /// Rust: `vclmulh_vx(vd, vs2, rs1, vm)`
39702 ///
39703 /// # Arguments
39704 /// - `vd` — Vector register operand.
39705 /// - `vs2` — Vector register operand.
39706 /// - `rs1` — Source register.
39707 /// - `vm` — Vector mask control.
39708 pub fn vclmulh_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39709 where
39710 Self: VclmulhVxEmitter<T0, T1, T2, T3>,
39711 {
39712 <Self as VclmulhVxEmitter<T0, T1, T2, T3>>::vclmulh_vx(self, vd, vs2, rs1, vm);
39713 }
39714 /// RISC-V `vclz.v` instruction.
39715 ///
39716 /// # Forms
39717 /// Assembly: `vclz.v vm, vs2, vd`
39718 /// Rust: `vclz_v(vd, vs2, vm)`
39719 ///
39720 /// # Arguments
39721 /// - `vd` — Vector register operand.
39722 /// - `vs2` — Vector register operand.
39723 /// - `vm` — Vector mask control.
39724 pub fn vclz_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39725 where
39726 Self: VclzVEmitter<T0, T1, T2>,
39727 {
39728 <Self as VclzVEmitter<T0, T1, T2>>::vclz_v(self, vd, vs2, vm);
39729 }
39730 /// RISC-V `vcompress.vm` instruction.
39731 ///
39732 /// # Forms
39733 /// Assembly: `vcompress.vm vs2, vs1, vd`
39734 /// Rust: `vcompress_vm(vd, vs1, vs2)`
39735 ///
39736 /// # Arguments
39737 /// - `vd` — Vector register operand.
39738 /// - `vs1` — Vector register operand.
39739 /// - `vs2` — Vector register operand.
39740 pub fn vcompress_vm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
39741 where
39742 Self: VcompressVmEmitter<T0, T1, T2>,
39743 {
39744 <Self as VcompressVmEmitter<T0, T1, T2>>::vcompress_vm(self, vd, vs1, vs2);
39745 }
39746 /// RISC-V `vcpop.m` instruction.
39747 ///
39748 /// # Forms
39749 /// Assembly: `vcpop.m vm, vs2, xd`
39750 /// Rust: `vcpop_m(rd, vs2, vm)`
39751 ///
39752 /// # Arguments
39753 /// - `rd` — Destination register.
39754 /// - `vs2` — Vector register operand.
39755 /// - `vm` — Vector mask control.
39756 pub fn vcpop_m<T0, T1, T2>(&mut self, rd: T0, vs2: T1, vm: T2)
39757 where
39758 Self: VcpopMEmitter<T0, T1, T2>,
39759 {
39760 <Self as VcpopMEmitter<T0, T1, T2>>::vcpop_m(self, rd, vs2, vm);
39761 }
39762 /// RISC-V `vcpop.v` instruction.
39763 ///
39764 /// # Forms
39765 /// Assembly: `vcpop.v vm, vs2, vd`
39766 /// Rust: `vcpop_v(vd, vs2, vm)`
39767 ///
39768 /// # Arguments
39769 /// - `vd` — Vector register operand.
39770 /// - `vs2` — Vector register operand.
39771 /// - `vm` — Vector mask control.
39772 pub fn vcpop_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39773 where
39774 Self: VcpopVEmitter<T0, T1, T2>,
39775 {
39776 <Self as VcpopVEmitter<T0, T1, T2>>::vcpop_v(self, vd, vs2, vm);
39777 }
39778 /// RISC-V `vctz.v` instruction.
39779 ///
39780 /// # Forms
39781 /// Assembly: `vctz.v vm, vs2, vd`
39782 /// Rust: `vctz_v(vd, vs2, vm)`
39783 ///
39784 /// # Arguments
39785 /// - `vd` — Vector register operand.
39786 /// - `vs2` — Vector register operand.
39787 /// - `vm` — Vector mask control.
39788 pub fn vctz_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39789 where
39790 Self: VctzVEmitter<T0, T1, T2>,
39791 {
39792 <Self as VctzVEmitter<T0, T1, T2>>::vctz_v(self, vd, vs2, vm);
39793 }
39794 /// RISC-V `vdiv.vv` instruction.
39795 ///
39796 /// # Forms
39797 /// Assembly: `vdiv.vv vm, vs2, vs1, vd`
39798 /// Rust: `vdiv_vv(vd, vs1, vs2, vm)`
39799 ///
39800 /// # Arguments
39801 /// - `vd` — Vector register operand.
39802 /// - `vs1` — Vector register operand.
39803 /// - `vs2` — Vector register operand.
39804 /// - `vm` — Vector mask control.
39805 pub fn vdiv_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39806 where
39807 Self: VdivVvEmitter<T0, T1, T2, T3>,
39808 {
39809 <Self as VdivVvEmitter<T0, T1, T2, T3>>::vdiv_vv(self, vd, vs1, vs2, vm);
39810 }
39811 /// RISC-V `vdiv.vx` instruction.
39812 ///
39813 /// # Forms
39814 /// Assembly: `vdiv.vx vm, vs2, xs1, vd`
39815 /// Rust: `vdiv_vx(vd, vs2, rs1, vm)`
39816 ///
39817 /// # Arguments
39818 /// - `vd` — Vector register operand.
39819 /// - `vs2` — Vector register operand.
39820 /// - `rs1` — Source register.
39821 /// - `vm` — Vector mask control.
39822 pub fn vdiv_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39823 where
39824 Self: VdivVxEmitter<T0, T1, T2, T3>,
39825 {
39826 <Self as VdivVxEmitter<T0, T1, T2, T3>>::vdiv_vx(self, vd, vs2, rs1, vm);
39827 }
39828 /// RISC-V `vdivu.vv` instruction.
39829 ///
39830 /// # Forms
39831 /// Assembly: `vdivu.vv vm, vs2, vs1, vd`
39832 /// Rust: `vdivu_vv(vd, vs1, vs2, vm)`
39833 ///
39834 /// # Arguments
39835 /// - `vd` — Vector register operand.
39836 /// - `vs1` — Vector register operand.
39837 /// - `vs2` — Vector register operand.
39838 /// - `vm` — Vector mask control.
39839 pub fn vdivu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39840 where
39841 Self: VdivuVvEmitter<T0, T1, T2, T3>,
39842 {
39843 <Self as VdivuVvEmitter<T0, T1, T2, T3>>::vdivu_vv(self, vd, vs1, vs2, vm);
39844 }
39845 /// RISC-V `vdivu.vx` instruction.
39846 ///
39847 /// # Forms
39848 /// Assembly: `vdivu.vx vm, vs2, xs1, vd`
39849 /// Rust: `vdivu_vx(vd, vs2, rs1, vm)`
39850 ///
39851 /// # Arguments
39852 /// - `vd` — Vector register operand.
39853 /// - `vs2` — Vector register operand.
39854 /// - `rs1` — Source register.
39855 /// - `vm` — Vector mask control.
39856 pub fn vdivu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39857 where
39858 Self: VdivuVxEmitter<T0, T1, T2, T3>,
39859 {
39860 <Self as VdivuVxEmitter<T0, T1, T2, T3>>::vdivu_vx(self, vd, vs2, rs1, vm);
39861 }
39862 /// RISC-V `vfadd.vf` instruction.
39863 ///
39864 /// # Forms
39865 /// Assembly: `vfadd.vf vm, vs2, xs1, vd`
39866 /// Rust: `vfadd_vf(vd, vs2, rs1, vm)`
39867 ///
39868 /// # Arguments
39869 /// - `vd` — Vector register operand.
39870 /// - `vs2` — Vector register operand.
39871 /// - `rs1` — Source register.
39872 /// - `vm` — Vector mask control.
39873 pub fn vfadd_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
39874 where
39875 Self: VfaddVfEmitter<T0, T1, T2, T3>,
39876 {
39877 <Self as VfaddVfEmitter<T0, T1, T2, T3>>::vfadd_vf(self, vd, vs2, rs1, vm);
39878 }
39879 /// RISC-V `vfadd.vv` instruction.
39880 ///
39881 /// # Forms
39882 /// Assembly: `vfadd.vv vm, vs2, vs1, vd`
39883 /// Rust: `vfadd_vv(vd, vs1, vs2, vm)`
39884 ///
39885 /// # Arguments
39886 /// - `vd` — Vector register operand.
39887 /// - `vs1` — Vector register operand.
39888 /// - `vs2` — Vector register operand.
39889 /// - `vm` — Vector mask control.
39890 pub fn vfadd_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
39891 where
39892 Self: VfaddVvEmitter<T0, T1, T2, T3>,
39893 {
39894 <Self as VfaddVvEmitter<T0, T1, T2, T3>>::vfadd_vv(self, vd, vs1, vs2, vm);
39895 }
39896 /// RISC-V `vfclass.v` instruction.
39897 ///
39898 /// # Forms
39899 /// Assembly: `vfclass.v vm, vs2, vd`
39900 /// Rust: `vfclass_v(vd, vs2, vm)`
39901 ///
39902 /// # Arguments
39903 /// - `vd` — Vector register operand.
39904 /// - `vs2` — Vector register operand.
39905 /// - `vm` — Vector mask control.
39906 pub fn vfclass_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39907 where
39908 Self: VfclassVEmitter<T0, T1, T2>,
39909 {
39910 <Self as VfclassVEmitter<T0, T1, T2>>::vfclass_v(self, vd, vs2, vm);
39911 }
39912 /// RISC-V `vfcvt.f.x.v` instruction.
39913 ///
39914 /// # Forms
39915 /// Assembly: `vfcvt.f.x.v vm, vs2, vd`
39916 /// Rust: `vfcvt_f_x_v(vd, vs2, vm)`
39917 ///
39918 /// # Arguments
39919 /// - `vd` — Vector register operand.
39920 /// - `vs2` — Vector register operand.
39921 /// - `vm` — Vector mask control.
39922 pub fn vfcvt_f_x_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39923 where
39924 Self: VfcvtFXVEmitter<T0, T1, T2>,
39925 {
39926 <Self as VfcvtFXVEmitter<T0, T1, T2>>::vfcvt_f_x_v(self, vd, vs2, vm);
39927 }
39928 /// RISC-V `vfcvt.f.xu.v` instruction.
39929 ///
39930 /// # Forms
39931 /// Assembly: `vfcvt.f.xu.v vm, vs2, vd`
39932 /// Rust: `vfcvt_f_xu_v(vd, vs2, vm)`
39933 ///
39934 /// # Arguments
39935 /// - `vd` — Vector register operand.
39936 /// - `vs2` — Vector register operand.
39937 /// - `vm` — Vector mask control.
39938 pub fn vfcvt_f_xu_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39939 where
39940 Self: VfcvtFXuVEmitter<T0, T1, T2>,
39941 {
39942 <Self as VfcvtFXuVEmitter<T0, T1, T2>>::vfcvt_f_xu_v(self, vd, vs2, vm);
39943 }
39944 /// RISC-V `vfcvt.rtz.x.f.v` instruction.
39945 ///
39946 /// # Forms
39947 /// Assembly: `vfcvt.rtz.x.f.v vm, vs2, vd`
39948 /// Rust: `vfcvt_rtz_x_f_v(vd, vs2, vm)`
39949 ///
39950 /// # Arguments
39951 /// - `vd` — Vector register operand.
39952 /// - `vs2` — Vector register operand.
39953 /// - `vm` — Vector mask control.
39954 pub fn vfcvt_rtz_x_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39955 where
39956 Self: VfcvtRtzXFVEmitter<T0, T1, T2>,
39957 {
39958 <Self as VfcvtRtzXFVEmitter<T0, T1, T2>>::vfcvt_rtz_x_f_v(self, vd, vs2, vm);
39959 }
39960 /// RISC-V `vfcvt.rtz.xu.f.v` instruction.
39961 ///
39962 /// # Forms
39963 /// Assembly: `vfcvt.rtz.xu.f.v vm, vs2, vd`
39964 /// Rust: `vfcvt_rtz_xu_f_v(vd, vs2, vm)`
39965 ///
39966 /// # Arguments
39967 /// - `vd` — Vector register operand.
39968 /// - `vs2` — Vector register operand.
39969 /// - `vm` — Vector mask control.
39970 pub fn vfcvt_rtz_xu_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39971 where
39972 Self: VfcvtRtzXuFVEmitter<T0, T1, T2>,
39973 {
39974 <Self as VfcvtRtzXuFVEmitter<T0, T1, T2>>::vfcvt_rtz_xu_f_v(self, vd, vs2, vm);
39975 }
39976 /// RISC-V `vfcvt.x.f.v` instruction.
39977 ///
39978 /// # Forms
39979 /// Assembly: `vfcvt.x.f.v vm, vs2, vd`
39980 /// Rust: `vfcvt_x_f_v(vd, vs2, vm)`
39981 ///
39982 /// # Arguments
39983 /// - `vd` — Vector register operand.
39984 /// - `vs2` — Vector register operand.
39985 /// - `vm` — Vector mask control.
39986 pub fn vfcvt_x_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
39987 where
39988 Self: VfcvtXFVEmitter<T0, T1, T2>,
39989 {
39990 <Self as VfcvtXFVEmitter<T0, T1, T2>>::vfcvt_x_f_v(self, vd, vs2, vm);
39991 }
39992 /// RISC-V `vfcvt.xu.f.v` instruction.
39993 ///
39994 /// # Forms
39995 /// Assembly: `vfcvt.xu.f.v vm, vs2, vd`
39996 /// Rust: `vfcvt_xu_f_v(vd, vs2, vm)`
39997 ///
39998 /// # Arguments
39999 /// - `vd` — Vector register operand.
40000 /// - `vs2` — Vector register operand.
40001 /// - `vm` — Vector mask control.
40002 pub fn vfcvt_xu_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40003 where
40004 Self: VfcvtXuFVEmitter<T0, T1, T2>,
40005 {
40006 <Self as VfcvtXuFVEmitter<T0, T1, T2>>::vfcvt_xu_f_v(self, vd, vs2, vm);
40007 }
40008 /// RISC-V `vfdiv.vf` instruction.
40009 ///
40010 /// # Forms
40011 /// Assembly: `vfdiv.vf vm, vs2, xs1, vd`
40012 /// Rust: `vfdiv_vf(vd, vs2, rs1, vm)`
40013 ///
40014 /// # Arguments
40015 /// - `vd` — Vector register operand.
40016 /// - `vs2` — Vector register operand.
40017 /// - `rs1` — Source register.
40018 /// - `vm` — Vector mask control.
40019 pub fn vfdiv_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40020 where
40021 Self: VfdivVfEmitter<T0, T1, T2, T3>,
40022 {
40023 <Self as VfdivVfEmitter<T0, T1, T2, T3>>::vfdiv_vf(self, vd, vs2, rs1, vm);
40024 }
40025 /// RISC-V `vfdiv.vv` instruction.
40026 ///
40027 /// # Forms
40028 /// Assembly: `vfdiv.vv vm, vs2, vs1, vd`
40029 /// Rust: `vfdiv_vv(vd, vs1, vs2, vm)`
40030 ///
40031 /// # Arguments
40032 /// - `vd` — Vector register operand.
40033 /// - `vs1` — Vector register operand.
40034 /// - `vs2` — Vector register operand.
40035 /// - `vm` — Vector mask control.
40036 pub fn vfdiv_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40037 where
40038 Self: VfdivVvEmitter<T0, T1, T2, T3>,
40039 {
40040 <Self as VfdivVvEmitter<T0, T1, T2, T3>>::vfdiv_vv(self, vd, vs1, vs2, vm);
40041 }
40042 /// RISC-V `vfirst.m` instruction.
40043 ///
40044 /// # Forms
40045 /// Assembly: `vfirst.m vm, vs2, xd`
40046 /// Rust: `vfirst_m(rd, vs2, vm)`
40047 ///
40048 /// # Arguments
40049 /// - `rd` — Destination register.
40050 /// - `vs2` — Vector register operand.
40051 /// - `vm` — Vector mask control.
40052 pub fn vfirst_m<T0, T1, T2>(&mut self, rd: T0, vs2: T1, vm: T2)
40053 where
40054 Self: VfirstMEmitter<T0, T1, T2>,
40055 {
40056 <Self as VfirstMEmitter<T0, T1, T2>>::vfirst_m(self, rd, vs2, vm);
40057 }
40058 /// RISC-V `vfmacc.vf` instruction.
40059 ///
40060 /// # Forms
40061 /// Assembly: `vfmacc.vf vm, vs2, xs1, vd`
40062 /// Rust: `vfmacc_vf(vd, vs2, rs1, vm)`
40063 ///
40064 /// # Arguments
40065 /// - `vd` — Vector register operand.
40066 /// - `vs2` — Vector register operand.
40067 /// - `rs1` — Source register.
40068 /// - `vm` — Vector mask control.
40069 pub fn vfmacc_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40070 where
40071 Self: VfmaccVfEmitter<T0, T1, T2, T3>,
40072 {
40073 <Self as VfmaccVfEmitter<T0, T1, T2, T3>>::vfmacc_vf(self, vd, vs2, rs1, vm);
40074 }
40075 /// RISC-V `vfmacc.vv` instruction.
40076 ///
40077 /// # Forms
40078 /// Assembly: `vfmacc.vv vm, vs2, vs1, vd`
40079 /// Rust: `vfmacc_vv(vd, vs1, vs2, vm)`
40080 ///
40081 /// # Arguments
40082 /// - `vd` — Vector register operand.
40083 /// - `vs1` — Vector register operand.
40084 /// - `vs2` — Vector register operand.
40085 /// - `vm` — Vector mask control.
40086 pub fn vfmacc_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40087 where
40088 Self: VfmaccVvEmitter<T0, T1, T2, T3>,
40089 {
40090 <Self as VfmaccVvEmitter<T0, T1, T2, T3>>::vfmacc_vv(self, vd, vs1, vs2, vm);
40091 }
40092 /// RISC-V `vfmadd.vf` instruction.
40093 ///
40094 /// # Forms
40095 /// Assembly: `vfmadd.vf vm, vs2, xs1, vd`
40096 /// Rust: `vfmadd_vf(vd, vs2, rs1, vm)`
40097 ///
40098 /// # Arguments
40099 /// - `vd` — Vector register operand.
40100 /// - `vs2` — Vector register operand.
40101 /// - `rs1` — Source register.
40102 /// - `vm` — Vector mask control.
40103 pub fn vfmadd_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40104 where
40105 Self: VfmaddVfEmitter<T0, T1, T2, T3>,
40106 {
40107 <Self as VfmaddVfEmitter<T0, T1, T2, T3>>::vfmadd_vf(self, vd, vs2, rs1, vm);
40108 }
40109 /// RISC-V `vfmadd.vv` instruction.
40110 ///
40111 /// # Forms
40112 /// Assembly: `vfmadd.vv vm, vs2, vs1, vd`
40113 /// Rust: `vfmadd_vv(vd, vs1, vs2, vm)`
40114 ///
40115 /// # Arguments
40116 /// - `vd` — Vector register operand.
40117 /// - `vs1` — Vector register operand.
40118 /// - `vs2` — Vector register operand.
40119 /// - `vm` — Vector mask control.
40120 pub fn vfmadd_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40121 where
40122 Self: VfmaddVvEmitter<T0, T1, T2, T3>,
40123 {
40124 <Self as VfmaddVvEmitter<T0, T1, T2, T3>>::vfmadd_vv(self, vd, vs1, vs2, vm);
40125 }
40126 /// RISC-V `vfmax.vf` instruction.
40127 ///
40128 /// # Forms
40129 /// Assembly: `vfmax.vf vm, vs2, xs1, vd`
40130 /// Rust: `vfmax_vf(vd, vs2, rs1, vm)`
40131 ///
40132 /// # Arguments
40133 /// - `vd` — Vector register operand.
40134 /// - `vs2` — Vector register operand.
40135 /// - `rs1` — Source register.
40136 /// - `vm` — Vector mask control.
40137 pub fn vfmax_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40138 where
40139 Self: VfmaxVfEmitter<T0, T1, T2, T3>,
40140 {
40141 <Self as VfmaxVfEmitter<T0, T1, T2, T3>>::vfmax_vf(self, vd, vs2, rs1, vm);
40142 }
40143 /// RISC-V `vfmax.vv` instruction.
40144 ///
40145 /// # Forms
40146 /// Assembly: `vfmax.vv vm, vs2, vs1, vd`
40147 /// Rust: `vfmax_vv(vd, vs1, vs2, vm)`
40148 ///
40149 /// # Arguments
40150 /// - `vd` — Vector register operand.
40151 /// - `vs1` — Vector register operand.
40152 /// - `vs2` — Vector register operand.
40153 /// - `vm` — Vector mask control.
40154 pub fn vfmax_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40155 where
40156 Self: VfmaxVvEmitter<T0, T1, T2, T3>,
40157 {
40158 <Self as VfmaxVvEmitter<T0, T1, T2, T3>>::vfmax_vv(self, vd, vs1, vs2, vm);
40159 }
40160 /// RISC-V `vfmerge.vfm` instruction.
40161 ///
40162 /// # Forms
40163 /// Assembly: `vfmerge.vfm vs2, xs1, vd`
40164 /// Rust: `vfmerge_vfm(vd, rs1, vs2)`
40165 ///
40166 /// # Arguments
40167 /// - `vd` — Vector register operand.
40168 /// - `rs1` — Source register.
40169 /// - `vs2` — Vector register operand.
40170 pub fn vfmerge_vfm<T0, T1, T2>(&mut self, vd: T0, rs1: T1, vs2: T2)
40171 where
40172 Self: VfmergeVfmEmitter<T0, T1, T2>,
40173 {
40174 <Self as VfmergeVfmEmitter<T0, T1, T2>>::vfmerge_vfm(self, vd, rs1, vs2);
40175 }
40176 /// RISC-V `vfmin.vf` instruction.
40177 ///
40178 /// # Forms
40179 /// Assembly: `vfmin.vf vm, vs2, xs1, vd`
40180 /// Rust: `vfmin_vf(vd, vs2, rs1, vm)`
40181 ///
40182 /// # Arguments
40183 /// - `vd` — Vector register operand.
40184 /// - `vs2` — Vector register operand.
40185 /// - `rs1` — Source register.
40186 /// - `vm` — Vector mask control.
40187 pub fn vfmin_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40188 where
40189 Self: VfminVfEmitter<T0, T1, T2, T3>,
40190 {
40191 <Self as VfminVfEmitter<T0, T1, T2, T3>>::vfmin_vf(self, vd, vs2, rs1, vm);
40192 }
40193 /// RISC-V `vfmin.vv` instruction.
40194 ///
40195 /// # Forms
40196 /// Assembly: `vfmin.vv vm, vs2, vs1, vd`
40197 /// Rust: `vfmin_vv(vd, vs1, vs2, vm)`
40198 ///
40199 /// # Arguments
40200 /// - `vd` — Vector register operand.
40201 /// - `vs1` — Vector register operand.
40202 /// - `vs2` — Vector register operand.
40203 /// - `vm` — Vector mask control.
40204 pub fn vfmin_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40205 where
40206 Self: VfminVvEmitter<T0, T1, T2, T3>,
40207 {
40208 <Self as VfminVvEmitter<T0, T1, T2, T3>>::vfmin_vv(self, vd, vs1, vs2, vm);
40209 }
40210 /// RISC-V `vfmsac.vf` instruction.
40211 ///
40212 /// # Forms
40213 /// Assembly: `vfmsac.vf vm, vs2, xs1, vd`
40214 /// Rust: `vfmsac_vf(vd, vs2, rs1, vm)`
40215 ///
40216 /// # Arguments
40217 /// - `vd` — Vector register operand.
40218 /// - `vs2` — Vector register operand.
40219 /// - `rs1` — Source register.
40220 /// - `vm` — Vector mask control.
40221 pub fn vfmsac_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40222 where
40223 Self: VfmsacVfEmitter<T0, T1, T2, T3>,
40224 {
40225 <Self as VfmsacVfEmitter<T0, T1, T2, T3>>::vfmsac_vf(self, vd, vs2, rs1, vm);
40226 }
40227 /// RISC-V `vfmsac.vv` instruction.
40228 ///
40229 /// # Forms
40230 /// Assembly: `vfmsac.vv vm, vs2, vs1, vd`
40231 /// Rust: `vfmsac_vv(vd, vs1, vs2, vm)`
40232 ///
40233 /// # Arguments
40234 /// - `vd` — Vector register operand.
40235 /// - `vs1` — Vector register operand.
40236 /// - `vs2` — Vector register operand.
40237 /// - `vm` — Vector mask control.
40238 pub fn vfmsac_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40239 where
40240 Self: VfmsacVvEmitter<T0, T1, T2, T3>,
40241 {
40242 <Self as VfmsacVvEmitter<T0, T1, T2, T3>>::vfmsac_vv(self, vd, vs1, vs2, vm);
40243 }
40244 /// RISC-V `vfmsub.vf` instruction.
40245 ///
40246 /// # Forms
40247 /// Assembly: `vfmsub.vf vm, vs2, xs1, vd`
40248 /// Rust: `vfmsub_vf(vd, vs2, rs1, vm)`
40249 ///
40250 /// # Arguments
40251 /// - `vd` — Vector register operand.
40252 /// - `vs2` — Vector register operand.
40253 /// - `rs1` — Source register.
40254 /// - `vm` — Vector mask control.
40255 pub fn vfmsub_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40256 where
40257 Self: VfmsubVfEmitter<T0, T1, T2, T3>,
40258 {
40259 <Self as VfmsubVfEmitter<T0, T1, T2, T3>>::vfmsub_vf(self, vd, vs2, rs1, vm);
40260 }
40261 /// RISC-V `vfmsub.vv` instruction.
40262 ///
40263 /// # Forms
40264 /// Assembly: `vfmsub.vv vm, vs2, vs1, vd`
40265 /// Rust: `vfmsub_vv(vd, vs1, vs2, vm)`
40266 ///
40267 /// # Arguments
40268 /// - `vd` — Vector register operand.
40269 /// - `vs1` — Vector register operand.
40270 /// - `vs2` — Vector register operand.
40271 /// - `vm` — Vector mask control.
40272 pub fn vfmsub_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40273 where
40274 Self: VfmsubVvEmitter<T0, T1, T2, T3>,
40275 {
40276 <Self as VfmsubVvEmitter<T0, T1, T2, T3>>::vfmsub_vv(self, vd, vs1, vs2, vm);
40277 }
40278 /// RISC-V `vfmul.vf` instruction.
40279 ///
40280 /// # Forms
40281 /// Assembly: `vfmul.vf vm, vs2, xs1, vd`
40282 /// Rust: `vfmul_vf(vd, vs2, rs1, vm)`
40283 ///
40284 /// # Arguments
40285 /// - `vd` — Vector register operand.
40286 /// - `vs2` — Vector register operand.
40287 /// - `rs1` — Source register.
40288 /// - `vm` — Vector mask control.
40289 pub fn vfmul_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40290 where
40291 Self: VfmulVfEmitter<T0, T1, T2, T3>,
40292 {
40293 <Self as VfmulVfEmitter<T0, T1, T2, T3>>::vfmul_vf(self, vd, vs2, rs1, vm);
40294 }
40295 /// RISC-V `vfmul.vv` instruction.
40296 ///
40297 /// # Forms
40298 /// Assembly: `vfmul.vv vm, vs2, vs1, vd`
40299 /// Rust: `vfmul_vv(vd, vs1, vs2, vm)`
40300 ///
40301 /// # Arguments
40302 /// - `vd` — Vector register operand.
40303 /// - `vs1` — Vector register operand.
40304 /// - `vs2` — Vector register operand.
40305 /// - `vm` — Vector mask control.
40306 pub fn vfmul_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40307 where
40308 Self: VfmulVvEmitter<T0, T1, T2, T3>,
40309 {
40310 <Self as VfmulVvEmitter<T0, T1, T2, T3>>::vfmul_vv(self, vd, vs1, vs2, vm);
40311 }
40312 /// RISC-V `vfmv.f.s` instruction.
40313 ///
40314 /// # Forms
40315 /// Assembly: `vfmv.f.s vs2, xd`
40316 /// Rust: `vfmv_f_s(rd, vs2)`
40317 ///
40318 /// # Arguments
40319 /// - `rd` — Destination register.
40320 /// - `vs2` — Vector register operand.
40321 pub fn vfmv_f_s<T0, T1>(&mut self, rd: T0, vs2: T1)
40322 where
40323 Self: VfmvFSEmitter<T0, T1>,
40324 {
40325 <Self as VfmvFSEmitter<T0, T1>>::vfmv_f_s(self, rd, vs2);
40326 }
40327 /// RISC-V `vfmv.s.f` instruction.
40328 ///
40329 /// # Forms
40330 /// Assembly: `vfmv.s.f xs1, vd`
40331 /// Rust: `vfmv_s_f(vd, rs1)`
40332 ///
40333 /// # Arguments
40334 /// - `vd` — Vector register operand.
40335 /// - `rs1` — Source register.
40336 pub fn vfmv_s_f<T0, T1>(&mut self, vd: T0, rs1: T1)
40337 where
40338 Self: VfmvSFEmitter<T0, T1>,
40339 {
40340 <Self as VfmvSFEmitter<T0, T1>>::vfmv_s_f(self, vd, rs1);
40341 }
40342 /// RISC-V `vfmv.v.f` instruction.
40343 ///
40344 /// # Forms
40345 /// Assembly: `vfmv.v.f xs1, vd`
40346 /// Rust: `vfmv_v_f(vd, rs1)`
40347 ///
40348 /// # Arguments
40349 /// - `vd` — Vector register operand.
40350 /// - `rs1` — Source register.
40351 pub fn vfmv_v_f<T0, T1>(&mut self, vd: T0, rs1: T1)
40352 where
40353 Self: VfmvVFEmitter<T0, T1>,
40354 {
40355 <Self as VfmvVFEmitter<T0, T1>>::vfmv_v_f(self, vd, rs1);
40356 }
40357 /// RISC-V `vfncvt.f.f.w` instruction.
40358 ///
40359 /// # Forms
40360 /// Assembly: `vfncvt.f.f.w vm, vs2, vd`
40361 /// Rust: `vfncvt_f_f_w(vd, vs2, vm)`
40362 ///
40363 /// # Arguments
40364 /// - `vd` — Vector register operand.
40365 /// - `vs2` — Vector register operand.
40366 /// - `vm` — Vector mask control.
40367 pub fn vfncvt_f_f_w<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40368 where
40369 Self: VfncvtFFWEmitter<T0, T1, T2>,
40370 {
40371 <Self as VfncvtFFWEmitter<T0, T1, T2>>::vfncvt_f_f_w(self, vd, vs2, vm);
40372 }
40373 /// RISC-V `vfncvt.f.x.w` instruction.
40374 ///
40375 /// # Forms
40376 /// Assembly: `vfncvt.f.x.w vm, vs2, vd`
40377 /// Rust: `vfncvt_f_x_w(vd, vs2, vm)`
40378 ///
40379 /// # Arguments
40380 /// - `vd` — Vector register operand.
40381 /// - `vs2` — Vector register operand.
40382 /// - `vm` — Vector mask control.
40383 pub fn vfncvt_f_x_w<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40384 where
40385 Self: VfncvtFXWEmitter<T0, T1, T2>,
40386 {
40387 <Self as VfncvtFXWEmitter<T0, T1, T2>>::vfncvt_f_x_w(self, vd, vs2, vm);
40388 }
40389 /// RISC-V `vfncvt.f.xu.w` instruction.
40390 ///
40391 /// # Forms
40392 /// Assembly: `vfncvt.f.xu.w vm, vs2, vd`
40393 /// Rust: `vfncvt_f_xu_w(vd, vs2, vm)`
40394 ///
40395 /// # Arguments
40396 /// - `vd` — Vector register operand.
40397 /// - `vs2` — Vector register operand.
40398 /// - `vm` — Vector mask control.
40399 pub fn vfncvt_f_xu_w<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40400 where
40401 Self: VfncvtFXuWEmitter<T0, T1, T2>,
40402 {
40403 <Self as VfncvtFXuWEmitter<T0, T1, T2>>::vfncvt_f_xu_w(self, vd, vs2, vm);
40404 }
40405 /// RISC-V `vfncvt.rod.f.f.w` instruction.
40406 ///
40407 /// # Forms
40408 /// Assembly: `vfncvt.rod.f.f.w vm, vs2, vd`
40409 /// Rust: `vfncvt_rod_f_f_w(vd, vs2, vm)`
40410 ///
40411 /// # Arguments
40412 /// - `vd` — Vector register operand.
40413 /// - `vs2` — Vector register operand.
40414 /// - `vm` — Vector mask control.
40415 pub fn vfncvt_rod_f_f_w<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40416 where
40417 Self: VfncvtRodFFWEmitter<T0, T1, T2>,
40418 {
40419 <Self as VfncvtRodFFWEmitter<T0, T1, T2>>::vfncvt_rod_f_f_w(self, vd, vs2, vm);
40420 }
40421 /// RISC-V `vfncvt.rtz.x.f.w` instruction.
40422 ///
40423 /// # Forms
40424 /// Assembly: `vfncvt.rtz.x.f.w vm, vs2, vd`
40425 /// Rust: `vfncvt_rtz_x_f_w(vd, vs2, vm)`
40426 ///
40427 /// # Arguments
40428 /// - `vd` — Vector register operand.
40429 /// - `vs2` — Vector register operand.
40430 /// - `vm` — Vector mask control.
40431 pub fn vfncvt_rtz_x_f_w<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40432 where
40433 Self: VfncvtRtzXFWEmitter<T0, T1, T2>,
40434 {
40435 <Self as VfncvtRtzXFWEmitter<T0, T1, T2>>::vfncvt_rtz_x_f_w(self, vd, vs2, vm);
40436 }
40437 /// RISC-V `vfncvt.rtz.xu.f.w` instruction.
40438 ///
40439 /// # Forms
40440 /// Assembly: `vfncvt.rtz.xu.f.w vm, vs2, vd`
40441 /// Rust: `vfncvt_rtz_xu_f_w(vd, vs2, vm)`
40442 ///
40443 /// # Arguments
40444 /// - `vd` — Vector register operand.
40445 /// - `vs2` — Vector register operand.
40446 /// - `vm` — Vector mask control.
40447 pub fn vfncvt_rtz_xu_f_w<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40448 where
40449 Self: VfncvtRtzXuFWEmitter<T0, T1, T2>,
40450 {
40451 <Self as VfncvtRtzXuFWEmitter<T0, T1, T2>>::vfncvt_rtz_xu_f_w(self, vd, vs2, vm);
40452 }
40453 /// RISC-V `vfncvt.x.f.w` instruction.
40454 ///
40455 /// # Forms
40456 /// Assembly: `vfncvt.x.f.w vm, vs2, vd`
40457 /// Rust: `vfncvt_x_f_w(vd, vs2, vm)`
40458 ///
40459 /// # Arguments
40460 /// - `vd` — Vector register operand.
40461 /// - `vs2` — Vector register operand.
40462 /// - `vm` — Vector mask control.
40463 pub fn vfncvt_x_f_w<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40464 where
40465 Self: VfncvtXFWEmitter<T0, T1, T2>,
40466 {
40467 <Self as VfncvtXFWEmitter<T0, T1, T2>>::vfncvt_x_f_w(self, vd, vs2, vm);
40468 }
40469 /// RISC-V `vfncvt.xu.f.w` instruction.
40470 ///
40471 /// # Forms
40472 /// Assembly: `vfncvt.xu.f.w vm, vs2, vd`
40473 /// Rust: `vfncvt_xu_f_w(vd, vs2, vm)`
40474 ///
40475 /// # Arguments
40476 /// - `vd` — Vector register operand.
40477 /// - `vs2` — Vector register operand.
40478 /// - `vm` — Vector mask control.
40479 pub fn vfncvt_xu_f_w<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40480 where
40481 Self: VfncvtXuFWEmitter<T0, T1, T2>,
40482 {
40483 <Self as VfncvtXuFWEmitter<T0, T1, T2>>::vfncvt_xu_f_w(self, vd, vs2, vm);
40484 }
40485 /// RISC-V `vfncvtbf16.f.f.w` instruction.
40486 ///
40487 /// # Forms
40488 /// Assembly: `vfncvtbf16.f.f.w vm, vs2, vd`
40489 /// Rust: `vfncvtbf16_f_f_w(vd, vs2, vm)`
40490 ///
40491 /// # Arguments
40492 /// - `vd` — Vector register operand.
40493 /// - `vs2` — Vector register operand.
40494 /// - `vm` — Vector mask control.
40495 pub fn vfncvtbf16_f_f_w<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40496 where
40497 Self: Vfncvtbf16FFWEmitter<T0, T1, T2>,
40498 {
40499 <Self as Vfncvtbf16FFWEmitter<T0, T1, T2>>::vfncvtbf16_f_f_w(self, vd, vs2, vm);
40500 }
40501 /// RISC-V `vfnmacc.vf` instruction.
40502 ///
40503 /// # Forms
40504 /// Assembly: `vfnmacc.vf vm, vs2, xs1, vd`
40505 /// Rust: `vfnmacc_vf(vd, vs2, rs1, vm)`
40506 ///
40507 /// # Arguments
40508 /// - `vd` — Vector register operand.
40509 /// - `vs2` — Vector register operand.
40510 /// - `rs1` — Source register.
40511 /// - `vm` — Vector mask control.
40512 pub fn vfnmacc_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40513 where
40514 Self: VfnmaccVfEmitter<T0, T1, T2, T3>,
40515 {
40516 <Self as VfnmaccVfEmitter<T0, T1, T2, T3>>::vfnmacc_vf(self, vd, vs2, rs1, vm);
40517 }
40518 /// RISC-V `vfnmacc.vv` instruction.
40519 ///
40520 /// # Forms
40521 /// Assembly: `vfnmacc.vv vm, vs2, vs1, vd`
40522 /// Rust: `vfnmacc_vv(vd, vs1, vs2, vm)`
40523 ///
40524 /// # Arguments
40525 /// - `vd` — Vector register operand.
40526 /// - `vs1` — Vector register operand.
40527 /// - `vs2` — Vector register operand.
40528 /// - `vm` — Vector mask control.
40529 pub fn vfnmacc_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40530 where
40531 Self: VfnmaccVvEmitter<T0, T1, T2, T3>,
40532 {
40533 <Self as VfnmaccVvEmitter<T0, T1, T2, T3>>::vfnmacc_vv(self, vd, vs1, vs2, vm);
40534 }
40535 /// RISC-V `vfnmadd.vf` instruction.
40536 ///
40537 /// # Forms
40538 /// Assembly: `vfnmadd.vf vm, vs2, xs1, vd`
40539 /// Rust: `vfnmadd_vf(vd, vs2, rs1, vm)`
40540 ///
40541 /// # Arguments
40542 /// - `vd` — Vector register operand.
40543 /// - `vs2` — Vector register operand.
40544 /// - `rs1` — Source register.
40545 /// - `vm` — Vector mask control.
40546 pub fn vfnmadd_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40547 where
40548 Self: VfnmaddVfEmitter<T0, T1, T2, T3>,
40549 {
40550 <Self as VfnmaddVfEmitter<T0, T1, T2, T3>>::vfnmadd_vf(self, vd, vs2, rs1, vm);
40551 }
40552 /// RISC-V `vfnmadd.vv` instruction.
40553 ///
40554 /// # Forms
40555 /// Assembly: `vfnmadd.vv vm, vs2, vs1, vd`
40556 /// Rust: `vfnmadd_vv(vd, vs1, vs2, vm)`
40557 ///
40558 /// # Arguments
40559 /// - `vd` — Vector register operand.
40560 /// - `vs1` — Vector register operand.
40561 /// - `vs2` — Vector register operand.
40562 /// - `vm` — Vector mask control.
40563 pub fn vfnmadd_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40564 where
40565 Self: VfnmaddVvEmitter<T0, T1, T2, T3>,
40566 {
40567 <Self as VfnmaddVvEmitter<T0, T1, T2, T3>>::vfnmadd_vv(self, vd, vs1, vs2, vm);
40568 }
40569 /// RISC-V `vfnmsac.vf` instruction.
40570 ///
40571 /// # Forms
40572 /// Assembly: `vfnmsac.vf vm, vs2, xs1, vd`
40573 /// Rust: `vfnmsac_vf(vd, vs2, rs1, vm)`
40574 ///
40575 /// # Arguments
40576 /// - `vd` — Vector register operand.
40577 /// - `vs2` — Vector register operand.
40578 /// - `rs1` — Source register.
40579 /// - `vm` — Vector mask control.
40580 pub fn vfnmsac_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40581 where
40582 Self: VfnmsacVfEmitter<T0, T1, T2, T3>,
40583 {
40584 <Self as VfnmsacVfEmitter<T0, T1, T2, T3>>::vfnmsac_vf(self, vd, vs2, rs1, vm);
40585 }
40586 /// RISC-V `vfnmsac.vv` instruction.
40587 ///
40588 /// # Forms
40589 /// Assembly: `vfnmsac.vv vm, vs2, vs1, vd`
40590 /// Rust: `vfnmsac_vv(vd, vs1, vs2, vm)`
40591 ///
40592 /// # Arguments
40593 /// - `vd` — Vector register operand.
40594 /// - `vs1` — Vector register operand.
40595 /// - `vs2` — Vector register operand.
40596 /// - `vm` — Vector mask control.
40597 pub fn vfnmsac_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40598 where
40599 Self: VfnmsacVvEmitter<T0, T1, T2, T3>,
40600 {
40601 <Self as VfnmsacVvEmitter<T0, T1, T2, T3>>::vfnmsac_vv(self, vd, vs1, vs2, vm);
40602 }
40603 /// RISC-V `vfnmsub.vf` instruction.
40604 ///
40605 /// # Forms
40606 /// Assembly: `vfnmsub.vf vm, vs2, xs1, vd`
40607 /// Rust: `vfnmsub_vf(vd, vs2, rs1, vm)`
40608 ///
40609 /// # Arguments
40610 /// - `vd` — Vector register operand.
40611 /// - `vs2` — Vector register operand.
40612 /// - `rs1` — Source register.
40613 /// - `vm` — Vector mask control.
40614 pub fn vfnmsub_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40615 where
40616 Self: VfnmsubVfEmitter<T0, T1, T2, T3>,
40617 {
40618 <Self as VfnmsubVfEmitter<T0, T1, T2, T3>>::vfnmsub_vf(self, vd, vs2, rs1, vm);
40619 }
40620 /// RISC-V `vfnmsub.vv` instruction.
40621 ///
40622 /// # Forms
40623 /// Assembly: `vfnmsub.vv vm, vs2, vs1, vd`
40624 /// Rust: `vfnmsub_vv(vd, vs1, vs2, vm)`
40625 ///
40626 /// # Arguments
40627 /// - `vd` — Vector register operand.
40628 /// - `vs1` — Vector register operand.
40629 /// - `vs2` — Vector register operand.
40630 /// - `vm` — Vector mask control.
40631 pub fn vfnmsub_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40632 where
40633 Self: VfnmsubVvEmitter<T0, T1, T2, T3>,
40634 {
40635 <Self as VfnmsubVvEmitter<T0, T1, T2, T3>>::vfnmsub_vv(self, vd, vs1, vs2, vm);
40636 }
40637 /// RISC-V `vfrdiv.vf` instruction.
40638 ///
40639 /// # Forms
40640 /// Assembly: `vfrdiv.vf vm, vs2, xs1, vd`
40641 /// Rust: `vfrdiv_vf(vd, vs2, rs1, vm)`
40642 ///
40643 /// # Arguments
40644 /// - `vd` — Vector register operand.
40645 /// - `vs2` — Vector register operand.
40646 /// - `rs1` — Source register.
40647 /// - `vm` — Vector mask control.
40648 pub fn vfrdiv_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40649 where
40650 Self: VfrdivVfEmitter<T0, T1, T2, T3>,
40651 {
40652 <Self as VfrdivVfEmitter<T0, T1, T2, T3>>::vfrdiv_vf(self, vd, vs2, rs1, vm);
40653 }
40654 /// RISC-V `vfrec7.v` instruction.
40655 ///
40656 /// # Forms
40657 /// Assembly: `vfrec7.v vm, vs2, vd`
40658 /// Rust: `vfrec7_v(vd, vs2, vm)`
40659 ///
40660 /// # Arguments
40661 /// - `vd` — Vector register operand.
40662 /// - `vs2` — Vector register operand.
40663 /// - `vm` — Vector mask control.
40664 pub fn vfrec7_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40665 where
40666 Self: Vfrec7VEmitter<T0, T1, T2>,
40667 {
40668 <Self as Vfrec7VEmitter<T0, T1, T2>>::vfrec7_v(self, vd, vs2, vm);
40669 }
40670 /// RISC-V `vfredmax.vs` instruction.
40671 ///
40672 /// # Forms
40673 /// Assembly: `vfredmax.vs vm, vs2, vs1, vd`
40674 /// Rust: `vfredmax_vs(vd, vs1, vs2, vm)`
40675 ///
40676 /// # Arguments
40677 /// - `vd` — Vector register operand.
40678 /// - `vs1` — Vector register operand.
40679 /// - `vs2` — Vector register operand.
40680 /// - `vm` — Vector mask control.
40681 pub fn vfredmax_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40682 where
40683 Self: VfredmaxVsEmitter<T0, T1, T2, T3>,
40684 {
40685 <Self as VfredmaxVsEmitter<T0, T1, T2, T3>>::vfredmax_vs(self, vd, vs1, vs2, vm);
40686 }
40687 /// RISC-V `vfredmin.vs` instruction.
40688 ///
40689 /// # Forms
40690 /// Assembly: `vfredmin.vs vm, vs2, vs1, vd`
40691 /// Rust: `vfredmin_vs(vd, vs1, vs2, vm)`
40692 ///
40693 /// # Arguments
40694 /// - `vd` — Vector register operand.
40695 /// - `vs1` — Vector register operand.
40696 /// - `vs2` — Vector register operand.
40697 /// - `vm` — Vector mask control.
40698 pub fn vfredmin_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40699 where
40700 Self: VfredminVsEmitter<T0, T1, T2, T3>,
40701 {
40702 <Self as VfredminVsEmitter<T0, T1, T2, T3>>::vfredmin_vs(self, vd, vs1, vs2, vm);
40703 }
40704 /// RISC-V `vfredosum.vs` instruction.
40705 ///
40706 /// # Forms
40707 /// Assembly: `vfredosum.vs vm, vs2, vs1, vd`
40708 /// Rust: `vfredosum_vs(vd, vs1, vs2, vm)`
40709 ///
40710 /// # Arguments
40711 /// - `vd` — Vector register operand.
40712 /// - `vs1` — Vector register operand.
40713 /// - `vs2` — Vector register operand.
40714 /// - `vm` — Vector mask control.
40715 pub fn vfredosum_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40716 where
40717 Self: VfredosumVsEmitter<T0, T1, T2, T3>,
40718 {
40719 <Self as VfredosumVsEmitter<T0, T1, T2, T3>>::vfredosum_vs(self, vd, vs1, vs2, vm);
40720 }
40721 /// RISC-V `vfredsum.vs` instruction.
40722 ///
40723 /// # Forms
40724 /// Assembly: `vfredsum.vs vd vs1 vs2 vm`
40725 /// Rust: `vfredsum_vs(vd, vs1, vs2, vm)`
40726 ///
40727 /// # Arguments
40728 /// - `vd` — Vector register operand.
40729 /// - `vs1` — Vector register operand.
40730 /// - `vs2` — Vector register operand.
40731 /// - `vm` — Vector mask control.
40732 pub fn vfredsum_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40733 where
40734 Self: VfredsumVsEmitter<T0, T1, T2, T3>,
40735 {
40736 <Self as VfredsumVsEmitter<T0, T1, T2, T3>>::vfredsum_vs(self, vd, vs1, vs2, vm);
40737 }
40738 /// RISC-V `vfredusum.vs` instruction.
40739 ///
40740 /// # Forms
40741 /// Assembly: `vfredusum.vs vm, vs2, vs1, vd`
40742 /// Rust: `vfredusum_vs(vd, vs1, vs2, vm)`
40743 ///
40744 /// # Arguments
40745 /// - `vd` — Vector register operand.
40746 /// - `vs1` — Vector register operand.
40747 /// - `vs2` — Vector register operand.
40748 /// - `vm` — Vector mask control.
40749 pub fn vfredusum_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40750 where
40751 Self: VfredusumVsEmitter<T0, T1, T2, T3>,
40752 {
40753 <Self as VfredusumVsEmitter<T0, T1, T2, T3>>::vfredusum_vs(self, vd, vs1, vs2, vm);
40754 }
40755 /// RISC-V `vfrsqrt7.v` instruction.
40756 ///
40757 /// # Forms
40758 /// Assembly: `vfrsqrt7.v vm, vs2, vd`
40759 /// Rust: `vfrsqrt7_v(vd, vs2, vm)`
40760 ///
40761 /// # Arguments
40762 /// - `vd` — Vector register operand.
40763 /// - `vs2` — Vector register operand.
40764 /// - `vm` — Vector mask control.
40765 pub fn vfrsqrt7_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40766 where
40767 Self: Vfrsqrt7VEmitter<T0, T1, T2>,
40768 {
40769 <Self as Vfrsqrt7VEmitter<T0, T1, T2>>::vfrsqrt7_v(self, vd, vs2, vm);
40770 }
40771 /// RISC-V `vfrsub.vf` instruction.
40772 ///
40773 /// # Forms
40774 /// Assembly: `vfrsub.vf vm, vs2, xs1, vd`
40775 /// Rust: `vfrsub_vf(vd, vs2, rs1, vm)`
40776 ///
40777 /// # Arguments
40778 /// - `vd` — Vector register operand.
40779 /// - `vs2` — Vector register operand.
40780 /// - `rs1` — Source register.
40781 /// - `vm` — Vector mask control.
40782 pub fn vfrsub_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40783 where
40784 Self: VfrsubVfEmitter<T0, T1, T2, T3>,
40785 {
40786 <Self as VfrsubVfEmitter<T0, T1, T2, T3>>::vfrsub_vf(self, vd, vs2, rs1, vm);
40787 }
40788 /// RISC-V `vfsgnj.vf` instruction.
40789 ///
40790 /// # Forms
40791 /// Assembly: `vfsgnj.vf vm, vs2, xs1, vd`
40792 /// Rust: `vfsgnj_vf(vd, vs2, rs1, vm)`
40793 ///
40794 /// # Arguments
40795 /// - `vd` — Vector register operand.
40796 /// - `vs2` — Vector register operand.
40797 /// - `rs1` — Source register.
40798 /// - `vm` — Vector mask control.
40799 pub fn vfsgnj_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40800 where
40801 Self: VfsgnjVfEmitter<T0, T1, T2, T3>,
40802 {
40803 <Self as VfsgnjVfEmitter<T0, T1, T2, T3>>::vfsgnj_vf(self, vd, vs2, rs1, vm);
40804 }
40805 /// RISC-V `vfsgnj.vv` instruction.
40806 ///
40807 /// # Forms
40808 /// Assembly: `vfsgnj.vv vm, vs2, vs1, vd`
40809 /// Rust: `vfsgnj_vv(vd, vs1, vs2, vm)`
40810 ///
40811 /// # Arguments
40812 /// - `vd` — Vector register operand.
40813 /// - `vs1` — Vector register operand.
40814 /// - `vs2` — Vector register operand.
40815 /// - `vm` — Vector mask control.
40816 pub fn vfsgnj_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40817 where
40818 Self: VfsgnjVvEmitter<T0, T1, T2, T3>,
40819 {
40820 <Self as VfsgnjVvEmitter<T0, T1, T2, T3>>::vfsgnj_vv(self, vd, vs1, vs2, vm);
40821 }
40822 /// RISC-V `vfsgnjn.vf` instruction.
40823 ///
40824 /// # Forms
40825 /// Assembly: `vfsgnjn.vf vm, vs2, xs1, vd`
40826 /// Rust: `vfsgnjn_vf(vd, vs2, rs1, vm)`
40827 ///
40828 /// # Arguments
40829 /// - `vd` — Vector register operand.
40830 /// - `vs2` — Vector register operand.
40831 /// - `rs1` — Source register.
40832 /// - `vm` — Vector mask control.
40833 pub fn vfsgnjn_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40834 where
40835 Self: VfsgnjnVfEmitter<T0, T1, T2, T3>,
40836 {
40837 <Self as VfsgnjnVfEmitter<T0, T1, T2, T3>>::vfsgnjn_vf(self, vd, vs2, rs1, vm);
40838 }
40839 /// RISC-V `vfsgnjn.vv` instruction.
40840 ///
40841 /// # Forms
40842 /// Assembly: `vfsgnjn.vv vm, vs2, vs1, vd`
40843 /// Rust: `vfsgnjn_vv(vd, vs1, vs2, vm)`
40844 ///
40845 /// # Arguments
40846 /// - `vd` — Vector register operand.
40847 /// - `vs1` — Vector register operand.
40848 /// - `vs2` — Vector register operand.
40849 /// - `vm` — Vector mask control.
40850 pub fn vfsgnjn_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40851 where
40852 Self: VfsgnjnVvEmitter<T0, T1, T2, T3>,
40853 {
40854 <Self as VfsgnjnVvEmitter<T0, T1, T2, T3>>::vfsgnjn_vv(self, vd, vs1, vs2, vm);
40855 }
40856 /// RISC-V `vfsgnjx.vf` instruction.
40857 ///
40858 /// # Forms
40859 /// Assembly: `vfsgnjx.vf vm, vs2, xs1, vd`
40860 /// Rust: `vfsgnjx_vf(vd, vs2, rs1, vm)`
40861 ///
40862 /// # Arguments
40863 /// - `vd` — Vector register operand.
40864 /// - `vs2` — Vector register operand.
40865 /// - `rs1` — Source register.
40866 /// - `vm` — Vector mask control.
40867 pub fn vfsgnjx_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40868 where
40869 Self: VfsgnjxVfEmitter<T0, T1, T2, T3>,
40870 {
40871 <Self as VfsgnjxVfEmitter<T0, T1, T2, T3>>::vfsgnjx_vf(self, vd, vs2, rs1, vm);
40872 }
40873 /// RISC-V `vfsgnjx.vv` instruction.
40874 ///
40875 /// # Forms
40876 /// Assembly: `vfsgnjx.vv vm, vs2, vs1, vd`
40877 /// Rust: `vfsgnjx_vv(vd, vs1, vs2, vm)`
40878 ///
40879 /// # Arguments
40880 /// - `vd` — Vector register operand.
40881 /// - `vs1` — Vector register operand.
40882 /// - `vs2` — Vector register operand.
40883 /// - `vm` — Vector mask control.
40884 pub fn vfsgnjx_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40885 where
40886 Self: VfsgnjxVvEmitter<T0, T1, T2, T3>,
40887 {
40888 <Self as VfsgnjxVvEmitter<T0, T1, T2, T3>>::vfsgnjx_vv(self, vd, vs1, vs2, vm);
40889 }
40890 /// RISC-V `vfslide1down.vf` instruction.
40891 ///
40892 /// # Forms
40893 /// Assembly: `vfslide1down.vf vm, vs2, xs1, vd`
40894 /// Rust: `vfslide1down_vf(vd, vs2, rs1, vm)`
40895 ///
40896 /// # Arguments
40897 /// - `vd` — Vector register operand.
40898 /// - `vs2` — Vector register operand.
40899 /// - `rs1` — Source register.
40900 /// - `vm` — Vector mask control.
40901 pub fn vfslide1down_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40902 where
40903 Self: Vfslide1DownVfEmitter<T0, T1, T2, T3>,
40904 {
40905 <Self as Vfslide1DownVfEmitter<T0, T1, T2, T3>>::vfslide1down_vf(self, vd, vs2, rs1, vm);
40906 }
40907 /// RISC-V `vfslide1up.vf` instruction.
40908 ///
40909 /// # Forms
40910 /// Assembly: `vfslide1up.vf vm, vs2, xs1, vd`
40911 /// Rust: `vfslide1up_vf(vd, vs2, rs1, vm)`
40912 ///
40913 /// # Arguments
40914 /// - `vd` — Vector register operand.
40915 /// - `vs2` — Vector register operand.
40916 /// - `rs1` — Source register.
40917 /// - `vm` — Vector mask control.
40918 pub fn vfslide1up_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40919 where
40920 Self: Vfslide1UpVfEmitter<T0, T1, T2, T3>,
40921 {
40922 <Self as Vfslide1UpVfEmitter<T0, T1, T2, T3>>::vfslide1up_vf(self, vd, vs2, rs1, vm);
40923 }
40924 /// RISC-V `vfsqrt.v` instruction.
40925 ///
40926 /// # Forms
40927 /// Assembly: `vfsqrt.v vm, vs2, vd`
40928 /// Rust: `vfsqrt_v(vd, vs2, vm)`
40929 ///
40930 /// # Arguments
40931 /// - `vd` — Vector register operand.
40932 /// - `vs2` — Vector register operand.
40933 /// - `vm` — Vector mask control.
40934 pub fn vfsqrt_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
40935 where
40936 Self: VfsqrtVEmitter<T0, T1, T2>,
40937 {
40938 <Self as VfsqrtVEmitter<T0, T1, T2>>::vfsqrt_v(self, vd, vs2, vm);
40939 }
40940 /// RISC-V `vfsub.vf` instruction.
40941 ///
40942 /// # Forms
40943 /// Assembly: `vfsub.vf vm, vs2, xs1, vd`
40944 /// Rust: `vfsub_vf(vd, vs2, rs1, vm)`
40945 ///
40946 /// # Arguments
40947 /// - `vd` — Vector register operand.
40948 /// - `vs2` — Vector register operand.
40949 /// - `rs1` — Source register.
40950 /// - `vm` — Vector mask control.
40951 pub fn vfsub_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40952 where
40953 Self: VfsubVfEmitter<T0, T1, T2, T3>,
40954 {
40955 <Self as VfsubVfEmitter<T0, T1, T2, T3>>::vfsub_vf(self, vd, vs2, rs1, vm);
40956 }
40957 /// RISC-V `vfsub.vv` instruction.
40958 ///
40959 /// # Forms
40960 /// Assembly: `vfsub.vv vm, vs2, vs1, vd`
40961 /// Rust: `vfsub_vv(vd, vs1, vs2, vm)`
40962 ///
40963 /// # Arguments
40964 /// - `vd` — Vector register operand.
40965 /// - `vs1` — Vector register operand.
40966 /// - `vs2` — Vector register operand.
40967 /// - `vm` — Vector mask control.
40968 pub fn vfsub_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
40969 where
40970 Self: VfsubVvEmitter<T0, T1, T2, T3>,
40971 {
40972 <Self as VfsubVvEmitter<T0, T1, T2, T3>>::vfsub_vv(self, vd, vs1, vs2, vm);
40973 }
40974 /// RISC-V `vfwadd.vf` instruction.
40975 ///
40976 /// # Forms
40977 /// Assembly: `vfwadd.vf vm, vs2, xs1, vd`
40978 /// Rust: `vfwadd_vf(vd, vs2, rs1, vm)`
40979 ///
40980 /// # Arguments
40981 /// - `vd` — Vector register operand.
40982 /// - `vs2` — Vector register operand.
40983 /// - `rs1` — Source register.
40984 /// - `vm` — Vector mask control.
40985 pub fn vfwadd_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
40986 where
40987 Self: VfwaddVfEmitter<T0, T1, T2, T3>,
40988 {
40989 <Self as VfwaddVfEmitter<T0, T1, T2, T3>>::vfwadd_vf(self, vd, vs2, rs1, vm);
40990 }
40991 /// RISC-V `vfwadd.vv` instruction.
40992 ///
40993 /// # Forms
40994 /// Assembly: `vfwadd.vv vm, vs2, vs1, vd`
40995 /// Rust: `vfwadd_vv(vd, vs1, vs2, vm)`
40996 ///
40997 /// # Arguments
40998 /// - `vd` — Vector register operand.
40999 /// - `vs1` — Vector register operand.
41000 /// - `vs2` — Vector register operand.
41001 /// - `vm` — Vector mask control.
41002 pub fn vfwadd_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41003 where
41004 Self: VfwaddVvEmitter<T0, T1, T2, T3>,
41005 {
41006 <Self as VfwaddVvEmitter<T0, T1, T2, T3>>::vfwadd_vv(self, vd, vs1, vs2, vm);
41007 }
41008 /// RISC-V `vfwadd.wf` instruction.
41009 ///
41010 /// # Forms
41011 /// Assembly: `vfwadd.wf vm, vs2, xs1, vd`
41012 /// Rust: `vfwadd_wf(vd, vs2, rs1, vm)`
41013 ///
41014 /// # Arguments
41015 /// - `vd` — Vector register operand.
41016 /// - `vs2` — Vector register operand.
41017 /// - `rs1` — Source register.
41018 /// - `vm` — Vector mask control.
41019 pub fn vfwadd_wf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
41020 where
41021 Self: VfwaddWfEmitter<T0, T1, T2, T3>,
41022 {
41023 <Self as VfwaddWfEmitter<T0, T1, T2, T3>>::vfwadd_wf(self, vd, vs2, rs1, vm);
41024 }
41025 /// RISC-V `vfwadd.wv` instruction.
41026 ///
41027 /// # Forms
41028 /// Assembly: `vfwadd.wv vm, vs2, vs1, vd`
41029 /// Rust: `vfwadd_wv(vd, vs1, vs2, vm)`
41030 ///
41031 /// # Arguments
41032 /// - `vd` — Vector register operand.
41033 /// - `vs1` — Vector register operand.
41034 /// - `vs2` — Vector register operand.
41035 /// - `vm` — Vector mask control.
41036 pub fn vfwadd_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41037 where
41038 Self: VfwaddWvEmitter<T0, T1, T2, T3>,
41039 {
41040 <Self as VfwaddWvEmitter<T0, T1, T2, T3>>::vfwadd_wv(self, vd, vs1, vs2, vm);
41041 }
41042 /// RISC-V `vfwcvt.f.f.v` instruction.
41043 ///
41044 /// # Forms
41045 /// Assembly: `vfwcvt.f.f.v vm, vs2, vd`
41046 /// Rust: `vfwcvt_f_f_v(vd, vs2, vm)`
41047 ///
41048 /// # Arguments
41049 /// - `vd` — Vector register operand.
41050 /// - `vs2` — Vector register operand.
41051 /// - `vm` — Vector mask control.
41052 pub fn vfwcvt_f_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
41053 where
41054 Self: VfwcvtFFVEmitter<T0, T1, T2>,
41055 {
41056 <Self as VfwcvtFFVEmitter<T0, T1, T2>>::vfwcvt_f_f_v(self, vd, vs2, vm);
41057 }
41058 /// RISC-V `vfwcvt.f.x.v` instruction.
41059 ///
41060 /// # Forms
41061 /// Assembly: `vfwcvt.f.x.v vm, vs2, vd`
41062 /// Rust: `vfwcvt_f_x_v(vd, vs2, vm)`
41063 ///
41064 /// # Arguments
41065 /// - `vd` — Vector register operand.
41066 /// - `vs2` — Vector register operand.
41067 /// - `vm` — Vector mask control.
41068 pub fn vfwcvt_f_x_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
41069 where
41070 Self: VfwcvtFXVEmitter<T0, T1, T2>,
41071 {
41072 <Self as VfwcvtFXVEmitter<T0, T1, T2>>::vfwcvt_f_x_v(self, vd, vs2, vm);
41073 }
41074 /// RISC-V `vfwcvt.f.xu.v` instruction.
41075 ///
41076 /// # Forms
41077 /// Assembly: `vfwcvt.f.xu.v vm, vs2, vd`
41078 /// Rust: `vfwcvt_f_xu_v(vd, vs2, vm)`
41079 ///
41080 /// # Arguments
41081 /// - `vd` — Vector register operand.
41082 /// - `vs2` — Vector register operand.
41083 /// - `vm` — Vector mask control.
41084 pub fn vfwcvt_f_xu_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
41085 where
41086 Self: VfwcvtFXuVEmitter<T0, T1, T2>,
41087 {
41088 <Self as VfwcvtFXuVEmitter<T0, T1, T2>>::vfwcvt_f_xu_v(self, vd, vs2, vm);
41089 }
41090 /// RISC-V `vfwcvt.rtz.x.f.v` instruction.
41091 ///
41092 /// # Forms
41093 /// Assembly: `vfwcvt.rtz.x.f.v vm, vs2, vd`
41094 /// Rust: `vfwcvt_rtz_x_f_v(vd, vs2, vm)`
41095 ///
41096 /// # Arguments
41097 /// - `vd` — Vector register operand.
41098 /// - `vs2` — Vector register operand.
41099 /// - `vm` — Vector mask control.
41100 pub fn vfwcvt_rtz_x_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
41101 where
41102 Self: VfwcvtRtzXFVEmitter<T0, T1, T2>,
41103 {
41104 <Self as VfwcvtRtzXFVEmitter<T0, T1, T2>>::vfwcvt_rtz_x_f_v(self, vd, vs2, vm);
41105 }
41106 /// RISC-V `vfwcvt.rtz.xu.f.v` instruction.
41107 ///
41108 /// # Forms
41109 /// Assembly: `vfwcvt.rtz.xu.f.v vm, vs2, vd`
41110 /// Rust: `vfwcvt_rtz_xu_f_v(vd, vs2, vm)`
41111 ///
41112 /// # Arguments
41113 /// - `vd` — Vector register operand.
41114 /// - `vs2` — Vector register operand.
41115 /// - `vm` — Vector mask control.
41116 pub fn vfwcvt_rtz_xu_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
41117 where
41118 Self: VfwcvtRtzXuFVEmitter<T0, T1, T2>,
41119 {
41120 <Self as VfwcvtRtzXuFVEmitter<T0, T1, T2>>::vfwcvt_rtz_xu_f_v(self, vd, vs2, vm);
41121 }
41122 /// RISC-V `vfwcvt.x.f.v` instruction.
41123 ///
41124 /// # Forms
41125 /// Assembly: `vfwcvt.x.f.v vm, vs2, vd`
41126 /// Rust: `vfwcvt_x_f_v(vd, vs2, vm)`
41127 ///
41128 /// # Arguments
41129 /// - `vd` — Vector register operand.
41130 /// - `vs2` — Vector register operand.
41131 /// - `vm` — Vector mask control.
41132 pub fn vfwcvt_x_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
41133 where
41134 Self: VfwcvtXFVEmitter<T0, T1, T2>,
41135 {
41136 <Self as VfwcvtXFVEmitter<T0, T1, T2>>::vfwcvt_x_f_v(self, vd, vs2, vm);
41137 }
41138 /// RISC-V `vfwcvt.xu.f.v` instruction.
41139 ///
41140 /// # Forms
41141 /// Assembly: `vfwcvt.xu.f.v vm, vs2, vd`
41142 /// Rust: `vfwcvt_xu_f_v(vd, vs2, vm)`
41143 ///
41144 /// # Arguments
41145 /// - `vd` — Vector register operand.
41146 /// - `vs2` — Vector register operand.
41147 /// - `vm` — Vector mask control.
41148 pub fn vfwcvt_xu_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
41149 where
41150 Self: VfwcvtXuFVEmitter<T0, T1, T2>,
41151 {
41152 <Self as VfwcvtXuFVEmitter<T0, T1, T2>>::vfwcvt_xu_f_v(self, vd, vs2, vm);
41153 }
41154 /// RISC-V `vfwcvtbf16.f.f.v` instruction.
41155 ///
41156 /// # Forms
41157 /// Assembly: `vfwcvtbf16.f.f.v vm, vs2, vd`
41158 /// Rust: `vfwcvtbf16_f_f_v(vd, vs2, vm)`
41159 ///
41160 /// # Arguments
41161 /// - `vd` — Vector register operand.
41162 /// - `vs2` — Vector register operand.
41163 /// - `vm` — Vector mask control.
41164 pub fn vfwcvtbf16_f_f_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
41165 where
41166 Self: Vfwcvtbf16FFVEmitter<T0, T1, T2>,
41167 {
41168 <Self as Vfwcvtbf16FFVEmitter<T0, T1, T2>>::vfwcvtbf16_f_f_v(self, vd, vs2, vm);
41169 }
41170 /// RISC-V `vfwmacc.vf` instruction.
41171 ///
41172 /// # Forms
41173 /// Assembly: `vfwmacc.vf vm, vs2, xs1, vd`
41174 /// Rust: `vfwmacc_vf(vd, vs2, rs1, vm)`
41175 ///
41176 /// # Arguments
41177 /// - `vd` — Vector register operand.
41178 /// - `vs2` — Vector register operand.
41179 /// - `rs1` — Source register.
41180 /// - `vm` — Vector mask control.
41181 pub fn vfwmacc_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
41182 where
41183 Self: VfwmaccVfEmitter<T0, T1, T2, T3>,
41184 {
41185 <Self as VfwmaccVfEmitter<T0, T1, T2, T3>>::vfwmacc_vf(self, vd, vs2, rs1, vm);
41186 }
41187 /// RISC-V `vfwmacc.vv` instruction.
41188 ///
41189 /// # Forms
41190 /// Assembly: `vfwmacc.vv vm, vs2, vs1, vd`
41191 /// Rust: `vfwmacc_vv(vd, vs1, vs2, vm)`
41192 ///
41193 /// # Arguments
41194 /// - `vd` — Vector register operand.
41195 /// - `vs1` — Vector register operand.
41196 /// - `vs2` — Vector register operand.
41197 /// - `vm` — Vector mask control.
41198 pub fn vfwmacc_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41199 where
41200 Self: VfwmaccVvEmitter<T0, T1, T2, T3>,
41201 {
41202 <Self as VfwmaccVvEmitter<T0, T1, T2, T3>>::vfwmacc_vv(self, vd, vs1, vs2, vm);
41203 }
41204 /// RISC-V `vfwmaccbf16.vf` instruction.
41205 ///
41206 /// # Forms
41207 /// Assembly: `vfwmaccbf16.vf vm, vs2, xs1, vd`
41208 /// Rust: `vfwmaccbf16_vf(vd, vs2, rs1, vm)`
41209 ///
41210 /// # Arguments
41211 /// - `vd` — Vector register operand.
41212 /// - `vs2` — Vector register operand.
41213 /// - `rs1` — Source register.
41214 /// - `vm` — Vector mask control.
41215 pub fn vfwmaccbf16_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
41216 where
41217 Self: Vfwmaccbf16VfEmitter<T0, T1, T2, T3>,
41218 {
41219 <Self as Vfwmaccbf16VfEmitter<T0, T1, T2, T3>>::vfwmaccbf16_vf(self, vd, vs2, rs1, vm);
41220 }
41221 /// RISC-V `vfwmaccbf16.vv` instruction.
41222 ///
41223 /// # Forms
41224 /// Assembly: `vfwmaccbf16.vv vm, vs2, vs1, vd`
41225 /// Rust: `vfwmaccbf16_vv(vd, vs1, vs2, vm)`
41226 ///
41227 /// # Arguments
41228 /// - `vd` — Vector register operand.
41229 /// - `vs1` — Vector register operand.
41230 /// - `vs2` — Vector register operand.
41231 /// - `vm` — Vector mask control.
41232 pub fn vfwmaccbf16_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41233 where
41234 Self: Vfwmaccbf16VvEmitter<T0, T1, T2, T3>,
41235 {
41236 <Self as Vfwmaccbf16VvEmitter<T0, T1, T2, T3>>::vfwmaccbf16_vv(self, vd, vs1, vs2, vm);
41237 }
41238 /// RISC-V `vfwmsac.vf` instruction.
41239 ///
41240 /// # Forms
41241 /// Assembly: `vfwmsac.vf vm, vs2, xs1, vd`
41242 /// Rust: `vfwmsac_vf(vd, vs2, rs1, vm)`
41243 ///
41244 /// # Arguments
41245 /// - `vd` — Vector register operand.
41246 /// - `vs2` — Vector register operand.
41247 /// - `rs1` — Source register.
41248 /// - `vm` — Vector mask control.
41249 pub fn vfwmsac_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
41250 where
41251 Self: VfwmsacVfEmitter<T0, T1, T2, T3>,
41252 {
41253 <Self as VfwmsacVfEmitter<T0, T1, T2, T3>>::vfwmsac_vf(self, vd, vs2, rs1, vm);
41254 }
41255 /// RISC-V `vfwmsac.vv` instruction.
41256 ///
41257 /// # Forms
41258 /// Assembly: `vfwmsac.vv vm, vs2, vs1, vd`
41259 /// Rust: `vfwmsac_vv(vd, vs1, vs2, vm)`
41260 ///
41261 /// # Arguments
41262 /// - `vd` — Vector register operand.
41263 /// - `vs1` — Vector register operand.
41264 /// - `vs2` — Vector register operand.
41265 /// - `vm` — Vector mask control.
41266 pub fn vfwmsac_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41267 where
41268 Self: VfwmsacVvEmitter<T0, T1, T2, T3>,
41269 {
41270 <Self as VfwmsacVvEmitter<T0, T1, T2, T3>>::vfwmsac_vv(self, vd, vs1, vs2, vm);
41271 }
41272 /// RISC-V `vfwmul.vf` instruction.
41273 ///
41274 /// # Forms
41275 /// Assembly: `vfwmul.vf vm, vs2, xs1, vd`
41276 /// Rust: `vfwmul_vf(vd, vs2, rs1, vm)`
41277 ///
41278 /// # Arguments
41279 /// - `vd` — Vector register operand.
41280 /// - `vs2` — Vector register operand.
41281 /// - `rs1` — Source register.
41282 /// - `vm` — Vector mask control.
41283 pub fn vfwmul_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
41284 where
41285 Self: VfwmulVfEmitter<T0, T1, T2, T3>,
41286 {
41287 <Self as VfwmulVfEmitter<T0, T1, T2, T3>>::vfwmul_vf(self, vd, vs2, rs1, vm);
41288 }
41289 /// RISC-V `vfwmul.vv` instruction.
41290 ///
41291 /// # Forms
41292 /// Assembly: `vfwmul.vv vm, vs2, vs1, vd`
41293 /// Rust: `vfwmul_vv(vd, vs1, vs2, vm)`
41294 ///
41295 /// # Arguments
41296 /// - `vd` — Vector register operand.
41297 /// - `vs1` — Vector register operand.
41298 /// - `vs2` — Vector register operand.
41299 /// - `vm` — Vector mask control.
41300 pub fn vfwmul_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41301 where
41302 Self: VfwmulVvEmitter<T0, T1, T2, T3>,
41303 {
41304 <Self as VfwmulVvEmitter<T0, T1, T2, T3>>::vfwmul_vv(self, vd, vs1, vs2, vm);
41305 }
41306 /// RISC-V `vfwnmacc.vf` instruction.
41307 ///
41308 /// # Forms
41309 /// Assembly: `vfwnmacc.vf vm, vs2, xs1, vd`
41310 /// Rust: `vfwnmacc_vf(vd, vs2, rs1, vm)`
41311 ///
41312 /// # Arguments
41313 /// - `vd` — Vector register operand.
41314 /// - `vs2` — Vector register operand.
41315 /// - `rs1` — Source register.
41316 /// - `vm` — Vector mask control.
41317 pub fn vfwnmacc_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
41318 where
41319 Self: VfwnmaccVfEmitter<T0, T1, T2, T3>,
41320 {
41321 <Self as VfwnmaccVfEmitter<T0, T1, T2, T3>>::vfwnmacc_vf(self, vd, vs2, rs1, vm);
41322 }
41323 /// RISC-V `vfwnmacc.vv` instruction.
41324 ///
41325 /// # Forms
41326 /// Assembly: `vfwnmacc.vv vm, vs2, vs1, vd`
41327 /// Rust: `vfwnmacc_vv(vd, vs1, vs2, vm)`
41328 ///
41329 /// # Arguments
41330 /// - `vd` — Vector register operand.
41331 /// - `vs1` — Vector register operand.
41332 /// - `vs2` — Vector register operand.
41333 /// - `vm` — Vector mask control.
41334 pub fn vfwnmacc_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41335 where
41336 Self: VfwnmaccVvEmitter<T0, T1, T2, T3>,
41337 {
41338 <Self as VfwnmaccVvEmitter<T0, T1, T2, T3>>::vfwnmacc_vv(self, vd, vs1, vs2, vm);
41339 }
41340 /// RISC-V `vfwnmsac.vf` instruction.
41341 ///
41342 /// # Forms
41343 /// Assembly: `vfwnmsac.vf vm, vs2, xs1, vd`
41344 /// Rust: `vfwnmsac_vf(vd, vs2, rs1, vm)`
41345 ///
41346 /// # Arguments
41347 /// - `vd` — Vector register operand.
41348 /// - `vs2` — Vector register operand.
41349 /// - `rs1` — Source register.
41350 /// - `vm` — Vector mask control.
41351 pub fn vfwnmsac_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
41352 where
41353 Self: VfwnmsacVfEmitter<T0, T1, T2, T3>,
41354 {
41355 <Self as VfwnmsacVfEmitter<T0, T1, T2, T3>>::vfwnmsac_vf(self, vd, vs2, rs1, vm);
41356 }
41357 /// RISC-V `vfwnmsac.vv` instruction.
41358 ///
41359 /// # Forms
41360 /// Assembly: `vfwnmsac.vv vm, vs2, vs1, vd`
41361 /// Rust: `vfwnmsac_vv(vd, vs1, vs2, vm)`
41362 ///
41363 /// # Arguments
41364 /// - `vd` — Vector register operand.
41365 /// - `vs1` — Vector register operand.
41366 /// - `vs2` — Vector register operand.
41367 /// - `vm` — Vector mask control.
41368 pub fn vfwnmsac_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41369 where
41370 Self: VfwnmsacVvEmitter<T0, T1, T2, T3>,
41371 {
41372 <Self as VfwnmsacVvEmitter<T0, T1, T2, T3>>::vfwnmsac_vv(self, vd, vs1, vs2, vm);
41373 }
41374 /// RISC-V `vfwredosum.vs` instruction.
41375 ///
41376 /// # Forms
41377 /// Assembly: `vfwredosum.vs vm, vs2, vs1, vd`
41378 /// Rust: `vfwredosum_vs(vd, vs1, vs2, vm)`
41379 ///
41380 /// # Arguments
41381 /// - `vd` — Vector register operand.
41382 /// - `vs1` — Vector register operand.
41383 /// - `vs2` — Vector register operand.
41384 /// - `vm` — Vector mask control.
41385 pub fn vfwredosum_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41386 where
41387 Self: VfwredosumVsEmitter<T0, T1, T2, T3>,
41388 {
41389 <Self as VfwredosumVsEmitter<T0, T1, T2, T3>>::vfwredosum_vs(self, vd, vs1, vs2, vm);
41390 }
41391 /// RISC-V `vfwredsum.vs` instruction.
41392 ///
41393 /// # Forms
41394 /// Assembly: `vfwredsum.vs vd vs1 vs2 vm`
41395 /// Rust: `vfwredsum_vs(vd, vs1, vs2, vm)`
41396 ///
41397 /// # Arguments
41398 /// - `vd` — Vector register operand.
41399 /// - `vs1` — Vector register operand.
41400 /// - `vs2` — Vector register operand.
41401 /// - `vm` — Vector mask control.
41402 pub fn vfwredsum_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41403 where
41404 Self: VfwredsumVsEmitter<T0, T1, T2, T3>,
41405 {
41406 <Self as VfwredsumVsEmitter<T0, T1, T2, T3>>::vfwredsum_vs(self, vd, vs1, vs2, vm);
41407 }
41408 /// RISC-V `vfwredusum.vs` instruction.
41409 ///
41410 /// # Forms
41411 /// Assembly: `vfwredusum.vs vm, vs2, vs1, vd`
41412 /// Rust: `vfwredusum_vs(vd, vs1, vs2, vm)`
41413 ///
41414 /// # Arguments
41415 /// - `vd` — Vector register operand.
41416 /// - `vs1` — Vector register operand.
41417 /// - `vs2` — Vector register operand.
41418 /// - `vm` — Vector mask control.
41419 pub fn vfwredusum_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41420 where
41421 Self: VfwredusumVsEmitter<T0, T1, T2, T3>,
41422 {
41423 <Self as VfwredusumVsEmitter<T0, T1, T2, T3>>::vfwredusum_vs(self, vd, vs1, vs2, vm);
41424 }
41425 /// RISC-V `vfwsub.vf` instruction.
41426 ///
41427 /// # Forms
41428 /// Assembly: `vfwsub.vf vm, vs2, xs1, vd`
41429 /// Rust: `vfwsub_vf(vd, vs2, rs1, vm)`
41430 ///
41431 /// # Arguments
41432 /// - `vd` — Vector register operand.
41433 /// - `vs2` — Vector register operand.
41434 /// - `rs1` — Source register.
41435 /// - `vm` — Vector mask control.
41436 pub fn vfwsub_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
41437 where
41438 Self: VfwsubVfEmitter<T0, T1, T2, T3>,
41439 {
41440 <Self as VfwsubVfEmitter<T0, T1, T2, T3>>::vfwsub_vf(self, vd, vs2, rs1, vm);
41441 }
41442 /// RISC-V `vfwsub.vv` instruction.
41443 ///
41444 /// # Forms
41445 /// Assembly: `vfwsub.vv vm, vs2, vs1, vd`
41446 /// Rust: `vfwsub_vv(vd, vs1, vs2, vm)`
41447 ///
41448 /// # Arguments
41449 /// - `vd` — Vector register operand.
41450 /// - `vs1` — Vector register operand.
41451 /// - `vs2` — Vector register operand.
41452 /// - `vm` — Vector mask control.
41453 pub fn vfwsub_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41454 where
41455 Self: VfwsubVvEmitter<T0, T1, T2, T3>,
41456 {
41457 <Self as VfwsubVvEmitter<T0, T1, T2, T3>>::vfwsub_vv(self, vd, vs1, vs2, vm);
41458 }
41459 /// RISC-V `vfwsub.wf` instruction.
41460 ///
41461 /// # Forms
41462 /// Assembly: `vfwsub.wf vm, vs2, xs1, vd`
41463 /// Rust: `vfwsub_wf(vd, vs2, rs1, vm)`
41464 ///
41465 /// # Arguments
41466 /// - `vd` — Vector register operand.
41467 /// - `vs2` — Vector register operand.
41468 /// - `rs1` — Source register.
41469 /// - `vm` — Vector mask control.
41470 pub fn vfwsub_wf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
41471 where
41472 Self: VfwsubWfEmitter<T0, T1, T2, T3>,
41473 {
41474 <Self as VfwsubWfEmitter<T0, T1, T2, T3>>::vfwsub_wf(self, vd, vs2, rs1, vm);
41475 }
41476 /// RISC-V `vfwsub.wv` instruction.
41477 ///
41478 /// # Forms
41479 /// Assembly: `vfwsub.wv vm, vs2, vs1, vd`
41480 /// Rust: `vfwsub_wv(vd, vs1, vs2, vm)`
41481 ///
41482 /// # Arguments
41483 /// - `vd` — Vector register operand.
41484 /// - `vs1` — Vector register operand.
41485 /// - `vs2` — Vector register operand.
41486 /// - `vm` — Vector mask control.
41487 pub fn vfwsub_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
41488 where
41489 Self: VfwsubWvEmitter<T0, T1, T2, T3>,
41490 {
41491 <Self as VfwsubWvEmitter<T0, T1, T2, T3>>::vfwsub_wv(self, vd, vs1, vs2, vm);
41492 }
41493 /// RISC-V `vghsh.vv` instruction.
41494 ///
41495 /// # Forms
41496 /// Assembly: `vghsh.vv vs2, vs1, vd`
41497 /// Rust: `vghsh_vv(vd, vs1, vs2)`
41498 ///
41499 /// # Arguments
41500 /// - `vd` — Vector register operand.
41501 /// - `vs1` — Vector register operand.
41502 /// - `vs2` — Vector register operand.
41503 pub fn vghsh_vv<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
41504 where
41505 Self: VghshVvEmitter<T0, T1, T2>,
41506 {
41507 <Self as VghshVvEmitter<T0, T1, T2>>::vghsh_vv(self, vd, vs1, vs2);
41508 }
41509 /// RISC-V `vgmul.vv` instruction.
41510 ///
41511 /// # Forms
41512 /// Assembly: `vgmul.vv vs2, vd`
41513 /// Rust: `vgmul_vv(vd, vs2)`
41514 ///
41515 /// # Arguments
41516 /// - `vd` — Vector register operand.
41517 /// - `vs2` — Vector register operand.
41518 pub fn vgmul_vv<T0, T1>(&mut self, vd: T0, vs2: T1)
41519 where
41520 Self: VgmulVvEmitter<T0, T1>,
41521 {
41522 <Self as VgmulVvEmitter<T0, T1>>::vgmul_vv(self, vd, vs2);
41523 }
41524 /// RISC-V `vid.v` instruction.
41525 ///
41526 /// # Forms
41527 /// Assembly: `vid.v vm, vd`
41528 /// Rust: `vid_v(vd, vm)`
41529 ///
41530 /// # Arguments
41531 /// - `vd` — Vector register operand.
41532 /// - `vm` — Vector mask control.
41533 pub fn vid_v<T0, T1>(&mut self, vd: T0, vm: T1)
41534 where
41535 Self: VidVEmitter<T0, T1>,
41536 {
41537 <Self as VidVEmitter<T0, T1>>::vid_v(self, vd, vm);
41538 }
41539 /// RISC-V `viota.m` instruction.
41540 ///
41541 /// # Forms
41542 /// Assembly: `viota.m vm, vs2, vd`
41543 /// Rust: `viota_m(vd, vs2, vm)`
41544 ///
41545 /// # Arguments
41546 /// - `vd` — Vector register operand.
41547 /// - `vs2` — Vector register operand.
41548 /// - `vm` — Vector mask control.
41549 pub fn viota_m<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
41550 where
41551 Self: ViotaMEmitter<T0, T1, T2>,
41552 {
41553 <Self as ViotaMEmitter<T0, T1, T2>>::viota_m(self, vd, vs2, vm);
41554 }
41555 /// RISC-V `vl1r.v` instruction.
41556 ///
41557 /// # Forms
41558 /// Assembly: `vl1r.v vd rs1`
41559 /// Rust: `vl1r_v(vd, rs1)`
41560 ///
41561 /// # Arguments
41562 /// - `vd` — Vector register operand.
41563 /// - `rs1` — Memory base register.
41564 pub fn vl1r_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41565 where
41566 Self: Vl1RVEmitter<T0, T1>,
41567 {
41568 <Self as Vl1RVEmitter<T0, T1>>::vl1r_v(self, vd, rs1);
41569 }
41570 /// RISC-V `vl1re16.v` instruction.
41571 ///
41572 /// # Forms
41573 /// Assembly: `vl1re16.v xs1, vd`
41574 /// Rust: `vl1re16_v(vd, rs1)`
41575 ///
41576 /// # Arguments
41577 /// - `vd` — Vector register operand.
41578 /// - `rs1` — Memory base register.
41579 pub fn vl1re16_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41580 where
41581 Self: Vl1Re16VEmitter<T0, T1>,
41582 {
41583 <Self as Vl1Re16VEmitter<T0, T1>>::vl1re16_v(self, vd, rs1);
41584 }
41585 /// RISC-V `vl1re32.v` instruction.
41586 ///
41587 /// # Forms
41588 /// Assembly: `vl1re32.v xs1, vd`
41589 /// Rust: `vl1re32_v(vd, rs1)`
41590 ///
41591 /// # Arguments
41592 /// - `vd` — Vector register operand.
41593 /// - `rs1` — Memory base register.
41594 pub fn vl1re32_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41595 where
41596 Self: Vl1Re32VEmitter<T0, T1>,
41597 {
41598 <Self as Vl1Re32VEmitter<T0, T1>>::vl1re32_v(self, vd, rs1);
41599 }
41600 /// RISC-V `vl1re64.v` instruction.
41601 ///
41602 /// # Forms
41603 /// Assembly: `vl1re64.v xs1, vd`
41604 /// Rust: `vl1re64_v(vd, rs1)`
41605 ///
41606 /// # Arguments
41607 /// - `vd` — Vector register operand.
41608 /// - `rs1` — Memory base register.
41609 pub fn vl1re64_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41610 where
41611 Self: Vl1Re64VEmitter<T0, T1>,
41612 {
41613 <Self as Vl1Re64VEmitter<T0, T1>>::vl1re64_v(self, vd, rs1);
41614 }
41615 /// RISC-V `vl1re8.v` instruction.
41616 ///
41617 /// # Forms
41618 /// Assembly: `vl1re8.v xs1, vd`
41619 /// Rust: `vl1re8_v(vd, rs1)`
41620 ///
41621 /// # Arguments
41622 /// - `vd` — Vector register operand.
41623 /// - `rs1` — Memory base register.
41624 pub fn vl1re8_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41625 where
41626 Self: Vl1Re8VEmitter<T0, T1>,
41627 {
41628 <Self as Vl1Re8VEmitter<T0, T1>>::vl1re8_v(self, vd, rs1);
41629 }
41630 /// RISC-V `vl2r.v` instruction.
41631 ///
41632 /// # Forms
41633 /// Assembly: `vl2r.v vd rs1`
41634 /// Rust: `vl2r_v(vd, rs1)`
41635 ///
41636 /// # Arguments
41637 /// - `vd` — Vector register operand.
41638 /// - `rs1` — Memory base register.
41639 pub fn vl2r_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41640 where
41641 Self: Vl2RVEmitter<T0, T1>,
41642 {
41643 <Self as Vl2RVEmitter<T0, T1>>::vl2r_v(self, vd, rs1);
41644 }
41645 /// RISC-V `vl2re16.v` instruction.
41646 ///
41647 /// # Forms
41648 /// Assembly: `vl2re16.v xs1, vd`
41649 /// Rust: `vl2re16_v(vd, rs1)`
41650 ///
41651 /// # Arguments
41652 /// - `vd` — Vector register operand.
41653 /// - `rs1` — Memory base register.
41654 pub fn vl2re16_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41655 where
41656 Self: Vl2Re16VEmitter<T0, T1>,
41657 {
41658 <Self as Vl2Re16VEmitter<T0, T1>>::vl2re16_v(self, vd, rs1);
41659 }
41660 /// RISC-V `vl2re32.v` instruction.
41661 ///
41662 /// # Forms
41663 /// Assembly: `vl2re32.v xs1, vd`
41664 /// Rust: `vl2re32_v(vd, rs1)`
41665 ///
41666 /// # Arguments
41667 /// - `vd` — Vector register operand.
41668 /// - `rs1` — Memory base register.
41669 pub fn vl2re32_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41670 where
41671 Self: Vl2Re32VEmitter<T0, T1>,
41672 {
41673 <Self as Vl2Re32VEmitter<T0, T1>>::vl2re32_v(self, vd, rs1);
41674 }
41675 /// RISC-V `vl2re64.v` instruction.
41676 ///
41677 /// # Forms
41678 /// Assembly: `vl2re64.v xs1, vd`
41679 /// Rust: `vl2re64_v(vd, rs1)`
41680 ///
41681 /// # Arguments
41682 /// - `vd` — Vector register operand.
41683 /// - `rs1` — Memory base register.
41684 pub fn vl2re64_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41685 where
41686 Self: Vl2Re64VEmitter<T0, T1>,
41687 {
41688 <Self as Vl2Re64VEmitter<T0, T1>>::vl2re64_v(self, vd, rs1);
41689 }
41690 /// RISC-V `vl2re8.v` instruction.
41691 ///
41692 /// # Forms
41693 /// Assembly: `vl2re8.v xs1, vd`
41694 /// Rust: `vl2re8_v(vd, rs1)`
41695 ///
41696 /// # Arguments
41697 /// - `vd` — Vector register operand.
41698 /// - `rs1` — Memory base register.
41699 pub fn vl2re8_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41700 where
41701 Self: Vl2Re8VEmitter<T0, T1>,
41702 {
41703 <Self as Vl2Re8VEmitter<T0, T1>>::vl2re8_v(self, vd, rs1);
41704 }
41705 /// RISC-V `vl4r.v` instruction.
41706 ///
41707 /// # Forms
41708 /// Assembly: `vl4r.v vd rs1`
41709 /// Rust: `vl4r_v(vd, rs1)`
41710 ///
41711 /// # Arguments
41712 /// - `vd` — Vector register operand.
41713 /// - `rs1` — Memory base register.
41714 pub fn vl4r_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41715 where
41716 Self: Vl4RVEmitter<T0, T1>,
41717 {
41718 <Self as Vl4RVEmitter<T0, T1>>::vl4r_v(self, vd, rs1);
41719 }
41720 /// RISC-V `vl4re16.v` instruction.
41721 ///
41722 /// # Forms
41723 /// Assembly: `vl4re16.v xs1, vd`
41724 /// Rust: `vl4re16_v(vd, rs1)`
41725 ///
41726 /// # Arguments
41727 /// - `vd` — Vector register operand.
41728 /// - `rs1` — Memory base register.
41729 pub fn vl4re16_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41730 where
41731 Self: Vl4Re16VEmitter<T0, T1>,
41732 {
41733 <Self as Vl4Re16VEmitter<T0, T1>>::vl4re16_v(self, vd, rs1);
41734 }
41735 /// RISC-V `vl4re32.v` instruction.
41736 ///
41737 /// # Forms
41738 /// Assembly: `vl4re32.v xs1, vd`
41739 /// Rust: `vl4re32_v(vd, rs1)`
41740 ///
41741 /// # Arguments
41742 /// - `vd` — Vector register operand.
41743 /// - `rs1` — Memory base register.
41744 pub fn vl4re32_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41745 where
41746 Self: Vl4Re32VEmitter<T0, T1>,
41747 {
41748 <Self as Vl4Re32VEmitter<T0, T1>>::vl4re32_v(self, vd, rs1);
41749 }
41750 /// RISC-V `vl4re64.v` instruction.
41751 ///
41752 /// # Forms
41753 /// Assembly: `vl4re64.v xs1, vd`
41754 /// Rust: `vl4re64_v(vd, rs1)`
41755 ///
41756 /// # Arguments
41757 /// - `vd` — Vector register operand.
41758 /// - `rs1` — Memory base register.
41759 pub fn vl4re64_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41760 where
41761 Self: Vl4Re64VEmitter<T0, T1>,
41762 {
41763 <Self as Vl4Re64VEmitter<T0, T1>>::vl4re64_v(self, vd, rs1);
41764 }
41765 /// RISC-V `vl4re8.v` instruction.
41766 ///
41767 /// # Forms
41768 /// Assembly: `vl4re8.v xs1, vd`
41769 /// Rust: `vl4re8_v(vd, rs1)`
41770 ///
41771 /// # Arguments
41772 /// - `vd` — Vector register operand.
41773 /// - `rs1` — Memory base register.
41774 pub fn vl4re8_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41775 where
41776 Self: Vl4Re8VEmitter<T0, T1>,
41777 {
41778 <Self as Vl4Re8VEmitter<T0, T1>>::vl4re8_v(self, vd, rs1);
41779 }
41780 /// RISC-V `vl8r.v` instruction.
41781 ///
41782 /// # Forms
41783 /// Assembly: `vl8r.v vd rs1`
41784 /// Rust: `vl8r_v(vd, rs1)`
41785 ///
41786 /// # Arguments
41787 /// - `vd` — Vector register operand.
41788 /// - `rs1` — Memory base register.
41789 pub fn vl8r_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41790 where
41791 Self: Vl8RVEmitter<T0, T1>,
41792 {
41793 <Self as Vl8RVEmitter<T0, T1>>::vl8r_v(self, vd, rs1);
41794 }
41795 /// RISC-V `vl8re16.v` instruction.
41796 ///
41797 /// # Forms
41798 /// Assembly: `vl8re16.v xs1, vd`
41799 /// Rust: `vl8re16_v(vd, rs1)`
41800 ///
41801 /// # Arguments
41802 /// - `vd` — Vector register operand.
41803 /// - `rs1` — Memory base register.
41804 pub fn vl8re16_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41805 where
41806 Self: Vl8Re16VEmitter<T0, T1>,
41807 {
41808 <Self as Vl8Re16VEmitter<T0, T1>>::vl8re16_v(self, vd, rs1);
41809 }
41810 /// RISC-V `vl8re32.v` instruction.
41811 ///
41812 /// # Forms
41813 /// Assembly: `vl8re32.v xs1, vd`
41814 /// Rust: `vl8re32_v(vd, rs1)`
41815 ///
41816 /// # Arguments
41817 /// - `vd` — Vector register operand.
41818 /// - `rs1` — Memory base register.
41819 pub fn vl8re32_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41820 where
41821 Self: Vl8Re32VEmitter<T0, T1>,
41822 {
41823 <Self as Vl8Re32VEmitter<T0, T1>>::vl8re32_v(self, vd, rs1);
41824 }
41825 /// RISC-V `vl8re64.v` instruction.
41826 ///
41827 /// # Forms
41828 /// Assembly: `vl8re64.v xs1, vd`
41829 /// Rust: `vl8re64_v(vd, rs1)`
41830 ///
41831 /// # Arguments
41832 /// - `vd` — Vector register operand.
41833 /// - `rs1` — Memory base register.
41834 pub fn vl8re64_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41835 where
41836 Self: Vl8Re64VEmitter<T0, T1>,
41837 {
41838 <Self as Vl8Re64VEmitter<T0, T1>>::vl8re64_v(self, vd, rs1);
41839 }
41840 /// RISC-V `vl8re8.v` instruction.
41841 ///
41842 /// # Forms
41843 /// Assembly: `vl8re8.v xs1, vd`
41844 /// Rust: `vl8re8_v(vd, rs1)`
41845 ///
41846 /// # Arguments
41847 /// - `vd` — Vector register operand.
41848 /// - `rs1` — Memory base register.
41849 pub fn vl8re8_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41850 where
41851 Self: Vl8Re8VEmitter<T0, T1>,
41852 {
41853 <Self as Vl8Re8VEmitter<T0, T1>>::vl8re8_v(self, vd, rs1);
41854 }
41855 /// RISC-V `vle16.v` instruction.
41856 ///
41857 /// # Forms
41858 /// Assembly: `vle16.v vm, xs1, vd`
41859 /// Rust: `vle16_v(vd, rs1, vm, nf)`
41860 ///
41861 /// # Arguments
41862 /// - `vd` — Vector register operand.
41863 /// - `rs1` — Memory base register.
41864 /// - `vm` — Vector mask control.
41865 /// - `nf` — Vector segment field count.
41866 pub fn vle16_v<T0, T1, T2, T3>(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3)
41867 where
41868 Self: Vle16VEmitter<T0, T1, T2, T3>,
41869 {
41870 <Self as Vle16VEmitter<T0, T1, T2, T3>>::vle16_v(self, vd, rs1, vm, nf);
41871 }
41872 /// RISC-V `vle16ff.v` instruction.
41873 ///
41874 /// # Forms
41875 /// Assembly: `vle16ff.v vm, xs1, vd`
41876 /// Rust: `vle16ff_v(vd, rs1, vm, nf)`
41877 ///
41878 /// # Arguments
41879 /// - `vd` — Vector register operand.
41880 /// - `rs1` — Memory base register.
41881 /// - `vm` — Vector mask control.
41882 /// - `nf` — Vector segment field count.
41883 pub fn vle16ff_v<T0, T1, T2, T3>(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3)
41884 where
41885 Self: Vle16FfVEmitter<T0, T1, T2, T3>,
41886 {
41887 <Self as Vle16FfVEmitter<T0, T1, T2, T3>>::vle16ff_v(self, vd, rs1, vm, nf);
41888 }
41889 /// RISC-V `vle1.v` instruction.
41890 ///
41891 /// # Forms
41892 /// Assembly: `vle1.v vd rs1`
41893 /// Rust: `vle1_v(vd, rs1)`
41894 ///
41895 /// # Arguments
41896 /// - `vd` — Vector register operand.
41897 /// - `rs1` — Memory base register.
41898 pub fn vle1_v<T0, T1>(&mut self, vd: T0, rs1: T1)
41899 where
41900 Self: Vle1VEmitter<T0, T1>,
41901 {
41902 <Self as Vle1VEmitter<T0, T1>>::vle1_v(self, vd, rs1);
41903 }
41904 /// RISC-V `vle32.v` instruction.
41905 ///
41906 /// # Forms
41907 /// Assembly: `vle32.v vm, xs1, vd`
41908 /// Rust: `vle32_v(vd, rs1, vm, nf)`
41909 ///
41910 /// # Arguments
41911 /// - `vd` — Vector register operand.
41912 /// - `rs1` — Memory base register.
41913 /// - `vm` — Vector mask control.
41914 /// - `nf` — Vector segment field count.
41915 pub fn vle32_v<T0, T1, T2, T3>(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3)
41916 where
41917 Self: Vle32VEmitter<T0, T1, T2, T3>,
41918 {
41919 <Self as Vle32VEmitter<T0, T1, T2, T3>>::vle32_v(self, vd, rs1, vm, nf);
41920 }
41921 /// RISC-V `vle32ff.v` instruction.
41922 ///
41923 /// # Forms
41924 /// Assembly: `vle32ff.v vm, xs1, vd`
41925 /// Rust: `vle32ff_v(vd, rs1, vm, nf)`
41926 ///
41927 /// # Arguments
41928 /// - `vd` — Vector register operand.
41929 /// - `rs1` — Memory base register.
41930 /// - `vm` — Vector mask control.
41931 /// - `nf` — Vector segment field count.
41932 pub fn vle32ff_v<T0, T1, T2, T3>(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3)
41933 where
41934 Self: Vle32FfVEmitter<T0, T1, T2, T3>,
41935 {
41936 <Self as Vle32FfVEmitter<T0, T1, T2, T3>>::vle32ff_v(self, vd, rs1, vm, nf);
41937 }
41938 /// RISC-V `vle64.v` instruction.
41939 ///
41940 /// # Forms
41941 /// Assembly: `vle64.v vm, xs1, vd`
41942 /// Rust: `vle64_v(vd, rs1, vm, nf)`
41943 ///
41944 /// # Arguments
41945 /// - `vd` — Vector register operand.
41946 /// - `rs1` — Memory base register.
41947 /// - `vm` — Vector mask control.
41948 /// - `nf` — Vector segment field count.
41949 pub fn vle64_v<T0, T1, T2, T3>(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3)
41950 where
41951 Self: Vle64VEmitter<T0, T1, T2, T3>,
41952 {
41953 <Self as Vle64VEmitter<T0, T1, T2, T3>>::vle64_v(self, vd, rs1, vm, nf);
41954 }
41955 /// RISC-V `vle64ff.v` instruction.
41956 ///
41957 /// # Forms
41958 /// Assembly: `vle64ff.v vm, xs1, vd`
41959 /// Rust: `vle64ff_v(vd, rs1, vm, nf)`
41960 ///
41961 /// # Arguments
41962 /// - `vd` — Vector register operand.
41963 /// - `rs1` — Memory base register.
41964 /// - `vm` — Vector mask control.
41965 /// - `nf` — Vector segment field count.
41966 pub fn vle64ff_v<T0, T1, T2, T3>(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3)
41967 where
41968 Self: Vle64FfVEmitter<T0, T1, T2, T3>,
41969 {
41970 <Self as Vle64FfVEmitter<T0, T1, T2, T3>>::vle64ff_v(self, vd, rs1, vm, nf);
41971 }
41972 /// RISC-V `vle8.v` instruction.
41973 ///
41974 /// # Forms
41975 /// Assembly: `vle8.v vm, xs1, vd`
41976 /// Rust: `vle8_v(vd, rs1, vm, nf)`
41977 ///
41978 /// # Arguments
41979 /// - `vd` — Vector register operand.
41980 /// - `rs1` — Memory base register.
41981 /// - `vm` — Vector mask control.
41982 /// - `nf` — Vector segment field count.
41983 pub fn vle8_v<T0, T1, T2, T3>(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3)
41984 where
41985 Self: Vle8VEmitter<T0, T1, T2, T3>,
41986 {
41987 <Self as Vle8VEmitter<T0, T1, T2, T3>>::vle8_v(self, vd, rs1, vm, nf);
41988 }
41989 /// RISC-V `vle8ff.v` instruction.
41990 ///
41991 /// # Forms
41992 /// Assembly: `vle8ff.v vm, xs1, vd`
41993 /// Rust: `vle8ff_v(vd, rs1, vm, nf)`
41994 ///
41995 /// # Arguments
41996 /// - `vd` — Vector register operand.
41997 /// - `rs1` — Memory base register.
41998 /// - `vm` — Vector mask control.
41999 /// - `nf` — Vector segment field count.
42000 pub fn vle8ff_v<T0, T1, T2, T3>(&mut self, vd: T0, rs1: T1, vm: T2, nf: T3)
42001 where
42002 Self: Vle8FfVEmitter<T0, T1, T2, T3>,
42003 {
42004 <Self as Vle8FfVEmitter<T0, T1, T2, T3>>::vle8ff_v(self, vd, rs1, vm, nf);
42005 }
42006 /// RISC-V `vlm.v` instruction.
42007 ///
42008 /// # Forms
42009 /// Assembly: `vlm.v xs1, vd`
42010 /// Rust: `vlm_v(vd, rs1)`
42011 ///
42012 /// # Arguments
42013 /// - `vd` — Vector register operand.
42014 /// - `rs1` — Memory base register.
42015 pub fn vlm_v<T0, T1>(&mut self, vd: T0, rs1: T1)
42016 where
42017 Self: VlmVEmitter<T0, T1>,
42018 {
42019 <Self as VlmVEmitter<T0, T1>>::vlm_v(self, vd, rs1);
42020 }
42021 /// RISC-V `vloxei16.v` instruction.
42022 ///
42023 /// # Forms
42024 /// Assembly: `vloxei16.v vm, vs2, xs1, vd`
42025 /// Rust: `vloxei16_v(vd, rs1, vs2, vm, nf)`
42026 ///
42027 /// # Arguments
42028 /// - `vd` — Vector register operand.
42029 /// - `rs1` — Memory base register.
42030 /// - `vs2` — Vector register operand.
42031 /// - `vm` — Vector mask control.
42032 /// - `nf` — Vector segment field count.
42033 pub fn vloxei16_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
42034 where
42035 Self: Vloxei16VEmitter<T0, T1, T2, T3, T4>,
42036 {
42037 <Self as Vloxei16VEmitter<T0, T1, T2, T3, T4>>::vloxei16_v(self, vd, rs1, vs2, vm, nf);
42038 }
42039 /// RISC-V `vloxei32.v` instruction.
42040 ///
42041 /// # Forms
42042 /// Assembly: `vloxei32.v vm, vs2, xs1, vd`
42043 /// Rust: `vloxei32_v(vd, rs1, vs2, vm, nf)`
42044 ///
42045 /// # Arguments
42046 /// - `vd` — Vector register operand.
42047 /// - `rs1` — Memory base register.
42048 /// - `vs2` — Vector register operand.
42049 /// - `vm` — Vector mask control.
42050 /// - `nf` — Vector segment field count.
42051 pub fn vloxei32_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
42052 where
42053 Self: Vloxei32VEmitter<T0, T1, T2, T3, T4>,
42054 {
42055 <Self as Vloxei32VEmitter<T0, T1, T2, T3, T4>>::vloxei32_v(self, vd, rs1, vs2, vm, nf);
42056 }
42057 /// RISC-V `vloxei64.v` instruction.
42058 ///
42059 /// # Forms
42060 /// Assembly: `vloxei64.v vm, vs2, xs1, vd`
42061 /// Rust: `vloxei64_v(vd, rs1, vs2, vm, nf)`
42062 ///
42063 /// # Arguments
42064 /// - `vd` — Vector register operand.
42065 /// - `rs1` — Memory base register.
42066 /// - `vs2` — Vector register operand.
42067 /// - `vm` — Vector mask control.
42068 /// - `nf` — Vector segment field count.
42069 pub fn vloxei64_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
42070 where
42071 Self: Vloxei64VEmitter<T0, T1, T2, T3, T4>,
42072 {
42073 <Self as Vloxei64VEmitter<T0, T1, T2, T3, T4>>::vloxei64_v(self, vd, rs1, vs2, vm, nf);
42074 }
42075 /// RISC-V `vloxei8.v` instruction.
42076 ///
42077 /// # Forms
42078 /// Assembly: `vloxei8.v vm, vs2, xs1, vd`
42079 /// Rust: `vloxei8_v(vd, rs1, vs2, vm, nf)`
42080 ///
42081 /// # Arguments
42082 /// - `vd` — Vector register operand.
42083 /// - `rs1` — Memory base register.
42084 /// - `vs2` — Vector register operand.
42085 /// - `vm` — Vector mask control.
42086 /// - `nf` — Vector segment field count.
42087 pub fn vloxei8_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
42088 where
42089 Self: Vloxei8VEmitter<T0, T1, T2, T3, T4>,
42090 {
42091 <Self as Vloxei8VEmitter<T0, T1, T2, T3, T4>>::vloxei8_v(self, vd, rs1, vs2, vm, nf);
42092 }
42093 /// RISC-V `vlse16.v` instruction.
42094 ///
42095 /// # Forms
42096 /// Assembly: `vlse16.v vm, xs2, xs1, vd`
42097 /// Rust: `vlse16_v(vd, rs1, rs2, vm, nf)`
42098 ///
42099 /// # Arguments
42100 /// - `vd` — Vector register operand.
42101 /// - `rs1` — Memory base register.
42102 /// - `rs2` — Source register.
42103 /// - `vm` — Vector mask control.
42104 /// - `nf` — Vector segment field count.
42105 pub fn vlse16_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, rs2: T2, vm: T3, nf: T4)
42106 where
42107 Self: Vlse16VEmitter<T0, T1, T2, T3, T4>,
42108 {
42109 <Self as Vlse16VEmitter<T0, T1, T2, T3, T4>>::vlse16_v(self, vd, rs1, rs2, vm, nf);
42110 }
42111 /// RISC-V `vlse32.v` instruction.
42112 ///
42113 /// # Forms
42114 /// Assembly: `vlse32.v vm, xs2, xs1, vd`
42115 /// Rust: `vlse32_v(vd, rs1, rs2, vm, nf)`
42116 ///
42117 /// # Arguments
42118 /// - `vd` — Vector register operand.
42119 /// - `rs1` — Memory base register.
42120 /// - `rs2` — Source register.
42121 /// - `vm` — Vector mask control.
42122 /// - `nf` — Vector segment field count.
42123 pub fn vlse32_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, rs2: T2, vm: T3, nf: T4)
42124 where
42125 Self: Vlse32VEmitter<T0, T1, T2, T3, T4>,
42126 {
42127 <Self as Vlse32VEmitter<T0, T1, T2, T3, T4>>::vlse32_v(self, vd, rs1, rs2, vm, nf);
42128 }
42129 /// RISC-V `vlse64.v` instruction.
42130 ///
42131 /// # Forms
42132 /// Assembly: `vlse64.v vm, xs2, xs1, vd`
42133 /// Rust: `vlse64_v(vd, rs1, rs2, vm, nf)`
42134 ///
42135 /// # Arguments
42136 /// - `vd` — Vector register operand.
42137 /// - `rs1` — Memory base register.
42138 /// - `rs2` — Source register.
42139 /// - `vm` — Vector mask control.
42140 /// - `nf` — Vector segment field count.
42141 pub fn vlse64_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, rs2: T2, vm: T3, nf: T4)
42142 where
42143 Self: Vlse64VEmitter<T0, T1, T2, T3, T4>,
42144 {
42145 <Self as Vlse64VEmitter<T0, T1, T2, T3, T4>>::vlse64_v(self, vd, rs1, rs2, vm, nf);
42146 }
42147 /// RISC-V `vlse8.v` instruction.
42148 ///
42149 /// # Forms
42150 /// Assembly: `vlse8.v vm, xs2, xs1, vd`
42151 /// Rust: `vlse8_v(vd, rs1, rs2, vm, nf)`
42152 ///
42153 /// # Arguments
42154 /// - `vd` — Vector register operand.
42155 /// - `rs1` — Memory base register.
42156 /// - `rs2` — Source register.
42157 /// - `vm` — Vector mask control.
42158 /// - `nf` — Vector segment field count.
42159 pub fn vlse8_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, rs2: T2, vm: T3, nf: T4)
42160 where
42161 Self: Vlse8VEmitter<T0, T1, T2, T3, T4>,
42162 {
42163 <Self as Vlse8VEmitter<T0, T1, T2, T3, T4>>::vlse8_v(self, vd, rs1, rs2, vm, nf);
42164 }
42165 /// RISC-V `vluxei16.v` instruction.
42166 ///
42167 /// # Forms
42168 /// Assembly: `vluxei16.v vm, vs2, xs1, vd`
42169 /// Rust: `vluxei16_v(vd, rs1, vs2, vm, nf)`
42170 ///
42171 /// # Arguments
42172 /// - `vd` — Vector register operand.
42173 /// - `rs1` — Memory base register.
42174 /// - `vs2` — Vector register operand.
42175 /// - `vm` — Vector mask control.
42176 /// - `nf` — Vector segment field count.
42177 pub fn vluxei16_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
42178 where
42179 Self: Vluxei16VEmitter<T0, T1, T2, T3, T4>,
42180 {
42181 <Self as Vluxei16VEmitter<T0, T1, T2, T3, T4>>::vluxei16_v(self, vd, rs1, vs2, vm, nf);
42182 }
42183 /// RISC-V `vluxei32.v` instruction.
42184 ///
42185 /// # Forms
42186 /// Assembly: `vluxei32.v vm, vs2, xs1, vd`
42187 /// Rust: `vluxei32_v(vd, rs1, vs2, vm, nf)`
42188 ///
42189 /// # Arguments
42190 /// - `vd` — Vector register operand.
42191 /// - `rs1` — Memory base register.
42192 /// - `vs2` — Vector register operand.
42193 /// - `vm` — Vector mask control.
42194 /// - `nf` — Vector segment field count.
42195 pub fn vluxei32_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
42196 where
42197 Self: Vluxei32VEmitter<T0, T1, T2, T3, T4>,
42198 {
42199 <Self as Vluxei32VEmitter<T0, T1, T2, T3, T4>>::vluxei32_v(self, vd, rs1, vs2, vm, nf);
42200 }
42201 /// RISC-V `vluxei64.v` instruction.
42202 ///
42203 /// # Forms
42204 /// Assembly: `vluxei64.v vm, vs2, xs1, vd`
42205 /// Rust: `vluxei64_v(vd, rs1, vs2, vm, nf)`
42206 ///
42207 /// # Arguments
42208 /// - `vd` — Vector register operand.
42209 /// - `rs1` — Memory base register.
42210 /// - `vs2` — Vector register operand.
42211 /// - `vm` — Vector mask control.
42212 /// - `nf` — Vector segment field count.
42213 pub fn vluxei64_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
42214 where
42215 Self: Vluxei64VEmitter<T0, T1, T2, T3, T4>,
42216 {
42217 <Self as Vluxei64VEmitter<T0, T1, T2, T3, T4>>::vluxei64_v(self, vd, rs1, vs2, vm, nf);
42218 }
42219 /// RISC-V `vluxei8.v` instruction.
42220 ///
42221 /// # Forms
42222 /// Assembly: `vluxei8.v vm, vs2, xs1, vd`
42223 /// Rust: `vluxei8_v(vd, rs1, vs2, vm, nf)`
42224 ///
42225 /// # Arguments
42226 /// - `vd` — Vector register operand.
42227 /// - `rs1` — Memory base register.
42228 /// - `vs2` — Vector register operand.
42229 /// - `vm` — Vector mask control.
42230 /// - `nf` — Vector segment field count.
42231 pub fn vluxei8_v<T0, T1, T2, T3, T4>(&mut self, vd: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
42232 where
42233 Self: Vluxei8VEmitter<T0, T1, T2, T3, T4>,
42234 {
42235 <Self as Vluxei8VEmitter<T0, T1, T2, T3, T4>>::vluxei8_v(self, vd, rs1, vs2, vm, nf);
42236 }
42237 /// RISC-V `vmacc.vv` instruction.
42238 ///
42239 /// # Forms
42240 /// Assembly: `vmacc.vv vm, vs2, vs1, vd`
42241 /// Rust: `vmacc_vv(vd, vs1, vs2, vm)`
42242 ///
42243 /// # Arguments
42244 /// - `vd` — Vector register operand.
42245 /// - `vs1` — Vector register operand.
42246 /// - `vs2` — Vector register operand.
42247 /// - `vm` — Vector mask control.
42248 pub fn vmacc_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42249 where
42250 Self: VmaccVvEmitter<T0, T1, T2, T3>,
42251 {
42252 <Self as VmaccVvEmitter<T0, T1, T2, T3>>::vmacc_vv(self, vd, vs1, vs2, vm);
42253 }
42254 /// RISC-V `vmacc.vx` instruction.
42255 ///
42256 /// # Forms
42257 /// Assembly: `vmacc.vx vm, vs2, xs1, vd`
42258 /// Rust: `vmacc_vx(vd, vs2, rs1, vm)`
42259 ///
42260 /// # Arguments
42261 /// - `vd` — Vector register operand.
42262 /// - `vs2` — Vector register operand.
42263 /// - `rs1` — Source register.
42264 /// - `vm` — Vector mask control.
42265 pub fn vmacc_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42266 where
42267 Self: VmaccVxEmitter<T0, T1, T2, T3>,
42268 {
42269 <Self as VmaccVxEmitter<T0, T1, T2, T3>>::vmacc_vx(self, vd, vs2, rs1, vm);
42270 }
42271 /// RISC-V `vmadc.vi` instruction.
42272 ///
42273 /// # Forms
42274 /// Assembly: `vmadc.vi vs2, vd, imm`
42275 /// Rust: `vmadc_vi(vd, vs2, simm5)`
42276 ///
42277 /// # Arguments
42278 /// - `vd` — Vector register operand.
42279 /// - `vs2` — Vector register operand.
42280 /// - `simm5` — Immediate encoding value.
42281 pub fn vmadc_vi<T0, T1, T2>(&mut self, vd: T0, vs2: T1, simm5: T2)
42282 where
42283 Self: VmadcViEmitter<T0, T1, T2>,
42284 {
42285 <Self as VmadcViEmitter<T0, T1, T2>>::vmadc_vi(self, vd, vs2, simm5);
42286 }
42287 /// RISC-V `vmadc.vim` instruction.
42288 ///
42289 /// # Forms
42290 /// Assembly: `vmadc.vim vs2, vd, imm`
42291 /// Rust: `vmadc_vim(vd, vs2, simm5)`
42292 ///
42293 /// # Arguments
42294 /// - `vd` — Vector register operand.
42295 /// - `vs2` — Vector register operand.
42296 /// - `simm5` — Immediate encoding value.
42297 pub fn vmadc_vim<T0, T1, T2>(&mut self, vd: T0, vs2: T1, simm5: T2)
42298 where
42299 Self: VmadcVimEmitter<T0, T1, T2>,
42300 {
42301 <Self as VmadcVimEmitter<T0, T1, T2>>::vmadc_vim(self, vd, vs2, simm5);
42302 }
42303 /// RISC-V `vmadc.vv` instruction.
42304 ///
42305 /// # Forms
42306 /// Assembly: `vmadc.vv vs2, vs1, vd`
42307 /// Rust: `vmadc_vv(vd, vs1, vs2)`
42308 ///
42309 /// # Arguments
42310 /// - `vd` — Vector register operand.
42311 /// - `vs1` — Vector register operand.
42312 /// - `vs2` — Vector register operand.
42313 pub fn vmadc_vv<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42314 where
42315 Self: VmadcVvEmitter<T0, T1, T2>,
42316 {
42317 <Self as VmadcVvEmitter<T0, T1, T2>>::vmadc_vv(self, vd, vs1, vs2);
42318 }
42319 /// RISC-V `vmadc.vvm` instruction.
42320 ///
42321 /// # Forms
42322 /// Assembly: `vmadc.vvm vs2, vs1, vd`
42323 /// Rust: `vmadc_vvm(vd, vs1, vs2)`
42324 ///
42325 /// # Arguments
42326 /// - `vd` — Vector register operand.
42327 /// - `vs1` — Vector register operand.
42328 /// - `vs2` — Vector register operand.
42329 pub fn vmadc_vvm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42330 where
42331 Self: VmadcVvmEmitter<T0, T1, T2>,
42332 {
42333 <Self as VmadcVvmEmitter<T0, T1, T2>>::vmadc_vvm(self, vd, vs1, vs2);
42334 }
42335 /// RISC-V `vmadc.vx` instruction.
42336 ///
42337 /// # Forms
42338 /// Assembly: `vmadc.vx vs2, xs1, vd`
42339 /// Rust: `vmadc_vx(vd, rs1, vs2)`
42340 ///
42341 /// # Arguments
42342 /// - `vd` — Vector register operand.
42343 /// - `rs1` — Source register.
42344 /// - `vs2` — Vector register operand.
42345 pub fn vmadc_vx<T0, T1, T2>(&mut self, vd: T0, rs1: T1, vs2: T2)
42346 where
42347 Self: VmadcVxEmitter<T0, T1, T2>,
42348 {
42349 <Self as VmadcVxEmitter<T0, T1, T2>>::vmadc_vx(self, vd, rs1, vs2);
42350 }
42351 /// RISC-V `vmadc.vxm` instruction.
42352 ///
42353 /// # Forms
42354 /// Assembly: `vmadc.vxm vs2, xs1, vd`
42355 /// Rust: `vmadc_vxm(vd, rs1, vs2)`
42356 ///
42357 /// # Arguments
42358 /// - `vd` — Vector register operand.
42359 /// - `rs1` — Source register.
42360 /// - `vs2` — Vector register operand.
42361 pub fn vmadc_vxm<T0, T1, T2>(&mut self, vd: T0, rs1: T1, vs2: T2)
42362 where
42363 Self: VmadcVxmEmitter<T0, T1, T2>,
42364 {
42365 <Self as VmadcVxmEmitter<T0, T1, T2>>::vmadc_vxm(self, vd, rs1, vs2);
42366 }
42367 /// RISC-V `vmadd.vv` instruction.
42368 ///
42369 /// # Forms
42370 /// Assembly: `vmadd.vv vm, vs2, vs1, vd`
42371 /// Rust: `vmadd_vv(vd, vs1, vs2, vm)`
42372 ///
42373 /// # Arguments
42374 /// - `vd` — Vector register operand.
42375 /// - `vs1` — Vector register operand.
42376 /// - `vs2` — Vector register operand.
42377 /// - `vm` — Vector mask control.
42378 pub fn vmadd_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42379 where
42380 Self: VmaddVvEmitter<T0, T1, T2, T3>,
42381 {
42382 <Self as VmaddVvEmitter<T0, T1, T2, T3>>::vmadd_vv(self, vd, vs1, vs2, vm);
42383 }
42384 /// RISC-V `vmadd.vx` instruction.
42385 ///
42386 /// # Forms
42387 /// Assembly: `vmadd.vx vm, vs2, xs1, vd`
42388 /// Rust: `vmadd_vx(vd, vs2, rs1, vm)`
42389 ///
42390 /// # Arguments
42391 /// - `vd` — Vector register operand.
42392 /// - `vs2` — Vector register operand.
42393 /// - `rs1` — Source register.
42394 /// - `vm` — Vector mask control.
42395 pub fn vmadd_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42396 where
42397 Self: VmaddVxEmitter<T0, T1, T2, T3>,
42398 {
42399 <Self as VmaddVxEmitter<T0, T1, T2, T3>>::vmadd_vx(self, vd, vs2, rs1, vm);
42400 }
42401 /// RISC-V `vmand.mm` instruction.
42402 ///
42403 /// # Forms
42404 /// Assembly: `vmand.mm vs2, vs1, vd`
42405 /// Rust: `vmand_mm(vd, vs1, vs2)`
42406 ///
42407 /// # Arguments
42408 /// - `vd` — Vector register operand.
42409 /// - `vs1` — Vector register operand.
42410 /// - `vs2` — Vector register operand.
42411 pub fn vmand_mm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42412 where
42413 Self: VmandMmEmitter<T0, T1, T2>,
42414 {
42415 <Self as VmandMmEmitter<T0, T1, T2>>::vmand_mm(self, vd, vs1, vs2);
42416 }
42417 /// RISC-V `vmandn.mm` instruction.
42418 ///
42419 /// # Forms
42420 /// Assembly: `vmandn.mm vs2, vs1, vd`
42421 /// Rust: `vmandn_mm(vd, vs1, vs2)`
42422 ///
42423 /// # Arguments
42424 /// - `vd` — Vector register operand.
42425 /// - `vs1` — Vector register operand.
42426 /// - `vs2` — Vector register operand.
42427 pub fn vmandn_mm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42428 where
42429 Self: VmandnMmEmitter<T0, T1, T2>,
42430 {
42431 <Self as VmandnMmEmitter<T0, T1, T2>>::vmandn_mm(self, vd, vs1, vs2);
42432 }
42433 /// RISC-V `vmandnot.mm` instruction.
42434 ///
42435 /// # Forms
42436 /// Assembly: `vmandnot.mm vd vs1 vs2 vm`
42437 /// Rust: `vmandnot_mm(vd, vs1, vs2, vm)`
42438 ///
42439 /// # Arguments
42440 /// - `vd` — Vector register operand.
42441 /// - `vs1` — Vector register operand.
42442 /// - `vs2` — Vector register operand.
42443 /// - `vm` — Vector mask control.
42444 pub fn vmandnot_mm<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42445 where
42446 Self: VmandnotMmEmitter<T0, T1, T2, T3>,
42447 {
42448 <Self as VmandnotMmEmitter<T0, T1, T2, T3>>::vmandnot_mm(self, vd, vs1, vs2, vm);
42449 }
42450 /// RISC-V `vmax.vv` instruction.
42451 ///
42452 /// # Forms
42453 /// Assembly: `vmax.vv vm, vs2, vs1, vd`
42454 /// Rust: `vmax_vv(vd, vs1, vs2, vm)`
42455 ///
42456 /// # Arguments
42457 /// - `vd` — Vector register operand.
42458 /// - `vs1` — Vector register operand.
42459 /// - `vs2` — Vector register operand.
42460 /// - `vm` — Vector mask control.
42461 pub fn vmax_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42462 where
42463 Self: VmaxVvEmitter<T0, T1, T2, T3>,
42464 {
42465 <Self as VmaxVvEmitter<T0, T1, T2, T3>>::vmax_vv(self, vd, vs1, vs2, vm);
42466 }
42467 /// RISC-V `vmax.vx` instruction.
42468 ///
42469 /// # Forms
42470 /// Assembly: `vmax.vx vm, vs2, xs1, vd`
42471 /// Rust: `vmax_vx(vd, vs2, rs1, vm)`
42472 ///
42473 /// # Arguments
42474 /// - `vd` — Vector register operand.
42475 /// - `vs2` — Vector register operand.
42476 /// - `rs1` — Source register.
42477 /// - `vm` — Vector mask control.
42478 pub fn vmax_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42479 where
42480 Self: VmaxVxEmitter<T0, T1, T2, T3>,
42481 {
42482 <Self as VmaxVxEmitter<T0, T1, T2, T3>>::vmax_vx(self, vd, vs2, rs1, vm);
42483 }
42484 /// RISC-V `vmaxu.vv` instruction.
42485 ///
42486 /// # Forms
42487 /// Assembly: `vmaxu.vv vm, vs2, vs1, vd`
42488 /// Rust: `vmaxu_vv(vd, vs1, vs2, vm)`
42489 ///
42490 /// # Arguments
42491 /// - `vd` — Vector register operand.
42492 /// - `vs1` — Vector register operand.
42493 /// - `vs2` — Vector register operand.
42494 /// - `vm` — Vector mask control.
42495 pub fn vmaxu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42496 where
42497 Self: VmaxuVvEmitter<T0, T1, T2, T3>,
42498 {
42499 <Self as VmaxuVvEmitter<T0, T1, T2, T3>>::vmaxu_vv(self, vd, vs1, vs2, vm);
42500 }
42501 /// RISC-V `vmaxu.vx` instruction.
42502 ///
42503 /// # Forms
42504 /// Assembly: `vmaxu.vx vm, vs2, xs1, vd`
42505 /// Rust: `vmaxu_vx(vd, vs2, rs1, vm)`
42506 ///
42507 /// # Arguments
42508 /// - `vd` — Vector register operand.
42509 /// - `vs2` — Vector register operand.
42510 /// - `rs1` — Source register.
42511 /// - `vm` — Vector mask control.
42512 pub fn vmaxu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42513 where
42514 Self: VmaxuVxEmitter<T0, T1, T2, T3>,
42515 {
42516 <Self as VmaxuVxEmitter<T0, T1, T2, T3>>::vmaxu_vx(self, vd, vs2, rs1, vm);
42517 }
42518 /// RISC-V `vmerge.vim` instruction.
42519 ///
42520 /// # Forms
42521 /// Assembly: `vmerge.vim vs2, vd, imm`
42522 /// Rust: `vmerge_vim(vd, vs2, simm5)`
42523 ///
42524 /// # Arguments
42525 /// - `vd` — Vector register operand.
42526 /// - `vs2` — Vector register operand.
42527 /// - `simm5` — Immediate encoding value.
42528 pub fn vmerge_vim<T0, T1, T2>(&mut self, vd: T0, vs2: T1, simm5: T2)
42529 where
42530 Self: VmergeVimEmitter<T0, T1, T2>,
42531 {
42532 <Self as VmergeVimEmitter<T0, T1, T2>>::vmerge_vim(self, vd, vs2, simm5);
42533 }
42534 /// RISC-V `vmerge.vvm` instruction.
42535 ///
42536 /// # Forms
42537 /// Assembly: `vmerge.vvm vs2, vs1, vd`
42538 /// Rust: `vmerge_vvm(vd, vs1, vs2)`
42539 ///
42540 /// # Arguments
42541 /// - `vd` — Vector register operand.
42542 /// - `vs1` — Vector register operand.
42543 /// - `vs2` — Vector register operand.
42544 pub fn vmerge_vvm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42545 where
42546 Self: VmergeVvmEmitter<T0, T1, T2>,
42547 {
42548 <Self as VmergeVvmEmitter<T0, T1, T2>>::vmerge_vvm(self, vd, vs1, vs2);
42549 }
42550 /// RISC-V `vmerge.vxm` instruction.
42551 ///
42552 /// # Forms
42553 /// Assembly: `vmerge.vxm vs2, xs1, vd`
42554 /// Rust: `vmerge_vxm(vd, rs1, vs2)`
42555 ///
42556 /// # Arguments
42557 /// - `vd` — Vector register operand.
42558 /// - `rs1` — Source register.
42559 /// - `vs2` — Vector register operand.
42560 pub fn vmerge_vxm<T0, T1, T2>(&mut self, vd: T0, rs1: T1, vs2: T2)
42561 where
42562 Self: VmergeVxmEmitter<T0, T1, T2>,
42563 {
42564 <Self as VmergeVxmEmitter<T0, T1, T2>>::vmerge_vxm(self, vd, rs1, vs2);
42565 }
42566 /// RISC-V `vmfeq.vf` instruction.
42567 ///
42568 /// # Forms
42569 /// Assembly: `vmfeq.vf vm, vs2, xs1, vd`
42570 /// Rust: `vmfeq_vf(vd, vs2, rs1, vm)`
42571 ///
42572 /// # Arguments
42573 /// - `vd` — Vector register operand.
42574 /// - `vs2` — Vector register operand.
42575 /// - `rs1` — Source register.
42576 /// - `vm` — Vector mask control.
42577 pub fn vmfeq_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42578 where
42579 Self: VmfeqVfEmitter<T0, T1, T2, T3>,
42580 {
42581 <Self as VmfeqVfEmitter<T0, T1, T2, T3>>::vmfeq_vf(self, vd, vs2, rs1, vm);
42582 }
42583 /// RISC-V `vmfeq.vv` instruction.
42584 ///
42585 /// # Forms
42586 /// Assembly: `vmfeq.vv vm, vs2, vs1, vd`
42587 /// Rust: `vmfeq_vv(vd, vs1, vs2, vm)`
42588 ///
42589 /// # Arguments
42590 /// - `vd` — Vector register operand.
42591 /// - `vs1` — Vector register operand.
42592 /// - `vs2` — Vector register operand.
42593 /// - `vm` — Vector mask control.
42594 pub fn vmfeq_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42595 where
42596 Self: VmfeqVvEmitter<T0, T1, T2, T3>,
42597 {
42598 <Self as VmfeqVvEmitter<T0, T1, T2, T3>>::vmfeq_vv(self, vd, vs1, vs2, vm);
42599 }
42600 /// RISC-V `vmfge.vf` instruction.
42601 ///
42602 /// # Forms
42603 /// Assembly: `vmfge.vf vm, vs2, xs1, vd`
42604 /// Rust: `vmfge_vf(vd, vs2, rs1, vm)`
42605 ///
42606 /// # Arguments
42607 /// - `vd` — Vector register operand.
42608 /// - `vs2` — Vector register operand.
42609 /// - `rs1` — Source register.
42610 /// - `vm` — Vector mask control.
42611 pub fn vmfge_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42612 where
42613 Self: VmfgeVfEmitter<T0, T1, T2, T3>,
42614 {
42615 <Self as VmfgeVfEmitter<T0, T1, T2, T3>>::vmfge_vf(self, vd, vs2, rs1, vm);
42616 }
42617 /// RISC-V `vmfgt.vf` instruction.
42618 ///
42619 /// # Forms
42620 /// Assembly: `vmfgt.vf vm, vs2, xs1, vd`
42621 /// Rust: `vmfgt_vf(vd, vs2, rs1, vm)`
42622 ///
42623 /// # Arguments
42624 /// - `vd` — Vector register operand.
42625 /// - `vs2` — Vector register operand.
42626 /// - `rs1` — Source register.
42627 /// - `vm` — Vector mask control.
42628 pub fn vmfgt_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42629 where
42630 Self: VmfgtVfEmitter<T0, T1, T2, T3>,
42631 {
42632 <Self as VmfgtVfEmitter<T0, T1, T2, T3>>::vmfgt_vf(self, vd, vs2, rs1, vm);
42633 }
42634 /// RISC-V `vmfle.vf` instruction.
42635 ///
42636 /// # Forms
42637 /// Assembly: `vmfle.vf vm, vs2, xs1, vd`
42638 /// Rust: `vmfle_vf(vd, vs2, rs1, vm)`
42639 ///
42640 /// # Arguments
42641 /// - `vd` — Vector register operand.
42642 /// - `vs2` — Vector register operand.
42643 /// - `rs1` — Source register.
42644 /// - `vm` — Vector mask control.
42645 pub fn vmfle_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42646 where
42647 Self: VmfleVfEmitter<T0, T1, T2, T3>,
42648 {
42649 <Self as VmfleVfEmitter<T0, T1, T2, T3>>::vmfle_vf(self, vd, vs2, rs1, vm);
42650 }
42651 /// RISC-V `vmfle.vv` instruction.
42652 ///
42653 /// # Forms
42654 /// Assembly: `vmfle.vv vm, vs2, vs1, vd`
42655 /// Rust: `vmfle_vv(vd, vs1, vs2, vm)`
42656 ///
42657 /// # Arguments
42658 /// - `vd` — Vector register operand.
42659 /// - `vs1` — Vector register operand.
42660 /// - `vs2` — Vector register operand.
42661 /// - `vm` — Vector mask control.
42662 pub fn vmfle_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42663 where
42664 Self: VmfleVvEmitter<T0, T1, T2, T3>,
42665 {
42666 <Self as VmfleVvEmitter<T0, T1, T2, T3>>::vmfle_vv(self, vd, vs1, vs2, vm);
42667 }
42668 /// RISC-V `vmflt.vf` instruction.
42669 ///
42670 /// # Forms
42671 /// Assembly: `vmflt.vf vm, vs2, xs1, vd`
42672 /// Rust: `vmflt_vf(vd, vs2, rs1, vm)`
42673 ///
42674 /// # Arguments
42675 /// - `vd` — Vector register operand.
42676 /// - `vs2` — Vector register operand.
42677 /// - `rs1` — Source register.
42678 /// - `vm` — Vector mask control.
42679 pub fn vmflt_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42680 where
42681 Self: VmfltVfEmitter<T0, T1, T2, T3>,
42682 {
42683 <Self as VmfltVfEmitter<T0, T1, T2, T3>>::vmflt_vf(self, vd, vs2, rs1, vm);
42684 }
42685 /// RISC-V `vmflt.vv` instruction.
42686 ///
42687 /// # Forms
42688 /// Assembly: `vmflt.vv vm, vs2, vs1, vd`
42689 /// Rust: `vmflt_vv(vd, vs1, vs2, vm)`
42690 ///
42691 /// # Arguments
42692 /// - `vd` — Vector register operand.
42693 /// - `vs1` — Vector register operand.
42694 /// - `vs2` — Vector register operand.
42695 /// - `vm` — Vector mask control.
42696 pub fn vmflt_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42697 where
42698 Self: VmfltVvEmitter<T0, T1, T2, T3>,
42699 {
42700 <Self as VmfltVvEmitter<T0, T1, T2, T3>>::vmflt_vv(self, vd, vs1, vs2, vm);
42701 }
42702 /// RISC-V `vmfne.vf` instruction.
42703 ///
42704 /// # Forms
42705 /// Assembly: `vmfne.vf vm, vs2, xs1, vd`
42706 /// Rust: `vmfne_vf(vd, vs2, rs1, vm)`
42707 ///
42708 /// # Arguments
42709 /// - `vd` — Vector register operand.
42710 /// - `vs2` — Vector register operand.
42711 /// - `rs1` — Source register.
42712 /// - `vm` — Vector mask control.
42713 pub fn vmfne_vf<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42714 where
42715 Self: VmfneVfEmitter<T0, T1, T2, T3>,
42716 {
42717 <Self as VmfneVfEmitter<T0, T1, T2, T3>>::vmfne_vf(self, vd, vs2, rs1, vm);
42718 }
42719 /// RISC-V `vmfne.vv` instruction.
42720 ///
42721 /// # Forms
42722 /// Assembly: `vmfne.vv vm, vs2, vs1, vd`
42723 /// Rust: `vmfne_vv(vd, vs1, vs2, vm)`
42724 ///
42725 /// # Arguments
42726 /// - `vd` — Vector register operand.
42727 /// - `vs1` — Vector register operand.
42728 /// - `vs2` — Vector register operand.
42729 /// - `vm` — Vector mask control.
42730 pub fn vmfne_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42731 where
42732 Self: VmfneVvEmitter<T0, T1, T2, T3>,
42733 {
42734 <Self as VmfneVvEmitter<T0, T1, T2, T3>>::vmfne_vv(self, vd, vs1, vs2, vm);
42735 }
42736 /// RISC-V `vmin.vv` instruction.
42737 ///
42738 /// # Forms
42739 /// Assembly: `vmin.vv vm, vs2, vs1, vd`
42740 /// Rust: `vmin_vv(vd, vs1, vs2, vm)`
42741 ///
42742 /// # Arguments
42743 /// - `vd` — Vector register operand.
42744 /// - `vs1` — Vector register operand.
42745 /// - `vs2` — Vector register operand.
42746 /// - `vm` — Vector mask control.
42747 pub fn vmin_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42748 where
42749 Self: VminVvEmitter<T0, T1, T2, T3>,
42750 {
42751 <Self as VminVvEmitter<T0, T1, T2, T3>>::vmin_vv(self, vd, vs1, vs2, vm);
42752 }
42753 /// RISC-V `vmin.vx` instruction.
42754 ///
42755 /// # Forms
42756 /// Assembly: `vmin.vx vm, vs2, xs1, vd`
42757 /// Rust: `vmin_vx(vd, vs2, rs1, vm)`
42758 ///
42759 /// # Arguments
42760 /// - `vd` — Vector register operand.
42761 /// - `vs2` — Vector register operand.
42762 /// - `rs1` — Source register.
42763 /// - `vm` — Vector mask control.
42764 pub fn vmin_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42765 where
42766 Self: VminVxEmitter<T0, T1, T2, T3>,
42767 {
42768 <Self as VminVxEmitter<T0, T1, T2, T3>>::vmin_vx(self, vd, vs2, rs1, vm);
42769 }
42770 /// RISC-V `vminu.vv` instruction.
42771 ///
42772 /// # Forms
42773 /// Assembly: `vminu.vv vm, vs2, vs1, vd`
42774 /// Rust: `vminu_vv(vd, vs1, vs2, vm)`
42775 ///
42776 /// # Arguments
42777 /// - `vd` — Vector register operand.
42778 /// - `vs1` — Vector register operand.
42779 /// - `vs2` — Vector register operand.
42780 /// - `vm` — Vector mask control.
42781 pub fn vminu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42782 where
42783 Self: VminuVvEmitter<T0, T1, T2, T3>,
42784 {
42785 <Self as VminuVvEmitter<T0, T1, T2, T3>>::vminu_vv(self, vd, vs1, vs2, vm);
42786 }
42787 /// RISC-V `vminu.vx` instruction.
42788 ///
42789 /// # Forms
42790 /// Assembly: `vminu.vx vm, vs2, xs1, vd`
42791 /// Rust: `vminu_vx(vd, vs2, rs1, vm)`
42792 ///
42793 /// # Arguments
42794 /// - `vd` — Vector register operand.
42795 /// - `vs2` — Vector register operand.
42796 /// - `rs1` — Source register.
42797 /// - `vm` — Vector mask control.
42798 pub fn vminu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
42799 where
42800 Self: VminuVxEmitter<T0, T1, T2, T3>,
42801 {
42802 <Self as VminuVxEmitter<T0, T1, T2, T3>>::vminu_vx(self, vd, vs2, rs1, vm);
42803 }
42804 /// RISC-V `vmnand.mm` instruction.
42805 ///
42806 /// # Forms
42807 /// Assembly: `vmnand.mm vs2, vs1, vd`
42808 /// Rust: `vmnand_mm(vd, vs1, vs2)`
42809 ///
42810 /// # Arguments
42811 /// - `vd` — Vector register operand.
42812 /// - `vs1` — Vector register operand.
42813 /// - `vs2` — Vector register operand.
42814 pub fn vmnand_mm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42815 where
42816 Self: VmnandMmEmitter<T0, T1, T2>,
42817 {
42818 <Self as VmnandMmEmitter<T0, T1, T2>>::vmnand_mm(self, vd, vs1, vs2);
42819 }
42820 /// RISC-V `vmnor.mm` instruction.
42821 ///
42822 /// # Forms
42823 /// Assembly: `vmnor.mm vs2, vs1, vd`
42824 /// Rust: `vmnor_mm(vd, vs1, vs2)`
42825 ///
42826 /// # Arguments
42827 /// - `vd` — Vector register operand.
42828 /// - `vs1` — Vector register operand.
42829 /// - `vs2` — Vector register operand.
42830 pub fn vmnor_mm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42831 where
42832 Self: VmnorMmEmitter<T0, T1, T2>,
42833 {
42834 <Self as VmnorMmEmitter<T0, T1, T2>>::vmnor_mm(self, vd, vs1, vs2);
42835 }
42836 /// RISC-V `vmor.mm` instruction.
42837 ///
42838 /// # Forms
42839 /// Assembly: `vmor.mm vs2, vs1, vd`
42840 /// Rust: `vmor_mm(vd, vs1, vs2)`
42841 ///
42842 /// # Arguments
42843 /// - `vd` — Vector register operand.
42844 /// - `vs1` — Vector register operand.
42845 /// - `vs2` — Vector register operand.
42846 pub fn vmor_mm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42847 where
42848 Self: VmorMmEmitter<T0, T1, T2>,
42849 {
42850 <Self as VmorMmEmitter<T0, T1, T2>>::vmor_mm(self, vd, vs1, vs2);
42851 }
42852 /// RISC-V `vmorn.mm` instruction.
42853 ///
42854 /// # Forms
42855 /// Assembly: `vmorn.mm vs2, vs1, vd`
42856 /// Rust: `vmorn_mm(vd, vs1, vs2)`
42857 ///
42858 /// # Arguments
42859 /// - `vd` — Vector register operand.
42860 /// - `vs1` — Vector register operand.
42861 /// - `vs2` — Vector register operand.
42862 pub fn vmorn_mm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42863 where
42864 Self: VmornMmEmitter<T0, T1, T2>,
42865 {
42866 <Self as VmornMmEmitter<T0, T1, T2>>::vmorn_mm(self, vd, vs1, vs2);
42867 }
42868 /// RISC-V `vmornot.mm` instruction.
42869 ///
42870 /// # Forms
42871 /// Assembly: `vmornot.mm vd vs1 vs2 vm`
42872 /// Rust: `vmornot_mm(vd, vs1, vs2, vm)`
42873 ///
42874 /// # Arguments
42875 /// - `vd` — Vector register operand.
42876 /// - `vs1` — Vector register operand.
42877 /// - `vs2` — Vector register operand.
42878 /// - `vm` — Vector mask control.
42879 pub fn vmornot_mm<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42880 where
42881 Self: VmornotMmEmitter<T0, T1, T2, T3>,
42882 {
42883 <Self as VmornotMmEmitter<T0, T1, T2, T3>>::vmornot_mm(self, vd, vs1, vs2, vm);
42884 }
42885 /// RISC-V `vmsbc.vv` instruction.
42886 ///
42887 /// # Forms
42888 /// Assembly: `vmsbc.vv vs2, vs1, vd`
42889 /// Rust: `vmsbc_vv(vd, vs1, vs2)`
42890 ///
42891 /// # Arguments
42892 /// - `vd` — Vector register operand.
42893 /// - `vs1` — Vector register operand.
42894 /// - `vs2` — Vector register operand.
42895 pub fn vmsbc_vv<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42896 where
42897 Self: VmsbcVvEmitter<T0, T1, T2>,
42898 {
42899 <Self as VmsbcVvEmitter<T0, T1, T2>>::vmsbc_vv(self, vd, vs1, vs2);
42900 }
42901 /// RISC-V `vmsbc.vvm` instruction.
42902 ///
42903 /// # Forms
42904 /// Assembly: `vmsbc.vvm vs2, vs1, vd`
42905 /// Rust: `vmsbc_vvm(vd, vs1, vs2)`
42906 ///
42907 /// # Arguments
42908 /// - `vd` — Vector register operand.
42909 /// - `vs1` — Vector register operand.
42910 /// - `vs2` — Vector register operand.
42911 pub fn vmsbc_vvm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
42912 where
42913 Self: VmsbcVvmEmitter<T0, T1, T2>,
42914 {
42915 <Self as VmsbcVvmEmitter<T0, T1, T2>>::vmsbc_vvm(self, vd, vs1, vs2);
42916 }
42917 /// RISC-V `vmsbc.vx` instruction.
42918 ///
42919 /// # Forms
42920 /// Assembly: `vmsbc.vx vs2, xs1, vd`
42921 /// Rust: `vmsbc_vx(vd, rs1, vs2)`
42922 ///
42923 /// # Arguments
42924 /// - `vd` — Vector register operand.
42925 /// - `rs1` — Source register.
42926 /// - `vs2` — Vector register operand.
42927 pub fn vmsbc_vx<T0, T1, T2>(&mut self, vd: T0, rs1: T1, vs2: T2)
42928 where
42929 Self: VmsbcVxEmitter<T0, T1, T2>,
42930 {
42931 <Self as VmsbcVxEmitter<T0, T1, T2>>::vmsbc_vx(self, vd, rs1, vs2);
42932 }
42933 /// RISC-V `vmsbc.vxm` instruction.
42934 ///
42935 /// # Forms
42936 /// Assembly: `vmsbc.vxm vs2, xs1, vd`
42937 /// Rust: `vmsbc_vxm(vd, rs1, vs2)`
42938 ///
42939 /// # Arguments
42940 /// - `vd` — Vector register operand.
42941 /// - `rs1` — Source register.
42942 /// - `vs2` — Vector register operand.
42943 pub fn vmsbc_vxm<T0, T1, T2>(&mut self, vd: T0, rs1: T1, vs2: T2)
42944 where
42945 Self: VmsbcVxmEmitter<T0, T1, T2>,
42946 {
42947 <Self as VmsbcVxmEmitter<T0, T1, T2>>::vmsbc_vxm(self, vd, rs1, vs2);
42948 }
42949 /// RISC-V `vmsbf.m` instruction.
42950 ///
42951 /// # Forms
42952 /// Assembly: `vmsbf.m vm, vs2, vd`
42953 /// Rust: `vmsbf_m(vd, vs2, vm)`
42954 ///
42955 /// # Arguments
42956 /// - `vd` — Vector register operand.
42957 /// - `vs2` — Vector register operand.
42958 /// - `vm` — Vector mask control.
42959 pub fn vmsbf_m<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
42960 where
42961 Self: VmsbfMEmitter<T0, T1, T2>,
42962 {
42963 <Self as VmsbfMEmitter<T0, T1, T2>>::vmsbf_m(self, vd, vs2, vm);
42964 }
42965 /// RISC-V `vmseq.vi` instruction.
42966 ///
42967 /// # Forms
42968 /// Assembly: `vmseq.vi vm, vs2, vd, imm`
42969 /// Rust: `vmseq_vi(vd, vs2, simm5, vm)`
42970 ///
42971 /// # Arguments
42972 /// - `vd` — Vector register operand.
42973 /// - `vs2` — Vector register operand.
42974 /// - `simm5` — Immediate encoding value.
42975 /// - `vm` — Vector mask control.
42976 pub fn vmseq_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
42977 where
42978 Self: VmseqViEmitter<T0, T1, T2, T3>,
42979 {
42980 <Self as VmseqViEmitter<T0, T1, T2, T3>>::vmseq_vi(self, vd, vs2, simm5, vm);
42981 }
42982 /// RISC-V `vmseq.vv` instruction.
42983 ///
42984 /// # Forms
42985 /// Assembly: `vmseq.vv vm, vs2, vs1, vd`
42986 /// Rust: `vmseq_vv(vd, vs1, vs2, vm)`
42987 ///
42988 /// # Arguments
42989 /// - `vd` — Vector register operand.
42990 /// - `vs1` — Vector register operand.
42991 /// - `vs2` — Vector register operand.
42992 /// - `vm` — Vector mask control.
42993 pub fn vmseq_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
42994 where
42995 Self: VmseqVvEmitter<T0, T1, T2, T3>,
42996 {
42997 <Self as VmseqVvEmitter<T0, T1, T2, T3>>::vmseq_vv(self, vd, vs1, vs2, vm);
42998 }
42999 /// RISC-V `vmseq.vx` instruction.
43000 ///
43001 /// # Forms
43002 /// Assembly: `vmseq.vx vm, vs2, xs1, vd`
43003 /// Rust: `vmseq_vx(vd, vs2, rs1, vm)`
43004 ///
43005 /// # Arguments
43006 /// - `vd` — Vector register operand.
43007 /// - `vs2` — Vector register operand.
43008 /// - `rs1` — Source register.
43009 /// - `vm` — Vector mask control.
43010 pub fn vmseq_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43011 where
43012 Self: VmseqVxEmitter<T0, T1, T2, T3>,
43013 {
43014 <Self as VmseqVxEmitter<T0, T1, T2, T3>>::vmseq_vx(self, vd, vs2, rs1, vm);
43015 }
43016 /// RISC-V `vmsgt.vi` instruction.
43017 ///
43018 /// # Forms
43019 /// Assembly: `vmsgt.vi vm, vs2, vd, imm`
43020 /// Rust: `vmsgt_vi(vd, vs2, simm5, vm)`
43021 ///
43022 /// # Arguments
43023 /// - `vd` — Vector register operand.
43024 /// - `vs2` — Vector register operand.
43025 /// - `simm5` — Immediate encoding value.
43026 /// - `vm` — Vector mask control.
43027 pub fn vmsgt_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
43028 where
43029 Self: VmsgtViEmitter<T0, T1, T2, T3>,
43030 {
43031 <Self as VmsgtViEmitter<T0, T1, T2, T3>>::vmsgt_vi(self, vd, vs2, simm5, vm);
43032 }
43033 /// RISC-V `vmsgt.vx` instruction.
43034 ///
43035 /// # Forms
43036 /// Assembly: `vmsgt.vx vm, vs2, xs1, vd`
43037 /// Rust: `vmsgt_vx(vd, vs2, rs1, vm)`
43038 ///
43039 /// # Arguments
43040 /// - `vd` — Vector register operand.
43041 /// - `vs2` — Vector register operand.
43042 /// - `rs1` — Source register.
43043 /// - `vm` — Vector mask control.
43044 pub fn vmsgt_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43045 where
43046 Self: VmsgtVxEmitter<T0, T1, T2, T3>,
43047 {
43048 <Self as VmsgtVxEmitter<T0, T1, T2, T3>>::vmsgt_vx(self, vd, vs2, rs1, vm);
43049 }
43050 /// RISC-V `vmsgtu.vi` instruction.
43051 ///
43052 /// # Forms
43053 /// Assembly: `vmsgtu.vi vm, vs2, vd, imm`
43054 /// Rust: `vmsgtu_vi(vd, vs2, simm5, vm)`
43055 ///
43056 /// # Arguments
43057 /// - `vd` — Vector register operand.
43058 /// - `vs2` — Vector register operand.
43059 /// - `simm5` — Immediate encoding value.
43060 /// - `vm` — Vector mask control.
43061 pub fn vmsgtu_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
43062 where
43063 Self: VmsgtuViEmitter<T0, T1, T2, T3>,
43064 {
43065 <Self as VmsgtuViEmitter<T0, T1, T2, T3>>::vmsgtu_vi(self, vd, vs2, simm5, vm);
43066 }
43067 /// RISC-V `vmsgtu.vx` instruction.
43068 ///
43069 /// # Forms
43070 /// Assembly: `vmsgtu.vx vm, vs2, xs1, vd`
43071 /// Rust: `vmsgtu_vx(vd, vs2, rs1, vm)`
43072 ///
43073 /// # Arguments
43074 /// - `vd` — Vector register operand.
43075 /// - `vs2` — Vector register operand.
43076 /// - `rs1` — Source register.
43077 /// - `vm` — Vector mask control.
43078 pub fn vmsgtu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43079 where
43080 Self: VmsgtuVxEmitter<T0, T1, T2, T3>,
43081 {
43082 <Self as VmsgtuVxEmitter<T0, T1, T2, T3>>::vmsgtu_vx(self, vd, vs2, rs1, vm);
43083 }
43084 /// RISC-V `vmsif.m` instruction.
43085 ///
43086 /// # Forms
43087 /// Assembly: `vmsif.m vm, vs2, vd`
43088 /// Rust: `vmsif_m(vd, vs2, vm)`
43089 ///
43090 /// # Arguments
43091 /// - `vd` — Vector register operand.
43092 /// - `vs2` — Vector register operand.
43093 /// - `vm` — Vector mask control.
43094 pub fn vmsif_m<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
43095 where
43096 Self: VmsifMEmitter<T0, T1, T2>,
43097 {
43098 <Self as VmsifMEmitter<T0, T1, T2>>::vmsif_m(self, vd, vs2, vm);
43099 }
43100 /// RISC-V `vmsle.vi` instruction.
43101 ///
43102 /// # Forms
43103 /// Assembly: `vmsle.vi vm, vs2, vd, imm`
43104 /// Rust: `vmsle_vi(vd, vs2, simm5, vm)`
43105 ///
43106 /// # Arguments
43107 /// - `vd` — Vector register operand.
43108 /// - `vs2` — Vector register operand.
43109 /// - `simm5` — Immediate encoding value.
43110 /// - `vm` — Vector mask control.
43111 pub fn vmsle_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
43112 where
43113 Self: VmsleViEmitter<T0, T1, T2, T3>,
43114 {
43115 <Self as VmsleViEmitter<T0, T1, T2, T3>>::vmsle_vi(self, vd, vs2, simm5, vm);
43116 }
43117 /// RISC-V `vmsle.vv` instruction.
43118 ///
43119 /// # Forms
43120 /// Assembly: `vmsle.vv vm, vs2, vs1, vd`
43121 /// Rust: `vmsle_vv(vd, vs1, vs2, vm)`
43122 ///
43123 /// # Arguments
43124 /// - `vd` — Vector register operand.
43125 /// - `vs1` — Vector register operand.
43126 /// - `vs2` — Vector register operand.
43127 /// - `vm` — Vector mask control.
43128 pub fn vmsle_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43129 where
43130 Self: VmsleVvEmitter<T0, T1, T2, T3>,
43131 {
43132 <Self as VmsleVvEmitter<T0, T1, T2, T3>>::vmsle_vv(self, vd, vs1, vs2, vm);
43133 }
43134 /// RISC-V `vmsle.vx` instruction.
43135 ///
43136 /// # Forms
43137 /// Assembly: `vmsle.vx vm, vs2, xs1, vd`
43138 /// Rust: `vmsle_vx(vd, vs2, rs1, vm)`
43139 ///
43140 /// # Arguments
43141 /// - `vd` — Vector register operand.
43142 /// - `vs2` — Vector register operand.
43143 /// - `rs1` — Source register.
43144 /// - `vm` — Vector mask control.
43145 pub fn vmsle_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43146 where
43147 Self: VmsleVxEmitter<T0, T1, T2, T3>,
43148 {
43149 <Self as VmsleVxEmitter<T0, T1, T2, T3>>::vmsle_vx(self, vd, vs2, rs1, vm);
43150 }
43151 /// RISC-V `vmsleu.vi` instruction.
43152 ///
43153 /// # Forms
43154 /// Assembly: `vmsleu.vi vm, vs2, vd, imm`
43155 /// Rust: `vmsleu_vi(vd, vs2, simm5, vm)`
43156 ///
43157 /// # Arguments
43158 /// - `vd` — Vector register operand.
43159 /// - `vs2` — Vector register operand.
43160 /// - `simm5` — Immediate encoding value.
43161 /// - `vm` — Vector mask control.
43162 pub fn vmsleu_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
43163 where
43164 Self: VmsleuViEmitter<T0, T1, T2, T3>,
43165 {
43166 <Self as VmsleuViEmitter<T0, T1, T2, T3>>::vmsleu_vi(self, vd, vs2, simm5, vm);
43167 }
43168 /// RISC-V `vmsleu.vv` instruction.
43169 ///
43170 /// # Forms
43171 /// Assembly: `vmsleu.vv vm, vs2, vs1, vd`
43172 /// Rust: `vmsleu_vv(vd, vs1, vs2, vm)`
43173 ///
43174 /// # Arguments
43175 /// - `vd` — Vector register operand.
43176 /// - `vs1` — Vector register operand.
43177 /// - `vs2` — Vector register operand.
43178 /// - `vm` — Vector mask control.
43179 pub fn vmsleu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43180 where
43181 Self: VmsleuVvEmitter<T0, T1, T2, T3>,
43182 {
43183 <Self as VmsleuVvEmitter<T0, T1, T2, T3>>::vmsleu_vv(self, vd, vs1, vs2, vm);
43184 }
43185 /// RISC-V `vmsleu.vx` instruction.
43186 ///
43187 /// # Forms
43188 /// Assembly: `vmsleu.vx vm, vs2, xs1, vd`
43189 /// Rust: `vmsleu_vx(vd, vs2, rs1, vm)`
43190 ///
43191 /// # Arguments
43192 /// - `vd` — Vector register operand.
43193 /// - `vs2` — Vector register operand.
43194 /// - `rs1` — Source register.
43195 /// - `vm` — Vector mask control.
43196 pub fn vmsleu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43197 where
43198 Self: VmsleuVxEmitter<T0, T1, T2, T3>,
43199 {
43200 <Self as VmsleuVxEmitter<T0, T1, T2, T3>>::vmsleu_vx(self, vd, vs2, rs1, vm);
43201 }
43202 /// RISC-V `vmslt.vv` instruction.
43203 ///
43204 /// # Forms
43205 /// Assembly: `vmslt.vv vm, vs2, vs1, vd`
43206 /// Rust: `vmslt_vv(vd, vs1, vs2, vm)`
43207 ///
43208 /// # Arguments
43209 /// - `vd` — Vector register operand.
43210 /// - `vs1` — Vector register operand.
43211 /// - `vs2` — Vector register operand.
43212 /// - `vm` — Vector mask control.
43213 pub fn vmslt_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43214 where
43215 Self: VmsltVvEmitter<T0, T1, T2, T3>,
43216 {
43217 <Self as VmsltVvEmitter<T0, T1, T2, T3>>::vmslt_vv(self, vd, vs1, vs2, vm);
43218 }
43219 /// RISC-V `vmslt.vx` instruction.
43220 ///
43221 /// # Forms
43222 /// Assembly: `vmslt.vx vm, vs2, xs1, vd`
43223 /// Rust: `vmslt_vx(vd, vs2, rs1, vm)`
43224 ///
43225 /// # Arguments
43226 /// - `vd` — Vector register operand.
43227 /// - `vs2` — Vector register operand.
43228 /// - `rs1` — Source register.
43229 /// - `vm` — Vector mask control.
43230 pub fn vmslt_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43231 where
43232 Self: VmsltVxEmitter<T0, T1, T2, T3>,
43233 {
43234 <Self as VmsltVxEmitter<T0, T1, T2, T3>>::vmslt_vx(self, vd, vs2, rs1, vm);
43235 }
43236 /// RISC-V `vmsltu.vv` instruction.
43237 ///
43238 /// # Forms
43239 /// Assembly: `vmsltu.vv vm, vs2, vs1, vd`
43240 /// Rust: `vmsltu_vv(vd, vs1, vs2, vm)`
43241 ///
43242 /// # Arguments
43243 /// - `vd` — Vector register operand.
43244 /// - `vs1` — Vector register operand.
43245 /// - `vs2` — Vector register operand.
43246 /// - `vm` — Vector mask control.
43247 pub fn vmsltu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43248 where
43249 Self: VmsltuVvEmitter<T0, T1, T2, T3>,
43250 {
43251 <Self as VmsltuVvEmitter<T0, T1, T2, T3>>::vmsltu_vv(self, vd, vs1, vs2, vm);
43252 }
43253 /// RISC-V `vmsltu.vx` instruction.
43254 ///
43255 /// # Forms
43256 /// Assembly: `vmsltu.vx vm, vs2, xs1, vd`
43257 /// Rust: `vmsltu_vx(vd, vs2, rs1, vm)`
43258 ///
43259 /// # Arguments
43260 /// - `vd` — Vector register operand.
43261 /// - `vs2` — Vector register operand.
43262 /// - `rs1` — Source register.
43263 /// - `vm` — Vector mask control.
43264 pub fn vmsltu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43265 where
43266 Self: VmsltuVxEmitter<T0, T1, T2, T3>,
43267 {
43268 <Self as VmsltuVxEmitter<T0, T1, T2, T3>>::vmsltu_vx(self, vd, vs2, rs1, vm);
43269 }
43270 /// RISC-V `vmsne.vi` instruction.
43271 ///
43272 /// # Forms
43273 /// Assembly: `vmsne.vi vm, vs2, vd, imm`
43274 /// Rust: `vmsne_vi(vd, vs2, simm5, vm)`
43275 ///
43276 /// # Arguments
43277 /// - `vd` — Vector register operand.
43278 /// - `vs2` — Vector register operand.
43279 /// - `simm5` — Immediate encoding value.
43280 /// - `vm` — Vector mask control.
43281 pub fn vmsne_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
43282 where
43283 Self: VmsneViEmitter<T0, T1, T2, T3>,
43284 {
43285 <Self as VmsneViEmitter<T0, T1, T2, T3>>::vmsne_vi(self, vd, vs2, simm5, vm);
43286 }
43287 /// RISC-V `vmsne.vv` instruction.
43288 ///
43289 /// # Forms
43290 /// Assembly: `vmsne.vv vm, vs2, vs1, vd`
43291 /// Rust: `vmsne_vv(vd, vs1, vs2, vm)`
43292 ///
43293 /// # Arguments
43294 /// - `vd` — Vector register operand.
43295 /// - `vs1` — Vector register operand.
43296 /// - `vs2` — Vector register operand.
43297 /// - `vm` — Vector mask control.
43298 pub fn vmsne_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43299 where
43300 Self: VmsneVvEmitter<T0, T1, T2, T3>,
43301 {
43302 <Self as VmsneVvEmitter<T0, T1, T2, T3>>::vmsne_vv(self, vd, vs1, vs2, vm);
43303 }
43304 /// RISC-V `vmsne.vx` instruction.
43305 ///
43306 /// # Forms
43307 /// Assembly: `vmsne.vx vm, vs2, xs1, vd`
43308 /// Rust: `vmsne_vx(vd, vs2, rs1, vm)`
43309 ///
43310 /// # Arguments
43311 /// - `vd` — Vector register operand.
43312 /// - `vs2` — Vector register operand.
43313 /// - `rs1` — Source register.
43314 /// - `vm` — Vector mask control.
43315 pub fn vmsne_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43316 where
43317 Self: VmsneVxEmitter<T0, T1, T2, T3>,
43318 {
43319 <Self as VmsneVxEmitter<T0, T1, T2, T3>>::vmsne_vx(self, vd, vs2, rs1, vm);
43320 }
43321 /// RISC-V `vmsof.m` instruction.
43322 ///
43323 /// # Forms
43324 /// Assembly: `vmsof.m vm, vs2, vd`
43325 /// Rust: `vmsof_m(vd, vs2, vm)`
43326 ///
43327 /// # Arguments
43328 /// - `vd` — Vector register operand.
43329 /// - `vs2` — Vector register operand.
43330 /// - `vm` — Vector mask control.
43331 pub fn vmsof_m<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
43332 where
43333 Self: VmsofMEmitter<T0, T1, T2>,
43334 {
43335 <Self as VmsofMEmitter<T0, T1, T2>>::vmsof_m(self, vd, vs2, vm);
43336 }
43337 /// RISC-V `vmul.vv` instruction.
43338 ///
43339 /// # Forms
43340 /// Assembly: `vmul.vv vm, vs2, vs1, vd`
43341 /// Rust: `vmul_vv(vd, vs1, vs2, vm)`
43342 ///
43343 /// # Arguments
43344 /// - `vd` — Vector register operand.
43345 /// - `vs1` — Vector register operand.
43346 /// - `vs2` — Vector register operand.
43347 /// - `vm` — Vector mask control.
43348 pub fn vmul_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43349 where
43350 Self: VmulVvEmitter<T0, T1, T2, T3>,
43351 {
43352 <Self as VmulVvEmitter<T0, T1, T2, T3>>::vmul_vv(self, vd, vs1, vs2, vm);
43353 }
43354 /// RISC-V `vmul.vx` instruction.
43355 ///
43356 /// # Forms
43357 /// Assembly: `vmul.vx vm, vs2, xs1, vd`
43358 /// Rust: `vmul_vx(vd, vs2, rs1, vm)`
43359 ///
43360 /// # Arguments
43361 /// - `vd` — Vector register operand.
43362 /// - `vs2` — Vector register operand.
43363 /// - `rs1` — Source register.
43364 /// - `vm` — Vector mask control.
43365 pub fn vmul_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43366 where
43367 Self: VmulVxEmitter<T0, T1, T2, T3>,
43368 {
43369 <Self as VmulVxEmitter<T0, T1, T2, T3>>::vmul_vx(self, vd, vs2, rs1, vm);
43370 }
43371 /// RISC-V `vmulh.vv` instruction.
43372 ///
43373 /// # Forms
43374 /// Assembly: `vmulh.vv vm, vs2, vs1, vd`
43375 /// Rust: `vmulh_vv(vd, vs1, vs2, vm)`
43376 ///
43377 /// # Arguments
43378 /// - `vd` — Vector register operand.
43379 /// - `vs1` — Vector register operand.
43380 /// - `vs2` — Vector register operand.
43381 /// - `vm` — Vector mask control.
43382 pub fn vmulh_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43383 where
43384 Self: VmulhVvEmitter<T0, T1, T2, T3>,
43385 {
43386 <Self as VmulhVvEmitter<T0, T1, T2, T3>>::vmulh_vv(self, vd, vs1, vs2, vm);
43387 }
43388 /// RISC-V `vmulh.vx` instruction.
43389 ///
43390 /// # Forms
43391 /// Assembly: `vmulh.vx vm, vs2, xs1, vd`
43392 /// Rust: `vmulh_vx(vd, vs2, rs1, vm)`
43393 ///
43394 /// # Arguments
43395 /// - `vd` — Vector register operand.
43396 /// - `vs2` — Vector register operand.
43397 /// - `rs1` — Source register.
43398 /// - `vm` — Vector mask control.
43399 pub fn vmulh_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43400 where
43401 Self: VmulhVxEmitter<T0, T1, T2, T3>,
43402 {
43403 <Self as VmulhVxEmitter<T0, T1, T2, T3>>::vmulh_vx(self, vd, vs2, rs1, vm);
43404 }
43405 /// RISC-V `vmulhsu.vv` instruction.
43406 ///
43407 /// # Forms
43408 /// Assembly: `vmulhsu.vv vm, vs2, vs1, vd`
43409 /// Rust: `vmulhsu_vv(vd, vs1, vs2, vm)`
43410 ///
43411 /// # Arguments
43412 /// - `vd` — Vector register operand.
43413 /// - `vs1` — Vector register operand.
43414 /// - `vs2` — Vector register operand.
43415 /// - `vm` — Vector mask control.
43416 pub fn vmulhsu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43417 where
43418 Self: VmulhsuVvEmitter<T0, T1, T2, T3>,
43419 {
43420 <Self as VmulhsuVvEmitter<T0, T1, T2, T3>>::vmulhsu_vv(self, vd, vs1, vs2, vm);
43421 }
43422 /// RISC-V `vmulhsu.vx` instruction.
43423 ///
43424 /// # Forms
43425 /// Assembly: `vmulhsu.vx vm, vs2, xs1, vd`
43426 /// Rust: `vmulhsu_vx(vd, vs2, rs1, vm)`
43427 ///
43428 /// # Arguments
43429 /// - `vd` — Vector register operand.
43430 /// - `vs2` — Vector register operand.
43431 /// - `rs1` — Source register.
43432 /// - `vm` — Vector mask control.
43433 pub fn vmulhsu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43434 where
43435 Self: VmulhsuVxEmitter<T0, T1, T2, T3>,
43436 {
43437 <Self as VmulhsuVxEmitter<T0, T1, T2, T3>>::vmulhsu_vx(self, vd, vs2, rs1, vm);
43438 }
43439 /// RISC-V `vmulhu.vv` instruction.
43440 ///
43441 /// # Forms
43442 /// Assembly: `vmulhu.vv vm, vs2, vs1, vd`
43443 /// Rust: `vmulhu_vv(vd, vs1, vs2, vm)`
43444 ///
43445 /// # Arguments
43446 /// - `vd` — Vector register operand.
43447 /// - `vs1` — Vector register operand.
43448 /// - `vs2` — Vector register operand.
43449 /// - `vm` — Vector mask control.
43450 pub fn vmulhu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43451 where
43452 Self: VmulhuVvEmitter<T0, T1, T2, T3>,
43453 {
43454 <Self as VmulhuVvEmitter<T0, T1, T2, T3>>::vmulhu_vv(self, vd, vs1, vs2, vm);
43455 }
43456 /// RISC-V `vmulhu.vx` instruction.
43457 ///
43458 /// # Forms
43459 /// Assembly: `vmulhu.vx vm, vs2, xs1, vd`
43460 /// Rust: `vmulhu_vx(vd, vs2, rs1, vm)`
43461 ///
43462 /// # Arguments
43463 /// - `vd` — Vector register operand.
43464 /// - `vs2` — Vector register operand.
43465 /// - `rs1` — Source register.
43466 /// - `vm` — Vector mask control.
43467 pub fn vmulhu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43468 where
43469 Self: VmulhuVxEmitter<T0, T1, T2, T3>,
43470 {
43471 <Self as VmulhuVxEmitter<T0, T1, T2, T3>>::vmulhu_vx(self, vd, vs2, rs1, vm);
43472 }
43473 /// RISC-V `vmv1r.v` instruction.
43474 ///
43475 /// # Forms
43476 /// Assembly: `vmv1r.v vs2, vd`
43477 /// Rust: `vmv1r_v(vd, vs2)`
43478 ///
43479 /// # Arguments
43480 /// - `vd` — Vector register operand.
43481 /// - `vs2` — Vector register operand.
43482 pub fn vmv1r_v<T0, T1>(&mut self, vd: T0, vs2: T1)
43483 where
43484 Self: Vmv1RVEmitter<T0, T1>,
43485 {
43486 <Self as Vmv1RVEmitter<T0, T1>>::vmv1r_v(self, vd, vs2);
43487 }
43488 /// RISC-V `vmv2r.v` instruction.
43489 ///
43490 /// # Forms
43491 /// Assembly: `vmv2r.v vs2, vd`
43492 /// Rust: `vmv2r_v(vd, vs2)`
43493 ///
43494 /// # Arguments
43495 /// - `vd` — Vector register operand.
43496 /// - `vs2` — Vector register operand.
43497 pub fn vmv2r_v<T0, T1>(&mut self, vd: T0, vs2: T1)
43498 where
43499 Self: Vmv2RVEmitter<T0, T1>,
43500 {
43501 <Self as Vmv2RVEmitter<T0, T1>>::vmv2r_v(self, vd, vs2);
43502 }
43503 /// RISC-V `vmv4r.v` instruction.
43504 ///
43505 /// # Forms
43506 /// Assembly: `vmv4r.v vs2, vd`
43507 /// Rust: `vmv4r_v(vd, vs2)`
43508 ///
43509 /// # Arguments
43510 /// - `vd` — Vector register operand.
43511 /// - `vs2` — Vector register operand.
43512 pub fn vmv4r_v<T0, T1>(&mut self, vd: T0, vs2: T1)
43513 where
43514 Self: Vmv4RVEmitter<T0, T1>,
43515 {
43516 <Self as Vmv4RVEmitter<T0, T1>>::vmv4r_v(self, vd, vs2);
43517 }
43518 /// RISC-V `vmv8r.v` instruction.
43519 ///
43520 /// # Forms
43521 /// Assembly: `vmv8r.v vs2, vd`
43522 /// Rust: `vmv8r_v(vd, vs2)`
43523 ///
43524 /// # Arguments
43525 /// - `vd` — Vector register operand.
43526 /// - `vs2` — Vector register operand.
43527 pub fn vmv8r_v<T0, T1>(&mut self, vd: T0, vs2: T1)
43528 where
43529 Self: Vmv8RVEmitter<T0, T1>,
43530 {
43531 <Self as Vmv8RVEmitter<T0, T1>>::vmv8r_v(self, vd, vs2);
43532 }
43533 /// RISC-V `vmv.s.x` instruction.
43534 ///
43535 /// # Forms
43536 /// Assembly: `vmv.s.x xs1, vd`
43537 /// Rust: `vmv_s_x(vd, rs1)`
43538 ///
43539 /// # Arguments
43540 /// - `vd` — Vector register operand.
43541 /// - `rs1` — Source register.
43542 pub fn vmv_s_x<T0, T1>(&mut self, vd: T0, rs1: T1)
43543 where
43544 Self: VmvSXEmitter<T0, T1>,
43545 {
43546 <Self as VmvSXEmitter<T0, T1>>::vmv_s_x(self, vd, rs1);
43547 }
43548 /// RISC-V `vmv.v.i` instruction.
43549 ///
43550 /// # Forms
43551 /// Assembly: `vmv.v.i vd, imm`
43552 /// Rust: `vmv_v_i(vd, simm5)`
43553 ///
43554 /// # Arguments
43555 /// - `vd` — Vector register operand.
43556 /// - `simm5` — Immediate encoding value.
43557 pub fn vmv_v_i<T0, T1>(&mut self, vd: T0, simm5: T1)
43558 where
43559 Self: VmvVIEmitter<T0, T1>,
43560 {
43561 <Self as VmvVIEmitter<T0, T1>>::vmv_v_i(self, vd, simm5);
43562 }
43563 /// RISC-V `vmv.v.v` instruction.
43564 ///
43565 /// # Forms
43566 /// Assembly: `vmv.v.v vs1, vd`
43567 /// Rust: `vmv_v_v(vd, vs1)`
43568 ///
43569 /// # Arguments
43570 /// - `vd` — Vector register operand.
43571 /// - `vs1` — Vector register operand.
43572 pub fn vmv_v_v<T0, T1>(&mut self, vd: T0, vs1: T1)
43573 where
43574 Self: VmvVVEmitter<T0, T1>,
43575 {
43576 <Self as VmvVVEmitter<T0, T1>>::vmv_v_v(self, vd, vs1);
43577 }
43578 /// RISC-V `vmv.v.x` instruction.
43579 ///
43580 /// # Forms
43581 /// Assembly: `vmv.v.x xs1, vd`
43582 /// Rust: `vmv_v_x(vd, rs1)`
43583 ///
43584 /// # Arguments
43585 /// - `vd` — Vector register operand.
43586 /// - `rs1` — Source register.
43587 pub fn vmv_v_x<T0, T1>(&mut self, vd: T0, rs1: T1)
43588 where
43589 Self: VmvVXEmitter<T0, T1>,
43590 {
43591 <Self as VmvVXEmitter<T0, T1>>::vmv_v_x(self, vd, rs1);
43592 }
43593 /// RISC-V `vmv.x.s` instruction.
43594 ///
43595 /// # Forms
43596 /// Assembly: `vmv.x.s vs2, xd`
43597 /// Rust: `vmv_x_s(rd, vs2)`
43598 ///
43599 /// # Arguments
43600 /// - `rd` — Destination register.
43601 /// - `vs2` — Vector register operand.
43602 pub fn vmv_x_s<T0, T1>(&mut self, rd: T0, vs2: T1)
43603 where
43604 Self: VmvXSEmitter<T0, T1>,
43605 {
43606 <Self as VmvXSEmitter<T0, T1>>::vmv_x_s(self, rd, vs2);
43607 }
43608 /// RISC-V `vmxnor.mm` instruction.
43609 ///
43610 /// # Forms
43611 /// Assembly: `vmxnor.mm vs2, vs1, vd`
43612 /// Rust: `vmxnor_mm(vd, vs1, vs2)`
43613 ///
43614 /// # Arguments
43615 /// - `vd` — Vector register operand.
43616 /// - `vs1` — Vector register operand.
43617 /// - `vs2` — Vector register operand.
43618 pub fn vmxnor_mm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
43619 where
43620 Self: VmxnorMmEmitter<T0, T1, T2>,
43621 {
43622 <Self as VmxnorMmEmitter<T0, T1, T2>>::vmxnor_mm(self, vd, vs1, vs2);
43623 }
43624 /// RISC-V `vmxor.mm` instruction.
43625 ///
43626 /// # Forms
43627 /// Assembly: `vmxor.mm vs2, vs1, vd`
43628 /// Rust: `vmxor_mm(vd, vs1, vs2)`
43629 ///
43630 /// # Arguments
43631 /// - `vd` — Vector register operand.
43632 /// - `vs1` — Vector register operand.
43633 /// - `vs2` — Vector register operand.
43634 pub fn vmxor_mm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
43635 where
43636 Self: VmxorMmEmitter<T0, T1, T2>,
43637 {
43638 <Self as VmxorMmEmitter<T0, T1, T2>>::vmxor_mm(self, vd, vs1, vs2);
43639 }
43640 /// RISC-V `vnclip.wi` instruction.
43641 ///
43642 /// # Forms
43643 /// Assembly: `vnclip.wi vm, vs2, vd, imm`
43644 /// Rust: `vnclip_wi(vd, vs2, zimm5, vm)`
43645 ///
43646 /// # Arguments
43647 /// - `vd` — Vector register operand.
43648 /// - `vs2` — Vector register operand.
43649 /// - `zimm5` — Immediate encoding value.
43650 /// - `vm` — Vector mask control.
43651 pub fn vnclip_wi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
43652 where
43653 Self: VnclipWiEmitter<T0, T1, T2, T3>,
43654 {
43655 <Self as VnclipWiEmitter<T0, T1, T2, T3>>::vnclip_wi(self, vd, vs2, zimm5, vm);
43656 }
43657 /// RISC-V `vnclip.wv` instruction.
43658 ///
43659 /// # Forms
43660 /// Assembly: `vnclip.wv vm, vs2, vs1, vd`
43661 /// Rust: `vnclip_wv(vd, vs1, vs2, vm)`
43662 ///
43663 /// # Arguments
43664 /// - `vd` — Vector register operand.
43665 /// - `vs1` — Vector register operand.
43666 /// - `vs2` — Vector register operand.
43667 /// - `vm` — Vector mask control.
43668 pub fn vnclip_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43669 where
43670 Self: VnclipWvEmitter<T0, T1, T2, T3>,
43671 {
43672 <Self as VnclipWvEmitter<T0, T1, T2, T3>>::vnclip_wv(self, vd, vs1, vs2, vm);
43673 }
43674 /// RISC-V `vnclip.wx` instruction.
43675 ///
43676 /// # Forms
43677 /// Assembly: `vnclip.wx vm, vs2, xs1, vd`
43678 /// Rust: `vnclip_wx(vd, vs2, rs1, vm)`
43679 ///
43680 /// # Arguments
43681 /// - `vd` — Vector register operand.
43682 /// - `vs2` — Vector register operand.
43683 /// - `rs1` — Source register.
43684 /// - `vm` — Vector mask control.
43685 pub fn vnclip_wx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43686 where
43687 Self: VnclipWxEmitter<T0, T1, T2, T3>,
43688 {
43689 <Self as VnclipWxEmitter<T0, T1, T2, T3>>::vnclip_wx(self, vd, vs2, rs1, vm);
43690 }
43691 /// RISC-V `vnclipu.wi` instruction.
43692 ///
43693 /// # Forms
43694 /// Assembly: `vnclipu.wi vm, vs2, vd, imm`
43695 /// Rust: `vnclipu_wi(vd, vs2, zimm5, vm)`
43696 ///
43697 /// # Arguments
43698 /// - `vd` — Vector register operand.
43699 /// - `vs2` — Vector register operand.
43700 /// - `zimm5` — Immediate encoding value.
43701 /// - `vm` — Vector mask control.
43702 pub fn vnclipu_wi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
43703 where
43704 Self: VnclipuWiEmitter<T0, T1, T2, T3>,
43705 {
43706 <Self as VnclipuWiEmitter<T0, T1, T2, T3>>::vnclipu_wi(self, vd, vs2, zimm5, vm);
43707 }
43708 /// RISC-V `vnclipu.wv` instruction.
43709 ///
43710 /// # Forms
43711 /// Assembly: `vnclipu.wv vm, vs2, vs1, vd`
43712 /// Rust: `vnclipu_wv(vd, vs1, vs2, vm)`
43713 ///
43714 /// # Arguments
43715 /// - `vd` — Vector register operand.
43716 /// - `vs1` — Vector register operand.
43717 /// - `vs2` — Vector register operand.
43718 /// - `vm` — Vector mask control.
43719 pub fn vnclipu_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43720 where
43721 Self: VnclipuWvEmitter<T0, T1, T2, T3>,
43722 {
43723 <Self as VnclipuWvEmitter<T0, T1, T2, T3>>::vnclipu_wv(self, vd, vs1, vs2, vm);
43724 }
43725 /// RISC-V `vnclipu.wx` instruction.
43726 ///
43727 /// # Forms
43728 /// Assembly: `vnclipu.wx vm, vs2, xs1, vd`
43729 /// Rust: `vnclipu_wx(vd, vs2, rs1, vm)`
43730 ///
43731 /// # Arguments
43732 /// - `vd` — Vector register operand.
43733 /// - `vs2` — Vector register operand.
43734 /// - `rs1` — Source register.
43735 /// - `vm` — Vector mask control.
43736 pub fn vnclipu_wx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43737 where
43738 Self: VnclipuWxEmitter<T0, T1, T2, T3>,
43739 {
43740 <Self as VnclipuWxEmitter<T0, T1, T2, T3>>::vnclipu_wx(self, vd, vs2, rs1, vm);
43741 }
43742 /// RISC-V `vnmsac.vv` instruction.
43743 ///
43744 /// # Forms
43745 /// Assembly: `vnmsac.vv vm, vs2, vs1, vd`
43746 /// Rust: `vnmsac_vv(vd, vs1, vs2, vm)`
43747 ///
43748 /// # Arguments
43749 /// - `vd` — Vector register operand.
43750 /// - `vs1` — Vector register operand.
43751 /// - `vs2` — Vector register operand.
43752 /// - `vm` — Vector mask control.
43753 pub fn vnmsac_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43754 where
43755 Self: VnmsacVvEmitter<T0, T1, T2, T3>,
43756 {
43757 <Self as VnmsacVvEmitter<T0, T1, T2, T3>>::vnmsac_vv(self, vd, vs1, vs2, vm);
43758 }
43759 /// RISC-V `vnmsac.vx` instruction.
43760 ///
43761 /// # Forms
43762 /// Assembly: `vnmsac.vx vm, vs2, xs1, vd`
43763 /// Rust: `vnmsac_vx(vd, vs2, rs1, vm)`
43764 ///
43765 /// # Arguments
43766 /// - `vd` — Vector register operand.
43767 /// - `vs2` — Vector register operand.
43768 /// - `rs1` — Source register.
43769 /// - `vm` — Vector mask control.
43770 pub fn vnmsac_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43771 where
43772 Self: VnmsacVxEmitter<T0, T1, T2, T3>,
43773 {
43774 <Self as VnmsacVxEmitter<T0, T1, T2, T3>>::vnmsac_vx(self, vd, vs2, rs1, vm);
43775 }
43776 /// RISC-V `vnmsub.vv` instruction.
43777 ///
43778 /// # Forms
43779 /// Assembly: `vnmsub.vv vm, vs2, vs1, vd`
43780 /// Rust: `vnmsub_vv(vd, vs1, vs2, vm)`
43781 ///
43782 /// # Arguments
43783 /// - `vd` — Vector register operand.
43784 /// - `vs1` — Vector register operand.
43785 /// - `vs2` — Vector register operand.
43786 /// - `vm` — Vector mask control.
43787 pub fn vnmsub_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43788 where
43789 Self: VnmsubVvEmitter<T0, T1, T2, T3>,
43790 {
43791 <Self as VnmsubVvEmitter<T0, T1, T2, T3>>::vnmsub_vv(self, vd, vs1, vs2, vm);
43792 }
43793 /// RISC-V `vnmsub.vx` instruction.
43794 ///
43795 /// # Forms
43796 /// Assembly: `vnmsub.vx vm, vs2, xs1, vd`
43797 /// Rust: `vnmsub_vx(vd, vs2, rs1, vm)`
43798 ///
43799 /// # Arguments
43800 /// - `vd` — Vector register operand.
43801 /// - `vs2` — Vector register operand.
43802 /// - `rs1` — Source register.
43803 /// - `vm` — Vector mask control.
43804 pub fn vnmsub_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43805 where
43806 Self: VnmsubVxEmitter<T0, T1, T2, T3>,
43807 {
43808 <Self as VnmsubVxEmitter<T0, T1, T2, T3>>::vnmsub_vx(self, vd, vs2, rs1, vm);
43809 }
43810 /// RISC-V `vnsra.wi` instruction.
43811 ///
43812 /// # Forms
43813 /// Assembly: `vnsra.wi vm, vs2, vd, imm`
43814 /// Rust: `vnsra_wi(vd, vs2, zimm5, vm)`
43815 ///
43816 /// # Arguments
43817 /// - `vd` — Vector register operand.
43818 /// - `vs2` — Vector register operand.
43819 /// - `zimm5` — Immediate encoding value.
43820 /// - `vm` — Vector mask control.
43821 pub fn vnsra_wi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
43822 where
43823 Self: VnsraWiEmitter<T0, T1, T2, T3>,
43824 {
43825 <Self as VnsraWiEmitter<T0, T1, T2, T3>>::vnsra_wi(self, vd, vs2, zimm5, vm);
43826 }
43827 /// RISC-V `vnsra.wv` instruction.
43828 ///
43829 /// # Forms
43830 /// Assembly: `vnsra.wv vm, vs2, vs1, vd`
43831 /// Rust: `vnsra_wv(vd, vs1, vs2, vm)`
43832 ///
43833 /// # Arguments
43834 /// - `vd` — Vector register operand.
43835 /// - `vs1` — Vector register operand.
43836 /// - `vs2` — Vector register operand.
43837 /// - `vm` — Vector mask control.
43838 pub fn vnsra_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43839 where
43840 Self: VnsraWvEmitter<T0, T1, T2, T3>,
43841 {
43842 <Self as VnsraWvEmitter<T0, T1, T2, T3>>::vnsra_wv(self, vd, vs1, vs2, vm);
43843 }
43844 /// RISC-V `vnsra.wx` instruction.
43845 ///
43846 /// # Forms
43847 /// Assembly: `vnsra.wx vm, vs2, xs1, vd`
43848 /// Rust: `vnsra_wx(vd, vs2, rs1, vm)`
43849 ///
43850 /// # Arguments
43851 /// - `vd` — Vector register operand.
43852 /// - `vs2` — Vector register operand.
43853 /// - `rs1` — Source register.
43854 /// - `vm` — Vector mask control.
43855 pub fn vnsra_wx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43856 where
43857 Self: VnsraWxEmitter<T0, T1, T2, T3>,
43858 {
43859 <Self as VnsraWxEmitter<T0, T1, T2, T3>>::vnsra_wx(self, vd, vs2, rs1, vm);
43860 }
43861 /// RISC-V `vnsrl.wi` instruction.
43862 ///
43863 /// # Forms
43864 /// Assembly: `vnsrl.wi vm, vs2, vd, imm`
43865 /// Rust: `vnsrl_wi(vd, vs2, zimm5, vm)`
43866 ///
43867 /// # Arguments
43868 /// - `vd` — Vector register operand.
43869 /// - `vs2` — Vector register operand.
43870 /// - `zimm5` — Immediate encoding value.
43871 /// - `vm` — Vector mask control.
43872 pub fn vnsrl_wi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
43873 where
43874 Self: VnsrlWiEmitter<T0, T1, T2, T3>,
43875 {
43876 <Self as VnsrlWiEmitter<T0, T1, T2, T3>>::vnsrl_wi(self, vd, vs2, zimm5, vm);
43877 }
43878 /// RISC-V `vnsrl.wv` instruction.
43879 ///
43880 /// # Forms
43881 /// Assembly: `vnsrl.wv vm, vs2, vs1, vd`
43882 /// Rust: `vnsrl_wv(vd, vs1, vs2, vm)`
43883 ///
43884 /// # Arguments
43885 /// - `vd` — Vector register operand.
43886 /// - `vs1` — Vector register operand.
43887 /// - `vs2` — Vector register operand.
43888 /// - `vm` — Vector mask control.
43889 pub fn vnsrl_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43890 where
43891 Self: VnsrlWvEmitter<T0, T1, T2, T3>,
43892 {
43893 <Self as VnsrlWvEmitter<T0, T1, T2, T3>>::vnsrl_wv(self, vd, vs1, vs2, vm);
43894 }
43895 /// RISC-V `vnsrl.wx` instruction.
43896 ///
43897 /// # Forms
43898 /// Assembly: `vnsrl.wx vm, vs2, xs1, vd`
43899 /// Rust: `vnsrl_wx(vd, vs2, rs1, vm)`
43900 ///
43901 /// # Arguments
43902 /// - `vd` — Vector register operand.
43903 /// - `vs2` — Vector register operand.
43904 /// - `rs1` — Source register.
43905 /// - `vm` — Vector mask control.
43906 pub fn vnsrl_wx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43907 where
43908 Self: VnsrlWxEmitter<T0, T1, T2, T3>,
43909 {
43910 <Self as VnsrlWxEmitter<T0, T1, T2, T3>>::vnsrl_wx(self, vd, vs2, rs1, vm);
43911 }
43912 /// RISC-V `vor.vi` instruction.
43913 ///
43914 /// # Forms
43915 /// Assembly: `vor.vi vm, vs2, vd, imm`
43916 /// Rust: `vor_vi(vd, vs2, simm5, vm)`
43917 ///
43918 /// # Arguments
43919 /// - `vd` — Vector register operand.
43920 /// - `vs2` — Vector register operand.
43921 /// - `simm5` — Immediate encoding value.
43922 /// - `vm` — Vector mask control.
43923 pub fn vor_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
43924 where
43925 Self: VorViEmitter<T0, T1, T2, T3>,
43926 {
43927 <Self as VorViEmitter<T0, T1, T2, T3>>::vor_vi(self, vd, vs2, simm5, vm);
43928 }
43929 /// RISC-V `vor.vv` instruction.
43930 ///
43931 /// # Forms
43932 /// Assembly: `vor.vv vm, vs2, vs1, vd`
43933 /// Rust: `vor_vv(vd, vs1, vs2, vm)`
43934 ///
43935 /// # Arguments
43936 /// - `vd` — Vector register operand.
43937 /// - `vs1` — Vector register operand.
43938 /// - `vs2` — Vector register operand.
43939 /// - `vm` — Vector mask control.
43940 pub fn vor_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43941 where
43942 Self: VorVvEmitter<T0, T1, T2, T3>,
43943 {
43944 <Self as VorVvEmitter<T0, T1, T2, T3>>::vor_vv(self, vd, vs1, vs2, vm);
43945 }
43946 /// RISC-V `vor.vx` instruction.
43947 ///
43948 /// # Forms
43949 /// Assembly: `vor.vx vm, vs2, xs1, vd`
43950 /// Rust: `vor_vx(vd, vs2, rs1, vm)`
43951 ///
43952 /// # Arguments
43953 /// - `vd` — Vector register operand.
43954 /// - `vs2` — Vector register operand.
43955 /// - `rs1` — Source register.
43956 /// - `vm` — Vector mask control.
43957 pub fn vor_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
43958 where
43959 Self: VorVxEmitter<T0, T1, T2, T3>,
43960 {
43961 <Self as VorVxEmitter<T0, T1, T2, T3>>::vor_vx(self, vd, vs2, rs1, vm);
43962 }
43963 /// RISC-V `vpopc.m` instruction.
43964 ///
43965 /// # Forms
43966 /// Assembly: `vpopc.m rd vs2 vm`
43967 /// Rust: `vpopc_m(rd, vs2, vm)`
43968 ///
43969 /// # Arguments
43970 /// - `rd` — Destination register.
43971 /// - `vs2` — Vector register operand.
43972 /// - `vm` — Vector mask control.
43973 pub fn vpopc_m<T0, T1, T2>(&mut self, rd: T0, vs2: T1, vm: T2)
43974 where
43975 Self: VpopcMEmitter<T0, T1, T2>,
43976 {
43977 <Self as VpopcMEmitter<T0, T1, T2>>::vpopc_m(self, rd, vs2, vm);
43978 }
43979 /// RISC-V `vredand.vs` instruction.
43980 ///
43981 /// # Forms
43982 /// Assembly: `vredand.vs vm, vs2, vs1, vd`
43983 /// Rust: `vredand_vs(vd, vs1, vs2, vm)`
43984 ///
43985 /// # Arguments
43986 /// - `vd` — Vector register operand.
43987 /// - `vs1` — Vector register operand.
43988 /// - `vs2` — Vector register operand.
43989 /// - `vm` — Vector mask control.
43990 pub fn vredand_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
43991 where
43992 Self: VredandVsEmitter<T0, T1, T2, T3>,
43993 {
43994 <Self as VredandVsEmitter<T0, T1, T2, T3>>::vredand_vs(self, vd, vs1, vs2, vm);
43995 }
43996 /// RISC-V `vredmax.vs` instruction.
43997 ///
43998 /// # Forms
43999 /// Assembly: `vredmax.vs vm, vs2, vs1, vd`
44000 /// Rust: `vredmax_vs(vd, vs1, vs2, vm)`
44001 ///
44002 /// # Arguments
44003 /// - `vd` — Vector register operand.
44004 /// - `vs1` — Vector register operand.
44005 /// - `vs2` — Vector register operand.
44006 /// - `vm` — Vector mask control.
44007 pub fn vredmax_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44008 where
44009 Self: VredmaxVsEmitter<T0, T1, T2, T3>,
44010 {
44011 <Self as VredmaxVsEmitter<T0, T1, T2, T3>>::vredmax_vs(self, vd, vs1, vs2, vm);
44012 }
44013 /// RISC-V `vredmaxu.vs` instruction.
44014 ///
44015 /// # Forms
44016 /// Assembly: `vredmaxu.vs vm, vs2, vs1, vd`
44017 /// Rust: `vredmaxu_vs(vd, vs1, vs2, vm)`
44018 ///
44019 /// # Arguments
44020 /// - `vd` — Vector register operand.
44021 /// - `vs1` — Vector register operand.
44022 /// - `vs2` — Vector register operand.
44023 /// - `vm` — Vector mask control.
44024 pub fn vredmaxu_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44025 where
44026 Self: VredmaxuVsEmitter<T0, T1, T2, T3>,
44027 {
44028 <Self as VredmaxuVsEmitter<T0, T1, T2, T3>>::vredmaxu_vs(self, vd, vs1, vs2, vm);
44029 }
44030 /// RISC-V `vredmin.vs` instruction.
44031 ///
44032 /// # Forms
44033 /// Assembly: `vredmin.vs vm, vs2, vs1, vd`
44034 /// Rust: `vredmin_vs(vd, vs1, vs2, vm)`
44035 ///
44036 /// # Arguments
44037 /// - `vd` — Vector register operand.
44038 /// - `vs1` — Vector register operand.
44039 /// - `vs2` — Vector register operand.
44040 /// - `vm` — Vector mask control.
44041 pub fn vredmin_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44042 where
44043 Self: VredminVsEmitter<T0, T1, T2, T3>,
44044 {
44045 <Self as VredminVsEmitter<T0, T1, T2, T3>>::vredmin_vs(self, vd, vs1, vs2, vm);
44046 }
44047 /// RISC-V `vredminu.vs` instruction.
44048 ///
44049 /// # Forms
44050 /// Assembly: `vredminu.vs vm, vs2, vs1, vd`
44051 /// Rust: `vredminu_vs(vd, vs1, vs2, vm)`
44052 ///
44053 /// # Arguments
44054 /// - `vd` — Vector register operand.
44055 /// - `vs1` — Vector register operand.
44056 /// - `vs2` — Vector register operand.
44057 /// - `vm` — Vector mask control.
44058 pub fn vredminu_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44059 where
44060 Self: VredminuVsEmitter<T0, T1, T2, T3>,
44061 {
44062 <Self as VredminuVsEmitter<T0, T1, T2, T3>>::vredminu_vs(self, vd, vs1, vs2, vm);
44063 }
44064 /// RISC-V `vredor.vs` instruction.
44065 ///
44066 /// # Forms
44067 /// Assembly: `vredor.vs vm, vs2, vs1, vd`
44068 /// Rust: `vredor_vs(vd, vs1, vs2, vm)`
44069 ///
44070 /// # Arguments
44071 /// - `vd` — Vector register operand.
44072 /// - `vs1` — Vector register operand.
44073 /// - `vs2` — Vector register operand.
44074 /// - `vm` — Vector mask control.
44075 pub fn vredor_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44076 where
44077 Self: VredorVsEmitter<T0, T1, T2, T3>,
44078 {
44079 <Self as VredorVsEmitter<T0, T1, T2, T3>>::vredor_vs(self, vd, vs1, vs2, vm);
44080 }
44081 /// RISC-V `vredsum.vs` instruction.
44082 ///
44083 /// # Forms
44084 /// Assembly: `vredsum.vs vm, vs2, vs1, vd`
44085 /// Rust: `vredsum_vs(vd, vs1, vs2, vm)`
44086 ///
44087 /// # Arguments
44088 /// - `vd` — Vector register operand.
44089 /// - `vs1` — Vector register operand.
44090 /// - `vs2` — Vector register operand.
44091 /// - `vm` — Vector mask control.
44092 pub fn vredsum_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44093 where
44094 Self: VredsumVsEmitter<T0, T1, T2, T3>,
44095 {
44096 <Self as VredsumVsEmitter<T0, T1, T2, T3>>::vredsum_vs(self, vd, vs1, vs2, vm);
44097 }
44098 /// RISC-V `vredxor.vs` instruction.
44099 ///
44100 /// # Forms
44101 /// Assembly: `vredxor.vs vm, vs2, vs1, vd`
44102 /// Rust: `vredxor_vs(vd, vs1, vs2, vm)`
44103 ///
44104 /// # Arguments
44105 /// - `vd` — Vector register operand.
44106 /// - `vs1` — Vector register operand.
44107 /// - `vs2` — Vector register operand.
44108 /// - `vm` — Vector mask control.
44109 pub fn vredxor_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44110 where
44111 Self: VredxorVsEmitter<T0, T1, T2, T3>,
44112 {
44113 <Self as VredxorVsEmitter<T0, T1, T2, T3>>::vredxor_vs(self, vd, vs1, vs2, vm);
44114 }
44115 /// RISC-V `vrem.vv` instruction.
44116 ///
44117 /// # Forms
44118 /// Assembly: `vrem.vv vm, vs2, vs1, vd`
44119 /// Rust: `vrem_vv(vd, vs1, vs2, vm)`
44120 ///
44121 /// # Arguments
44122 /// - `vd` — Vector register operand.
44123 /// - `vs1` — Vector register operand.
44124 /// - `vs2` — Vector register operand.
44125 /// - `vm` — Vector mask control.
44126 pub fn vrem_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44127 where
44128 Self: VremVvEmitter<T0, T1, T2, T3>,
44129 {
44130 <Self as VremVvEmitter<T0, T1, T2, T3>>::vrem_vv(self, vd, vs1, vs2, vm);
44131 }
44132 /// RISC-V `vrem.vx` instruction.
44133 ///
44134 /// # Forms
44135 /// Assembly: `vrem.vx vm, vs2, xs1, vd`
44136 /// Rust: `vrem_vx(vd, vs2, rs1, vm)`
44137 ///
44138 /// # Arguments
44139 /// - `vd` — Vector register operand.
44140 /// - `vs2` — Vector register operand.
44141 /// - `rs1` — Source register.
44142 /// - `vm` — Vector mask control.
44143 pub fn vrem_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44144 where
44145 Self: VremVxEmitter<T0, T1, T2, T3>,
44146 {
44147 <Self as VremVxEmitter<T0, T1, T2, T3>>::vrem_vx(self, vd, vs2, rs1, vm);
44148 }
44149 /// RISC-V `vremu.vv` instruction.
44150 ///
44151 /// # Forms
44152 /// Assembly: `vremu.vv vm, vs2, vs1, vd`
44153 /// Rust: `vremu_vv(vd, vs1, vs2, vm)`
44154 ///
44155 /// # Arguments
44156 /// - `vd` — Vector register operand.
44157 /// - `vs1` — Vector register operand.
44158 /// - `vs2` — Vector register operand.
44159 /// - `vm` — Vector mask control.
44160 pub fn vremu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44161 where
44162 Self: VremuVvEmitter<T0, T1, T2, T3>,
44163 {
44164 <Self as VremuVvEmitter<T0, T1, T2, T3>>::vremu_vv(self, vd, vs1, vs2, vm);
44165 }
44166 /// RISC-V `vremu.vx` instruction.
44167 ///
44168 /// # Forms
44169 /// Assembly: `vremu.vx vm, vs2, xs1, vd`
44170 /// Rust: `vremu_vx(vd, vs2, rs1, vm)`
44171 ///
44172 /// # Arguments
44173 /// - `vd` — Vector register operand.
44174 /// - `vs2` — Vector register operand.
44175 /// - `rs1` — Source register.
44176 /// - `vm` — Vector mask control.
44177 pub fn vremu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44178 where
44179 Self: VremuVxEmitter<T0, T1, T2, T3>,
44180 {
44181 <Self as VremuVxEmitter<T0, T1, T2, T3>>::vremu_vx(self, vd, vs2, rs1, vm);
44182 }
44183 /// RISC-V `vrev8.v` instruction.
44184 ///
44185 /// # Forms
44186 /// Assembly: `vrev8.v vm, vs2, vd`
44187 /// Rust: `vrev8_v(vd, vs2, vm)`
44188 ///
44189 /// # Arguments
44190 /// - `vd` — Vector register operand.
44191 /// - `vs2` — Vector register operand.
44192 /// - `vm` — Vector mask control.
44193 pub fn vrev8_v<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
44194 where
44195 Self: Vrev8VEmitter<T0, T1, T2>,
44196 {
44197 <Self as Vrev8VEmitter<T0, T1, T2>>::vrev8_v(self, vd, vs2, vm);
44198 }
44199 /// RISC-V `vrgather.vi` instruction.
44200 ///
44201 /// # Forms
44202 /// Assembly: `vrgather.vi vm, vs2, vd, imm`
44203 /// Rust: `vrgather_vi(vd, vs2, zimm5, vm)`
44204 ///
44205 /// # Arguments
44206 /// - `vd` — Vector register operand.
44207 /// - `vs2` — Vector register operand.
44208 /// - `zimm5` — Immediate encoding value.
44209 /// - `vm` — Vector mask control.
44210 pub fn vrgather_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
44211 where
44212 Self: VrgatherViEmitter<T0, T1, T2, T3>,
44213 {
44214 <Self as VrgatherViEmitter<T0, T1, T2, T3>>::vrgather_vi(self, vd, vs2, zimm5, vm);
44215 }
44216 /// RISC-V `vrgather.vv` instruction.
44217 ///
44218 /// # Forms
44219 /// Assembly: `vrgather.vv vm, vs2, vs1, vd`
44220 /// Rust: `vrgather_vv(vd, vs1, vs2, vm)`
44221 ///
44222 /// # Arguments
44223 /// - `vd` — Vector register operand.
44224 /// - `vs1` — Vector register operand.
44225 /// - `vs2` — Vector register operand.
44226 /// - `vm` — Vector mask control.
44227 pub fn vrgather_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44228 where
44229 Self: VrgatherVvEmitter<T0, T1, T2, T3>,
44230 {
44231 <Self as VrgatherVvEmitter<T0, T1, T2, T3>>::vrgather_vv(self, vd, vs1, vs2, vm);
44232 }
44233 /// RISC-V `vrgather.vx` instruction.
44234 ///
44235 /// # Forms
44236 /// Assembly: `vrgather.vx vm, vs2, xs1, vd`
44237 /// Rust: `vrgather_vx(vd, vs2, rs1, vm)`
44238 ///
44239 /// # Arguments
44240 /// - `vd` — Vector register operand.
44241 /// - `vs2` — Vector register operand.
44242 /// - `rs1` — Source register.
44243 /// - `vm` — Vector mask control.
44244 pub fn vrgather_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44245 where
44246 Self: VrgatherVxEmitter<T0, T1, T2, T3>,
44247 {
44248 <Self as VrgatherVxEmitter<T0, T1, T2, T3>>::vrgather_vx(self, vd, vs2, rs1, vm);
44249 }
44250 /// RISC-V `vrgatherei16.vv` instruction.
44251 ///
44252 /// # Forms
44253 /// Assembly: `vrgatherei16.vv vm, vs2, vs1, vd`
44254 /// Rust: `vrgatherei16_vv(vd, vs1, vs2, vm)`
44255 ///
44256 /// # Arguments
44257 /// - `vd` — Vector register operand.
44258 /// - `vs1` — Vector register operand.
44259 /// - `vs2` — Vector register operand.
44260 /// - `vm` — Vector mask control.
44261 pub fn vrgatherei16_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44262 where
44263 Self: Vrgatherei16VvEmitter<T0, T1, T2, T3>,
44264 {
44265 <Self as Vrgatherei16VvEmitter<T0, T1, T2, T3>>::vrgatherei16_vv(self, vd, vs1, vs2, vm);
44266 }
44267 /// RISC-V `vrol.vv` instruction.
44268 ///
44269 /// # Forms
44270 /// Assembly: `vrol.vv vm, vs2, vs1, vd`
44271 /// Rust: `vrol_vv(vd, vs1, vs2, vm)`
44272 ///
44273 /// # Arguments
44274 /// - `vd` — Vector register operand.
44275 /// - `vs1` — Vector register operand.
44276 /// - `vs2` — Vector register operand.
44277 /// - `vm` — Vector mask control.
44278 pub fn vrol_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44279 where
44280 Self: VrolVvEmitter<T0, T1, T2, T3>,
44281 {
44282 <Self as VrolVvEmitter<T0, T1, T2, T3>>::vrol_vv(self, vd, vs1, vs2, vm);
44283 }
44284 /// RISC-V `vrol.vx` instruction.
44285 ///
44286 /// # Forms
44287 /// Assembly: `vrol.vx vm, vs2, xs1, vd`
44288 /// Rust: `vrol_vx(vd, vs2, rs1, vm)`
44289 ///
44290 /// # Arguments
44291 /// - `vd` — Vector register operand.
44292 /// - `vs2` — Vector register operand.
44293 /// - `rs1` — Source register.
44294 /// - `vm` — Vector mask control.
44295 pub fn vrol_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44296 where
44297 Self: VrolVxEmitter<T0, T1, T2, T3>,
44298 {
44299 <Self as VrolVxEmitter<T0, T1, T2, T3>>::vrol_vx(self, vd, vs2, rs1, vm);
44300 }
44301 /// RISC-V `vror.vi` instruction.
44302 ///
44303 /// # Forms
44304 /// Assembly: `vror.vi vm, vs2, vd, imm`
44305 /// Rust: `vror_vi(vd, vs2, zimm6lohi, vm)`
44306 ///
44307 /// # Arguments
44308 /// - `vd` — Vector register operand.
44309 /// - `vs2` — Vector register operand.
44310 /// - `zimm6lohi` — Immediate encoding value.
44311 /// - `vm` — Vector mask control.
44312 pub fn vror_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm6lohi: T2, vm: T3)
44313 where
44314 Self: VrorViEmitter<T0, T1, T2, T3>,
44315 {
44316 <Self as VrorViEmitter<T0, T1, T2, T3>>::vror_vi(self, vd, vs2, zimm6lohi, vm);
44317 }
44318 /// RISC-V `vror.vv` instruction.
44319 ///
44320 /// # Forms
44321 /// Assembly: `vror.vv vm, vs2, vs1, vd`
44322 /// Rust: `vror_vv(vd, vs1, vs2, vm)`
44323 ///
44324 /// # Arguments
44325 /// - `vd` — Vector register operand.
44326 /// - `vs1` — Vector register operand.
44327 /// - `vs2` — Vector register operand.
44328 /// - `vm` — Vector mask control.
44329 pub fn vror_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44330 where
44331 Self: VrorVvEmitter<T0, T1, T2, T3>,
44332 {
44333 <Self as VrorVvEmitter<T0, T1, T2, T3>>::vror_vv(self, vd, vs1, vs2, vm);
44334 }
44335 /// RISC-V `vror.vx` instruction.
44336 ///
44337 /// # Forms
44338 /// Assembly: `vror.vx vm, vs2, xs1, vd`
44339 /// Rust: `vror_vx(vd, vs2, rs1, vm)`
44340 ///
44341 /// # Arguments
44342 /// - `vd` — Vector register operand.
44343 /// - `vs2` — Vector register operand.
44344 /// - `rs1` — Source register.
44345 /// - `vm` — Vector mask control.
44346 pub fn vror_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44347 where
44348 Self: VrorVxEmitter<T0, T1, T2, T3>,
44349 {
44350 <Self as VrorVxEmitter<T0, T1, T2, T3>>::vror_vx(self, vd, vs2, rs1, vm);
44351 }
44352 /// RISC-V `vrsub.vi` instruction.
44353 ///
44354 /// # Forms
44355 /// Assembly: `vrsub.vi vm, vs2, vd, imm`
44356 /// Rust: `vrsub_vi(vd, vs2, simm5, vm)`
44357 ///
44358 /// # Arguments
44359 /// - `vd` — Vector register operand.
44360 /// - `vs2` — Vector register operand.
44361 /// - `simm5` — Immediate encoding value.
44362 /// - `vm` — Vector mask control.
44363 pub fn vrsub_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
44364 where
44365 Self: VrsubViEmitter<T0, T1, T2, T3>,
44366 {
44367 <Self as VrsubViEmitter<T0, T1, T2, T3>>::vrsub_vi(self, vd, vs2, simm5, vm);
44368 }
44369 /// RISC-V `vrsub.vx` instruction.
44370 ///
44371 /// # Forms
44372 /// Assembly: `vrsub.vx vm, vs2, xs1, vd`
44373 /// Rust: `vrsub_vx(vd, vs2, rs1, vm)`
44374 ///
44375 /// # Arguments
44376 /// - `vd` — Vector register operand.
44377 /// - `vs2` — Vector register operand.
44378 /// - `rs1` — Source register.
44379 /// - `vm` — Vector mask control.
44380 pub fn vrsub_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44381 where
44382 Self: VrsubVxEmitter<T0, T1, T2, T3>,
44383 {
44384 <Self as VrsubVxEmitter<T0, T1, T2, T3>>::vrsub_vx(self, vd, vs2, rs1, vm);
44385 }
44386 /// RISC-V `vs1r.v` instruction.
44387 ///
44388 /// # Forms
44389 /// Assembly: `vs1r.v xs1, vs3`
44390 /// Rust: `vs1r_v(vs3, rs1)`
44391 ///
44392 /// # Arguments
44393 /// - `vs3` — Vector register operand.
44394 /// - `rs1` — Memory base register.
44395 pub fn vs1r_v<T0, T1>(&mut self, vs3: T0, rs1: T1)
44396 where
44397 Self: Vs1RVEmitter<T0, T1>,
44398 {
44399 <Self as Vs1RVEmitter<T0, T1>>::vs1r_v(self, vs3, rs1);
44400 }
44401 /// RISC-V `vs2r.v` instruction.
44402 ///
44403 /// # Forms
44404 /// Assembly: `vs2r.v xs1, vs3`
44405 /// Rust: `vs2r_v(vs3, rs1)`
44406 ///
44407 /// # Arguments
44408 /// - `vs3` — Vector register operand.
44409 /// - `rs1` — Memory base register.
44410 pub fn vs2r_v<T0, T1>(&mut self, vs3: T0, rs1: T1)
44411 where
44412 Self: Vs2RVEmitter<T0, T1>,
44413 {
44414 <Self as Vs2RVEmitter<T0, T1>>::vs2r_v(self, vs3, rs1);
44415 }
44416 /// RISC-V `vs4r.v` instruction.
44417 ///
44418 /// # Forms
44419 /// Assembly: `vs4r.v xs1, vs3`
44420 /// Rust: `vs4r_v(vs3, rs1)`
44421 ///
44422 /// # Arguments
44423 /// - `vs3` — Vector register operand.
44424 /// - `rs1` — Memory base register.
44425 pub fn vs4r_v<T0, T1>(&mut self, vs3: T0, rs1: T1)
44426 where
44427 Self: Vs4RVEmitter<T0, T1>,
44428 {
44429 <Self as Vs4RVEmitter<T0, T1>>::vs4r_v(self, vs3, rs1);
44430 }
44431 /// RISC-V `vs8r.v` instruction.
44432 ///
44433 /// # Forms
44434 /// Assembly: `vs8r.v xs1, vs3`
44435 /// Rust: `vs8r_v(vs3, rs1)`
44436 ///
44437 /// # Arguments
44438 /// - `vs3` — Vector register operand.
44439 /// - `rs1` — Memory base register.
44440 pub fn vs8r_v<T0, T1>(&mut self, vs3: T0, rs1: T1)
44441 where
44442 Self: Vs8RVEmitter<T0, T1>,
44443 {
44444 <Self as Vs8RVEmitter<T0, T1>>::vs8r_v(self, vs3, rs1);
44445 }
44446 /// RISC-V `vsadd.vi` instruction.
44447 ///
44448 /// # Forms
44449 /// Assembly: `vsadd.vi vm, vs2, vd, imm`
44450 /// Rust: `vsadd_vi(vd, vs2, simm5, vm)`
44451 ///
44452 /// # Arguments
44453 /// - `vd` — Vector register operand.
44454 /// - `vs2` — Vector register operand.
44455 /// - `simm5` — Immediate encoding value.
44456 /// - `vm` — Vector mask control.
44457 pub fn vsadd_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
44458 where
44459 Self: VsaddViEmitter<T0, T1, T2, T3>,
44460 {
44461 <Self as VsaddViEmitter<T0, T1, T2, T3>>::vsadd_vi(self, vd, vs2, simm5, vm);
44462 }
44463 /// RISC-V `vsadd.vv` instruction.
44464 ///
44465 /// # Forms
44466 /// Assembly: `vsadd.vv vm, vs2, vs1, vd`
44467 /// Rust: `vsadd_vv(vd, vs1, vs2, vm)`
44468 ///
44469 /// # Arguments
44470 /// - `vd` — Vector register operand.
44471 /// - `vs1` — Vector register operand.
44472 /// - `vs2` — Vector register operand.
44473 /// - `vm` — Vector mask control.
44474 pub fn vsadd_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44475 where
44476 Self: VsaddVvEmitter<T0, T1, T2, T3>,
44477 {
44478 <Self as VsaddVvEmitter<T0, T1, T2, T3>>::vsadd_vv(self, vd, vs1, vs2, vm);
44479 }
44480 /// RISC-V `vsadd.vx` instruction.
44481 ///
44482 /// # Forms
44483 /// Assembly: `vsadd.vx vm, vs2, xs1, vd`
44484 /// Rust: `vsadd_vx(vd, vs2, rs1, vm)`
44485 ///
44486 /// # Arguments
44487 /// - `vd` — Vector register operand.
44488 /// - `vs2` — Vector register operand.
44489 /// - `rs1` — Source register.
44490 /// - `vm` — Vector mask control.
44491 pub fn vsadd_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44492 where
44493 Self: VsaddVxEmitter<T0, T1, T2, T3>,
44494 {
44495 <Self as VsaddVxEmitter<T0, T1, T2, T3>>::vsadd_vx(self, vd, vs2, rs1, vm);
44496 }
44497 /// RISC-V `vsaddu.vi` instruction.
44498 ///
44499 /// # Forms
44500 /// Assembly: `vsaddu.vi vm, vs2, vd, imm`
44501 /// Rust: `vsaddu_vi(vd, vs2, simm5, vm)`
44502 ///
44503 /// # Arguments
44504 /// - `vd` — Vector register operand.
44505 /// - `vs2` — Vector register operand.
44506 /// - `simm5` — Immediate encoding value.
44507 /// - `vm` — Vector mask control.
44508 pub fn vsaddu_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
44509 where
44510 Self: VsadduViEmitter<T0, T1, T2, T3>,
44511 {
44512 <Self as VsadduViEmitter<T0, T1, T2, T3>>::vsaddu_vi(self, vd, vs2, simm5, vm);
44513 }
44514 /// RISC-V `vsaddu.vv` instruction.
44515 ///
44516 /// # Forms
44517 /// Assembly: `vsaddu.vv vm, vs2, vs1, vd`
44518 /// Rust: `vsaddu_vv(vd, vs1, vs2, vm)`
44519 ///
44520 /// # Arguments
44521 /// - `vd` — Vector register operand.
44522 /// - `vs1` — Vector register operand.
44523 /// - `vs2` — Vector register operand.
44524 /// - `vm` — Vector mask control.
44525 pub fn vsaddu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44526 where
44527 Self: VsadduVvEmitter<T0, T1, T2, T3>,
44528 {
44529 <Self as VsadduVvEmitter<T0, T1, T2, T3>>::vsaddu_vv(self, vd, vs1, vs2, vm);
44530 }
44531 /// RISC-V `vsaddu.vx` instruction.
44532 ///
44533 /// # Forms
44534 /// Assembly: `vsaddu.vx vm, vs2, xs1, vd`
44535 /// Rust: `vsaddu_vx(vd, vs2, rs1, vm)`
44536 ///
44537 /// # Arguments
44538 /// - `vd` — Vector register operand.
44539 /// - `vs2` — Vector register operand.
44540 /// - `rs1` — Source register.
44541 /// - `vm` — Vector mask control.
44542 pub fn vsaddu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44543 where
44544 Self: VsadduVxEmitter<T0, T1, T2, T3>,
44545 {
44546 <Self as VsadduVxEmitter<T0, T1, T2, T3>>::vsaddu_vx(self, vd, vs2, rs1, vm);
44547 }
44548 /// RISC-V `vsbc.vvm` instruction.
44549 ///
44550 /// # Forms
44551 /// Assembly: `vsbc.vvm vs2, vs1, vd`
44552 /// Rust: `vsbc_vvm(vd, vs1, vs2)`
44553 ///
44554 /// # Arguments
44555 /// - `vd` — Vector register operand.
44556 /// - `vs1` — Vector register operand.
44557 /// - `vs2` — Vector register operand.
44558 pub fn vsbc_vvm<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
44559 where
44560 Self: VsbcVvmEmitter<T0, T1, T2>,
44561 {
44562 <Self as VsbcVvmEmitter<T0, T1, T2>>::vsbc_vvm(self, vd, vs1, vs2);
44563 }
44564 /// RISC-V `vsbc.vxm` instruction.
44565 ///
44566 /// # Forms
44567 /// Assembly: `vsbc.vxm vs2, xs1, vd`
44568 /// Rust: `vsbc_vxm(vd, rs1, vs2)`
44569 ///
44570 /// # Arguments
44571 /// - `vd` — Vector register operand.
44572 /// - `rs1` — Source register.
44573 /// - `vs2` — Vector register operand.
44574 pub fn vsbc_vxm<T0, T1, T2>(&mut self, vd: T0, rs1: T1, vs2: T2)
44575 where
44576 Self: VsbcVxmEmitter<T0, T1, T2>,
44577 {
44578 <Self as VsbcVxmEmitter<T0, T1, T2>>::vsbc_vxm(self, vd, rs1, vs2);
44579 }
44580 /// RISC-V `vse16.v` instruction.
44581 ///
44582 /// # Forms
44583 /// Assembly: `vse16.v vm, xs1, vs3`
44584 /// Rust: `vse16_v(vs3, rs1, vm, nf)`
44585 ///
44586 /// # Arguments
44587 /// - `vs3` — Vector register operand.
44588 /// - `rs1` — Memory base register.
44589 /// - `vm` — Vector mask control.
44590 /// - `nf` — Vector segment field count.
44591 pub fn vse16_v<T0, T1, T2, T3>(&mut self, vs3: T0, rs1: T1, vm: T2, nf: T3)
44592 where
44593 Self: Vse16VEmitter<T0, T1, T2, T3>,
44594 {
44595 <Self as Vse16VEmitter<T0, T1, T2, T3>>::vse16_v(self, vs3, rs1, vm, nf);
44596 }
44597 /// RISC-V `vse1.v` instruction.
44598 ///
44599 /// # Forms
44600 /// Assembly: `vse1.v vs3 rs1`
44601 /// Rust: `vse1_v(vs3, rs1)`
44602 ///
44603 /// # Arguments
44604 /// - `vs3` — Vector register operand.
44605 /// - `rs1` — Memory base register.
44606 pub fn vse1_v<T0, T1>(&mut self, vs3: T0, rs1: T1)
44607 where
44608 Self: Vse1VEmitter<T0, T1>,
44609 {
44610 <Self as Vse1VEmitter<T0, T1>>::vse1_v(self, vs3, rs1);
44611 }
44612 /// RISC-V `vse32.v` instruction.
44613 ///
44614 /// # Forms
44615 /// Assembly: `vse32.v vm, xs1, vs3`
44616 /// Rust: `vse32_v(vs3, rs1, vm, nf)`
44617 ///
44618 /// # Arguments
44619 /// - `vs3` — Vector register operand.
44620 /// - `rs1` — Memory base register.
44621 /// - `vm` — Vector mask control.
44622 /// - `nf` — Vector segment field count.
44623 pub fn vse32_v<T0, T1, T2, T3>(&mut self, vs3: T0, rs1: T1, vm: T2, nf: T3)
44624 where
44625 Self: Vse32VEmitter<T0, T1, T2, T3>,
44626 {
44627 <Self as Vse32VEmitter<T0, T1, T2, T3>>::vse32_v(self, vs3, rs1, vm, nf);
44628 }
44629 /// RISC-V `vse64.v` instruction.
44630 ///
44631 /// # Forms
44632 /// Assembly: `vse64.v vm, xs1, vs3`
44633 /// Rust: `vse64_v(vs3, rs1, vm, nf)`
44634 ///
44635 /// # Arguments
44636 /// - `vs3` — Vector register operand.
44637 /// - `rs1` — Memory base register.
44638 /// - `vm` — Vector mask control.
44639 /// - `nf` — Vector segment field count.
44640 pub fn vse64_v<T0, T1, T2, T3>(&mut self, vs3: T0, rs1: T1, vm: T2, nf: T3)
44641 where
44642 Self: Vse64VEmitter<T0, T1, T2, T3>,
44643 {
44644 <Self as Vse64VEmitter<T0, T1, T2, T3>>::vse64_v(self, vs3, rs1, vm, nf);
44645 }
44646 /// RISC-V `vse8.v` instruction.
44647 ///
44648 /// # Forms
44649 /// Assembly: `vse8.v vm, xs1, vs3`
44650 /// Rust: `vse8_v(vs3, rs1, vm, nf)`
44651 ///
44652 /// # Arguments
44653 /// - `vs3` — Vector register operand.
44654 /// - `rs1` — Memory base register.
44655 /// - `vm` — Vector mask control.
44656 /// - `nf` — Vector segment field count.
44657 pub fn vse8_v<T0, T1, T2, T3>(&mut self, vs3: T0, rs1: T1, vm: T2, nf: T3)
44658 where
44659 Self: Vse8VEmitter<T0, T1, T2, T3>,
44660 {
44661 <Self as Vse8VEmitter<T0, T1, T2, T3>>::vse8_v(self, vs3, rs1, vm, nf);
44662 }
44663 /// RISC-V `vsetivli` instruction.
44664 ///
44665 /// # Forms
44666 /// Assembly: `vsetivli xd, imm`
44667 /// Rust: `vsetivli(rd, zimm5, zimm10)`
44668 ///
44669 /// # Arguments
44670 /// - `rd` — Destination register.
44671 /// - `zimm5` — Immediate encoding value.
44672 /// - `zimm10` — Immediate encoding value.
44673 pub fn vsetivli<T0, T1, T2>(&mut self, rd: T0, zimm5: T1, zimm10: T2)
44674 where
44675 Self: VsetivliEmitter<T0, T1, T2>,
44676 {
44677 <Self as VsetivliEmitter<T0, T1, T2>>::vsetivli(self, rd, zimm5, zimm10);
44678 }
44679 /// RISC-V `vsetvl` instruction.
44680 ///
44681 /// # Forms
44682 /// Assembly: `vsetvl xs2, xs1, xd`
44683 /// Rust: `vsetvl(rd, rs1, rs2)`
44684 ///
44685 /// # Arguments
44686 /// - `rd` — Destination register.
44687 /// - `rs1` — Source register.
44688 /// - `rs2` — Source register.
44689 pub fn vsetvl<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
44690 where
44691 Self: VsetvlEmitter<T0, T1, T2>,
44692 {
44693 <Self as VsetvlEmitter<T0, T1, T2>>::vsetvl(self, rd, rs1, rs2);
44694 }
44695 /// RISC-V `vsetvli` instruction.
44696 ///
44697 /// # Forms
44698 /// Assembly: `vsetvli xs1, xd, imm`
44699 /// Rust: `vsetvli(rd, rs1, zimm11)`
44700 ///
44701 /// # Arguments
44702 /// - `rd` — Destination register.
44703 /// - `rs1` — Source register.
44704 /// - `zimm11` — Immediate encoding value.
44705 pub fn vsetvli<T0, T1, T2>(&mut self, rd: T0, rs1: T1, zimm11: T2)
44706 where
44707 Self: VsetvliEmitter<T0, T1, T2>,
44708 {
44709 <Self as VsetvliEmitter<T0, T1, T2>>::vsetvli(self, rd, rs1, zimm11);
44710 }
44711 /// RISC-V `vsext.vf2` instruction.
44712 ///
44713 /// # Forms
44714 /// Assembly: `vsext.vf2 vm, vs2, vd`
44715 /// Rust: `vsext_vf2(vd, vs2, vm)`
44716 ///
44717 /// # Arguments
44718 /// - `vd` — Vector register operand.
44719 /// - `vs2` — Vector register operand.
44720 /// - `vm` — Vector mask control.
44721 pub fn vsext_vf2<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
44722 where
44723 Self: VsextVf2Emitter<T0, T1, T2>,
44724 {
44725 <Self as VsextVf2Emitter<T0, T1, T2>>::vsext_vf2(self, vd, vs2, vm);
44726 }
44727 /// RISC-V `vsext.vf4` instruction.
44728 ///
44729 /// # Forms
44730 /// Assembly: `vsext.vf4 vm, vs2, vd`
44731 /// Rust: `vsext_vf4(vd, vs2, vm)`
44732 ///
44733 /// # Arguments
44734 /// - `vd` — Vector register operand.
44735 /// - `vs2` — Vector register operand.
44736 /// - `vm` — Vector mask control.
44737 pub fn vsext_vf4<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
44738 where
44739 Self: VsextVf4Emitter<T0, T1, T2>,
44740 {
44741 <Self as VsextVf4Emitter<T0, T1, T2>>::vsext_vf4(self, vd, vs2, vm);
44742 }
44743 /// RISC-V `vsext.vf8` instruction.
44744 ///
44745 /// # Forms
44746 /// Assembly: `vsext.vf8 vm, vs2, vd`
44747 /// Rust: `vsext_vf8(vd, vs2, vm)`
44748 ///
44749 /// # Arguments
44750 /// - `vd` — Vector register operand.
44751 /// - `vs2` — Vector register operand.
44752 /// - `vm` — Vector mask control.
44753 pub fn vsext_vf8<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
44754 where
44755 Self: VsextVf8Emitter<T0, T1, T2>,
44756 {
44757 <Self as VsextVf8Emitter<T0, T1, T2>>::vsext_vf8(self, vd, vs2, vm);
44758 }
44759 /// RISC-V `vsha2ch.vv` instruction.
44760 ///
44761 /// # Forms
44762 /// Assembly: `vsha2ch.vv vs2, vs1, vd`
44763 /// Rust: `vsha2ch_vv(vd, vs1, vs2)`
44764 ///
44765 /// # Arguments
44766 /// - `vd` — Vector register operand.
44767 /// - `vs1` — Vector register operand.
44768 /// - `vs2` — Vector register operand.
44769 pub fn vsha2ch_vv<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
44770 where
44771 Self: Vsha2ChVvEmitter<T0, T1, T2>,
44772 {
44773 <Self as Vsha2ChVvEmitter<T0, T1, T2>>::vsha2ch_vv(self, vd, vs1, vs2);
44774 }
44775 /// RISC-V `vsha2cl.vv` instruction.
44776 ///
44777 /// # Forms
44778 /// Assembly: `vsha2cl.vv vs2, vs1, vd`
44779 /// Rust: `vsha2cl_vv(vd, vs1, vs2)`
44780 ///
44781 /// # Arguments
44782 /// - `vd` — Vector register operand.
44783 /// - `vs1` — Vector register operand.
44784 /// - `vs2` — Vector register operand.
44785 pub fn vsha2cl_vv<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
44786 where
44787 Self: Vsha2ClVvEmitter<T0, T1, T2>,
44788 {
44789 <Self as Vsha2ClVvEmitter<T0, T1, T2>>::vsha2cl_vv(self, vd, vs1, vs2);
44790 }
44791 /// RISC-V `vsha2ms.vv` instruction.
44792 ///
44793 /// # Forms
44794 /// Assembly: `vsha2ms.vv vs2, vs1, vd`
44795 /// Rust: `vsha2ms_vv(vd, vs1, vs2)`
44796 ///
44797 /// # Arguments
44798 /// - `vd` — Vector register operand.
44799 /// - `vs1` — Vector register operand.
44800 /// - `vs2` — Vector register operand.
44801 pub fn vsha2ms_vv<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
44802 where
44803 Self: Vsha2MsVvEmitter<T0, T1, T2>,
44804 {
44805 <Self as Vsha2MsVvEmitter<T0, T1, T2>>::vsha2ms_vv(self, vd, vs1, vs2);
44806 }
44807 /// RISC-V `vslide1down.vx` instruction.
44808 ///
44809 /// # Forms
44810 /// Assembly: `vslide1down.vx vm, vs2, xs1, vd`
44811 /// Rust: `vslide1down_vx(vd, vs2, rs1, vm)`
44812 ///
44813 /// # Arguments
44814 /// - `vd` — Vector register operand.
44815 /// - `vs2` — Vector register operand.
44816 /// - `rs1` — Source register.
44817 /// - `vm` — Vector mask control.
44818 pub fn vslide1down_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44819 where
44820 Self: Vslide1DownVxEmitter<T0, T1, T2, T3>,
44821 {
44822 <Self as Vslide1DownVxEmitter<T0, T1, T2, T3>>::vslide1down_vx(self, vd, vs2, rs1, vm);
44823 }
44824 /// RISC-V `vslide1up.vx` instruction.
44825 ///
44826 /// # Forms
44827 /// Assembly: `vslide1up.vx vm, vs2, xs1, vd`
44828 /// Rust: `vslide1up_vx(vd, vs2, rs1, vm)`
44829 ///
44830 /// # Arguments
44831 /// - `vd` — Vector register operand.
44832 /// - `vs2` — Vector register operand.
44833 /// - `rs1` — Source register.
44834 /// - `vm` — Vector mask control.
44835 pub fn vslide1up_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44836 where
44837 Self: Vslide1UpVxEmitter<T0, T1, T2, T3>,
44838 {
44839 <Self as Vslide1UpVxEmitter<T0, T1, T2, T3>>::vslide1up_vx(self, vd, vs2, rs1, vm);
44840 }
44841 /// RISC-V `vslidedown.vi` instruction.
44842 ///
44843 /// # Forms
44844 /// Assembly: `vslidedown.vi vm, vs2, vd, imm`
44845 /// Rust: `vslidedown_vi(vd, vs2, zimm5, vm)`
44846 ///
44847 /// # Arguments
44848 /// - `vd` — Vector register operand.
44849 /// - `vs2` — Vector register operand.
44850 /// - `zimm5` — Immediate encoding value.
44851 /// - `vm` — Vector mask control.
44852 pub fn vslidedown_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
44853 where
44854 Self: VslidedownViEmitter<T0, T1, T2, T3>,
44855 {
44856 <Self as VslidedownViEmitter<T0, T1, T2, T3>>::vslidedown_vi(self, vd, vs2, zimm5, vm);
44857 }
44858 /// RISC-V `vslidedown.vx` instruction.
44859 ///
44860 /// # Forms
44861 /// Assembly: `vslidedown.vx vm, vs2, xs1, vd`
44862 /// Rust: `vslidedown_vx(vd, vs2, rs1, vm)`
44863 ///
44864 /// # Arguments
44865 /// - `vd` — Vector register operand.
44866 /// - `vs2` — Vector register operand.
44867 /// - `rs1` — Source register.
44868 /// - `vm` — Vector mask control.
44869 pub fn vslidedown_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44870 where
44871 Self: VslidedownVxEmitter<T0, T1, T2, T3>,
44872 {
44873 <Self as VslidedownVxEmitter<T0, T1, T2, T3>>::vslidedown_vx(self, vd, vs2, rs1, vm);
44874 }
44875 /// RISC-V `vslideup.vi` instruction.
44876 ///
44877 /// # Forms
44878 /// Assembly: `vslideup.vi vm, vs2, vd, imm`
44879 /// Rust: `vslideup_vi(vd, vs2, zimm5, vm)`
44880 ///
44881 /// # Arguments
44882 /// - `vd` — Vector register operand.
44883 /// - `vs2` — Vector register operand.
44884 /// - `zimm5` — Immediate encoding value.
44885 /// - `vm` — Vector mask control.
44886 pub fn vslideup_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
44887 where
44888 Self: VslideupViEmitter<T0, T1, T2, T3>,
44889 {
44890 <Self as VslideupViEmitter<T0, T1, T2, T3>>::vslideup_vi(self, vd, vs2, zimm5, vm);
44891 }
44892 /// RISC-V `vslideup.vx` instruction.
44893 ///
44894 /// # Forms
44895 /// Assembly: `vslideup.vx vm, vs2, xs1, vd`
44896 /// Rust: `vslideup_vx(vd, vs2, rs1, vm)`
44897 ///
44898 /// # Arguments
44899 /// - `vd` — Vector register operand.
44900 /// - `vs2` — Vector register operand.
44901 /// - `rs1` — Source register.
44902 /// - `vm` — Vector mask control.
44903 pub fn vslideup_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44904 where
44905 Self: VslideupVxEmitter<T0, T1, T2, T3>,
44906 {
44907 <Self as VslideupVxEmitter<T0, T1, T2, T3>>::vslideup_vx(self, vd, vs2, rs1, vm);
44908 }
44909 /// RISC-V `vsll.vi` instruction.
44910 ///
44911 /// # Forms
44912 /// Assembly: `vsll.vi vm, vs2, vd, imm`
44913 /// Rust: `vsll_vi(vd, vs2, zimm5, vm)`
44914 ///
44915 /// # Arguments
44916 /// - `vd` — Vector register operand.
44917 /// - `vs2` — Vector register operand.
44918 /// - `zimm5` — Immediate encoding value.
44919 /// - `vm` — Vector mask control.
44920 pub fn vsll_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
44921 where
44922 Self: VsllViEmitter<T0, T1, T2, T3>,
44923 {
44924 <Self as VsllViEmitter<T0, T1, T2, T3>>::vsll_vi(self, vd, vs2, zimm5, vm);
44925 }
44926 /// RISC-V `vsll.vv` instruction.
44927 ///
44928 /// # Forms
44929 /// Assembly: `vsll.vv vm, vs2, vs1, vd`
44930 /// Rust: `vsll_vv(vd, vs1, vs2, vm)`
44931 ///
44932 /// # Arguments
44933 /// - `vd` — Vector register operand.
44934 /// - `vs1` — Vector register operand.
44935 /// - `vs2` — Vector register operand.
44936 /// - `vm` — Vector mask control.
44937 pub fn vsll_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
44938 where
44939 Self: VsllVvEmitter<T0, T1, T2, T3>,
44940 {
44941 <Self as VsllVvEmitter<T0, T1, T2, T3>>::vsll_vv(self, vd, vs1, vs2, vm);
44942 }
44943 /// RISC-V `vsll.vx` instruction.
44944 ///
44945 /// # Forms
44946 /// Assembly: `vsll.vx vm, vs2, xs1, vd`
44947 /// Rust: `vsll_vx(vd, vs2, rs1, vm)`
44948 ///
44949 /// # Arguments
44950 /// - `vd` — Vector register operand.
44951 /// - `vs2` — Vector register operand.
44952 /// - `rs1` — Source register.
44953 /// - `vm` — Vector mask control.
44954 pub fn vsll_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
44955 where
44956 Self: VsllVxEmitter<T0, T1, T2, T3>,
44957 {
44958 <Self as VsllVxEmitter<T0, T1, T2, T3>>::vsll_vx(self, vd, vs2, rs1, vm);
44959 }
44960 /// RISC-V `vsm3c.vi` instruction.
44961 ///
44962 /// # Forms
44963 /// Assembly: `vsm3c.vi vs2, vd, imm`
44964 /// Rust: `vsm3c_vi(vd, vs2, zimm5)`
44965 ///
44966 /// # Arguments
44967 /// - `vd` — Vector register operand.
44968 /// - `vs2` — Vector register operand.
44969 /// - `zimm5` — Immediate encoding value.
44970 pub fn vsm3c_vi<T0, T1, T2>(&mut self, vd: T0, vs2: T1, zimm5: T2)
44971 where
44972 Self: Vsm3CViEmitter<T0, T1, T2>,
44973 {
44974 <Self as Vsm3CViEmitter<T0, T1, T2>>::vsm3c_vi(self, vd, vs2, zimm5);
44975 }
44976 /// RISC-V `vsm3me.vv` instruction.
44977 ///
44978 /// # Forms
44979 /// Assembly: `vsm3me.vv vs2, vs1, vd`
44980 /// Rust: `vsm3me_vv(vd, vs1, vs2)`
44981 ///
44982 /// # Arguments
44983 /// - `vd` — Vector register operand.
44984 /// - `vs1` — Vector register operand.
44985 /// - `vs2` — Vector register operand.
44986 pub fn vsm3me_vv<T0, T1, T2>(&mut self, vd: T0, vs1: T1, vs2: T2)
44987 where
44988 Self: Vsm3MeVvEmitter<T0, T1, T2>,
44989 {
44990 <Self as Vsm3MeVvEmitter<T0, T1, T2>>::vsm3me_vv(self, vd, vs1, vs2);
44991 }
44992 /// RISC-V `vsm4k.vi` instruction.
44993 ///
44994 /// # Forms
44995 /// Assembly: `vsm4k.vi vs2, vd, imm`
44996 /// Rust: `vsm4k_vi(vd, vs2, zimm5)`
44997 ///
44998 /// # Arguments
44999 /// - `vd` — Vector register operand.
45000 /// - `vs2` — Vector register operand.
45001 /// - `zimm5` — Immediate encoding value.
45002 pub fn vsm4k_vi<T0, T1, T2>(&mut self, vd: T0, vs2: T1, zimm5: T2)
45003 where
45004 Self: Vsm4KViEmitter<T0, T1, T2>,
45005 {
45006 <Self as Vsm4KViEmitter<T0, T1, T2>>::vsm4k_vi(self, vd, vs2, zimm5);
45007 }
45008 /// RISC-V `vsm4r.vs` instruction.
45009 ///
45010 /// # Forms
45011 /// Assembly: `vsm4r.vs vs2, vd`
45012 /// Rust: `vsm4r_vs(vd, vs2)`
45013 ///
45014 /// # Arguments
45015 /// - `vd` — Vector register operand.
45016 /// - `vs2` — Vector register operand.
45017 pub fn vsm4r_vs<T0, T1>(&mut self, vd: T0, vs2: T1)
45018 where
45019 Self: Vsm4RVsEmitter<T0, T1>,
45020 {
45021 <Self as Vsm4RVsEmitter<T0, T1>>::vsm4r_vs(self, vd, vs2);
45022 }
45023 /// RISC-V `vsm4r.vv` instruction.
45024 ///
45025 /// # Forms
45026 /// Assembly: `vsm4r.vv vs2, vd`
45027 /// Rust: `vsm4r_vv(vd, vs2)`
45028 ///
45029 /// # Arguments
45030 /// - `vd` — Vector register operand.
45031 /// - `vs2` — Vector register operand.
45032 pub fn vsm4r_vv<T0, T1>(&mut self, vd: T0, vs2: T1)
45033 where
45034 Self: Vsm4RVvEmitter<T0, T1>,
45035 {
45036 <Self as Vsm4RVvEmitter<T0, T1>>::vsm4r_vv(self, vd, vs2);
45037 }
45038 /// RISC-V `vsm.v` instruction.
45039 ///
45040 /// # Forms
45041 /// Assembly: `vsm.v xs1, vs3`
45042 /// Rust: `vsm_v(vs3, rs1)`
45043 ///
45044 /// # Arguments
45045 /// - `vs3` — Vector register operand.
45046 /// - `rs1` — Memory base register.
45047 pub fn vsm_v<T0, T1>(&mut self, vs3: T0, rs1: T1)
45048 where
45049 Self: VsmVEmitter<T0, T1>,
45050 {
45051 <Self as VsmVEmitter<T0, T1>>::vsm_v(self, vs3, rs1);
45052 }
45053 /// RISC-V `vsmul.vv` instruction.
45054 ///
45055 /// # Forms
45056 /// Assembly: `vsmul.vv vm, vs2, vs1, vd`
45057 /// Rust: `vsmul_vv(vd, vs1, vs2, vm)`
45058 ///
45059 /// # Arguments
45060 /// - `vd` — Vector register operand.
45061 /// - `vs1` — Vector register operand.
45062 /// - `vs2` — Vector register operand.
45063 /// - `vm` — Vector mask control.
45064 pub fn vsmul_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45065 where
45066 Self: VsmulVvEmitter<T0, T1, T2, T3>,
45067 {
45068 <Self as VsmulVvEmitter<T0, T1, T2, T3>>::vsmul_vv(self, vd, vs1, vs2, vm);
45069 }
45070 /// RISC-V `vsmul.vx` instruction.
45071 ///
45072 /// # Forms
45073 /// Assembly: `vsmul.vx vm, vs2, xs1, vd`
45074 /// Rust: `vsmul_vx(vd, vs2, rs1, vm)`
45075 ///
45076 /// # Arguments
45077 /// - `vd` — Vector register operand.
45078 /// - `vs2` — Vector register operand.
45079 /// - `rs1` — Source register.
45080 /// - `vm` — Vector mask control.
45081 pub fn vsmul_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45082 where
45083 Self: VsmulVxEmitter<T0, T1, T2, T3>,
45084 {
45085 <Self as VsmulVxEmitter<T0, T1, T2, T3>>::vsmul_vx(self, vd, vs2, rs1, vm);
45086 }
45087 /// RISC-V `vsoxei16.v` instruction.
45088 ///
45089 /// # Forms
45090 /// Assembly: `vsoxei16.v vm, vs2, xs1, vs3`
45091 /// Rust: `vsoxei16_v(vs3, rs1, vs2, vm, nf)`
45092 ///
45093 /// # Arguments
45094 /// - `vs3` — Vector register operand.
45095 /// - `rs1` — Memory base register.
45096 /// - `vs2` — Vector register operand.
45097 /// - `vm` — Vector mask control.
45098 /// - `nf` — Vector segment field count.
45099 pub fn vsoxei16_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
45100 where
45101 Self: Vsoxei16VEmitter<T0, T1, T2, T3, T4>,
45102 {
45103 <Self as Vsoxei16VEmitter<T0, T1, T2, T3, T4>>::vsoxei16_v(self, vs3, rs1, vs2, vm, nf);
45104 }
45105 /// RISC-V `vsoxei32.v` instruction.
45106 ///
45107 /// # Forms
45108 /// Assembly: `vsoxei32.v vm, vs2, xs1, vs3`
45109 /// Rust: `vsoxei32_v(vs3, rs1, vs2, vm, nf)`
45110 ///
45111 /// # Arguments
45112 /// - `vs3` — Vector register operand.
45113 /// - `rs1` — Memory base register.
45114 /// - `vs2` — Vector register operand.
45115 /// - `vm` — Vector mask control.
45116 /// - `nf` — Vector segment field count.
45117 pub fn vsoxei32_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
45118 where
45119 Self: Vsoxei32VEmitter<T0, T1, T2, T3, T4>,
45120 {
45121 <Self as Vsoxei32VEmitter<T0, T1, T2, T3, T4>>::vsoxei32_v(self, vs3, rs1, vs2, vm, nf);
45122 }
45123 /// RISC-V `vsoxei64.v` instruction.
45124 ///
45125 /// # Forms
45126 /// Assembly: `vsoxei64.v vm, vs2, xs1, vs3`
45127 /// Rust: `vsoxei64_v(vs3, rs1, vs2, vm, nf)`
45128 ///
45129 /// # Arguments
45130 /// - `vs3` — Vector register operand.
45131 /// - `rs1` — Memory base register.
45132 /// - `vs2` — Vector register operand.
45133 /// - `vm` — Vector mask control.
45134 /// - `nf` — Vector segment field count.
45135 pub fn vsoxei64_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
45136 where
45137 Self: Vsoxei64VEmitter<T0, T1, T2, T3, T4>,
45138 {
45139 <Self as Vsoxei64VEmitter<T0, T1, T2, T3, T4>>::vsoxei64_v(self, vs3, rs1, vs2, vm, nf);
45140 }
45141 /// RISC-V `vsoxei8.v` instruction.
45142 ///
45143 /// # Forms
45144 /// Assembly: `vsoxei8.v vm, vs2, xs1, vs3`
45145 /// Rust: `vsoxei8_v(vs3, rs1, vs2, vm, nf)`
45146 ///
45147 /// # Arguments
45148 /// - `vs3` — Vector register operand.
45149 /// - `rs1` — Memory base register.
45150 /// - `vs2` — Vector register operand.
45151 /// - `vm` — Vector mask control.
45152 /// - `nf` — Vector segment field count.
45153 pub fn vsoxei8_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
45154 where
45155 Self: Vsoxei8VEmitter<T0, T1, T2, T3, T4>,
45156 {
45157 <Self as Vsoxei8VEmitter<T0, T1, T2, T3, T4>>::vsoxei8_v(self, vs3, rs1, vs2, vm, nf);
45158 }
45159 /// RISC-V `vsra.vi` instruction.
45160 ///
45161 /// # Forms
45162 /// Assembly: `vsra.vi vm, vs2, vd, imm`
45163 /// Rust: `vsra_vi(vd, vs2, zimm5, vm)`
45164 ///
45165 /// # Arguments
45166 /// - `vd` — Vector register operand.
45167 /// - `vs2` — Vector register operand.
45168 /// - `zimm5` — Immediate encoding value.
45169 /// - `vm` — Vector mask control.
45170 pub fn vsra_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
45171 where
45172 Self: VsraViEmitter<T0, T1, T2, T3>,
45173 {
45174 <Self as VsraViEmitter<T0, T1, T2, T3>>::vsra_vi(self, vd, vs2, zimm5, vm);
45175 }
45176 /// RISC-V `vsra.vv` instruction.
45177 ///
45178 /// # Forms
45179 /// Assembly: `vsra.vv vm, vs2, vs1, vd`
45180 /// Rust: `vsra_vv(vd, vs1, vs2, vm)`
45181 ///
45182 /// # Arguments
45183 /// - `vd` — Vector register operand.
45184 /// - `vs1` — Vector register operand.
45185 /// - `vs2` — Vector register operand.
45186 /// - `vm` — Vector mask control.
45187 pub fn vsra_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45188 where
45189 Self: VsraVvEmitter<T0, T1, T2, T3>,
45190 {
45191 <Self as VsraVvEmitter<T0, T1, T2, T3>>::vsra_vv(self, vd, vs1, vs2, vm);
45192 }
45193 /// RISC-V `vsra.vx` instruction.
45194 ///
45195 /// # Forms
45196 /// Assembly: `vsra.vx vm, vs2, xs1, vd`
45197 /// Rust: `vsra_vx(vd, vs2, rs1, vm)`
45198 ///
45199 /// # Arguments
45200 /// - `vd` — Vector register operand.
45201 /// - `vs2` — Vector register operand.
45202 /// - `rs1` — Source register.
45203 /// - `vm` — Vector mask control.
45204 pub fn vsra_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45205 where
45206 Self: VsraVxEmitter<T0, T1, T2, T3>,
45207 {
45208 <Self as VsraVxEmitter<T0, T1, T2, T3>>::vsra_vx(self, vd, vs2, rs1, vm);
45209 }
45210 /// RISC-V `vsrl.vi` instruction.
45211 ///
45212 /// # Forms
45213 /// Assembly: `vsrl.vi vm, vs2, vd, imm`
45214 /// Rust: `vsrl_vi(vd, vs2, zimm5, vm)`
45215 ///
45216 /// # Arguments
45217 /// - `vd` — Vector register operand.
45218 /// - `vs2` — Vector register operand.
45219 /// - `zimm5` — Immediate encoding value.
45220 /// - `vm` — Vector mask control.
45221 pub fn vsrl_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
45222 where
45223 Self: VsrlViEmitter<T0, T1, T2, T3>,
45224 {
45225 <Self as VsrlViEmitter<T0, T1, T2, T3>>::vsrl_vi(self, vd, vs2, zimm5, vm);
45226 }
45227 /// RISC-V `vsrl.vv` instruction.
45228 ///
45229 /// # Forms
45230 /// Assembly: `vsrl.vv vm, vs2, vs1, vd`
45231 /// Rust: `vsrl_vv(vd, vs1, vs2, vm)`
45232 ///
45233 /// # Arguments
45234 /// - `vd` — Vector register operand.
45235 /// - `vs1` — Vector register operand.
45236 /// - `vs2` — Vector register operand.
45237 /// - `vm` — Vector mask control.
45238 pub fn vsrl_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45239 where
45240 Self: VsrlVvEmitter<T0, T1, T2, T3>,
45241 {
45242 <Self as VsrlVvEmitter<T0, T1, T2, T3>>::vsrl_vv(self, vd, vs1, vs2, vm);
45243 }
45244 /// RISC-V `vsrl.vx` instruction.
45245 ///
45246 /// # Forms
45247 /// Assembly: `vsrl.vx vm, vs2, xs1, vd`
45248 /// Rust: `vsrl_vx(vd, vs2, rs1, vm)`
45249 ///
45250 /// # Arguments
45251 /// - `vd` — Vector register operand.
45252 /// - `vs2` — Vector register operand.
45253 /// - `rs1` — Source register.
45254 /// - `vm` — Vector mask control.
45255 pub fn vsrl_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45256 where
45257 Self: VsrlVxEmitter<T0, T1, T2, T3>,
45258 {
45259 <Self as VsrlVxEmitter<T0, T1, T2, T3>>::vsrl_vx(self, vd, vs2, rs1, vm);
45260 }
45261 /// RISC-V `vsse16.v` instruction.
45262 ///
45263 /// # Forms
45264 /// Assembly: `vsse16.v vm, xs2, xs1, vs3`
45265 /// Rust: `vsse16_v(vs3, rs1, rs2, vm, nf)`
45266 ///
45267 /// # Arguments
45268 /// - `vs3` — Vector register operand.
45269 /// - `rs1` — Memory base register.
45270 /// - `rs2` — Source register.
45271 /// - `vm` — Vector mask control.
45272 /// - `nf` — Vector segment field count.
45273 pub fn vsse16_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, rs2: T2, vm: T3, nf: T4)
45274 where
45275 Self: Vsse16VEmitter<T0, T1, T2, T3, T4>,
45276 {
45277 <Self as Vsse16VEmitter<T0, T1, T2, T3, T4>>::vsse16_v(self, vs3, rs1, rs2, vm, nf);
45278 }
45279 /// RISC-V `vsse32.v` instruction.
45280 ///
45281 /// # Forms
45282 /// Assembly: `vsse32.v vm, xs2, xs1, vs3`
45283 /// Rust: `vsse32_v(vs3, rs1, rs2, vm, nf)`
45284 ///
45285 /// # Arguments
45286 /// - `vs3` — Vector register operand.
45287 /// - `rs1` — Memory base register.
45288 /// - `rs2` — Source register.
45289 /// - `vm` — Vector mask control.
45290 /// - `nf` — Vector segment field count.
45291 pub fn vsse32_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, rs2: T2, vm: T3, nf: T4)
45292 where
45293 Self: Vsse32VEmitter<T0, T1, T2, T3, T4>,
45294 {
45295 <Self as Vsse32VEmitter<T0, T1, T2, T3, T4>>::vsse32_v(self, vs3, rs1, rs2, vm, nf);
45296 }
45297 /// RISC-V `vsse64.v` instruction.
45298 ///
45299 /// # Forms
45300 /// Assembly: `vsse64.v vm, xs2, xs1, vs3`
45301 /// Rust: `vsse64_v(vs3, rs1, rs2, vm, nf)`
45302 ///
45303 /// # Arguments
45304 /// - `vs3` — Vector register operand.
45305 /// - `rs1` — Memory base register.
45306 /// - `rs2` — Source register.
45307 /// - `vm` — Vector mask control.
45308 /// - `nf` — Vector segment field count.
45309 pub fn vsse64_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, rs2: T2, vm: T3, nf: T4)
45310 where
45311 Self: Vsse64VEmitter<T0, T1, T2, T3, T4>,
45312 {
45313 <Self as Vsse64VEmitter<T0, T1, T2, T3, T4>>::vsse64_v(self, vs3, rs1, rs2, vm, nf);
45314 }
45315 /// RISC-V `vsse8.v` instruction.
45316 ///
45317 /// # Forms
45318 /// Assembly: `vsse8.v vm, xs2, xs1, vs3`
45319 /// Rust: `vsse8_v(vs3, rs1, rs2, vm, nf)`
45320 ///
45321 /// # Arguments
45322 /// - `vs3` — Vector register operand.
45323 /// - `rs1` — Memory base register.
45324 /// - `rs2` — Source register.
45325 /// - `vm` — Vector mask control.
45326 /// - `nf` — Vector segment field count.
45327 pub fn vsse8_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, rs2: T2, vm: T3, nf: T4)
45328 where
45329 Self: Vsse8VEmitter<T0, T1, T2, T3, T4>,
45330 {
45331 <Self as Vsse8VEmitter<T0, T1, T2, T3, T4>>::vsse8_v(self, vs3, rs1, rs2, vm, nf);
45332 }
45333 /// RISC-V `vssra.vi` instruction.
45334 ///
45335 /// # Forms
45336 /// Assembly: `vssra.vi vm, vs2, vd, imm`
45337 /// Rust: `vssra_vi(vd, vs2, zimm5, vm)`
45338 ///
45339 /// # Arguments
45340 /// - `vd` — Vector register operand.
45341 /// - `vs2` — Vector register operand.
45342 /// - `zimm5` — Immediate encoding value.
45343 /// - `vm` — Vector mask control.
45344 pub fn vssra_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
45345 where
45346 Self: VssraViEmitter<T0, T1, T2, T3>,
45347 {
45348 <Self as VssraViEmitter<T0, T1, T2, T3>>::vssra_vi(self, vd, vs2, zimm5, vm);
45349 }
45350 /// RISC-V `vssra.vv` instruction.
45351 ///
45352 /// # Forms
45353 /// Assembly: `vssra.vv vm, vs2, vs1, vd`
45354 /// Rust: `vssra_vv(vd, vs1, vs2, vm)`
45355 ///
45356 /// # Arguments
45357 /// - `vd` — Vector register operand.
45358 /// - `vs1` — Vector register operand.
45359 /// - `vs2` — Vector register operand.
45360 /// - `vm` — Vector mask control.
45361 pub fn vssra_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45362 where
45363 Self: VssraVvEmitter<T0, T1, T2, T3>,
45364 {
45365 <Self as VssraVvEmitter<T0, T1, T2, T3>>::vssra_vv(self, vd, vs1, vs2, vm);
45366 }
45367 /// RISC-V `vssra.vx` instruction.
45368 ///
45369 /// # Forms
45370 /// Assembly: `vssra.vx vm, vs2, xs1, vd`
45371 /// Rust: `vssra_vx(vd, vs2, rs1, vm)`
45372 ///
45373 /// # Arguments
45374 /// - `vd` — Vector register operand.
45375 /// - `vs2` — Vector register operand.
45376 /// - `rs1` — Source register.
45377 /// - `vm` — Vector mask control.
45378 pub fn vssra_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45379 where
45380 Self: VssraVxEmitter<T0, T1, T2, T3>,
45381 {
45382 <Self as VssraVxEmitter<T0, T1, T2, T3>>::vssra_vx(self, vd, vs2, rs1, vm);
45383 }
45384 /// RISC-V `vssrl.vi` instruction.
45385 ///
45386 /// # Forms
45387 /// Assembly: `vssrl.vi vm, vs2, vd, imm`
45388 /// Rust: `vssrl_vi(vd, vs2, zimm5, vm)`
45389 ///
45390 /// # Arguments
45391 /// - `vd` — Vector register operand.
45392 /// - `vs2` — Vector register operand.
45393 /// - `zimm5` — Immediate encoding value.
45394 /// - `vm` — Vector mask control.
45395 pub fn vssrl_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
45396 where
45397 Self: VssrlViEmitter<T0, T1, T2, T3>,
45398 {
45399 <Self as VssrlViEmitter<T0, T1, T2, T3>>::vssrl_vi(self, vd, vs2, zimm5, vm);
45400 }
45401 /// RISC-V `vssrl.vv` instruction.
45402 ///
45403 /// # Forms
45404 /// Assembly: `vssrl.vv vm, vs2, vs1, vd`
45405 /// Rust: `vssrl_vv(vd, vs1, vs2, vm)`
45406 ///
45407 /// # Arguments
45408 /// - `vd` — Vector register operand.
45409 /// - `vs1` — Vector register operand.
45410 /// - `vs2` — Vector register operand.
45411 /// - `vm` — Vector mask control.
45412 pub fn vssrl_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45413 where
45414 Self: VssrlVvEmitter<T0, T1, T2, T3>,
45415 {
45416 <Self as VssrlVvEmitter<T0, T1, T2, T3>>::vssrl_vv(self, vd, vs1, vs2, vm);
45417 }
45418 /// RISC-V `vssrl.vx` instruction.
45419 ///
45420 /// # Forms
45421 /// Assembly: `vssrl.vx vm, vs2, xs1, vd`
45422 /// Rust: `vssrl_vx(vd, vs2, rs1, vm)`
45423 ///
45424 /// # Arguments
45425 /// - `vd` — Vector register operand.
45426 /// - `vs2` — Vector register operand.
45427 /// - `rs1` — Source register.
45428 /// - `vm` — Vector mask control.
45429 pub fn vssrl_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45430 where
45431 Self: VssrlVxEmitter<T0, T1, T2, T3>,
45432 {
45433 <Self as VssrlVxEmitter<T0, T1, T2, T3>>::vssrl_vx(self, vd, vs2, rs1, vm);
45434 }
45435 /// RISC-V `vssub.vv` instruction.
45436 ///
45437 /// # Forms
45438 /// Assembly: `vssub.vv vm, vs2, vs1, vd`
45439 /// Rust: `vssub_vv(vd, vs1, vs2, vm)`
45440 ///
45441 /// # Arguments
45442 /// - `vd` — Vector register operand.
45443 /// - `vs1` — Vector register operand.
45444 /// - `vs2` — Vector register operand.
45445 /// - `vm` — Vector mask control.
45446 pub fn vssub_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45447 where
45448 Self: VssubVvEmitter<T0, T1, T2, T3>,
45449 {
45450 <Self as VssubVvEmitter<T0, T1, T2, T3>>::vssub_vv(self, vd, vs1, vs2, vm);
45451 }
45452 /// RISC-V `vssub.vx` instruction.
45453 ///
45454 /// # Forms
45455 /// Assembly: `vssub.vx vm, vs2, xs1, vd`
45456 /// Rust: `vssub_vx(vd, vs2, rs1, vm)`
45457 ///
45458 /// # Arguments
45459 /// - `vd` — Vector register operand.
45460 /// - `vs2` — Vector register operand.
45461 /// - `rs1` — Source register.
45462 /// - `vm` — Vector mask control.
45463 pub fn vssub_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45464 where
45465 Self: VssubVxEmitter<T0, T1, T2, T3>,
45466 {
45467 <Self as VssubVxEmitter<T0, T1, T2, T3>>::vssub_vx(self, vd, vs2, rs1, vm);
45468 }
45469 /// RISC-V `vssubu.vv` instruction.
45470 ///
45471 /// # Forms
45472 /// Assembly: `vssubu.vv vm, vs2, vs1, vd`
45473 /// Rust: `vssubu_vv(vd, vs1, vs2, vm)`
45474 ///
45475 /// # Arguments
45476 /// - `vd` — Vector register operand.
45477 /// - `vs1` — Vector register operand.
45478 /// - `vs2` — Vector register operand.
45479 /// - `vm` — Vector mask control.
45480 pub fn vssubu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45481 where
45482 Self: VssubuVvEmitter<T0, T1, T2, T3>,
45483 {
45484 <Self as VssubuVvEmitter<T0, T1, T2, T3>>::vssubu_vv(self, vd, vs1, vs2, vm);
45485 }
45486 /// RISC-V `vssubu.vx` instruction.
45487 ///
45488 /// # Forms
45489 /// Assembly: `vssubu.vx vm, vs2, xs1, vd`
45490 /// Rust: `vssubu_vx(vd, vs2, rs1, vm)`
45491 ///
45492 /// # Arguments
45493 /// - `vd` — Vector register operand.
45494 /// - `vs2` — Vector register operand.
45495 /// - `rs1` — Source register.
45496 /// - `vm` — Vector mask control.
45497 pub fn vssubu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45498 where
45499 Self: VssubuVxEmitter<T0, T1, T2, T3>,
45500 {
45501 <Self as VssubuVxEmitter<T0, T1, T2, T3>>::vssubu_vx(self, vd, vs2, rs1, vm);
45502 }
45503 /// RISC-V `vsub.vv` instruction.
45504 ///
45505 /// # Forms
45506 /// Assembly: `vsub.vv vm, vs2, vs1, vd`
45507 /// Rust: `vsub_vv(vd, vs1, vs2, vm)`
45508 ///
45509 /// # Arguments
45510 /// - `vd` — Vector register operand.
45511 /// - `vs1` — Vector register operand.
45512 /// - `vs2` — Vector register operand.
45513 /// - `vm` — Vector mask control.
45514 pub fn vsub_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45515 where
45516 Self: VsubVvEmitter<T0, T1, T2, T3>,
45517 {
45518 <Self as VsubVvEmitter<T0, T1, T2, T3>>::vsub_vv(self, vd, vs1, vs2, vm);
45519 }
45520 /// RISC-V `vsub.vx` instruction.
45521 ///
45522 /// # Forms
45523 /// Assembly: `vsub.vx vm, vs2, xs1, vd`
45524 /// Rust: `vsub_vx(vd, vs2, rs1, vm)`
45525 ///
45526 /// # Arguments
45527 /// - `vd` — Vector register operand.
45528 /// - `vs2` — Vector register operand.
45529 /// - `rs1` — Source register.
45530 /// - `vm` — Vector mask control.
45531 pub fn vsub_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45532 where
45533 Self: VsubVxEmitter<T0, T1, T2, T3>,
45534 {
45535 <Self as VsubVxEmitter<T0, T1, T2, T3>>::vsub_vx(self, vd, vs2, rs1, vm);
45536 }
45537 /// RISC-V `vsuxei16.v` instruction.
45538 ///
45539 /// # Forms
45540 /// Assembly: `vsuxei16.v vm, vs2, xs1, vs3`
45541 /// Rust: `vsuxei16_v(vs3, rs1, vs2, vm, nf)`
45542 ///
45543 /// # Arguments
45544 /// - `vs3` — Vector register operand.
45545 /// - `rs1` — Memory base register.
45546 /// - `vs2` — Vector register operand.
45547 /// - `vm` — Vector mask control.
45548 /// - `nf` — Vector segment field count.
45549 pub fn vsuxei16_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
45550 where
45551 Self: Vsuxei16VEmitter<T0, T1, T2, T3, T4>,
45552 {
45553 <Self as Vsuxei16VEmitter<T0, T1, T2, T3, T4>>::vsuxei16_v(self, vs3, rs1, vs2, vm, nf);
45554 }
45555 /// RISC-V `vsuxei32.v` instruction.
45556 ///
45557 /// # Forms
45558 /// Assembly: `vsuxei32.v vm, vs2, xs1, vs3`
45559 /// Rust: `vsuxei32_v(vs3, rs1, vs2, vm, nf)`
45560 ///
45561 /// # Arguments
45562 /// - `vs3` — Vector register operand.
45563 /// - `rs1` — Memory base register.
45564 /// - `vs2` — Vector register operand.
45565 /// - `vm` — Vector mask control.
45566 /// - `nf` — Vector segment field count.
45567 pub fn vsuxei32_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
45568 where
45569 Self: Vsuxei32VEmitter<T0, T1, T2, T3, T4>,
45570 {
45571 <Self as Vsuxei32VEmitter<T0, T1, T2, T3, T4>>::vsuxei32_v(self, vs3, rs1, vs2, vm, nf);
45572 }
45573 /// RISC-V `vsuxei64.v` instruction.
45574 ///
45575 /// # Forms
45576 /// Assembly: `vsuxei64.v vm, vs2, xs1, vs3`
45577 /// Rust: `vsuxei64_v(vs3, rs1, vs2, vm, nf)`
45578 ///
45579 /// # Arguments
45580 /// - `vs3` — Vector register operand.
45581 /// - `rs1` — Memory base register.
45582 /// - `vs2` — Vector register operand.
45583 /// - `vm` — Vector mask control.
45584 /// - `nf` — Vector segment field count.
45585 pub fn vsuxei64_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
45586 where
45587 Self: Vsuxei64VEmitter<T0, T1, T2, T3, T4>,
45588 {
45589 <Self as Vsuxei64VEmitter<T0, T1, T2, T3, T4>>::vsuxei64_v(self, vs3, rs1, vs2, vm, nf);
45590 }
45591 /// RISC-V `vsuxei8.v` instruction.
45592 ///
45593 /// # Forms
45594 /// Assembly: `vsuxei8.v vm, vs2, xs1, vs3`
45595 /// Rust: `vsuxei8_v(vs3, rs1, vs2, vm, nf)`
45596 ///
45597 /// # Arguments
45598 /// - `vs3` — Vector register operand.
45599 /// - `rs1` — Memory base register.
45600 /// - `vs2` — Vector register operand.
45601 /// - `vm` — Vector mask control.
45602 /// - `nf` — Vector segment field count.
45603 pub fn vsuxei8_v<T0, T1, T2, T3, T4>(&mut self, vs3: T0, rs1: T1, vs2: T2, vm: T3, nf: T4)
45604 where
45605 Self: Vsuxei8VEmitter<T0, T1, T2, T3, T4>,
45606 {
45607 <Self as Vsuxei8VEmitter<T0, T1, T2, T3, T4>>::vsuxei8_v(self, vs3, rs1, vs2, vm, nf);
45608 }
45609 /// RISC-V `vwadd.vv` instruction.
45610 ///
45611 /// # Forms
45612 /// Assembly: `vwadd.vv vm, vs2, vs1, vd`
45613 /// Rust: `vwadd_vv(vd, vs1, vs2, vm)`
45614 ///
45615 /// # Arguments
45616 /// - `vd` — Vector register operand.
45617 /// - `vs1` — Vector register operand.
45618 /// - `vs2` — Vector register operand.
45619 /// - `vm` — Vector mask control.
45620 pub fn vwadd_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45621 where
45622 Self: VwaddVvEmitter<T0, T1, T2, T3>,
45623 {
45624 <Self as VwaddVvEmitter<T0, T1, T2, T3>>::vwadd_vv(self, vd, vs1, vs2, vm);
45625 }
45626 /// RISC-V `vwadd.vx` instruction.
45627 ///
45628 /// # Forms
45629 /// Assembly: `vwadd.vx vm, vs2, xs1, vd`
45630 /// Rust: `vwadd_vx(vd, vs2, rs1, vm)`
45631 ///
45632 /// # Arguments
45633 /// - `vd` — Vector register operand.
45634 /// - `vs2` — Vector register operand.
45635 /// - `rs1` — Source register.
45636 /// - `vm` — Vector mask control.
45637 pub fn vwadd_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45638 where
45639 Self: VwaddVxEmitter<T0, T1, T2, T3>,
45640 {
45641 <Self as VwaddVxEmitter<T0, T1, T2, T3>>::vwadd_vx(self, vd, vs2, rs1, vm);
45642 }
45643 /// RISC-V `vwadd.wv` instruction.
45644 ///
45645 /// # Forms
45646 /// Assembly: `vwadd.wv vm, vs2, vs1, vd`
45647 /// Rust: `vwadd_wv(vd, vs1, vs2, vm)`
45648 ///
45649 /// # Arguments
45650 /// - `vd` — Vector register operand.
45651 /// - `vs1` — Vector register operand.
45652 /// - `vs2` — Vector register operand.
45653 /// - `vm` — Vector mask control.
45654 pub fn vwadd_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45655 where
45656 Self: VwaddWvEmitter<T0, T1, T2, T3>,
45657 {
45658 <Self as VwaddWvEmitter<T0, T1, T2, T3>>::vwadd_wv(self, vd, vs1, vs2, vm);
45659 }
45660 /// RISC-V `vwadd.wx` instruction.
45661 ///
45662 /// # Forms
45663 /// Assembly: `vwadd.wx vm, vs2, xs1, vd`
45664 /// Rust: `vwadd_wx(vd, vs2, rs1, vm)`
45665 ///
45666 /// # Arguments
45667 /// - `vd` — Vector register operand.
45668 /// - `vs2` — Vector register operand.
45669 /// - `rs1` — Source register.
45670 /// - `vm` — Vector mask control.
45671 pub fn vwadd_wx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45672 where
45673 Self: VwaddWxEmitter<T0, T1, T2, T3>,
45674 {
45675 <Self as VwaddWxEmitter<T0, T1, T2, T3>>::vwadd_wx(self, vd, vs2, rs1, vm);
45676 }
45677 /// RISC-V `vwaddu.vv` instruction.
45678 ///
45679 /// # Forms
45680 /// Assembly: `vwaddu.vv vm, vs2, vs1, vd`
45681 /// Rust: `vwaddu_vv(vd, vs1, vs2, vm)`
45682 ///
45683 /// # Arguments
45684 /// - `vd` — Vector register operand.
45685 /// - `vs1` — Vector register operand.
45686 /// - `vs2` — Vector register operand.
45687 /// - `vm` — Vector mask control.
45688 pub fn vwaddu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45689 where
45690 Self: VwadduVvEmitter<T0, T1, T2, T3>,
45691 {
45692 <Self as VwadduVvEmitter<T0, T1, T2, T3>>::vwaddu_vv(self, vd, vs1, vs2, vm);
45693 }
45694 /// RISC-V `vwaddu.vx` instruction.
45695 ///
45696 /// # Forms
45697 /// Assembly: `vwaddu.vx vm, vs2, xs1, vd`
45698 /// Rust: `vwaddu_vx(vd, vs2, rs1, vm)`
45699 ///
45700 /// # Arguments
45701 /// - `vd` — Vector register operand.
45702 /// - `vs2` — Vector register operand.
45703 /// - `rs1` — Source register.
45704 /// - `vm` — Vector mask control.
45705 pub fn vwaddu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45706 where
45707 Self: VwadduVxEmitter<T0, T1, T2, T3>,
45708 {
45709 <Self as VwadduVxEmitter<T0, T1, T2, T3>>::vwaddu_vx(self, vd, vs2, rs1, vm);
45710 }
45711 /// RISC-V `vwaddu.wv` instruction.
45712 ///
45713 /// # Forms
45714 /// Assembly: `vwaddu.wv vm, vs2, vs1, vd`
45715 /// Rust: `vwaddu_wv(vd, vs1, vs2, vm)`
45716 ///
45717 /// # Arguments
45718 /// - `vd` — Vector register operand.
45719 /// - `vs1` — Vector register operand.
45720 /// - `vs2` — Vector register operand.
45721 /// - `vm` — Vector mask control.
45722 pub fn vwaddu_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45723 where
45724 Self: VwadduWvEmitter<T0, T1, T2, T3>,
45725 {
45726 <Self as VwadduWvEmitter<T0, T1, T2, T3>>::vwaddu_wv(self, vd, vs1, vs2, vm);
45727 }
45728 /// RISC-V `vwaddu.wx` instruction.
45729 ///
45730 /// # Forms
45731 /// Assembly: `vwaddu.wx vm, vs2, xs1, vd`
45732 /// Rust: `vwaddu_wx(vd, vs2, rs1, vm)`
45733 ///
45734 /// # Arguments
45735 /// - `vd` — Vector register operand.
45736 /// - `vs2` — Vector register operand.
45737 /// - `rs1` — Source register.
45738 /// - `vm` — Vector mask control.
45739 pub fn vwaddu_wx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45740 where
45741 Self: VwadduWxEmitter<T0, T1, T2, T3>,
45742 {
45743 <Self as VwadduWxEmitter<T0, T1, T2, T3>>::vwaddu_wx(self, vd, vs2, rs1, vm);
45744 }
45745 /// RISC-V `vwmacc.vv` instruction.
45746 ///
45747 /// # Forms
45748 /// Assembly: `vwmacc.vv vm, vs2, vs1, vd`
45749 /// Rust: `vwmacc_vv(vd, vs1, vs2, vm)`
45750 ///
45751 /// # Arguments
45752 /// - `vd` — Vector register operand.
45753 /// - `vs1` — Vector register operand.
45754 /// - `vs2` — Vector register operand.
45755 /// - `vm` — Vector mask control.
45756 pub fn vwmacc_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45757 where
45758 Self: VwmaccVvEmitter<T0, T1, T2, T3>,
45759 {
45760 <Self as VwmaccVvEmitter<T0, T1, T2, T3>>::vwmacc_vv(self, vd, vs1, vs2, vm);
45761 }
45762 /// RISC-V `vwmacc.vx` instruction.
45763 ///
45764 /// # Forms
45765 /// Assembly: `vwmacc.vx vm, vs2, xs1, vd`
45766 /// Rust: `vwmacc_vx(vd, vs2, rs1, vm)`
45767 ///
45768 /// # Arguments
45769 /// - `vd` — Vector register operand.
45770 /// - `vs2` — Vector register operand.
45771 /// - `rs1` — Source register.
45772 /// - `vm` — Vector mask control.
45773 pub fn vwmacc_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45774 where
45775 Self: VwmaccVxEmitter<T0, T1, T2, T3>,
45776 {
45777 <Self as VwmaccVxEmitter<T0, T1, T2, T3>>::vwmacc_vx(self, vd, vs2, rs1, vm);
45778 }
45779 /// RISC-V `vwmaccsu.vv` instruction.
45780 ///
45781 /// # Forms
45782 /// Assembly: `vwmaccsu.vv vm, vs2, vs1, vd`
45783 /// Rust: `vwmaccsu_vv(vd, vs1, vs2, vm)`
45784 ///
45785 /// # Arguments
45786 /// - `vd` — Vector register operand.
45787 /// - `vs1` — Vector register operand.
45788 /// - `vs2` — Vector register operand.
45789 /// - `vm` — Vector mask control.
45790 pub fn vwmaccsu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45791 where
45792 Self: VwmaccsuVvEmitter<T0, T1, T2, T3>,
45793 {
45794 <Self as VwmaccsuVvEmitter<T0, T1, T2, T3>>::vwmaccsu_vv(self, vd, vs1, vs2, vm);
45795 }
45796 /// RISC-V `vwmaccsu.vx` instruction.
45797 ///
45798 /// # Forms
45799 /// Assembly: `vwmaccsu.vx vm, vs2, xs1, vd`
45800 /// Rust: `vwmaccsu_vx(vd, vs2, rs1, vm)`
45801 ///
45802 /// # Arguments
45803 /// - `vd` — Vector register operand.
45804 /// - `vs2` — Vector register operand.
45805 /// - `rs1` — Source register.
45806 /// - `vm` — Vector mask control.
45807 pub fn vwmaccsu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45808 where
45809 Self: VwmaccsuVxEmitter<T0, T1, T2, T3>,
45810 {
45811 <Self as VwmaccsuVxEmitter<T0, T1, T2, T3>>::vwmaccsu_vx(self, vd, vs2, rs1, vm);
45812 }
45813 /// RISC-V `vwmaccu.vv` instruction.
45814 ///
45815 /// # Forms
45816 /// Assembly: `vwmaccu.vv vm, vs2, vs1, vd`
45817 /// Rust: `vwmaccu_vv(vd, vs1, vs2, vm)`
45818 ///
45819 /// # Arguments
45820 /// - `vd` — Vector register operand.
45821 /// - `vs1` — Vector register operand.
45822 /// - `vs2` — Vector register operand.
45823 /// - `vm` — Vector mask control.
45824 pub fn vwmaccu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45825 where
45826 Self: VwmaccuVvEmitter<T0, T1, T2, T3>,
45827 {
45828 <Self as VwmaccuVvEmitter<T0, T1, T2, T3>>::vwmaccu_vv(self, vd, vs1, vs2, vm);
45829 }
45830 /// RISC-V `vwmaccu.vx` instruction.
45831 ///
45832 /// # Forms
45833 /// Assembly: `vwmaccu.vx vm, vs2, xs1, vd`
45834 /// Rust: `vwmaccu_vx(vd, vs2, rs1, vm)`
45835 ///
45836 /// # Arguments
45837 /// - `vd` — Vector register operand.
45838 /// - `vs2` — Vector register operand.
45839 /// - `rs1` — Source register.
45840 /// - `vm` — Vector mask control.
45841 pub fn vwmaccu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45842 where
45843 Self: VwmaccuVxEmitter<T0, T1, T2, T3>,
45844 {
45845 <Self as VwmaccuVxEmitter<T0, T1, T2, T3>>::vwmaccu_vx(self, vd, vs2, rs1, vm);
45846 }
45847 /// RISC-V `vwmaccus.vx` instruction.
45848 ///
45849 /// # Forms
45850 /// Assembly: `vwmaccus.vx vm, vs2, xs1, vd`
45851 /// Rust: `vwmaccus_vx(vd, vs2, rs1, vm)`
45852 ///
45853 /// # Arguments
45854 /// - `vd` — Vector register operand.
45855 /// - `vs2` — Vector register operand.
45856 /// - `rs1` — Source register.
45857 /// - `vm` — Vector mask control.
45858 pub fn vwmaccus_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45859 where
45860 Self: VwmaccusVxEmitter<T0, T1, T2, T3>,
45861 {
45862 <Self as VwmaccusVxEmitter<T0, T1, T2, T3>>::vwmaccus_vx(self, vd, vs2, rs1, vm);
45863 }
45864 /// RISC-V `vwmul.vv` instruction.
45865 ///
45866 /// # Forms
45867 /// Assembly: `vwmul.vv vm, vs2, vs1, vd`
45868 /// Rust: `vwmul_vv(vd, vs1, vs2, vm)`
45869 ///
45870 /// # Arguments
45871 /// - `vd` — Vector register operand.
45872 /// - `vs1` — Vector register operand.
45873 /// - `vs2` — Vector register operand.
45874 /// - `vm` — Vector mask control.
45875 pub fn vwmul_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45876 where
45877 Self: VwmulVvEmitter<T0, T1, T2, T3>,
45878 {
45879 <Self as VwmulVvEmitter<T0, T1, T2, T3>>::vwmul_vv(self, vd, vs1, vs2, vm);
45880 }
45881 /// RISC-V `vwmul.vx` instruction.
45882 ///
45883 /// # Forms
45884 /// Assembly: `vwmul.vx vm, vs2, xs1, vd`
45885 /// Rust: `vwmul_vx(vd, vs2, rs1, vm)`
45886 ///
45887 /// # Arguments
45888 /// - `vd` — Vector register operand.
45889 /// - `vs2` — Vector register operand.
45890 /// - `rs1` — Source register.
45891 /// - `vm` — Vector mask control.
45892 pub fn vwmul_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45893 where
45894 Self: VwmulVxEmitter<T0, T1, T2, T3>,
45895 {
45896 <Self as VwmulVxEmitter<T0, T1, T2, T3>>::vwmul_vx(self, vd, vs2, rs1, vm);
45897 }
45898 /// RISC-V `vwmulsu.vv` instruction.
45899 ///
45900 /// # Forms
45901 /// Assembly: `vwmulsu.vv vm, vs2, vs1, vd`
45902 /// Rust: `vwmulsu_vv(vd, vs1, vs2, vm)`
45903 ///
45904 /// # Arguments
45905 /// - `vd` — Vector register operand.
45906 /// - `vs1` — Vector register operand.
45907 /// - `vs2` — Vector register operand.
45908 /// - `vm` — Vector mask control.
45909 pub fn vwmulsu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45910 where
45911 Self: VwmulsuVvEmitter<T0, T1, T2, T3>,
45912 {
45913 <Self as VwmulsuVvEmitter<T0, T1, T2, T3>>::vwmulsu_vv(self, vd, vs1, vs2, vm);
45914 }
45915 /// RISC-V `vwmulsu.vx` instruction.
45916 ///
45917 /// # Forms
45918 /// Assembly: `vwmulsu.vx vm, vs2, xs1, vd`
45919 /// Rust: `vwmulsu_vx(vd, vs2, rs1, vm)`
45920 ///
45921 /// # Arguments
45922 /// - `vd` — Vector register operand.
45923 /// - `vs2` — Vector register operand.
45924 /// - `rs1` — Source register.
45925 /// - `vm` — Vector mask control.
45926 pub fn vwmulsu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45927 where
45928 Self: VwmulsuVxEmitter<T0, T1, T2, T3>,
45929 {
45930 <Self as VwmulsuVxEmitter<T0, T1, T2, T3>>::vwmulsu_vx(self, vd, vs2, rs1, vm);
45931 }
45932 /// RISC-V `vwmulu.vv` instruction.
45933 ///
45934 /// # Forms
45935 /// Assembly: `vwmulu.vv vm, vs2, vs1, vd`
45936 /// Rust: `vwmulu_vv(vd, vs1, vs2, vm)`
45937 ///
45938 /// # Arguments
45939 /// - `vd` — Vector register operand.
45940 /// - `vs1` — Vector register operand.
45941 /// - `vs2` — Vector register operand.
45942 /// - `vm` — Vector mask control.
45943 pub fn vwmulu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45944 where
45945 Self: VwmuluVvEmitter<T0, T1, T2, T3>,
45946 {
45947 <Self as VwmuluVvEmitter<T0, T1, T2, T3>>::vwmulu_vv(self, vd, vs1, vs2, vm);
45948 }
45949 /// RISC-V `vwmulu.vx` instruction.
45950 ///
45951 /// # Forms
45952 /// Assembly: `vwmulu.vx vm, vs2, xs1, vd`
45953 /// Rust: `vwmulu_vx(vd, vs2, rs1, vm)`
45954 ///
45955 /// # Arguments
45956 /// - `vd` — Vector register operand.
45957 /// - `vs2` — Vector register operand.
45958 /// - `rs1` — Source register.
45959 /// - `vm` — Vector mask control.
45960 pub fn vwmulu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
45961 where
45962 Self: VwmuluVxEmitter<T0, T1, T2, T3>,
45963 {
45964 <Self as VwmuluVxEmitter<T0, T1, T2, T3>>::vwmulu_vx(self, vd, vs2, rs1, vm);
45965 }
45966 /// RISC-V `vwredsum.vs` instruction.
45967 ///
45968 /// # Forms
45969 /// Assembly: `vwredsum.vs vm, vs2, vs1, vd`
45970 /// Rust: `vwredsum_vs(vd, vs1, vs2, vm)`
45971 ///
45972 /// # Arguments
45973 /// - `vd` — Vector register operand.
45974 /// - `vs1` — Vector register operand.
45975 /// - `vs2` — Vector register operand.
45976 /// - `vm` — Vector mask control.
45977 pub fn vwredsum_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45978 where
45979 Self: VwredsumVsEmitter<T0, T1, T2, T3>,
45980 {
45981 <Self as VwredsumVsEmitter<T0, T1, T2, T3>>::vwredsum_vs(self, vd, vs1, vs2, vm);
45982 }
45983 /// RISC-V `vwredsumu.vs` instruction.
45984 ///
45985 /// # Forms
45986 /// Assembly: `vwredsumu.vs vm, vs2, vs1, vd`
45987 /// Rust: `vwredsumu_vs(vd, vs1, vs2, vm)`
45988 ///
45989 /// # Arguments
45990 /// - `vd` — Vector register operand.
45991 /// - `vs1` — Vector register operand.
45992 /// - `vs2` — Vector register operand.
45993 /// - `vm` — Vector mask control.
45994 pub fn vwredsumu_vs<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
45995 where
45996 Self: VwredsumuVsEmitter<T0, T1, T2, T3>,
45997 {
45998 <Self as VwredsumuVsEmitter<T0, T1, T2, T3>>::vwredsumu_vs(self, vd, vs1, vs2, vm);
45999 }
46000 /// RISC-V `vwsll.vi` instruction.
46001 ///
46002 /// # Forms
46003 /// Assembly: `vwsll.vi vm, vs2, vd, imm`
46004 /// Rust: `vwsll_vi(vd, vs2, zimm5, vm)`
46005 ///
46006 /// # Arguments
46007 /// - `vd` — Vector register operand.
46008 /// - `vs2` — Vector register operand.
46009 /// - `zimm5` — Immediate encoding value.
46010 /// - `vm` — Vector mask control.
46011 pub fn vwsll_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, zimm5: T2, vm: T3)
46012 where
46013 Self: VwsllViEmitter<T0, T1, T2, T3>,
46014 {
46015 <Self as VwsllViEmitter<T0, T1, T2, T3>>::vwsll_vi(self, vd, vs2, zimm5, vm);
46016 }
46017 /// RISC-V `vwsll.vv` instruction.
46018 ///
46019 /// # Forms
46020 /// Assembly: `vwsll.vv vm, vs2, vs1, vd`
46021 /// Rust: `vwsll_vv(vd, vs1, vs2, vm)`
46022 ///
46023 /// # Arguments
46024 /// - `vd` — Vector register operand.
46025 /// - `vs1` — Vector register operand.
46026 /// - `vs2` — Vector register operand.
46027 /// - `vm` — Vector mask control.
46028 pub fn vwsll_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
46029 where
46030 Self: VwsllVvEmitter<T0, T1, T2, T3>,
46031 {
46032 <Self as VwsllVvEmitter<T0, T1, T2, T3>>::vwsll_vv(self, vd, vs1, vs2, vm);
46033 }
46034 /// RISC-V `vwsll.vx` instruction.
46035 ///
46036 /// # Forms
46037 /// Assembly: `vwsll.vx vm, vs2, xs1, vd`
46038 /// Rust: `vwsll_vx(vd, vs2, rs1, vm)`
46039 ///
46040 /// # Arguments
46041 /// - `vd` — Vector register operand.
46042 /// - `vs2` — Vector register operand.
46043 /// - `rs1` — Source register.
46044 /// - `vm` — Vector mask control.
46045 pub fn vwsll_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
46046 where
46047 Self: VwsllVxEmitter<T0, T1, T2, T3>,
46048 {
46049 <Self as VwsllVxEmitter<T0, T1, T2, T3>>::vwsll_vx(self, vd, vs2, rs1, vm);
46050 }
46051 /// RISC-V `vwsub.vv` instruction.
46052 ///
46053 /// # Forms
46054 /// Assembly: `vwsub.vv vm, vs2, vs1, vd`
46055 /// Rust: `vwsub_vv(vd, vs1, vs2, vm)`
46056 ///
46057 /// # Arguments
46058 /// - `vd` — Vector register operand.
46059 /// - `vs1` — Vector register operand.
46060 /// - `vs2` — Vector register operand.
46061 /// - `vm` — Vector mask control.
46062 pub fn vwsub_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
46063 where
46064 Self: VwsubVvEmitter<T0, T1, T2, T3>,
46065 {
46066 <Self as VwsubVvEmitter<T0, T1, T2, T3>>::vwsub_vv(self, vd, vs1, vs2, vm);
46067 }
46068 /// RISC-V `vwsub.vx` instruction.
46069 ///
46070 /// # Forms
46071 /// Assembly: `vwsub.vx vm, vs2, xs1, vd`
46072 /// Rust: `vwsub_vx(vd, vs2, rs1, vm)`
46073 ///
46074 /// # Arguments
46075 /// - `vd` — Vector register operand.
46076 /// - `vs2` — Vector register operand.
46077 /// - `rs1` — Source register.
46078 /// - `vm` — Vector mask control.
46079 pub fn vwsub_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
46080 where
46081 Self: VwsubVxEmitter<T0, T1, T2, T3>,
46082 {
46083 <Self as VwsubVxEmitter<T0, T1, T2, T3>>::vwsub_vx(self, vd, vs2, rs1, vm);
46084 }
46085 /// RISC-V `vwsub.wv` instruction.
46086 ///
46087 /// # Forms
46088 /// Assembly: `vwsub.wv vm, vs2, vs1, vd`
46089 /// Rust: `vwsub_wv(vd, vs1, vs2, vm)`
46090 ///
46091 /// # Arguments
46092 /// - `vd` — Vector register operand.
46093 /// - `vs1` — Vector register operand.
46094 /// - `vs2` — Vector register operand.
46095 /// - `vm` — Vector mask control.
46096 pub fn vwsub_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
46097 where
46098 Self: VwsubWvEmitter<T0, T1, T2, T3>,
46099 {
46100 <Self as VwsubWvEmitter<T0, T1, T2, T3>>::vwsub_wv(self, vd, vs1, vs2, vm);
46101 }
46102 /// RISC-V `vwsub.wx` instruction.
46103 ///
46104 /// # Forms
46105 /// Assembly: `vwsub.wx vm, vs2, xs1, vd`
46106 /// Rust: `vwsub_wx(vd, vs2, rs1, vm)`
46107 ///
46108 /// # Arguments
46109 /// - `vd` — Vector register operand.
46110 /// - `vs2` — Vector register operand.
46111 /// - `rs1` — Source register.
46112 /// - `vm` — Vector mask control.
46113 pub fn vwsub_wx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
46114 where
46115 Self: VwsubWxEmitter<T0, T1, T2, T3>,
46116 {
46117 <Self as VwsubWxEmitter<T0, T1, T2, T3>>::vwsub_wx(self, vd, vs2, rs1, vm);
46118 }
46119 /// RISC-V `vwsubu.vv` instruction.
46120 ///
46121 /// # Forms
46122 /// Assembly: `vwsubu.vv vm, vs2, vs1, vd`
46123 /// Rust: `vwsubu_vv(vd, vs1, vs2, vm)`
46124 ///
46125 /// # Arguments
46126 /// - `vd` — Vector register operand.
46127 /// - `vs1` — Vector register operand.
46128 /// - `vs2` — Vector register operand.
46129 /// - `vm` — Vector mask control.
46130 pub fn vwsubu_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
46131 where
46132 Self: VwsubuVvEmitter<T0, T1, T2, T3>,
46133 {
46134 <Self as VwsubuVvEmitter<T0, T1, T2, T3>>::vwsubu_vv(self, vd, vs1, vs2, vm);
46135 }
46136 /// RISC-V `vwsubu.vx` instruction.
46137 ///
46138 /// # Forms
46139 /// Assembly: `vwsubu.vx vm, vs2, xs1, vd`
46140 /// Rust: `vwsubu_vx(vd, vs2, rs1, vm)`
46141 ///
46142 /// # Arguments
46143 /// - `vd` — Vector register operand.
46144 /// - `vs2` — Vector register operand.
46145 /// - `rs1` — Source register.
46146 /// - `vm` — Vector mask control.
46147 pub fn vwsubu_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
46148 where
46149 Self: VwsubuVxEmitter<T0, T1, T2, T3>,
46150 {
46151 <Self as VwsubuVxEmitter<T0, T1, T2, T3>>::vwsubu_vx(self, vd, vs2, rs1, vm);
46152 }
46153 /// RISC-V `vwsubu.wv` instruction.
46154 ///
46155 /// # Forms
46156 /// Assembly: `vwsubu.wv vm, vs2, vs1, vd`
46157 /// Rust: `vwsubu_wv(vd, vs1, vs2, vm)`
46158 ///
46159 /// # Arguments
46160 /// - `vd` — Vector register operand.
46161 /// - `vs1` — Vector register operand.
46162 /// - `vs2` — Vector register operand.
46163 /// - `vm` — Vector mask control.
46164 pub fn vwsubu_wv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
46165 where
46166 Self: VwsubuWvEmitter<T0, T1, T2, T3>,
46167 {
46168 <Self as VwsubuWvEmitter<T0, T1, T2, T3>>::vwsubu_wv(self, vd, vs1, vs2, vm);
46169 }
46170 /// RISC-V `vwsubu.wx` instruction.
46171 ///
46172 /// # Forms
46173 /// Assembly: `vwsubu.wx vm, vs2, xs1, vd`
46174 /// Rust: `vwsubu_wx(vd, vs2, rs1, vm)`
46175 ///
46176 /// # Arguments
46177 /// - `vd` — Vector register operand.
46178 /// - `vs2` — Vector register operand.
46179 /// - `rs1` — Source register.
46180 /// - `vm` — Vector mask control.
46181 pub fn vwsubu_wx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
46182 where
46183 Self: VwsubuWxEmitter<T0, T1, T2, T3>,
46184 {
46185 <Self as VwsubuWxEmitter<T0, T1, T2, T3>>::vwsubu_wx(self, vd, vs2, rs1, vm);
46186 }
46187 /// RISC-V `vxor.vi` instruction.
46188 ///
46189 /// # Forms
46190 /// Assembly: `vxor.vi vm, vs2, vd, imm`
46191 /// Rust: `vxor_vi(vd, vs2, simm5, vm)`
46192 ///
46193 /// # Arguments
46194 /// - `vd` — Vector register operand.
46195 /// - `vs2` — Vector register operand.
46196 /// - `simm5` — Immediate encoding value.
46197 /// - `vm` — Vector mask control.
46198 pub fn vxor_vi<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, simm5: T2, vm: T3)
46199 where
46200 Self: VxorViEmitter<T0, T1, T2, T3>,
46201 {
46202 <Self as VxorViEmitter<T0, T1, T2, T3>>::vxor_vi(self, vd, vs2, simm5, vm);
46203 }
46204 /// RISC-V `vxor.vv` instruction.
46205 ///
46206 /// # Forms
46207 /// Assembly: `vxor.vv vm, vs2, vs1, vd`
46208 /// Rust: `vxor_vv(vd, vs1, vs2, vm)`
46209 ///
46210 /// # Arguments
46211 /// - `vd` — Vector register operand.
46212 /// - `vs1` — Vector register operand.
46213 /// - `vs2` — Vector register operand.
46214 /// - `vm` — Vector mask control.
46215 pub fn vxor_vv<T0, T1, T2, T3>(&mut self, vd: T0, vs1: T1, vs2: T2, vm: T3)
46216 where
46217 Self: VxorVvEmitter<T0, T1, T2, T3>,
46218 {
46219 <Self as VxorVvEmitter<T0, T1, T2, T3>>::vxor_vv(self, vd, vs1, vs2, vm);
46220 }
46221 /// RISC-V `vxor.vx` instruction.
46222 ///
46223 /// # Forms
46224 /// Assembly: `vxor.vx vm, vs2, xs1, vd`
46225 /// Rust: `vxor_vx(vd, vs2, rs1, vm)`
46226 ///
46227 /// # Arguments
46228 /// - `vd` — Vector register operand.
46229 /// - `vs2` — Vector register operand.
46230 /// - `rs1` — Source register.
46231 /// - `vm` — Vector mask control.
46232 pub fn vxor_vx<T0, T1, T2, T3>(&mut self, vd: T0, vs2: T1, rs1: T2, vm: T3)
46233 where
46234 Self: VxorVxEmitter<T0, T1, T2, T3>,
46235 {
46236 <Self as VxorVxEmitter<T0, T1, T2, T3>>::vxor_vx(self, vd, vs2, rs1, vm);
46237 }
46238 /// RISC-V `vzext.vf2` instruction.
46239 ///
46240 /// # Forms
46241 /// Assembly: `vzext.vf2 vm, vs2, vd`
46242 /// Rust: `vzext_vf2(vd, vs2, vm)`
46243 ///
46244 /// # Arguments
46245 /// - `vd` — Vector register operand.
46246 /// - `vs2` — Vector register operand.
46247 /// - `vm` — Vector mask control.
46248 pub fn vzext_vf2<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
46249 where
46250 Self: VzextVf2Emitter<T0, T1, T2>,
46251 {
46252 <Self as VzextVf2Emitter<T0, T1, T2>>::vzext_vf2(self, vd, vs2, vm);
46253 }
46254 /// RISC-V `vzext.vf4` instruction.
46255 ///
46256 /// # Forms
46257 /// Assembly: `vzext.vf4 vm, vs2, vd`
46258 /// Rust: `vzext_vf4(vd, vs2, vm)`
46259 ///
46260 /// # Arguments
46261 /// - `vd` — Vector register operand.
46262 /// - `vs2` — Vector register operand.
46263 /// - `vm` — Vector mask control.
46264 pub fn vzext_vf4<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
46265 where
46266 Self: VzextVf4Emitter<T0, T1, T2>,
46267 {
46268 <Self as VzextVf4Emitter<T0, T1, T2>>::vzext_vf4(self, vd, vs2, vm);
46269 }
46270 /// RISC-V `vzext.vf8` instruction.
46271 ///
46272 /// # Forms
46273 /// Assembly: `vzext.vf8 vm, vs2, vd`
46274 /// Rust: `vzext_vf8(vd, vs2, vm)`
46275 ///
46276 /// # Arguments
46277 /// - `vd` — Vector register operand.
46278 /// - `vs2` — Vector register operand.
46279 /// - `vm` — Vector mask control.
46280 pub fn vzext_vf8<T0, T1, T2>(&mut self, vd: T0, vs2: T1, vm: T2)
46281 where
46282 Self: VzextVf8Emitter<T0, T1, T2>,
46283 {
46284 <Self as VzextVf8Emitter<T0, T1, T2>>::vzext_vf8(self, vd, vs2, vm);
46285 }
46286 /// Wait for interrupt
46287 ///
46288 /// Can causes the processor to enter a low-power state until the next interrupt occurs.
46289 ///
46290 /// <%- if ext?(:H) -%>
46291 /// The behavior of `wfi` is affected by the `mstatus.TW`
46292 /// and `hstatus.VTW` bits, as summarized below.
46293 ///
46294 /// \[%autowidth,%footer\]
46295 /// |===
46296 /// .2+| \[.rotate\]#`mstatus.TW`# .2+| \[.rotate\]#`hstatus.VTW`# 4+^.>| `wfi` behavior
46297 /// h| HS-mode h| U-mode h| VS-mode h| in VU-mode
46298 ///
46299 /// | 0 | 0 | Wait | Trap (I) | Wait | Trap (V)
46300 /// | 0 | 1 | Wait | Trap (I) | Trap (V) | Trap (V)
46301 /// | 1 | - | Trap (I) | Trap (I) | Trap (I) | Trap (I)
46302 ///
46303 /// 6+| Trap (I) - Trap with `Illegal Instruction` code +
46304 /// Trap (V) - Trap with `Virtual Instruction` code
46305 /// |===
46306 ///
46307 /// <%- else -%>
46308 /// The `wfi` instruction is also affected by `mstatus.TW`, as shown below:
46309 ///
46310 /// \[%autowidth,%footer\]
46311 /// |===
46312 /// .2+| \[.rotate\]#`mstatus.TW`# 2+^.>| `wfi` behavior
46313 /// h| S-mode h| U-mode
46314 ///
46315 /// | 0 | Wait | Trap (I)
46316 /// | 1 | Trap (I) | Trap (I)
46317 ///
46318 /// 3+| Trap (I) - Trap with `Illegal Instruction` code
46319 /// |===
46320 ///
46321 /// <%- end -%>
46322 ///
46323 /// When `wfi` is marked as causing a trap above, the implementation is allowed to wait
46324 /// for an unspecified period of time to see if an interrupt occurs before raising the trap.
46325 /// That period of time can be zero (_i.e._, `wfi` always causes a trap in the cases identified
46326 /// above).
46327 ///
46328 /// # Forms
46329 /// Assembly: `wfi ""`
46330 /// Rust: `wfi()`
46331 ///
46332 /// # Arguments
46333 pub fn wfi(&mut self)
46334 where
46335 Self: WfiEmitter,
46336 {
46337 <Self as WfiEmitter>::wfi(self);
46338 }
46339 /// RISC-V `wrs.nto` instruction.
46340 ///
46341 /// # Forms
46342 /// Assembly: `wrs.nto wrs_nto`
46343 /// Rust: `wrs_nto()`
46344 ///
46345 /// # Arguments
46346 pub fn wrs_nto(&mut self)
46347 where
46348 Self: WrsNtoEmitter,
46349 {
46350 <Self as WrsNtoEmitter>::wrs_nto(self);
46351 }
46352 /// RISC-V `wrs.sto` instruction.
46353 ///
46354 /// # Forms
46355 /// Assembly: `wrs.sto wrs_sto`
46356 /// Rust: `wrs_sto()`
46357 ///
46358 /// # Arguments
46359 pub fn wrs_sto(&mut self)
46360 where
46361 Self: WrsStoEmitter,
46362 {
46363 <Self as WrsStoEmitter>::wrs_sto(self);
46364 }
46365 /// Exclusive NOR
46366 ///
46367 /// This instruction performs the bit-wise exclusive-NOR operation on rs1 and rs2.
46368 ///
46369 /// # Forms
46370 /// Assembly: `xnor xd, xs1, xs2`
46371 /// Rust: `xnor(rd, rs1, rs2)`
46372 ///
46373 /// # Arguments
46374 /// - `rd` — Destination register.
46375 /// - `rs1` — Source register.
46376 /// - `rs2` — Source register.
46377 pub fn xnor<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
46378 where
46379 Self: XnorEmitter<T0, T1, T2>,
46380 {
46381 <Self as XnorEmitter<T0, T1, T2>>::xnor(self, rd, rs1, rs2);
46382 }
46383 /// Exclusive Or
46384 ///
46385 /// Exclusive or rs1 with rs2, and store the result in rd
46386 ///
46387 /// # Forms
46388 /// Assembly: `xor xd, xs1, xs2`
46389 /// Rust: `xor(rd, rs1, rs2)`
46390 ///
46391 /// # Arguments
46392 /// - `rd` — Destination register.
46393 /// - `rs1` — Source register.
46394 /// - `rs2` — Source register.
46395 pub fn xor<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
46396 where
46397 Self: XorEmitter<T0, T1, T2>,
46398 {
46399 <Self as XorEmitter<T0, T1, T2>>::xor(self, rd, rs1, rs2);
46400 }
46401 /// Exclusive Or immediate
46402 ///
46403 /// Exclusive or an immediate to the value in rs1, and store the result in rd
46404 ///
46405 /// # Forms
46406 /// Assembly: `xori xd, xs1, imm`
46407 /// Rust: `xori(rd, rs1, imm)`
46408 ///
46409 /// # Arguments
46410 /// - `rd` — Destination register.
46411 /// - `rs1` — Source register.
46412 /// - `imm` — Immediate encoding value.
46413 pub fn xori<T0, T1, T2>(&mut self, rd: T0, rs1: T1, imm: T2)
46414 where
46415 Self: XoriEmitter<T0, T1, T2>,
46416 {
46417 <Self as XoriEmitter<T0, T1, T2>>::xori(self, rd, rs1, imm);
46418 }
46419 /// Crossbar permutation (nibbles)
46420 ///
46421 /// The xperm4 instruction operates on nibbles. The rs1 register contains a vector of XLEN/4 4-bit
46422 /// elements. The rs2 register contains a vector of XLEN/4 4-bit indexes. The result is each element in
46423 /// rs2 replaced by the indexed element in rs1, or zero if the index into rs2 is out of bounds.
46424 ///
46425 /// # Forms
46426 /// Assembly: `xperm4 xd, xs1, xs2`
46427 /// Rust: `xperm4(rd, rs1, rs2)`
46428 ///
46429 /// # Arguments
46430 /// - `rd` — Destination register.
46431 /// - `rs1` — Source register.
46432 /// - `rs2` — Source register.
46433 pub fn xperm4<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
46434 where
46435 Self: Xperm4Emitter<T0, T1, T2>,
46436 {
46437 <Self as Xperm4Emitter<T0, T1, T2>>::xperm4(self, rd, rs1, rs2);
46438 }
46439 /// Crossbar permutation (bytes)
46440 ///
46441 /// The xperm8 instruction operates on bytes. The rs1 register contains a vector of XLEN/8 8-bit
46442 /// elements. The rs2 register contains a vector of XLEN/8 8-bit indexes. The result is each element in
46443 /// rs2 replaced by the indexed element in rs1, or zero if the index into rs2 is out of bounds.
46444 ///
46445 /// # Forms
46446 /// Assembly: `xperm8 xd, xs1, xs2`
46447 /// Rust: `xperm8(rd, rs1, rs2)`
46448 ///
46449 /// # Arguments
46450 /// - `rd` — Destination register.
46451 /// - `rs1` — Source register.
46452 /// - `rs2` — Source register.
46453 pub fn xperm8<T0, T1, T2>(&mut self, rd: T0, rs1: T1, rs2: T2)
46454 where
46455 Self: Xperm8Emitter<T0, T1, T2>,
46456 {
46457 <Self as Xperm8Emitter<T0, T1, T2>>::xperm8(self, rd, rs1, rs2);
46458 }
46459 /// RISC-V `zext.b` instruction.
46460 ///
46461 /// # Forms
46462 /// Assembly: `zext.b rd rs1`
46463 /// Rust: `zext_b(rd, rs1)`
46464 ///
46465 /// # Arguments
46466 /// - `rd` — Destination register.
46467 /// - `rs1` — Source register.
46468 pub fn zext_b<T0, T1>(&mut self, rd: T0, rs1: T1)
46469 where
46470 Self: ZextBEmitter<T0, T1>,
46471 {
46472 <Self as ZextBEmitter<T0, T1>>::zext_b(self, rd, rs1);
46473 }
46474 /// Zero-extend halfword
46475 ///
46476 /// This instruction zero-extends the least-significant halfword of the source to XLEN by inserting
46477 /// 0's into all of the bits more significant than 15.
46478 ///
46479 /// \[NOTE\]
46480 /// The *zext.h* instruction is a pseudo-op for `pack` when `Zbkb` is implemented and XLEN == 32.
46481 ///
46482 /// \[NOTE\]
46483 /// The *zext.h* instruction is a pseudo-op for `packw` when `Zbkb` is implemented and XLEN == 64.
46484 ///
46485 /// # Forms
46486 /// Assembly: `zext.h xd, xs1`
46487 /// Rust: `zext_h(rd, rs1)`
46488 ///
46489 /// # Arguments
46490 /// - `rd` — Destination register.
46491 /// - `rs1` — Source register.
46492 pub fn zext_h<T0, T1>(&mut self, rd: T0, rs1: T1)
46493 where
46494 Self: ZextHEmitter<T0, T1>,
46495 {
46496 <Self as ZextHEmitter<T0, T1>>::zext_h(self, rd, rs1);
46497 }
46498 /// Zero-extend halfword
46499 ///
46500 /// This instruction zero-extends the least-significant halfword of the source to XLEN by inserting
46501 /// 0's into all of the bits more significant than 15.
46502 ///
46503 /// \[NOTE\]
46504 /// The *zext.h* instruction is a pseudo-op for `pack` when `Zbkb` is implemented and XLEN == 32.
46505 ///
46506 /// \[NOTE\]
46507 /// The *zext.h* instruction is a pseudo-op for `packw` when `Zbkb` is implemented and XLEN == 64.
46508 ///
46509 /// # Forms
46510 /// Assembly: `zext.h.rv32 xd, xs1`
46511 /// Rust: `zext_h_rv32(rd, rs1)`
46512 ///
46513 /// # Arguments
46514 /// - `rd` — Destination register.
46515 /// - `rs1` — Source register.
46516 pub fn zext_h_rv32<T0, T1>(&mut self, rd: T0, rs1: T1)
46517 where
46518 Self: ZextHRv32Emitter<T0, T1>,
46519 {
46520 <Self as ZextHRv32Emitter<T0, T1>>::zext_h_rv32(self, rd, rs1);
46521 }
46522 /// RISC-V `zext.w` instruction.
46523 ///
46524 /// # Forms
46525 /// Assembly: `zext.w rd rs1`
46526 /// Rust: `zext_w(rd, rs1)`
46527 ///
46528 /// # Arguments
46529 /// - `rd` — Destination register.
46530 /// - `rs1` — Source register.
46531 pub fn zext_w<T0, T1>(&mut self, rd: T0, rs1: T1)
46532 where
46533 Self: ZextWEmitter<T0, T1>,
46534 {
46535 <Self as ZextWEmitter<T0, T1>>::zext_w(self, rd, rs1);
46536 }
46537 /// Bit interleave
46538 ///
46539 /// This instruction scatters all of the odd and even bits of a source word into the high and low halves
46540 /// of a destination word. It is the inverse of the unzip instruction. This instruction is available only on
46541 /// RV32.
46542 ///
46543 /// # Forms
46544 /// Assembly: `zip xd, xs1`
46545 /// Rust: `zip(rd, rs1)`
46546 ///
46547 /// # Arguments
46548 /// - `rd` — Destination register.
46549 /// - `rs1` — Source register.
46550 pub fn zip<T0, T1>(&mut self, rd: T0, rs1: T1)
46551 where
46552 Self: ZipEmitter<T0, T1>,
46553 {
46554 <Self as ZipEmitter<T0, T1>>::zip(self, rd, rs1);
46555 }
46556}