/src/capstonenext/arch/RISCV/RISCVInstPrinter.c
Line | Count | Source |
1 | | //===-- RISCVInstPrinter.cpp - Convert RISCV MCInst to asm syntax ---------===// |
2 | | // |
3 | | // The LLVM Compiler Infrastructure |
4 | | // |
5 | | // This file is distributed under the University of Illinois Open Source |
6 | | // License. See LICENSE.TXT for details. |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | // |
10 | | // This class prints an RISCV MCInst to a .s file. |
11 | | // |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | #ifdef CAPSTONE_HAS_RISCV |
15 | | |
16 | | #include <stdio.h> // DEBUG |
17 | | #include <stdlib.h> |
18 | | #include <string.h> |
19 | | #include <capstone/platform.h> |
20 | | |
21 | | #include "RISCVInstPrinter.h" |
22 | | #include "RISCVBaseInfo.h" |
23 | | #include "../../MCInst.h" |
24 | | #include "../../SStream.h" |
25 | | #include "../../MCRegisterInfo.h" |
26 | | #include "../../utils.h" |
27 | | #include "../../Mapping.h" |
28 | | #include "RISCVMapping.h" |
29 | | |
30 | | //#include "RISCVDisassembler.h" |
31 | | |
32 | | #define GET_REGINFO_ENUM |
33 | | #define GET_REGINFO_MC_DESC |
34 | | #include "RISCVGenRegisterInfo.inc" |
35 | | #define GET_INSTRINFO_ENUM |
36 | | #include "RISCVGenInstrInfo.inc" |
37 | | |
38 | | // Autogenerated by tblgen. |
39 | | static void printInstruction(MCInst *MI, SStream *O, MCRegisterInfo *MRI); |
40 | | static bool printAliasInstr(MCInst *MI, SStream *OS, void *info); |
41 | | static void printOperand(MCInst *MI, unsigned OpNo, SStream *O); |
42 | | static void printFenceArg(MCInst *MI, unsigned OpNo, SStream *O); |
43 | | static void printCSRSystemRegister(MCInst *, unsigned, SStream *); |
44 | | static void printFRMArg(MCInst *MI, unsigned OpNo, SStream *O); |
45 | | static void printCustomAliasOperand(MCInst *, unsigned, unsigned, SStream *); |
46 | | /// getRegisterName - This method is automatically generated by tblgen |
47 | | /// from the register set description. This returns the assembler name |
48 | | /// for the specified register. |
49 | | static const char *getRegisterName(unsigned RegNo, unsigned AltIdx); |
50 | | |
51 | | // Include the auto-generated portion of the assembly writer. |
52 | | #define PRINT_ALIAS_INSTR |
53 | | #include "RISCVGenAsmWriter.inc" |
54 | | |
55 | | static void fixDetailOfEffectiveAddr(MCInst *MI) |
56 | 13.3k | { |
57 | | // Operands for load and store instructions in RISCV vary widely |
58 | 13.3k | unsigned id = MI->flat_insn->id; |
59 | 13.3k | unsigned reg = 0; |
60 | 13.3k | int64_t imm = 0; |
61 | 13.3k | uint8_t access = 0; |
62 | | |
63 | 13.3k | switch (id) { |
64 | 0 | case RISCV_INS_C_FLD: |
65 | 0 | case RISCV_INS_C_LW: |
66 | 0 | case RISCV_INS_C_FLW: |
67 | 0 | case RISCV_INS_C_LD: |
68 | 0 | case RISCV_INS_C_FSD: |
69 | 0 | case RISCV_INS_C_SW: |
70 | 0 | case RISCV_INS_C_FSW: |
71 | 0 | case RISCV_INS_C_SD: |
72 | 0 | case RISCV_INS_C_FLDSP: |
73 | 0 | case RISCV_INS_C_LWSP: |
74 | 0 | case RISCV_INS_C_FLWSP: |
75 | 0 | case RISCV_INS_C_LDSP: |
76 | 0 | case RISCV_INS_C_FSDSP: |
77 | 0 | case RISCV_INS_C_SWSP: |
78 | 0 | case RISCV_INS_C_FSWSP: |
79 | 0 | case RISCV_INS_C_SDSP: |
80 | 152 | case RISCV_INS_FLW: |
81 | 404 | case RISCV_INS_FSW: |
82 | 606 | case RISCV_INS_FLD: |
83 | 955 | case RISCV_INS_FSD: |
84 | 1.66k | case RISCV_INS_LB: |
85 | 1.82k | case RISCV_INS_LBU: |
86 | 2.05k | case RISCV_INS_LD: |
87 | 2.14k | case RISCV_INS_LH: |
88 | 2.47k | case RISCV_INS_LHU: |
89 | 2.80k | case RISCV_INS_LW: |
90 | 2.98k | case RISCV_INS_LWU: |
91 | 3.21k | case RISCV_INS_SB: |
92 | 3.34k | case RISCV_INS_SD: |
93 | 3.49k | case RISCV_INS_SH: |
94 | 4.31k | case RISCV_INS_SW: { |
95 | 4.31k | CS_ASSERT(3 == MI->flat_insn->detail->riscv.op_count); |
96 | 4.31k | CS_ASSERT(RISCV_OP_REG == RISCV_get_detail_op(MI, -3)->type); |
97 | 4.31k | CS_ASSERT(RISCV_OP_IMM == RISCV_get_detail_op(MI, -2)->type); |
98 | 4.31k | CS_ASSERT(RISCV_OP_REG == RISCV_get_detail_op(MI, -1)->type); |
99 | | |
100 | 4.31k | imm = RISCV_get_detail_op(MI, -2)->imm; |
101 | 4.31k | reg = RISCV_get_detail_op(MI, -1)->reg; |
102 | 4.31k | access = RISCV_get_detail_op(MI, -1)->access; |
103 | | |
104 | 4.31k | RISCV_get_detail_op(MI, -2)->type = RISCV_OP_MEM; |
105 | 4.31k | RISCV_get_detail_op(MI, -2)->mem.base = reg; |
106 | 4.31k | RISCV_get_detail_op(MI, -2)->mem.disp = imm; |
107 | 4.31k | RISCV_get_detail_op(MI, -2)->access = access; |
108 | | |
109 | 4.31k | RISCV_dec_op_count(MI); |
110 | | |
111 | 4.31k | break; |
112 | 3.49k | } |
113 | 37 | case RISCV_INS_LR_W: |
114 | 103 | case RISCV_INS_LR_W_AQ: |
115 | 396 | case RISCV_INS_LR_W_AQ_RL: |
116 | 443 | case RISCV_INS_LR_W_RL: |
117 | 510 | case RISCV_INS_LR_D: |
118 | 528 | case RISCV_INS_LR_D_AQ: |
119 | 712 | case RISCV_INS_LR_D_AQ_RL: |
120 | 881 | case RISCV_INS_LR_D_RL: { |
121 | 881 | CS_ASSERT(2 == MI->flat_insn->detail->riscv.op_count); |
122 | 881 | CS_ASSERT(RISCV_OP_REG == RISCV_get_detail_op(MI, -1)->type); |
123 | 881 | CS_ASSERT(RISCV_OP_REG == RISCV_get_detail_op(MI, -2)->type); |
124 | | |
125 | 881 | reg = RISCV_get_detail_op(MI, -1)->reg; |
126 | | |
127 | 881 | RISCV_get_detail_op(MI, -1)->type = RISCV_OP_MEM; |
128 | 881 | RISCV_get_detail_op(MI, -1)->mem.base = reg; |
129 | 881 | RISCV_get_detail_op(MI, -1)->mem.disp = 0; |
130 | | |
131 | 881 | break; |
132 | 712 | } |
133 | 20 | case RISCV_INS_SC_W: |
134 | 85 | case RISCV_INS_SC_W_AQ: |
135 | 136 | case RISCV_INS_SC_W_AQ_RL: |
136 | 203 | case RISCV_INS_SC_W_RL: |
137 | 288 | case RISCV_INS_SC_D: |
138 | 322 | case RISCV_INS_SC_D_AQ: |
139 | 352 | case RISCV_INS_SC_D_AQ_RL: |
140 | 425 | case RISCV_INS_SC_D_RL: |
141 | 476 | case RISCV_INS_AMOADD_D: |
142 | 543 | case RISCV_INS_AMOADD_D_AQ: |
143 | 1.09k | case RISCV_INS_AMOADD_D_AQ_RL: |
144 | 1.37k | case RISCV_INS_AMOADD_D_RL: |
145 | 1.41k | case RISCV_INS_AMOADD_W: |
146 | 1.49k | case RISCV_INS_AMOADD_W_AQ: |
147 | 1.59k | case RISCV_INS_AMOADD_W_AQ_RL: |
148 | 1.97k | case RISCV_INS_AMOADD_W_RL: |
149 | 2.10k | case RISCV_INS_AMOAND_D: |
150 | 2.20k | case RISCV_INS_AMOAND_D_AQ: |
151 | 2.23k | case RISCV_INS_AMOAND_D_AQ_RL: |
152 | 2.43k | case RISCV_INS_AMOAND_D_RL: |
153 | 2.44k | case RISCV_INS_AMOAND_W: |
154 | 2.48k | case RISCV_INS_AMOAND_W_AQ: |
155 | 2.69k | case RISCV_INS_AMOAND_W_AQ_RL: |
156 | 2.75k | case RISCV_INS_AMOAND_W_RL: |
157 | 3.16k | case RISCV_INS_AMOMAXU_D: |
158 | 3.25k | case RISCV_INS_AMOMAXU_D_AQ: |
159 | 3.29k | case RISCV_INS_AMOMAXU_D_AQ_RL: |
160 | 3.36k | case RISCV_INS_AMOMAXU_D_RL: |
161 | 3.42k | case RISCV_INS_AMOMAXU_W: |
162 | 3.50k | case RISCV_INS_AMOMAXU_W_AQ: |
163 | 3.61k | case RISCV_INS_AMOMAXU_W_AQ_RL: |
164 | 3.67k | case RISCV_INS_AMOMAXU_W_RL: |
165 | 3.76k | case RISCV_INS_AMOMAX_D: |
166 | 3.79k | case RISCV_INS_AMOMAX_D_AQ: |
167 | 3.83k | case RISCV_INS_AMOMAX_D_AQ_RL: |
168 | 3.93k | case RISCV_INS_AMOMAX_D_RL: |
169 | 4.00k | case RISCV_INS_AMOMAX_W: |
170 | 4.08k | case RISCV_INS_AMOMAX_W_AQ: |
171 | 4.19k | case RISCV_INS_AMOMAX_W_AQ_RL: |
172 | 4.32k | case RISCV_INS_AMOMAX_W_RL: |
173 | 4.40k | case RISCV_INS_AMOMINU_D: |
174 | 4.47k | case RISCV_INS_AMOMINU_D_AQ: |
175 | 4.54k | case RISCV_INS_AMOMINU_D_AQ_RL: |
176 | 4.63k | case RISCV_INS_AMOMINU_D_RL: |
177 | 4.68k | case RISCV_INS_AMOMINU_W: |
178 | 4.78k | case RISCV_INS_AMOMINU_W_AQ: |
179 | 4.85k | case RISCV_INS_AMOMINU_W_AQ_RL: |
180 | 4.87k | case RISCV_INS_AMOMINU_W_RL: |
181 | 5.87k | case RISCV_INS_AMOMIN_D: |
182 | 6.10k | case RISCV_INS_AMOMIN_D_AQ: |
183 | 6.15k | case RISCV_INS_AMOMIN_D_AQ_RL: |
184 | 6.18k | case RISCV_INS_AMOMIN_D_RL: |
185 | 6.26k | case RISCV_INS_AMOMIN_W: |
186 | 6.30k | case RISCV_INS_AMOMIN_W_AQ: |
187 | 6.37k | case RISCV_INS_AMOMIN_W_AQ_RL: |
188 | 6.40k | case RISCV_INS_AMOMIN_W_RL: |
189 | 6.44k | case RISCV_INS_AMOOR_D: |
190 | 6.47k | case RISCV_INS_AMOOR_D_AQ: |
191 | 6.54k | case RISCV_INS_AMOOR_D_AQ_RL: |
192 | 6.62k | case RISCV_INS_AMOOR_D_RL: |
193 | 6.67k | case RISCV_INS_AMOOR_W: |
194 | 6.73k | case RISCV_INS_AMOOR_W_AQ: |
195 | 6.77k | case RISCV_INS_AMOOR_W_AQ_RL: |
196 | 6.84k | case RISCV_INS_AMOOR_W_RL: |
197 | 6.87k | case RISCV_INS_AMOSWAP_D: |
198 | 6.92k | case RISCV_INS_AMOSWAP_D_AQ: |
199 | 7.06k | case RISCV_INS_AMOSWAP_D_AQ_RL: |
200 | 7.12k | case RISCV_INS_AMOSWAP_D_RL: |
201 | 7.14k | case RISCV_INS_AMOSWAP_W: |
202 | 7.20k | case RISCV_INS_AMOSWAP_W_AQ: |
203 | 7.24k | case RISCV_INS_AMOSWAP_W_AQ_RL: |
204 | 7.32k | case RISCV_INS_AMOSWAP_W_RL: |
205 | 7.38k | case RISCV_INS_AMOXOR_D: |
206 | 7.41k | case RISCV_INS_AMOXOR_D_AQ: |
207 | 7.48k | case RISCV_INS_AMOXOR_D_AQ_RL: |
208 | 7.51k | case RISCV_INS_AMOXOR_D_RL: |
209 | 7.74k | case RISCV_INS_AMOXOR_W: |
210 | 7.78k | case RISCV_INS_AMOXOR_W_AQ: |
211 | 7.92k | case RISCV_INS_AMOXOR_W_AQ_RL: |
212 | 8.12k | case RISCV_INS_AMOXOR_W_RL: { |
213 | 8.12k | CS_ASSERT(3 == MI->flat_insn->detail->riscv.op_count); |
214 | 8.12k | CS_ASSERT(RISCV_OP_REG == RISCV_get_detail_op(MI, -3)->type); |
215 | 8.12k | CS_ASSERT(RISCV_OP_REG == RISCV_get_detail_op(MI, -2)->type); |
216 | 8.12k | CS_ASSERT(RISCV_OP_REG == RISCV_get_detail_op(MI, -1)->type); |
217 | | |
218 | 8.12k | reg = RISCV_get_detail_op(MI, -1)->reg; |
219 | | |
220 | 8.12k | RISCV_get_detail_op(MI, -1)->type = RISCV_OP_MEM; |
221 | 8.12k | RISCV_get_detail_op(MI, -1)->mem.base = reg; |
222 | 8.12k | RISCV_get_detail_op(MI, -1)->mem.disp = 0; |
223 | | |
224 | 8.12k | break; |
225 | 7.92k | } |
226 | 0 | default: { |
227 | 0 | CS_ASSERT(0 && "id is not a RISC-V memory instruction"); |
228 | 0 | break; |
229 | 7.92k | } |
230 | 13.3k | } |
231 | 13.3k | return; |
232 | 13.3k | } |
233 | | |
234 | | //void RISCVInstPrinter::printInst(const MCInst *MI, raw_ostream &O, |
235 | | // StringRef Annot, const MCSubtargetInfo &STI) |
236 | | void RISCV_printInst(MCInst *MI, SStream *O, void *info) |
237 | 250k | { |
238 | 250k | MCRegisterInfo *MRI = (MCRegisterInfo *)info; |
239 | | //bool Res = false; |
240 | | //MCInst *NewMI = MI; |
241 | | // TODO: RISCV compressd instructions. |
242 | | //MCInst UncompressedMI; |
243 | | //if (!NoAliases) |
244 | | //Res = uncompressInst(UncompressedMI, *MI, MRI, STI); |
245 | | //if (Res) |
246 | | //NewMI = const_cast<MCInst *>(&UncompressedMI); |
247 | 250k | if (/*NoAliases ||*/ !printAliasInstr(MI, O, info)) |
248 | 182k | printInstruction(MI, O, MRI); |
249 | | //printAnnotation(O, Annot); |
250 | | // fix load/store type insttuction |
251 | 250k | if (MI->csh->detail_opt && |
252 | 250k | MI->flat_insn->detail->riscv.need_effective_addr) |
253 | 14.7k | fixDetailOfEffectiveAddr(MI); |
254 | | |
255 | 250k | return; |
256 | 250k | } |
257 | | |
258 | | static void printRegName(SStream *OS, unsigned RegNo) |
259 | 427k | { |
260 | 427k | SStream_concat0(OS, getRegisterName(RegNo, RISCV_ABIRegAltName)); |
261 | 427k | } |
262 | | |
263 | | /** |
264 | | void RISCVInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, |
265 | | raw_ostream &O, const char *Modifier) |
266 | | */ |
267 | | static void printOperand(MCInst *MI, unsigned OpNo, SStream *O) |
268 | 218k | { |
269 | 218k | unsigned reg; |
270 | 218k | int64_t Imm = 0; |
271 | | |
272 | 218k | RISCV_add_cs_detail(MI, OpNo); |
273 | | |
274 | 218k | MCOperand *MO = MCInst_getOperand(MI, OpNo); |
275 | | |
276 | 218k | if (MCOperand_isReg(MO)) { |
277 | 185k | reg = MCOperand_getReg(MO); |
278 | 185k | printRegName(O, reg); |
279 | 185k | } else { |
280 | 33.2k | CS_ASSERT(MCOperand_isImm(MO) && |
281 | 33.2k | "Unknown operand kind in printOperand"); |
282 | 33.2k | Imm = MCOperand_getImm(MO); |
283 | 33.2k | if (Imm >= 0) { |
284 | 30.2k | if (Imm > HEX_THRESHOLD) |
285 | 17.5k | SStream_concat(O, "0x%" PRIx64, Imm); |
286 | 12.6k | else |
287 | 12.6k | SStream_concat(O, "%" PRIu64, Imm); |
288 | 30.2k | } else { |
289 | 3.03k | if (Imm < -HEX_THRESHOLD) |
290 | 2.87k | SStream_concat(O, "-0x%" PRIx64, -Imm); |
291 | 159 | else |
292 | 159 | SStream_concat(O, "-%" PRIu64, -Imm); |
293 | 3.03k | } |
294 | 33.2k | } |
295 | | |
296 | | //CS_ASSERT(MO.isExpr() && "Unknown operand kind in printOperand"); |
297 | | |
298 | 218k | return; |
299 | 218k | } |
300 | | |
301 | | static const char *getCSRSystemRegisterName(unsigned CsrNo) |
302 | 148k | { |
303 | 148k | switch (CsrNo) { |
304 | | /* |
305 | | * From RISC-V Privileged Architecture Version 1.10. |
306 | | * In the same order as Table 2.5. |
307 | | */ |
308 | 730 | case 0x0000: |
309 | 730 | return "ustatus"; |
310 | 474 | case 0x0004: |
311 | 474 | return "uie"; |
312 | 245 | case 0x0005: |
313 | 245 | return "utvec"; |
314 | | |
315 | 193 | case 0x0040: |
316 | 193 | return "uscratch"; |
317 | 306 | case 0x0041: |
318 | 306 | return "uepc"; |
319 | 876 | case 0x0042: |
320 | 876 | return "ucause"; |
321 | 581 | case 0x0043: |
322 | 581 | return "utval"; |
323 | 349 | case 0x0044: |
324 | 349 | return "uip"; |
325 | | |
326 | 1.45k | case 0x0001: |
327 | 1.45k | return "fflags"; |
328 | 1.19k | case 0x0002: |
329 | 1.19k | return "frm"; |
330 | 2.22k | case 0x0003: |
331 | 2.22k | return "fcsr"; |
332 | | |
333 | 1.28k | case 0x0c00: |
334 | 1.28k | return "cycle"; |
335 | 3.01k | case 0x0c01: |
336 | 3.01k | return "time"; |
337 | 936 | case 0x0c02: |
338 | 936 | return "instret"; |
339 | 443 | case 0x0c03: |
340 | 443 | return "hpmcounter3"; |
341 | 967 | case 0x0c04: |
342 | 967 | return "hpmcounter4"; |
343 | 238 | case 0x0c05: |
344 | 238 | return "hpmcounter5"; |
345 | 470 | case 0x0c06: |
346 | 470 | return "hpmcounter6"; |
347 | 795 | case 0x0c07: |
348 | 795 | return "hpmcounter7"; |
349 | 476 | case 0x0c08: |
350 | 476 | return "hpmcounter8"; |
351 | 658 | case 0x0c09: |
352 | 658 | return "hpmcounter9"; |
353 | 498 | case 0x0c0a: |
354 | 498 | return "hpmcounter10"; |
355 | 990 | case 0x0c0b: |
356 | 990 | return "hpmcounter11"; |
357 | 506 | case 0x0c0c: |
358 | 506 | return "hpmcounter12"; |
359 | 509 | case 0x0c0d: |
360 | 509 | return "hpmcounter13"; |
361 | 299 | case 0x0c0e: |
362 | 299 | return "hpmcounter14"; |
363 | 428 | case 0x0c0f: |
364 | 428 | return "hpmcounter15"; |
365 | 489 | case 0x0c10: |
366 | 489 | return "hpmcounter16"; |
367 | 478 | case 0x0c11: |
368 | 478 | return "hpmcounter17"; |
369 | 206 | case 0x0c12: |
370 | 206 | return "hpmcounter18"; |
371 | 161 | case 0x0c13: |
372 | 161 | return "hpmcounter19"; |
373 | 1.10k | case 0x0c14: |
374 | 1.10k | return "hpmcounter20"; |
375 | 161 | case 0x0c15: |
376 | 161 | return "hpmcounter21"; |
377 | 265 | case 0x0c16: |
378 | 265 | return "hpmcounter22"; |
379 | 1.38k | case 0x0c17: |
380 | 1.38k | return "hpmcounter23"; |
381 | 348 | case 0x0c18: |
382 | 348 | return "hpmcounter24"; |
383 | 1.02k | case 0x0c19: |
384 | 1.02k | return "hpmcounter25"; |
385 | 386 | case 0x0c1a: |
386 | 386 | return "hpmcounter26"; |
387 | 1.28k | case 0x0c1b: |
388 | 1.28k | return "hpmcounter27"; |
389 | 491 | case 0x0c1c: |
390 | 491 | return "hpmcounter28"; |
391 | 157 | case 0x0c1d: |
392 | 157 | return "hpmcounter29"; |
393 | 1.31k | case 0x0c1e: |
394 | 1.31k | return "hpmcounter30"; |
395 | 524 | case 0x0c1f: |
396 | 524 | return "hpmcounter31"; |
397 | 1.50k | case 0x0c80: |
398 | 1.50k | return "cycleh"; |
399 | 160 | case 0x0c81: |
400 | 160 | return "timeh"; |
401 | 2.28k | case 0x0c82: |
402 | 2.28k | return "instreth"; |
403 | 519 | case 0x0c83: |
404 | 519 | return "hpmcounter3h"; |
405 | 348 | case 0x0c84: |
406 | 348 | return "hpmcounter4h"; |
407 | 218 | case 0x0c85: |
408 | 218 | return "hpmcounter5h"; |
409 | 370 | case 0x0c86: |
410 | 370 | return "hpmcounter6h"; |
411 | 1.59k | case 0x0c87: |
412 | 1.59k | return "hpmcounter7h"; |
413 | 377 | case 0x0c88: |
414 | 377 | return "hpmcounter8h"; |
415 | 141 | case 0x0c89: |
416 | 141 | return "hpmcounter9h"; |
417 | 423 | case 0x0c8a: |
418 | 423 | return "hpmcounter10h"; |
419 | 482 | case 0x0c8b: |
420 | 482 | return "hpmcounter11h"; |
421 | 808 | case 0x0c8c: |
422 | 808 | return "hpmcounter12h"; |
423 | 909 | case 0x0c8d: |
424 | 909 | return "hpmcounter13h"; |
425 | 324 | case 0x0c8e: |
426 | 324 | return "hpmcounter14h"; |
427 | 1.11k | case 0x0c8f: |
428 | 1.11k | return "hpmcounter15h"; |
429 | 611 | case 0x0c90: |
430 | 611 | return "hpmcounter16h"; |
431 | 288 | case 0x0c91: |
432 | 288 | return "hpmcounter17h"; |
433 | 823 | case 0x0c92: |
434 | 823 | return "hpmcounter18h"; |
435 | 235 | case 0x0c93: |
436 | 235 | return "hpmcounter19h"; |
437 | 193 | case 0x0c94: |
438 | 193 | return "hpmcounter20h"; |
439 | 349 | case 0x0c95: |
440 | 349 | return "hpmcounter21h"; |
441 | 199 | case 0x0c96: |
442 | 199 | return "hpmcounter22h"; |
443 | 233 | case 0x0c97: |
444 | 233 | return "hpmcounter23h"; |
445 | 340 | case 0x0c98: |
446 | 340 | return "hpmcounter24h"; |
447 | 771 | case 0x0c99: |
448 | 771 | return "hpmcounter25h"; |
449 | 945 | case 0x0c9a: |
450 | 945 | return "hpmcounter26h"; |
451 | 1.04k | case 0x0c9b: |
452 | 1.04k | return "hpmcounter27h"; |
453 | 969 | case 0x0c9c: |
454 | 969 | return "hpmcounter28h"; |
455 | 1.33k | case 0x0c9d: |
456 | 1.33k | return "hpmcounter29h"; |
457 | 224 | case 0x0c9e: |
458 | 224 | return "hpmcounter30h"; |
459 | 910 | case 0x0c9f: |
460 | 910 | return "hpmcounter31h"; |
461 | | |
462 | 573 | case 0x0100: |
463 | 573 | return "sstatus"; |
464 | 723 | case 0x0102: |
465 | 723 | return "sedeleg"; |
466 | 568 | case 0x0103: |
467 | 568 | return "sideleg"; |
468 | 598 | case 0x0104: |
469 | 598 | return "sie"; |
470 | 1.15k | case 0x0105: |
471 | 1.15k | return "stvec"; |
472 | 806 | case 0x0106: |
473 | 806 | return "scounteren"; |
474 | | |
475 | 105 | case 0x0140: |
476 | 105 | return "sscratch"; |
477 | 427 | case 0x0141: |
478 | 427 | return "sepc"; |
479 | 276 | case 0x0142: |
480 | 276 | return "scause"; |
481 | 280 | case 0x0143: |
482 | 280 | return "stval"; |
483 | 152 | case 0x0144: |
484 | 152 | return "sip"; |
485 | | |
486 | 260 | case 0x0180: |
487 | 260 | return "satp"; |
488 | | |
489 | 271 | case 0x0f11: |
490 | 271 | return "mvendorid"; |
491 | 144 | case 0x0f12: |
492 | 144 | return "marchid"; |
493 | 445 | case 0x0f13: |
494 | 445 | return "mimpid"; |
495 | 101 | case 0x0f14: |
496 | 101 | return "mhartid"; |
497 | | |
498 | 125 | case 0x0300: |
499 | 125 | return "mstatus"; |
500 | 116 | case 0x0301: |
501 | 116 | return "misa"; |
502 | 1.01k | case 0x0302: |
503 | 1.01k | return "medeleg"; |
504 | 288 | case 0x0303: |
505 | 288 | return "mideleg"; |
506 | 229 | case 0x0304: |
507 | 229 | return "mie"; |
508 | 549 | case 0x0305: |
509 | 549 | return "mtvec"; |
510 | 147 | case 0x0306: |
511 | 147 | return "mcounteren"; |
512 | | |
513 | 288 | case 0x0340: |
514 | 288 | return "mscratch"; |
515 | 1.41k | case 0x0341: |
516 | 1.41k | return "mepc"; |
517 | 608 | case 0x0342: |
518 | 608 | return "mcause"; |
519 | 267 | case 0x0343: |
520 | 267 | return "mtval"; |
521 | 922 | case 0x0344: |
522 | 922 | return "mip"; |
523 | | |
524 | 272 | case 0x03a0: |
525 | 272 | return "pmpcfg0"; |
526 | 473 | case 0x03a1: |
527 | 473 | return "pmpcfg1"; |
528 | 677 | case 0x03a2: |
529 | 677 | return "pmpcfg2"; |
530 | 178 | case 0x03a3: |
531 | 178 | return "pmpcfg3"; |
532 | 1.01k | case 0x03b0: |
533 | 1.01k | return "pmpaddr0"; |
534 | 474 | case 0x03b1: |
535 | 474 | return "pmpaddr1"; |
536 | 234 | case 0x03b2: |
537 | 234 | return "pmpaddr2"; |
538 | 369 | case 0x03b3: |
539 | 369 | return "pmpaddr3"; |
540 | 143 | case 0x03b4: |
541 | 143 | return "pmpaddr4"; |
542 | 612 | case 0x03b5: |
543 | 612 | return "pmpaddr5"; |
544 | 161 | case 0x03b6: |
545 | 161 | return "pmpaddr6"; |
546 | 567 | case 0x03b7: |
547 | 567 | return "pmpaddr7"; |
548 | 118 | case 0x03b8: |
549 | 118 | return "pmpaddr8"; |
550 | 639 | case 0x03b9: |
551 | 639 | return "pmpaddr9"; |
552 | 90 | case 0x03ba: |
553 | 90 | return "pmpaddr10"; |
554 | 902 | case 0x03bb: |
555 | 902 | return "pmpaddr11"; |
556 | 683 | case 0x03bc: |
557 | 683 | return "pmpaddr12"; |
558 | 343 | case 0x03bd: |
559 | 343 | return "pmpaddr13"; |
560 | 472 | case 0x03be: |
561 | 472 | return "pmpaddr14"; |
562 | 884 | case 0x03bf: |
563 | 884 | return "pmpaddr15"; |
564 | | |
565 | 410 | case 0x0b00: |
566 | 410 | return "mcycle"; |
567 | 843 | case 0x0b02: |
568 | 843 | return "minstret"; |
569 | 1.21k | case 0x0b03: |
570 | 1.21k | return "mhpmcounter3"; |
571 | 738 | case 0x0b04: |
572 | 738 | return "mhpmcounter4"; |
573 | 733 | case 0x0b05: |
574 | 733 | return "mhpmcounter5"; |
575 | 428 | case 0x0b06: |
576 | 428 | return "mhpmcounter6"; |
577 | 544 | case 0x0b07: |
578 | 544 | return "mhpmcounter7"; |
579 | 105 | case 0x0b08: |
580 | 105 | return "mhpmcounter8"; |
581 | 141 | case 0x0b09: |
582 | 141 | return "mhpmcounter9"; |
583 | 157 | case 0x0b0a: |
584 | 157 | return "mhpmcounter10"; |
585 | 771 | case 0x0b0b: |
586 | 771 | return "mhpmcounter11"; |
587 | 292 | case 0x0b0c: |
588 | 292 | return "mhpmcounter12"; |
589 | 197 | case 0x0b0d: |
590 | 197 | return "mhpmcounter13"; |
591 | 171 | case 0x0b0e: |
592 | 171 | return "mhpmcounter14"; |
593 | 346 | case 0x0b0f: |
594 | 346 | return "mhpmcounter15"; |
595 | 416 | case 0x0b10: |
596 | 416 | return "mhpmcounter16"; |
597 | 530 | case 0x0b11: |
598 | 530 | return "mhpmcounter17"; |
599 | 847 | case 0x0b12: |
600 | 847 | return "mhpmcounter18"; |
601 | 325 | case 0x0b13: |
602 | 325 | return "mhpmcounter19"; |
603 | 145 | case 0x0b14: |
604 | 145 | return "mhpmcounter20"; |
605 | 855 | case 0x0b15: |
606 | 855 | return "mhpmcounter21"; |
607 | 190 | case 0x0b16: |
608 | 190 | return "mhpmcounter22"; |
609 | 113 | case 0x0b17: |
610 | 113 | return "mhpmcounter23"; |
611 | 151 | case 0x0b18: |
612 | 151 | return "mhpmcounter24"; |
613 | 247 | case 0x0b19: |
614 | 247 | return "mhpmcounter25"; |
615 | 449 | case 0x0b1a: |
616 | 449 | return "mhpmcounter26"; |
617 | 505 | case 0x0b1b: |
618 | 505 | return "mhpmcounter27"; |
619 | 575 | case 0x0b1c: |
620 | 575 | return "mhpmcounter28"; |
621 | 595 | case 0x0b1d: |
622 | 595 | return "mhpmcounter29"; |
623 | 152 | case 0x0b1e: |
624 | 152 | return "mhpmcounter30"; |
625 | 137 | case 0x0b1f: |
626 | 137 | return "mhpmcounter31"; |
627 | 1.32k | case 0x0b80: |
628 | 1.32k | return "mcycleh"; |
629 | 164 | case 0x0b82: |
630 | 164 | return "minstreth"; |
631 | 55 | case 0x0b83: |
632 | 55 | return "mhpmcounter3h"; |
633 | 313 | case 0x0b84: |
634 | 313 | return "mhpmcounter4h"; |
635 | 118 | case 0x0b85: |
636 | 118 | return "mhpmcounter5h"; |
637 | 145 | case 0x0b86: |
638 | 145 | return "mhpmcounter6h"; |
639 | 364 | case 0x0b87: |
640 | 364 | return "mhpmcounter7h"; |
641 | 139 | case 0x0b88: |
642 | 139 | return "mhpmcounter8h"; |
643 | 151 | case 0x0b89: |
644 | 151 | return "mhpmcounter9h"; |
645 | 340 | case 0x0b8a: |
646 | 340 | return "mhpmcounter10h"; |
647 | 1.89k | case 0x0b8b: |
648 | 1.89k | return "mhpmcounter11h"; |
649 | 136 | case 0x0b8c: |
650 | 136 | return "mhpmcounter12h"; |
651 | 292 | case 0x0b8d: |
652 | 292 | return "mhpmcounter13h"; |
653 | 546 | case 0x0b8e: |
654 | 546 | return "mhpmcounter14h"; |
655 | 646 | case 0x0b8f: |
656 | 646 | return "mhpmcounter15h"; |
657 | 748 | case 0x0b90: |
658 | 748 | return "mhpmcounter16h"; |
659 | 356 | case 0x0b91: |
660 | 356 | return "mhpmcounter17h"; |
661 | 213 | case 0x0b92: |
662 | 213 | return "mhpmcounter18h"; |
663 | 535 | case 0x0b93: |
664 | 535 | return "mhpmcounter19h"; |
665 | 134 | case 0x0b94: |
666 | 134 | return "mhpmcounter20h"; |
667 | 140 | case 0x0b95: |
668 | 140 | return "mhpmcounter21h"; |
669 | 298 | case 0x0b96: |
670 | 298 | return "mhpmcounter22h"; |
671 | 437 | case 0x0b97: |
672 | 437 | return "mhpmcounter23h"; |
673 | 334 | case 0x0b98: |
674 | 334 | return "mhpmcounter24h"; |
675 | 1.12k | case 0x0b99: |
676 | 1.12k | return "mhpmcounter25h"; |
677 | 291 | case 0x0b9a: |
678 | 291 | return "mhpmcounter26h"; |
679 | 1.22k | case 0x0b9b: |
680 | 1.22k | return "mhpmcounter27h"; |
681 | 803 | case 0x0b9c: |
682 | 803 | return "mhpmcounter28h"; |
683 | 782 | case 0x0b9d: |
684 | 782 | return "mhpmcounter29h"; |
685 | 339 | case 0x0b9e: |
686 | 339 | return "mhpmcounter30h"; |
687 | 157 | case 0x0b9f: |
688 | 157 | return "mhpmcounter31h"; |
689 | | |
690 | 115 | case 0x0323: |
691 | 115 | return "mhpmevent3"; |
692 | 236 | case 0x0324: |
693 | 236 | return "mhpmevent4"; |
694 | 547 | case 0x0325: |
695 | 547 | return "mhpmevent5"; |
696 | 127 | case 0x0326: |
697 | 127 | return "mhpmevent6"; |
698 | 419 | case 0x0327: |
699 | 419 | return "mhpmevent7"; |
700 | 2.29k | case 0x0328: |
701 | 2.29k | return "mhpmevent8"; |
702 | 448 | case 0x0329: |
703 | 448 | return "mhpmevent9"; |
704 | 677 | case 0x032a: |
705 | 677 | return "mhpmevent10"; |
706 | 456 | case 0x032b: |
707 | 456 | return "mhpmevent11"; |
708 | 182 | case 0x032c: |
709 | 182 | return "mhpmevent12"; |
710 | 301 | case 0x032d: |
711 | 301 | return "mhpmevent13"; |
712 | 659 | case 0x032e: |
713 | 659 | return "mhpmevent14"; |
714 | 168 | case 0x032f: |
715 | 168 | return "mhpmevent15"; |
716 | 289 | case 0x0330: |
717 | 289 | return "mhpmevent16"; |
718 | 598 | case 0x0331: |
719 | 598 | return "mhpmevent17"; |
720 | 1.35k | case 0x0332: |
721 | 1.35k | return "mhpmevent18"; |
722 | 245 | case 0x0333: |
723 | 245 | return "mhpmevent19"; |
724 | 893 | case 0x0334: |
725 | 893 | return "mhpmevent20"; |
726 | 509 | case 0x0335: |
727 | 509 | return "mhpmevent21"; |
728 | 533 | case 0x0336: |
729 | 533 | return "mhpmevent22"; |
730 | 265 | case 0x0337: |
731 | 265 | return "mhpmevent23"; |
732 | 370 | case 0x0338: |
733 | 370 | return "mhpmevent24"; |
734 | 812 | case 0x0339: |
735 | 812 | return "mhpmevent25"; |
736 | 166 | case 0x033a: |
737 | 166 | return "mhpmevent26"; |
738 | 566 | case 0x033b: |
739 | 566 | return "mhpmevent27"; |
740 | 638 | case 0x033c: |
741 | 638 | return "mhpmevent28"; |
742 | 1.04k | case 0x033d: |
743 | 1.04k | return "mhpmevent29"; |
744 | 645 | case 0x033e: |
745 | 645 | return "mhpmevent30"; |
746 | 624 | case 0x033f: |
747 | 624 | return "mhpmevent31"; |
748 | | |
749 | 234 | case 0x07a0: |
750 | 234 | return "tselect"; |
751 | 123 | case 0x07a1: |
752 | 123 | return "tdata1"; |
753 | 1.05k | case 0x07a2: |
754 | 1.05k | return "tdata2"; |
755 | 406 | case 0x07a3: |
756 | 406 | return "tdata3"; |
757 | | |
758 | 216 | case 0x07b0: |
759 | 216 | return "dcsr"; |
760 | 531 | case 0x07b1: |
761 | 531 | return "dpc"; |
762 | 92 | case 0x07b2: |
763 | 92 | return "dscratch"; |
764 | 148k | } |
765 | 27.3k | return NULL; |
766 | 148k | } |
767 | | |
768 | | static void printCSRSystemRegister(MCInst *MI, unsigned OpNo, |
769 | | //const MCSubtargetInfo &STI, |
770 | | SStream *O) |
771 | 148k | { |
772 | 148k | unsigned Imm = MCOperand_getImm(MCInst_getOperand(MI, OpNo)); |
773 | 148k | const char *Name = getCSRSystemRegisterName(Imm); |
774 | | |
775 | 148k | if (Name) { |
776 | 120k | SStream_concat0(O, Name); |
777 | 120k | } else { |
778 | 27.3k | SStream_concat(O, "%u", Imm); |
779 | 27.3k | } |
780 | 148k | } |
781 | | |
782 | | static void printFenceArg(MCInst *MI, unsigned OpNo, SStream *O) |
783 | 5.20k | { |
784 | 5.20k | unsigned FenceArg = MCOperand_getImm(MCInst_getOperand(MI, OpNo)); |
785 | | //CS_ASSERT (((FenceArg >> 4) == 0) && "Invalid immediate in printFenceArg"); |
786 | | |
787 | 5.20k | if ((FenceArg & RISCVFenceField_I) != 0) |
788 | 2.59k | SStream_concat0(O, "i"); |
789 | 5.20k | if ((FenceArg & RISCVFenceField_O) != 0) |
790 | 2.25k | SStream_concat0(O, "o"); |
791 | 5.20k | if ((FenceArg & RISCVFenceField_R) != 0) |
792 | 2.40k | SStream_concat0(O, "r"); |
793 | 5.20k | if ((FenceArg & RISCVFenceField_W) != 0) |
794 | 2.40k | SStream_concat0(O, "w"); |
795 | 5.20k | if (FenceArg == 0) |
796 | 1.38k | SStream_concat0(O, "unknown"); |
797 | 5.20k | } |
798 | | |
799 | | static void printFRMArg(MCInst *MI, unsigned OpNo, SStream *O) |
800 | 24.6k | { |
801 | 24.6k | enum RoundingMode FRMArg = (enum RoundingMode)MCOperand_getImm( |
802 | 24.6k | MCInst_getOperand(MI, OpNo)); |
803 | | #if 0 |
804 | | auto FRMArg = |
805 | | static_cast<RISCVFPRndMode::RoundingMode>(MI->getOperand(OpNo).getImm()); |
806 | | O << RISCVFPRndMode::roundingModeToString(FRMArg); |
807 | | #endif |
808 | 24.6k | SStream_concat0(O, roundingModeToString(FRMArg)); |
809 | 24.6k | } |
810 | | |
811 | | #endif // CAPSTONE_HAS_RISCV |