riscv_isa/
asm.rs

1// Copyright James Wainwright
2//
3// SPDX-License-Identifier: MPL-2.0
4
5//! Support for serializing instructions in assembly format.
6
7use std::fmt::{self, Display};
8
9use crate::instruction::{Compressed, Instruction, Iorw};
10
11impl Display for Instruction {
12    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
13        match self {
14            Instruction::UNIMP => f.write_str("unimp"),
15            Instruction::LUI { rd, imm } => write!(f, "lui x{rd}, {imm}"),
16            Instruction::AUIPC { rd, imm } => write!(f, "auipc x{rd}, {imm}"),
17            Instruction::JAL { rd, offset } => write!(f, "jal x{rd}, {offset}"),
18            Instruction::JALR { rd, rs1, offset } => write!(f, "jalr x{rd}, {offset}(x{rs1})"),
19            Instruction::BEQ { rs1, rs2, offset } => write!(f, "beq x{rs1}, x{rs2}, {offset}"),
20            Instruction::BNE { rs1, rs2, offset } => write!(f, "bne x{rs1}, x{rs2}, {offset}"),
21            Instruction::BLT { rs1, rs2, offset } => write!(f, "blt x{rs1}, x{rs2}, {offset}"),
22            Instruction::BGE { rs1, rs2, offset } => write!(f, "bge x{rs1}, x{rs2}, {offset}"),
23            Instruction::BLTU { rs1, rs2, offset } => write!(f, "bltu x{rs1}, x{rs2}, {offset}"),
24            Instruction::BGEU { rs1, rs2, offset } => write!(f, "bgeu x{rs1}, x{rs2}, {offset}"),
25            Instruction::LB { rd, rs1, offset } => write!(f, "lb x{rd}, {offset}(x{rs1})"),
26            Instruction::LH { rd, rs1, offset } => write!(f, "lh x{rd}, {offset}(x{rs1})"),
27            Instruction::LW { rd, rs1, offset } => write!(f, "lw x{rd}, {offset}(x{rs1})"),
28            Instruction::LBU { rd, rs1, offset } => write!(f, "lbu x{rd}, {offset}(x{rs1})"),
29            Instruction::LHU { rd, rs1, offset } => write!(f, "lhu x{rd}, {offset}(x{rs1})"),
30            Instruction::SB { rs1, rs2, offset } => write!(f, "sb x{rs2}, {offset}(x{rs1})"),
31            Instruction::SH { rs1, rs2, offset } => write!(f, "sh x{rs2}, {offset}(x{rs1})"),
32            Instruction::SW { rs1, rs2, offset } => write!(f, "sw x{rs2}, {offset}(x{rs1})"),
33            Instruction::ADDI { rd, rs1, imm } => write!(f, "addi x{rd}, x{rs1}, {imm}"),
34            Instruction::SLTI { rd, rs1, imm } => write!(f, "slti x{rd}, x{rs1}, {imm}"),
35            Instruction::SLTIU { rd, rs1, imm } => write!(f, "sltiu x{rd}, x{rs1}, {imm}"),
36            Instruction::XORI { rd, rs1, imm } => write!(f, "xori x{rd}, x{rs1}, {imm}"),
37            Instruction::ORI { rd, rs1, imm } => write!(f, "ori x{rd}, x{rs1}, {imm}"),
38            Instruction::ANDI { rd, rs1, imm } => write!(f, "andi x{rd}, x{rs1}, {imm}"),
39            Instruction::SLLI { rd, rs1, shamt } => write!(f, "slli x{rd}, x{rs1}, {shamt}"),
40            Instruction::SRLI { rd, rs1, shamt } => write!(f, "srli x{rd}, x{rs1}, {shamt}"),
41            Instruction::SRAI { rd, rs1, shamt } => write!(f, "srai x{rd}, x{rs1}, {shamt}"),
42            Instruction::ADD { rd, rs1, rs2 } => write!(f, "add x{rd}, x{rs1}, x{rs2}"),
43            Instruction::SUB { rd, rs1, rs2 } => write!(f, "sub x{rd}, x{rs1}, x{rs2}"),
44            Instruction::SLL { rd, rs1, rs2 } => write!(f, "sll x{rd}, x{rs1}, x{rs2}"),
45            Instruction::SLT { rd, rs1, rs2 } => write!(f, "slt x{rd}, x{rs1}, x{rs2}"),
46            Instruction::SLTU { rd, rs1, rs2 } => write!(f, "sltu x{rd}, x{rs1}, x{rs2}"),
47            Instruction::XOR { rd, rs1, rs2 } => write!(f, "xor x{rd}, x{rs1}, x{rs2}"),
48            Instruction::SRL { rd, rs1, rs2 } => write!(f, "srl x{rd}, x{rs1}, x{rs2}"),
49            Instruction::SRA { rd, rs1, rs2 } => write!(f, "sra x{rd}, x{rs1}, x{rs2}"),
50            Instruction::OR { rd, rs1, rs2 } => write!(f, "or x{rd}, x{rs1}, x{rs2}"),
51            Instruction::AND { rd, rs1, rs2 } => write!(f, "and x{rd}, x{rs1}, x{rs2}"),
52            Instruction::FENCE { pred, succ } => {
53                write!(f, "fence {pred}, {succ}")
54            }
55            Instruction::ECALL => f.write_str("ecall"),
56            Instruction::EBREAK => f.write_str("ebreak"),
57            Instruction::SRET => f.write_str("sret"),
58            Instruction::SFENCE_VMA { rs1, rs2 } => write!(f, "sfence.vma x{rs1}, x{rs2}"),
59            Instruction::MRET => f.write_str("mret"),
60            Instruction::WFI => f.write_str("wfi"),
61            Instruction::LWU { rd, rs1, offset } => write!(f, "lwu x{rd}, {offset}(x{rs1})"),
62            Instruction::LD { rd, rs1, offset } => write!(f, "ld x{rd}, {offset}(x{rs1})"),
63            Instruction::SD { rs1, rs2, offset } => write!(f, "sd x{rs2}, {offset}(x{rs1})"),
64            Instruction::ADDIW { rd, rs1, imm } => write!(f, "addiw x{rd}, x{rs1}, {imm}"),
65            Instruction::SLLIW { rd, rs1, shamt } => write!(f, "slliw x{rd}, x{rs1}, {shamt}"),
66            Instruction::SRLIW { rd, rs1, shamt } => write!(f, "srliw x{rd}, x{rs1}, {shamt}"),
67            Instruction::SRAIW { rd, rs1, shamt } => write!(f, "sraiw x{rd}, x{rs1}, {shamt}"),
68            Instruction::ADDW { rd, rs1, rs2 } => write!(f, "addw x{rd}, x{rs1}, x{rs2}"),
69            Instruction::SUBW { rd, rs1, rs2 } => write!(f, "subw x{rd}, x{rs1}, x{rs2}"),
70            Instruction::SLLW { rd, rs1, rs2 } => write!(f, "sllw x{rd}, x{rs1}, x{rs2}"),
71            Instruction::SRLW { rd, rs1, rs2 } => write!(f, "srlw x{rd}, x{rs1}, x{rs2}"),
72            Instruction::SRAW { rd, rs1, rs2 } => write!(f, "sraw x{rd}, x{rs1}, x{rs2}"),
73            Instruction::FENCE_I => f.write_str("fence.i"),
74            Instruction::CSRRW { rd, csr, rs1 } => write!(f, "csrrw x{rd}, {csr}, x{rs1}"),
75            Instruction::CSRRS { rd, csr, rs1 } => write!(f, "csrrs x{rd}, {csr}, x{rs1}"),
76            Instruction::CSRRC { rd, csr, rs1 } => write!(f, "csrrc x{rd}, {csr}, x{rs1}"),
77            Instruction::CSRRWI { rd, csr, uimm } => write!(f, "csrrwi x{rd}, {csr}, {uimm}"),
78            Instruction::CSRRSI { rd, csr, uimm } => write!(f, "csrrsi x{rd}, {csr}, {uimm}"),
79            Instruction::CSRRCI { rd, csr, uimm } => write!(f, "csrrci x{rd}, {csr}, {uimm}"),
80            Instruction::MUL { rd, rs1, rs2 } => write!(f, "mul x{rd}, x{rs1}, x{rs2}"),
81            Instruction::MULH { rd, rs1, rs2 } => write!(f, "mulh x{rd}, x{rs1}, x{rs2}"),
82            Instruction::MULHSU { rd, rs1, rs2 } => write!(f, "mulhsu x{rd}, x{rs1}, x{rs2}"),
83            Instruction::MULHU { rd, rs1, rs2 } => write!(f, "mulhu x{rd}, x{rs1}, x{rs2}"),
84            Instruction::DIV { rd, rs1, rs2 } => write!(f, "div x{rd}, x{rs1}, x{rs2}"),
85            Instruction::DIVU { rd, rs1, rs2 } => write!(f, "divu x{rd}, x{rs1}, x{rs2}"),
86            Instruction::REM { rd, rs1, rs2 } => write!(f, "rem x{rd}, x{rs1}, x{rs2}"),
87            Instruction::REMU { rd, rs1, rs2 } => write!(f, "remu x{rd}, x{rs1}, x{rs2}"),
88            Instruction::MULW { rd, rs1, rs2 } => write!(f, "mulw x{rd}, x{rs1}, x{rs2}"),
89            Instruction::DIVW { rd, rs1, rs2 } => write!(f, "divw x{rd}, x{rs1}, x{rs2}"),
90            Instruction::DIVUW { rd, rs1, rs2 } => write!(f, "divuw x{rd}, x{rs1}, x{rs2}"),
91            Instruction::REMW { rd, rs1, rs2 } => write!(f, "remw x{rd}, x{rs1}, x{rs2}"),
92            Instruction::REMUW { rd, rs1, rs2 } => write!(f, "remuw x{rd}, x{rs1}, x{rs2}"),
93            Instruction::LR_W { rd, rs1, .. } => write!(f, "lr.w x{rd}, (x{rs1})"),
94            Instruction::SC_W { rd, rs1, rs2, .. } => write!(f, "sc.w x{rd}, x{rs2}, (x{rs1})"),
95            Instruction::AMOSWAP_W { rd, rs1, rs2, .. } => {
96                write!(f, "amoswap.w x{rd}, x{rs2}, (x{rs1})")
97            }
98            Instruction::AMOADD_W { rd, rs1, rs2, .. } => {
99                write!(f, "amoadd.w x{rd}, x{rs2}, (x{rs1})")
100            }
101            Instruction::AMOXOR_W { rd, rs1, rs2, .. } => {
102                write!(f, "amoxor.w x{rd}, x{rs2}, (x{rs1})")
103            }
104            Instruction::AMOAND_W { rd, rs1, rs2, .. } => {
105                write!(f, "amoand.w x{rd}, x{rs2}, (x{rs1})")
106            }
107            Instruction::AMOOR_W { rd, rs1, rs2, .. } => {
108                write!(f, "amoor.w x{rd}, x{rs2}, (x{rs1})")
109            }
110            Instruction::AMOMIN_W { rd, rs1, rs2, .. } => {
111                write!(f, "amomin.w x{rd}, x{rs2}, (x{rs1})")
112            }
113            Instruction::AMOMAX_W { rd, rs1, rs2, .. } => {
114                write!(f, "amomax.w x{rd}, x{rs2}, (x{rs1})")
115            }
116            Instruction::AMOMINU_W { rd, rs1, rs2, .. } => {
117                write!(f, "amominu.w x{rd}, x{rs2}, (x{rs1})")
118            }
119            Instruction::AMOMAXU_W { rd, rs1, rs2, .. } => {
120                write!(f, "amomaxu.w x{rd}, x{rs2}, (x{rs1})")
121            }
122            Instruction::LR_D { rd, rs1, .. } => write!(f, "lr.d x{rd}, (x{rs1})"),
123            Instruction::SC_D { rd, rs1, rs2, .. } => write!(f, "sc.d x{rd}, x{rs2}, (x{rs1})"),
124            Instruction::AMOSWAP_D { rd, rs1, rs2, .. } => {
125                write!(f, "amoswap.d x{rd}, x{rs2}, (x{rs1})")
126            }
127            Instruction::AMOADD_D { rd, rs1, rs2, .. } => {
128                write!(f, "amoadd.d x{rd}, x{rs2}, (x{rs1})")
129            }
130            Instruction::AMOXOR_D { rd, rs1, rs2, .. } => {
131                write!(f, "amoxor.d x{rd}, x{rs2}, (x{rs1})")
132            }
133            Instruction::AMOAND_D { rd, rs1, rs2, .. } => {
134                write!(f, "amoand.d x{rd}, x{rs2}, (x{rs1})")
135            }
136            Instruction::AMOOR_D { rd, rs1, rs2, .. } => {
137                write!(f, "amoor.d x{rd}, x{rs2}, (x{rs1})")
138            }
139            Instruction::AMOMIN_D { rd, rs1, rs2, .. } => {
140                write!(f, "amomin.d x{rd}, x{rs2}, (x{rs1})")
141            }
142            Instruction::AMOMAX_D { rd, rs1, rs2, .. } => {
143                write!(f, "amomax.d x{rd}, x{rs2}, (x{rs1})")
144            }
145            Instruction::AMOMINU_D { rd, rs1, rs2, .. } => {
146                write!(f, "amominu.d x{rd}, x{rs2}, (x{rs1})")
147            }
148            Instruction::AMOMAXU_D { rd, rs1, rs2, .. } => {
149                write!(f, "amomaxu.d x{rd}, x{rs2}, (x{rs1})")
150            }
151            Instruction::FLW { frd, rs1, offset } => write!(f, "flw f{frd}, {offset}(x{rs1})"),
152            Instruction::FSW { rs1, frs2, offset } => write!(f, "fsw f{frs2}, {offset}(x{rs1})"),
153            Instruction::FMADD_S { frd, frs1, frs2, frs3, .. } => {
154                write!(f, "fmadd.s f{frd}, f{frs1}, f{frs2}, f{frs3}")
155            }
156            Instruction::FMSUB_S { frd, frs1, frs2, frs3, .. } => {
157                write!(f, "fmsub.s f{frd}, f{frs1}, f{frs2}, f{frs3}")
158            }
159            Instruction::FNMSUB_S { frd, frs1, frs2, frs3, .. } => {
160                write!(f, "fnmsub.s f{frd}, f{frs1}, f{frs2}, f{frs3}")
161            }
162            Instruction::FNMADD_S { frd, frs1, frs2, frs3, .. } => {
163                write!(f, "fnmadd.s f{frd}, f{frs1}, f{frs2}, f{frs3}")
164            }
165            Instruction::FADD_S { frd, frs1, frs2, .. } => {
166                write!(f, "fadd.s f{frd}, f{frs1}, f{frs2}")
167            }
168            Instruction::FSUB_S { frd, frs1, frs2, .. } => {
169                write!(f, "fsub.s f{frd}, f{frs1}, f{frs2}")
170            }
171            Instruction::FMUL_S { frd, frs1, frs2, .. } => {
172                write!(f, "fmul.s f{frd}, f{frs1}, f{frs2}")
173            }
174            Instruction::FDIV_S { frd, frs1, frs2, .. } => {
175                write!(f, "fdiv.s f{frd}, f{frs1}, f{frs2}")
176            }
177            Instruction::FSQRT_S { frd, frs1, .. } => write!(f, "fsqrt.s f{frd}, f{frs1}"),
178            Instruction::FSGNJ_S { frd, frs1, frs2 } => {
179                write!(f, "fsgnj.s f{frd}, f{frs1}, f{frs2}")
180            }
181            Instruction::FSGNJN_S { frd, frs1, frs2 } => {
182                write!(f, "fsgnjn.s f{frd}, f{frs1}, f{frs2}")
183            }
184            Instruction::FSGNJX_S { frd, frs1, frs2 } => {
185                write!(f, "fsgnjx.s f{frd}, f{frs1}, f{frs2}")
186            }
187            Instruction::FMIN_S { frd, frs1, frs2 } => write!(f, "fmin.s f{frd}, f{frs1}, f{frs2}"),
188            Instruction::FMAX_S { frd, frs1, frs2 } => write!(f, "fmax.s f{frd}, f{frs1}, f{frs2}"),
189            Instruction::FCVT_W_S { rd, frs1, .. } => write!(f, "fcvt.w.s x{rd}, f{frs1}"),
190            Instruction::FCVT_WU_S { rd, frs1, .. } => write!(f, "fcvt.wu.s x{rd}, f{frs1}"),
191            Instruction::FMV_X_W { rd, frs1 } => write!(f, "fmv.x.w x{rd}, f{frs1}"),
192            Instruction::FEQ_S { rd, frs1, frs2 } => write!(f, "feq.s x{rd}, f{frs1}, f{frs2}"),
193            Instruction::FLT_S { rd, frs1, frs2 } => write!(f, "flt.s x{rd}, f{frs1}, f{frs2}"),
194            Instruction::FLE_S { rd, frs1, frs2 } => write!(f, "fle.s x{rd}, f{frs1}, f{frs2}"),
195            Instruction::FCLASS_S { rd, frs1 } => write!(f, "fclass.s x{rd}, f{frs1}"),
196            Instruction::FCVT_S_W { frd, rs1, .. } => write!(f, "fcvt.s.w f{frd}, x{rs1}"),
197            Instruction::FCVT_S_WU { frd, rs1, .. } => write!(f, "fcvt.s.wu f{frd}, x{rs1}"),
198            Instruction::FMV_W_X { frd, rs1 } => write!(f, "fmv.w.x f{frd}, x{rs1}"),
199            Instruction::FCVT_L_S { rd, frs1, .. } => write!(f, "fcvt.l.s x{rd}, f{frs1}"),
200            Instruction::FCVT_LU_S { rd, frs1, .. } => write!(f, "fcvt.lu.s x{rd}, f{frs1}"),
201            Instruction::FCVT_S_L { frd, rs1, .. } => write!(f, "fcvt.s.l f{frd}, x{rs1}"),
202            Instruction::FCVT_S_LU { frd, rs1, .. } => write!(f, "fcvt.s.lu f{frd}, x{rs1}"),
203            Instruction::FLD { frd, rs1, offset } => write!(f, "fld f{frd}, {offset}(x{rs1})"),
204            Instruction::FSD { rs1, frs2, offset } => write!(f, "fsd f{frs2}, {offset}(x{rs1})"),
205            Instruction::FMADD_D { frd, frs1, frs2, frs3, .. } => {
206                write!(f, "fmadd.d f{frd}, f{frs1}, f{frs2}, f{frs3}")
207            }
208            Instruction::FMSUB_D { frd, frs1, frs2, frs3, .. } => {
209                write!(f, "fmsub.d f{frd}, f{frs1}, f{frs2}, f{frs3}")
210            }
211            Instruction::FNMSUB_D { frd, frs1, frs2, frs3, .. } => {
212                write!(f, "fnmsub.d f{frd}, f{frs1}, f{frs2}, f{frs3}")
213            }
214            Instruction::FNMADD_D { frd, frs1, frs2, frs3, .. } => {
215                write!(f, "fnmadd.d f{frd}, f{frs1}, f{frs2}, f{frs3}")
216            }
217            Instruction::FADD_D { frd, frs1, frs2, .. } => {
218                write!(f, "fadd.d f{frd}, f{frs1}, f{frs2}")
219            }
220            Instruction::FSUB_D { frd, frs1, frs2, .. } => {
221                write!(f, "fsub.d f{frd}, f{frs1}, f{frs2}")
222            }
223            Instruction::FMUL_D { frd, frs1, frs2, .. } => {
224                write!(f, "fmul.d f{frd}, f{frs1}, f{frs2}")
225            }
226            Instruction::FDIV_D { frd, frs1, frs2, .. } => {
227                write!(f, "fdiv.d f{frd}, f{frs1}, f{frs2}")
228            }
229            Instruction::FSQRT_D { frd, frs1, .. } => write!(f, "fsqrt.d f{frd}, f{frs1}"),
230            Instruction::FSGNJ_D { frd, frs1, frs2 } => {
231                write!(f, "fsgnj.d f{frd}, f{frs1}, f{frs2}")
232            }
233            Instruction::FSGNJN_D { frd, frs1, frs2 } => {
234                write!(f, "fsgnjn.d f{frd}, f{frs1}, f{frs2}")
235            }
236            Instruction::FSGNJX_D { frd, frs1, frs2 } => {
237                write!(f, "fsgnjx.d f{frd}, f{frs1}, f{frs2}")
238            }
239            Instruction::FMIN_D { frd, frs1, frs2 } => write!(f, "fmin.d f{frd}, f{frs1}, f{frs2}"),
240            Instruction::FMAX_D { frd, frs1, frs2 } => write!(f, "fmax.d f{frd}, f{frs1}, f{frs2}"),
241            Instruction::FCVT_S_D { frd, frs1, .. } => write!(f, "fcvt.s.d f{frd}, f{frs1}"),
242            Instruction::FCVT_D_S { frd, frs1, .. } => write!(f, "fcvt.d.s f{frd}, f{frs1}"),
243            Instruction::FEQ_D { rd, frs1, frs2 } => write!(f, "feq.d x{rd}, f{frs1}, f{frs2}"),
244            Instruction::FLT_D { rd, frs1, frs2 } => write!(f, "flt.d x{rd}, f{frs1}, f{frs2}"),
245            Instruction::FLE_D { rd, frs1, frs2 } => write!(f, "fle.d x{rd}, f{frs1}, f{frs2}"),
246            Instruction::FCLASS_D { rd, frs1 } => write!(f, "fclass.d x{rd}, f{frs1}"),
247            Instruction::FCVT_W_D { rd, frs1, .. } => write!(f, "fcvt.w.d x{rd}, f{frs1}"),
248            Instruction::FCVT_WU_D { rd, frs1, .. } => write!(f, "fcvt.wu.d x{rd}, f{frs1}"),
249            Instruction::FCVT_D_W { frd, rs1, .. } => write!(f, "fcvt.d.w f{frd}, x{rs1}"),
250            Instruction::FCVT_D_WU { frd, rs1, .. } => write!(f, "fcvt.d.wu f{frd}, x{rs1}"),
251            Instruction::FCVT_L_D { rd, frs1, .. } => write!(f, "fcvt.l.d x{rd}, f{frs1}"),
252            Instruction::FCVT_LU_D { rd, frs1, .. } => write!(f, "fcvt.lu.d x{rd}, f{frs1}"),
253            Instruction::FMV_X_D { rd, frs1 } => write!(f, "fmv.x.d x{rd}, f{frs1}"),
254            Instruction::FCVT_D_L { frd, rs1, .. } => write!(f, "fcvt.d.l f{frd}, x{rs1}"),
255            Instruction::FCVT_D_LU { frd, rs1, .. } => write!(f, "fcvt.d.lu f{frd}, x{rs1}"),
256            Instruction::FMV_D_X { frd, rs1 } => write!(f, "fmv.d.x f{frd}, x{rs1}"),
257            Instruction::FLQ { frd, rs1, offset } => write!(f, "flq f{frd}, {offset}(x{rs1})"),
258            Instruction::FSQ { rs1, frs2, offset } => write!(f, "fsq f{frs2}, {offset}(x{rs1})"),
259            Instruction::FMADD_Q { frd, frs1, frs2, frs3, .. } => {
260                write!(f, "fmadd.q f{frd}, f{frs1}, f{frs2}, f{frs3}")
261            }
262            Instruction::FMSUB_Q { frd, frs1, frs2, frs3, .. } => {
263                write!(f, "fmsub.q f{frd}, f{frs1}, f{frs2}, f{frs3}")
264            }
265            Instruction::FNMSUB_Q { frd, frs1, frs2, frs3, .. } => {
266                write!(f, "fnmsub.q f{frd}, f{frs1}, f{frs2}, f{frs3}")
267            }
268            Instruction::FNMADD_Q { frd, frs1, frs2, frs3, .. } => {
269                write!(f, "fnmadd.q f{frd}, f{frs1}, f{frs2}, f{frs3}")
270            }
271            Instruction::FADD_Q { frd, frs1, frs2, .. } => {
272                write!(f, "fadd.q f{frd}, f{frs1}, f{frs2}")
273            }
274            Instruction::FSUB_Q { frd, frs1, frs2, .. } => {
275                write!(f, "fsub.q f{frd}, f{frs1}, f{frs2}")
276            }
277            Instruction::FMUL_Q { frd, frs1, frs2, .. } => {
278                write!(f, "fmul.q f{frd}, f{frs1}, f{frs2}")
279            }
280            Instruction::FDIV_Q { frd, frs1, frs2, .. } => {
281                write!(f, "fdiv.q f{frd}, f{frs1}, f{frs2}")
282            }
283            Instruction::FSQRT_Q { frd, frs1, .. } => write!(f, "fsqrt.q f{frd}, f{frs1}"),
284            Instruction::FSGNJ_Q { frd, frs1, frs2 } => {
285                write!(f, "fsgnj.q f{frd}, f{frs1}, f{frs2}")
286            }
287            Instruction::FSGNJN_Q { frd, frs1, frs2 } => {
288                write!(f, "fsgnjn.q f{frd}, f{frs1}, f{frs2}")
289            }
290            Instruction::FSGNJX_Q { frd, frs1, frs2 } => {
291                write!(f, "fsgnjx.q f{frd}, f{frs1}, f{frs2}")
292            }
293            Instruction::FMIN_Q { frd, frs1, frs2 } => write!(f, "fmin.q f{frd}, f{frs1}, f{frs2}"),
294            Instruction::FMAX_Q { frd, frs1, frs2 } => write!(f, "fmax.q f{frd}, f{frs1}, f{frs2}"),
295            Instruction::FCVT_S_Q { frd, frs1, .. } => write!(f, "fcvt.s.q f{frd}, f{frs1}"),
296            Instruction::FCVT_Q_S { frd, frs1, .. } => write!(f, "fcvt.q.s f{frd}, f{frs1}"),
297            Instruction::FCVT_D_Q { frd, frs1, .. } => write!(f, "fcvt.d.q f{frd}, f{frs1}"),
298            Instruction::FCVT_Q_D { frd, frs1, .. } => write!(f, "fcvt.q.d f{frd}, f{frs1}"),
299            Instruction::FEQ_Q { rd, frs1, frs2 } => write!(f, "feq.q x{rd}, f{frs1}, f{frs2}"),
300            Instruction::FLT_Q { rd, frs1, frs2 } => write!(f, "flt.q x{rd}, f{frs1}, f{frs2}"),
301            Instruction::FLE_Q { rd, frs1, frs2 } => write!(f, "fle.q x{rd}, f{frs1}, f{frs2}"),
302            Instruction::FCLASS_Q { rd, frs1 } => write!(f, "fclass.q x{rd}, f{frs1}"),
303            Instruction::FCVT_W_Q { rd, frs1, .. } => write!(f, "fcvt.w.q x{rd}, f{frs1}"),
304            Instruction::FCVT_WU_Q { rd, frs1, .. } => write!(f, "fcvt.wu.q x{rd}, f{frs1}"),
305            Instruction::FCVT_Q_W { frd, rs1, .. } => write!(f, "fcvt.q.w f{frd}, x{rs1}"),
306            Instruction::FCVT_Q_WU { frd, rs1, .. } => write!(f, "fcvt.q.wu f{frd}, x{rs1}"),
307            Instruction::FCVT_L_Q { rd, frs1, .. } => write!(f, "fcvt.l.q x{rd}, f{frs1}"),
308            Instruction::FCVT_LU_Q { rd, frs1, .. } => write!(f, "fcvt.lu.q x{rd}, f{frs1}"),
309            Instruction::FCVT_Q_L { frd, rs1, .. } => write!(f, "fcvt.q.l f{frd}, x{rs1}"),
310            Instruction::FCVT_Q_LU { frd, rs1, .. } => write!(f, "fcvt.q.lu f{frd}, x{rs1}"),
311            Instruction::FLH { frd, rs1, offset } => write!(f, "flh f{frd}, {offset}(x{rs1})"),
312            Instruction::FSH { rs1, frs2, offset } => write!(f, "fsh f{frs2}, {offset}(x{rs1})"),
313            Instruction::FMADD_H { frd, frs1, frs2, frs3, .. } => {
314                write!(f, "fmadd.h f{frd}, f{frs1}, f{frs2}, f{frs3}")
315            }
316            Instruction::FMSUB_H { frd, frs1, frs2, frs3, .. } => {
317                write!(f, "fmsub.h f{frd}, f{frs1}, f{frs2}, f{frs3}")
318            }
319            Instruction::FNMSUB_H { frd, frs1, frs2, frs3, .. } => {
320                write!(f, "fnmsub.h f{frd}, f{frs1}, f{frs2}, f{frs3}")
321            }
322            Instruction::FNMADD_H { frd, frs1, frs2, frs3, .. } => {
323                write!(f, "fnmadd.h f{frd}, f{frs1}, f{frs2}, f{frs3}")
324            }
325            Instruction::FADD_H { frd, frs1, frs2, .. } => {
326                write!(f, "fadd.h f{frd}, f{frs1}, f{frs2}")
327            }
328            Instruction::FSUB_H { frd, frs1, frs2, .. } => {
329                write!(f, "fsub.h f{frd}, f{frs1}, f{frs2}")
330            }
331            Instruction::FMUL_H { frd, frs1, frs2, .. } => {
332                write!(f, "fmul.h f{frd}, f{frs1}, f{frs2}")
333            }
334            Instruction::FDIV_H { frd, frs1, frs2, .. } => {
335                write!(f, "fdiv.h f{frd}, f{frs1}, f{frs2}")
336            }
337            Instruction::FSQRT_H { frd, frs1, .. } => write!(f, "fsqrt.h f{frd}, f{frs1}"),
338            Instruction::FSGNJ_H { frd, frs1, frs2 } => {
339                write!(f, "fsgnj.h f{frd}, f{frs1}, f{frs2}")
340            }
341            Instruction::FSGNJN_H { frd, frs1, frs2 } => {
342                write!(f, "fsgnjn.h f{frd}, f{frs1}, f{frs2}")
343            }
344            Instruction::FSGNJX_H { frd, frs1, frs2 } => {
345                write!(f, "fsgnjx.h f{frd}, f{frs1}, f{frs2}")
346            }
347            Instruction::FMIN_H { frd, frs1, frs2 } => write!(f, "fmin.h f{frd}, f{frs1}, f{frs2}"),
348            Instruction::FMAX_H { frd, frs1, frs2 } => write!(f, "fmax.h f{frd}, f{frs1}, f{frs2}"),
349            Instruction::FCVT_S_H { frd, frs1, .. } => write!(f, "fcvt.s.h f{frd}, f{frs1}"),
350            Instruction::FCVT_H_S { frd, frs1, .. } => write!(f, "fcvt.h.s f{frd}, f{frs1}"),
351            Instruction::FCVT_D_H { frd, frs1, .. } => write!(f, "fcvt.d.h f{frd}, f{frs1}"),
352            Instruction::FCVT_H_D { frd, frs1, .. } => write!(f, "fcvt.h.d f{frd}, f{frs1}"),
353            Instruction::FCVT_Q_H { frd, frs1, .. } => write!(f, "fcvt.q.h f{frd}, f{frs1}"),
354            Instruction::FCVT_H_Q { frd, frs1, .. } => write!(f, "fcvt.h.q f{frd}, f{frs1}"),
355            Instruction::FEQ_H { rd, frs1, frs2 } => write!(f, "feq.h x{rd}, f{frs1}, f{frs2}"),
356            Instruction::FLT_H { rd, frs1, frs2 } => write!(f, "flt.h x{rd}, f{frs1}, f{frs2}"),
357            Instruction::FLE_H { rd, frs1, frs2 } => write!(f, "fle.h x{rd}, f{frs1}, f{frs2}"),
358            Instruction::FCLASS_H { rd, frs1 } => write!(f, "fclass.h x{rd}, f{frs1}"),
359            Instruction::FCVT_W_H { rd, frs1, .. } => write!(f, "fcvt.w.h x{rd}, f{frs1}"),
360            Instruction::FCVT_WU_H { rd, frs1, .. } => write!(f, "fcvt.wu.h x{rd}, f{frs1}"),
361            Instruction::FMV_X_H { frd, rs1 } => write!(f, "fmv.x.h f{frd}, x{rs1}"),
362            Instruction::FCVT_H_W { frd, rs1, .. } => write!(f, "fcvt.h.w f{frd}, x{rs1}"),
363            Instruction::FCVT_H_WU { frd, rs1, .. } => write!(f, "fcvt.h.wu f{frd}, x{rs1}"),
364            Instruction::FMV_H_X { frd, rs1 } => write!(f, "fmv.h.x f{frd}, x{rs1}"),
365            Instruction::FCVT_L_H { rd, frs1, .. } => write!(f, "fcvt.l.h x{rd}, f{frs1}"),
366            Instruction::FCVT_LU_H { rd, frs1, .. } => {
367                write!(f, "fcvt.lu.h x{rd}, f{frs1}")
368            }
369            Instruction::FCVT_H_L { frd, rs1, .. } => write!(f, "fcvt.h.l f{frd}, x{rs1}"),
370            Instruction::FCVT_H_LU { frd, rs1, .. } => {
371                write!(f, "fcvt.h.lu f{frd}, x{rs1}")
372            }
373            Instruction::WRS_NTO => f.write_str("wrs.nto"),
374            Instruction::WRS_STO => f.write_str("wrs.sto"),
375            Instruction::SH1ADD { rd, rs1, rs2 } => write!(f, "sh1add x{rd}, x{rs1}, x{rs2}"),
376            Instruction::SH2ADD { rd, rs1, rs2 } => write!(f, "sh2add x{rd}, x{rs1}, x{rs2}"),
377            Instruction::SH3ADD { rd, rs1, rs2 } => write!(f, "sh3add x{rd}, x{rs1}, x{rs2}"),
378            Instruction::ADD_UW { rd, rs1, rs2 } => write!(f, "add.uw x{rd}, x{rs1}, x{rs2}"),
379            Instruction::SH1ADD_UW { rd, rs1, rs2 } => write!(f, "sh1add.uw x{rd}, x{rs1}, x{rs2}"),
380            Instruction::SH2ADD_UW { rd, rs1, rs2 } => write!(f, "sh2add.uw x{rd}, x{rs1}, x{rs2}"),
381            Instruction::SH3ADD_UW { rd, rs1, rs2 } => write!(f, "sh3add.uw x{rd}, x{rs1}, x{rs2}"),
382            Instruction::SLLI_UW { rd, rs1, shamt } => write!(f, "slli.uw x{rd}, x{rs1}, {shamt}"),
383            Instruction::ANDN { rd, rs1, rs2 } => write!(f, "andn x{rd}, x{rs1}, x{rs2}"),
384            Instruction::ORN { rd, rs1, rs2 } => write!(f, "orn x{rd}, x{rs1}, x{rs2}"),
385            Instruction::XNOR { rd, rs1, rs2 } => write!(f, "xnor x{rd}, x{rs1}, x{rs2}"),
386            Instruction::CLZ { rd, rs1 } => write!(f, "clz x{rd}, x{rs1}"),
387            Instruction::CTZ { rd, rs1 } => write!(f, "ctz x{rd}, x{rs1}"),
388            Instruction::CPOP { rd, rs1 } => write!(f, "cpop x{rd}, x{rs1}"),
389            Instruction::MAX { rd, rs1, rs2 } => write!(f, "max x{rd}, x{rs1}, x{rs2}"),
390            Instruction::MAXU { rd, rs1, rs2 } => write!(f, "maxu x{rd}, x{rs1}, x{rs2}"),
391            Instruction::MIN { rd, rs1, rs2 } => write!(f, "min x{rd}, x{rs1}, x{rs2}"),
392            Instruction::MINU { rd, rs1, rs2 } => write!(f, "minu x{rd}, x{rs1}, x{rs2}"),
393            Instruction::SEXT_B { rd, rs1 } => write!(f, "sext.b x{rd}, x{rs1}"),
394            Instruction::SEXT_H { rd, rs1 } => write!(f, "sext.h x{rd}, x{rs1}"),
395            Instruction::ZEXT_H { rd, rs1 } => write!(f, "zext.h x{rd}, x{rs1}"),
396            Instruction::CLZW { rd, rs1 } => write!(f, "clzw x{rd}, x{rs1}"),
397            Instruction::CTZW { rd, rs1 } => write!(f, "ctzw x{rd}, x{rs1}"),
398            Instruction::CPOPW { rd, rs1 } => write!(f, "cpopw x{rd}, x{rs1}"),
399            Instruction::ROL { rd, rs1, rs2 } => write!(f, "rol x{rd}, x{rs1}, x{rs2}"),
400            Instruction::ROR { rd, rs1, rs2 } => write!(f, "ror x{rd}, x{rs1}, x{rs2}"),
401            Instruction::RORI { rd, rs1, shamt } => write!(f, "rori x{rd}, x{rs1}, {shamt}"),
402            Instruction::ORC_B { rd, rs1 } => write!(f, "orc.b x{rd}, x{rs1}"),
403            Instruction::REV8 { rd, rs1 } => write!(f, "rev8 x{rd}, x{rs1}"),
404            Instruction::ROLW { rd, rs1, rs2 } => write!(f, "rolw x{rd}, x{rs1}, x{rs2}"),
405            Instruction::RORIW { rd, rs1, shamt } => write!(f, "roriw x{rd}, x{rs1}, {shamt}"),
406            Instruction::RORW { rd, rs1, rs2 } => write!(f, "rorw x{rd}, x{rs1}, x{rs2}"),
407            Instruction::PACK { rd, rs1, rs2 } => write!(f, "pack x{rd}, x{rs1}, x{rs2}"),
408            Instruction::PACKH { rd, rs1, rs2 } => write!(f, "packh x{rd}, x{rs1}, x{rs2}"),
409            Instruction::BREV8 { rd, rs1 } => write!(f, "brev8 x{rd}, x{rs1}"),
410            Instruction::ZIP { rd, rs1 } => write!(f, "zip x{rd}, x{rs1}"),
411            Instruction::UNZIP { rd, rs1 } => write!(f, "unzip x{rd}, x{rs1}"),
412            Instruction::PACKW { rd, rs1, rs2 } => write!(f, "packw x{rd}, x{rs1}, x{rs2}"),
413            Instruction::CLMUL { rd, rs1, rs2 } => write!(f, "clmul x{rd}, x{rs1}, x{rs2}"),
414            Instruction::CLMULH { rd, rs1, rs2 } => write!(f, "clmulh x{rd}, x{rs1}, x{rs2}"),
415            Instruction::CLMULR { rd, rs1, rs2 } => write!(f, "clmulr x{rd}, x{rs1}, x{rs2}"),
416            Instruction::BCLR { rd, rs1, rs2 } => write!(f, "bclr x{rd}, x{rs1}, x{rs2}"),
417            Instruction::BCLRI { rd, rs1, shamt } => write!(f, "bclri x{rd}, x{rs1}, {shamt}"),
418            Instruction::BEXT { rd, rs1, rs2 } => write!(f, "bext x{rd}, x{rs1}, x{rs2}"),
419            Instruction::BEXTI { rd, rs1, shamt } => write!(f, "bexti x{rd}, x{rs1}, {shamt}"),
420            Instruction::BINV { rd, rs1, rs2 } => write!(f, "binv x{rd}, x{rs1}, x{rs2}"),
421            Instruction::BINVI { rd, rs1, shamt } => write!(f, "binvi x{rd}, x{rs1}, {shamt}"),
422            Instruction::BSET { rd, rs1, rs2 } => write!(f, "bset x{rd}, x{rs1}, x{rs2}"),
423            Instruction::BSETI { rd, rs1, shamt } => write!(f, "bseti x{rd}, x{rs1}, {shamt}"),
424        }
425    }
426}
427
428impl Display for Compressed {
429    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
430        match self {
431            Compressed::UNIMP => f.write_str("unimp"),
432            Compressed::C_LWSP { rd, offset } => write!(f, "c.lwsp x{rd}, {offset}(x2)"),
433            Compressed::C_LDSP { rd, offset } => write!(f, "c.ldsp x{rd}, {offset}(x2)"),
434            Compressed::C_LQSP { rd, offset } => write!(f, "c.lqsp x{rd}, {offset}(x2)"),
435            Compressed::C_FLWSP { frd, offset } => write!(f, "c.flwsp f{frd}, {offset}(x2)"),
436            Compressed::C_FLDSP { frd, offset } => write!(f, "c.fldsp f{frd}, {offset}(x2)"),
437            Compressed::C_SWSP { rs2, offset } => write!(f, "c.swsp x{rs2}, {offset}(x2)"),
438            Compressed::C_SDSP { rs2, offset } => write!(f, "c.sdsp x{rs2}, {offset}(x2)"),
439            Compressed::C_SQSP { rs2, offset } => write!(f, "c.sqsp x{rs2}, {offset}(x2)"),
440            Compressed::C_FSWSP { frs2, offset } => write!(f, "c.fswsp f{frs2}, {offset}(x2)"),
441            Compressed::C_FSDSP { frs2, offset } => write!(f, "c.fsdsp f{frs2}, {offset}(x2)"),
442            Compressed::C_LW { rd, rs1, offset } => write!(f, "c.lw x{rd}, {offset}(x{rs1})"),
443            Compressed::C_LD { rd, rs1, offset } => write!(f, "c.ld x{rd}, {offset}(x{rs1})"),
444            Compressed::C_LQ { rd, rs1, offset } => write!(f, "c.lq x{rd}, {offset}(x{rs1})"),
445            Compressed::C_FLW { frd, rs1, offset } => write!(f, "c.flw f{frd}, {offset}(x{rs1})"),
446            Compressed::C_FLD { frd, rs1, offset } => write!(f, "c.fld f{frd}, {offset}(x{rs1})"),
447            Compressed::C_SW { rs1, rs2, offset } => write!(f, "c.sw x{rs2}, {offset}(x{rs1})"),
448            Compressed::C_SD { rs1, rs2, offset } => write!(f, "c.sd x{rs2}, {offset}(x{rs1})"),
449            Compressed::C_SQ { rs1, rs2, offset } => write!(f, "c.sq x{rs2}, {offset}(x{rs1})"),
450            Compressed::C_FSW { rs1, frs2, offset } => write!(f, "c.fsw f{frs2}, {offset}(x{rs1})"),
451            Compressed::C_FSD { rs1, frs2, offset } => write!(f, "c.fsd f{frs2}, {offset}(x{rs1})"),
452            Compressed::C_J { offset } => write!(f, "c.j {offset}"),
453            Compressed::C_JAL { offset } => write!(f, "c.jal {offset}"),
454            Compressed::C_JR { rs1 } => write!(f, "c.jr x{rs1}"),
455            Compressed::C_JALR { rs1 } => write!(f, "c.jalr x{rs1}"),
456            Compressed::C_BEQZ { rs1, offset } => write!(f, "c.beqz x{rs1}, {offset}"),
457            Compressed::C_BNEZ { rs1, offset } => write!(f, "c.bnez x{rs1}, {offset}"),
458            Compressed::C_LI { rd, imm } => write!(f, "c.li x{rd}, {imm}"),
459            Compressed::C_LUI { rd, imm } => write!(f, "c.lui x{rd}, {imm}"),
460            Compressed::C_ADDI { rd, imm } => write!(f, "c.addi x{rd}, {imm}"),
461            Compressed::C_ADDIW { rd, imm } => write!(f, "c.addiw x{rd}, {imm}"),
462            Compressed::C_ADDI16SP { imm } => write!(f, "c.addi16sp x2, {imm}"),
463            Compressed::C_ADDI4SPN { rd, imm } => write!(f, "c.addi4spn x{rd}, x2, {imm}"),
464            Compressed::C_SLLI { rd, shamt } => write!(f, "c.slli x{rd}, {shamt}"),
465            Compressed::C_SRLI { rd, shamt } => write!(f, "c.srli x{rd}, {shamt}"),
466            Compressed::C_SRAI { rd, shamt } => write!(f, "c.srai x{rd}, {shamt}"),
467            Compressed::C_ANDI { rd, imm } => write!(f, "c.andi x{rd}, {imm}"),
468            Compressed::C_MV { rd, rs2 } => write!(f, "c.mv x{rd}, x{rs2}"),
469            Compressed::C_ADD { rd, rs2 } => write!(f, "c.add x{rd}, x{rs2}"),
470            Compressed::C_AND { rd, rs2 } => write!(f, "c.and x{rd}, x{rs2}"),
471            Compressed::C_OR { rd, rs2 } => write!(f, "c.or x{rd}, x{rs2}"),
472            Compressed::C_XOR { rd, rs2 } => write!(f, "c.xor x{rd}, x{rs2}"),
473            Compressed::C_SUB { rd, rs2 } => write!(f, "c.sub x{rd}, x{rs2}"),
474            Compressed::C_ADDW { rd, rs2 } => write!(f, "c.addw x{rd}, x{rs2}"),
475            Compressed::C_SUBW { rd, rs2 } => write!(f, "c.subw x{rd}, x{rs2}"),
476            Compressed::C_NOP => f.write_str("c.nop"),
477            Compressed::C_EBREAK => f.write_str("c.ebreak"),
478        }
479    }
480}
481
482impl Display for Iorw {
483    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
484        if *self & Iorw::I == Iorw::I {
485            f.write_str("i")?;
486        }
487        if *self & Iorw::O == Iorw::O {
488            f.write_str("o")?;
489        }
490        if *self & Iorw::R == Iorw::R {
491            f.write_str("r")?;
492        }
493        if *self & Iorw::W == Iorw::W {
494            f.write_str("w")?;
495        }
496
497        Ok(())
498    }
499}