1use 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}