/src/capstonev5/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 "RISCVMapping.h"  | 
28  |  |  | 
29  |  | //#include "RISCVDisassembler.h"  | 
30  |  |  | 
31  |  | #define GET_REGINFO_ENUM  | 
32  |  | #define GET_REGINFO_MC_DESC  | 
33  |  | #include "RISCVGenRegisterInfo.inc"  | 
34  |  | #define GET_INSTRINFO_ENUM  | 
35  |  | #include "RISCVGenInstrInfo.inc"  | 
36  |  |  | 
37  |  | // Autogenerated by tblgen.  | 
38  |  | static void printInstruction(MCInst *MI, SStream *O, MCRegisterInfo *MRI);  | 
39  |  | static bool printAliasInstr(MCInst *MI, SStream *OS, void *info);  | 
40  |  | static void printOperand(MCInst *MI, unsigned OpNo, SStream *O);  | 
41  |  | static void printFenceArg(MCInst *MI, unsigned OpNo, SStream *O);  | 
42  |  | static void printCSRSystemRegister(MCInst*, unsigned, SStream *);  | 
43  |  | static void printFRMArg(MCInst *MI, unsigned OpNo, SStream *O);  | 
44  |  | static void printCustomAliasOperand( MCInst *, unsigned, unsigned, SStream *);  | 
45  |  | /// getRegisterName - This method is automatically generated by tblgen  | 
46  |  | /// from the register set description.  This returns the assembler name  | 
47  |  | /// for the specified register.  | 
48  |  | static const char *getRegisterName(unsigned RegNo, unsigned AltIdx);  | 
49  |  |  | 
50  |  | // Include the auto-generated portion of the assembly writer.  | 
51  |  | #define PRINT_ALIAS_INSTR  | 
52  |  | #include "RISCVGenAsmWriter.inc"  | 
53  |  |  | 
54  |  |  | 
55  |  | static void fixDetailOfEffectiveAddr(MCInst *MI)  | 
56  | 1.44k  | { | 
57  | 1.44k  |   unsigned reg = 0;  | 
58  | 1.44k  |   int64_t imm = 0;  | 
59  |  |  | 
60  | 1.44k  |   CS_ASSERT(3 == MI->flat_insn->detail->riscv.op_count);  | 
61  | 1.44k  |   CS_ASSERT(RISCV_OP_REG == MI->flat_insn->detail->riscv.operands[0].type);  | 
62  |  |  | 
63  | 1.44k  |   if (RISCV_OP_IMM == MI->flat_insn->detail->riscv.operands[1].type) { | 
64  | 1.44k  |     CS_ASSERT(RISCV_OP_REG == MI->flat_insn->detail->riscv.operands[2].type);  | 
65  | 1.44k  |     imm = MI->flat_insn->detail->riscv.operands[1].imm;  | 
66  | 1.44k  |     reg = MI->flat_insn->detail->riscv.operands[2].reg;  | 
67  | 1.44k  |   } else if (RISCV_OP_REG == MI->flat_insn->detail->riscv.operands[1].type) { | 
68  | 0  |     CS_ASSERT(RISCV_OP_IMM == MI->flat_insn->detail->riscv.operands[2].type);  | 
69  | 0  |     reg = MI->flat_insn->detail->riscv.operands[1].reg;  | 
70  | 0  |     imm = MI->flat_insn->detail->riscv.operands[2].imm;  | 
71  | 0  |   }  | 
72  |  |  | 
73  |  |   // set up effective address.  | 
74  | 1.44k  |   MI->flat_insn->detail->riscv.operands[1].type = RISCV_OP_MEM;  | 
75  | 1.44k  |   MI->flat_insn->detail->riscv.op_count--;  | 
76  | 1.44k  |       MI->flat_insn->detail->riscv.operands[1].mem.base = reg;  | 
77  | 1.44k  |       MI->flat_insn->detail->riscv.operands[1].mem.disp = imm;  | 
78  |  |  | 
79  | 1.44k  |   return;  | 
80  | 1.44k  | }  | 
81  |  |  | 
82  |  |  | 
83  |  | //void RISCVInstPrinter::printInst(const MCInst *MI, raw_ostream &O,  | 
84  |  | //                                 StringRef Annot, const MCSubtargetInfo &STI)   | 
85  |  | void RISCV_printInst(MCInst *MI, SStream *O, void *info)   | 
86  | 258k  | { | 
87  | 258k  |     MCRegisterInfo *MRI = (MCRegisterInfo *) info;  | 
88  |  |     //bool Res = false;  | 
89  |  |     //MCInst *NewMI = MI;  | 
90  |  |     // TODO: RISCV compressd instructions.  | 
91  |  |     //MCInst UncompressedMI;  | 
92  |  |     //if (!NoAliases)  | 
93  |  |       //Res = uncompressInst(UncompressedMI, *MI, MRI, STI);  | 
94  |  |     //if (Res)  | 
95  |  |       //NewMI = const_cast<MCInst *>(&UncompressedMI);  | 
96  | 258k  |     if (/*NoAliases ||*/ !printAliasInstr(MI, O, info))  | 
97  | 189k  |         printInstruction(MI, O, MRI);  | 
98  |  |       //printAnnotation(O, Annot);  | 
99  |  |   // fix load/store type insttuction  | 
100  | 258k  |       if (MI->csh->detail &&   | 
101  | 258k  |       MI->flat_insn->detail->riscv.need_effective_addr)  | 
102  | 17.4k  |     fixDetailOfEffectiveAddr(MI);  | 
103  |  |     | 
104  | 258k  |   return;  | 
105  | 258k  | }  | 
106  |  |  | 
107  |  | static void printRegName(SStream *OS, unsigned RegNo)   | 
108  | 437k  | { | 
109  | 437k  |     SStream_concat0(OS, getRegisterName(RegNo, RISCV_ABIRegAltName));  | 
110  | 437k  | }  | 
111  |  |  | 
112  |  | /**  | 
113  |  | void RISCVInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,  | 
114  |  |                                     raw_ostream &O, const char *Modifier)   | 
115  |  | */  | 
116  |  | static void printOperand(MCInst *MI, unsigned OpNo, SStream *O)   | 
117  | 284k  | { | 
118  | 284k  |     unsigned reg;  | 
119  | 284k  |     int64_t Imm = 0;  | 
120  |  |  | 
121  | 284k  |     MCOperand *MO = MCInst_getOperand(MI, OpNo);  | 
122  |  |     | 
123  | 284k  |     if (MCOperand_isReg(MO)) { | 
124  | 235k  |         reg = MCOperand_getReg(MO);  | 
125  | 235k  |         printRegName(O, reg);  | 
126  | 235k  |         if (MI->csh->detail) { | 
127  | 235k  |             MI->flat_insn->detail->riscv.operands[MI->flat_insn->detail->riscv.op_count].type = RISCV_OP_REG;  | 
128  | 235k  |             MI->flat_insn->detail->riscv.operands[MI->flat_insn->detail->riscv.op_count].reg = reg;  | 
129  | 235k  |             MI->flat_insn->detail->riscv.op_count++;  | 
130  | 235k  |         }  | 
131  | 235k  |     } else { | 
132  | 48.7k  |     CS_ASSERT(MCOperand_isImm(MO) && "Unknown operand kind in printOperand");  | 
133  | 48.7k  |         Imm = MCOperand_getImm(MO);  | 
134  | 48.7k  |         if (Imm >= 0) { | 
135  | 46.4k  |             if (Imm > HEX_THRESHOLD)  | 
136  | 31.6k  |               SStream_concat(O, "0x%" PRIx64, Imm);  | 
137  | 14.8k  |             else  | 
138  | 14.8k  |         SStream_concat(O, "%" PRIu64, Imm);  | 
139  | 46.4k  |         } else { | 
140  | 2.27k  |             if (Imm < -HEX_THRESHOLD)  | 
141  | 2.11k  |         SStream_concat(O, "-0x%" PRIx64, -Imm);  | 
142  | 160  |             else  | 
143  | 160  |         SStream_concat(O, "-%" PRIu64, -Imm);  | 
144  | 2.27k  |         }  | 
145  |  |  | 
146  | 48.7k  |         if (MI->csh->detail) { | 
147  | 48.7k  |             MI->flat_insn->detail->riscv.operands[MI->flat_insn->detail->riscv.op_count].type = RISCV_OP_IMM;  | 
148  | 48.7k  |             MI->flat_insn->detail->riscv.operands[MI->flat_insn->detail->riscv.op_count].imm = Imm;  | 
149  | 48.7k  |             MI->flat_insn->detail->riscv.op_count++;  | 
150  | 48.7k  |     }  | 
151  | 48.7k  |       }  | 
152  |  |  | 
153  |  |     //CS_ASSERT(MO.isExpr() && "Unknown operand kind in printOperand");  | 
154  |  |     | 
155  | 284k  |   return;  | 
156  | 284k  | }  | 
157  |  |  | 
158  |  | static const char *getCSRSystemRegisterName(unsigned CsrNo)  | 
159  | 152k  | { | 
160  | 152k  |   switch (CsrNo) { | 
161  |  |   /*  | 
162  |  |    * From RISC-V Privileged Architecture Version 1.10.  | 
163  |  |    * In the same order as Table 2.5.  | 
164  |  |    */  | 
165  | 1.02k  |   case 0x0000: return "ustatus";  | 
166  | 450  |   case 0x0004: return "uie";  | 
167  | 163  |   case 0x0005: return "utvec";  | 
168  |  |  | 
169  | 179  |   case 0x0040: return "uscratch";  | 
170  | 138  |   case 0x0041: return "uepc";  | 
171  | 1.09k  |   case 0x0042: return "ucause";  | 
172  | 380  |   case 0x0043: return "utval";  | 
173  | 391  |   case 0x0044: return "uip";  | 
174  |  |  | 
175  | 1.18k  |   case 0x0001: return "fflags";  | 
176  | 1.24k  |   case 0x0002: return "frm";  | 
177  | 1.45k  |   case 0x0003: return "fcsr";  | 
178  |  |  | 
179  | 2.08k  |   case 0x0c00: return "cycle";  | 
180  | 2.30k  |   case 0x0c01: return "time";  | 
181  | 842  |   case 0x0c02: return "instret";  | 
182  | 239  |   case 0x0c03: return "hpmcounter3";  | 
183  | 1.22k  |   case 0x0c04: return "hpmcounter4";  | 
184  | 731  |   case 0x0c05: return "hpmcounter5";  | 
185  | 385  |   case 0x0c06: return "hpmcounter6";  | 
186  | 703  |   case 0x0c07: return "hpmcounter7";  | 
187  | 999  |   case 0x0c08: return "hpmcounter8";  | 
188  | 400  |   case 0x0c09: return "hpmcounter9";  | 
189  | 720  |   case 0x0c0a: return "hpmcounter10";  | 
190  | 1.12k  |   case 0x0c0b: return "hpmcounter11";  | 
191  | 1.22k  |   case 0x0c0c: return "hpmcounter12";  | 
192  | 463  |   case 0x0c0d: return "hpmcounter13";  | 
193  | 224  |   case 0x0c0e: return "hpmcounter14";  | 
194  | 412  |   case 0x0c0f: return "hpmcounter15";  | 
195  | 349  |   case 0x0c10: return "hpmcounter16";  | 
196  | 494  |   case 0x0c11: return "hpmcounter17";  | 
197  | 188  |   case 0x0c12: return "hpmcounter18";  | 
198  | 115  |   case 0x0c13: return "hpmcounter19";  | 
199  | 1.44k  |   case 0x0c14: return "hpmcounter20";  | 
200  | 153  |   case 0x0c15: return "hpmcounter21";  | 
201  | 323  |   case 0x0c16: return "hpmcounter22";  | 
202  | 1.46k  |   case 0x0c17: return "hpmcounter23";  | 
203  | 586  |   case 0x0c18: return "hpmcounter24";  | 
204  | 1.79k  |   case 0x0c19: return "hpmcounter25";  | 
205  | 559  |   case 0x0c1a: return "hpmcounter26";  | 
206  | 1.47k  |   case 0x0c1b: return "hpmcounter27";  | 
207  | 394  |   case 0x0c1c: return "hpmcounter28";  | 
208  | 172  |   case 0x0c1d: return "hpmcounter29";  | 
209  | 659  |   case 0x0c1e: return "hpmcounter30";  | 
210  | 243  |   case 0x0c1f: return "hpmcounter31";  | 
211  | 822  |   case 0x0c80: return "cycleh";  | 
212  | 114  |   case 0x0c81: return "timeh";  | 
213  | 1.46k  |   case 0x0c82: return "instreth";  | 
214  | 521  |   case 0x0c83: return "hpmcounter3h";  | 
215  | 274  |   case 0x0c84: return "hpmcounter4h";  | 
216  | 152  |   case 0x0c85: return "hpmcounter5h";  | 
217  | 679  |   case 0x0c86: return "hpmcounter6h";  | 
218  | 462  |   case 0x0c87: return "hpmcounter7h";  | 
219  | 601  |   case 0x0c88: return "hpmcounter8h";  | 
220  | 104  |   case 0x0c89: return "hpmcounter9h";  | 
221  | 616  |   case 0x0c8a: return "hpmcounter10h";  | 
222  | 459  |   case 0x0c8b: return "hpmcounter11h";  | 
223  | 635  |   case 0x0c8c: return "hpmcounter12h";  | 
224  | 960  |   case 0x0c8d: return "hpmcounter13h";  | 
225  | 204  |   case 0x0c8e: return "hpmcounter14h";  | 
226  | 733  |   case 0x0c8f: return "hpmcounter15h";  | 
227  | 996  |   case 0x0c90: return "hpmcounter16h";  | 
228  | 187  |   case 0x0c91: return "hpmcounter17h";  | 
229  | 908  |   case 0x0c92: return "hpmcounter18h";  | 
230  | 363  |   case 0x0c93: return "hpmcounter19h";  | 
231  | 293  |   case 0x0c94: return "hpmcounter20h";  | 
232  | 400  |   case 0x0c95: return "hpmcounter21h";  | 
233  | 238  |   case 0x0c96: return "hpmcounter22h";  | 
234  | 353  |   case 0x0c97: return "hpmcounter23h";  | 
235  | 368  |   case 0x0c98: return "hpmcounter24h";  | 
236  | 976  |   case 0x0c99: return "hpmcounter25h";  | 
237  | 681  |   case 0x0c9a: return "hpmcounter26h";  | 
238  | 1.19k  |   case 0x0c9b: return "hpmcounter27h";  | 
239  | 1.67k  |   case 0x0c9c: return "hpmcounter28h";  | 
240  | 1.53k  |   case 0x0c9d: return "hpmcounter29h";  | 
241  | 460  |   case 0x0c9e: return "hpmcounter30h";  | 
242  | 1.30k  |   case 0x0c9f: return "hpmcounter31h";  | 
243  |  |  | 
244  | 545  |   case 0x0100: return "sstatus";  | 
245  | 693  |   case 0x0102: return "sedeleg";  | 
246  | 697  |   case 0x0103: return "sideleg";  | 
247  | 579  |   case 0x0104: return "sie";  | 
248  | 1.13k  |   case 0x0105: return "stvec";  | 
249  | 774  |   case 0x0106: return "scounteren";  | 
250  |  |  | 
251  | 146  |   case 0x0140: return "sscratch";  | 
252  | 164  |   case 0x0141: return "sepc";  | 
253  | 269  |   case 0x0142: return "scause";  | 
254  | 344  |   case 0x0143: return "stval";  | 
255  | 581  |   case 0x0144: return "sip";  | 
256  |  |  | 
257  | 267  |   case 0x0180: return "satp";  | 
258  |  |  | 
259  | 140  |   case 0x0f11: return "mvendorid";  | 
260  | 285  |   case 0x0f12: return "marchid";  | 
261  | 422  |   case 0x0f13: return "mimpid";  | 
262  | 141  |   case 0x0f14: return "mhartid";  | 
263  |  |  | 
264  | 143  |   case 0x0300: return "mstatus";  | 
265  | 202  |   case 0x0301: return "misa";  | 
266  | 1.43k  |   case 0x0302: return "medeleg";  | 
267  | 232  |   case 0x0303: return "mideleg";  | 
268  | 228  |   case 0x0304: return "mie";  | 
269  | 909  |   case 0x0305: return "mtvec";  | 
270  | 177  |   case 0x0306: return "mcounteren";  | 
271  |  |  | 
272  | 284  |   case 0x0340: return "mscratch";  | 
273  | 1.15k  |   case 0x0341: return "mepc";  | 
274  | 369  |   case 0x0342: return "mcause";  | 
275  | 241  |   case 0x0343: return "mtval";  | 
276  | 1.43k  |   case 0x0344: return "mip";  | 
277  |  |  | 
278  | 120  |   case 0x03a0: return "pmpcfg0";  | 
279  | 303  |   case 0x03a1: return "pmpcfg1";  | 
280  | 827  |   case 0x03a2: return "pmpcfg2";  | 
281  | 199  |   case 0x03a3: return "pmpcfg3";  | 
282  | 525  |   case 0x03b0: return "pmpaddr0";  | 
283  | 476  |   case 0x03b1: return "pmpaddr1";  | 
284  | 1.06k  |   case 0x03b2: return "pmpaddr2";  | 
285  | 706  |   case 0x03b3: return "pmpaddr3";  | 
286  | 153  |   case 0x03b4: return "pmpaddr4";  | 
287  | 475  |   case 0x03b5: return "pmpaddr5";  | 
288  | 46  |   case 0x03b6: return "pmpaddr6";  | 
289  | 543  |   case 0x03b7: return "pmpaddr7";  | 
290  | 157  |   case 0x03b8: return "pmpaddr8";  | 
291  | 862  |   case 0x03b9: return "pmpaddr9";  | 
292  | 139  |   case 0x03ba: return "pmpaddr10";  | 
293  | 1.03k  |   case 0x03bb: return "pmpaddr11";  | 
294  | 525  |   case 0x03bc: return "pmpaddr12";  | 
295  | 222  |   case 0x03bd: return "pmpaddr14";  | 
296  | 568  |   case 0x03be: return "pmpaddr13";  | 
297  | 1.19k  |   case 0x03bf: return "pmpaddr15";  | 
298  |  |  | 
299  | 522  |   case 0x0b00: return "mcycle";  | 
300  | 634  |   case 0x0b02: return "minstret";  | 
301  | 698  |   case 0x0b03: return "mhpmcounter3";  | 
302  | 980  |   case 0x0b04: return "mhpmcounter4";  | 
303  | 612  |   case 0x0b05: return "mhpmcounter5";  | 
304  | 516  |   case 0x0b06: return "mhpmcounter6";  | 
305  | 564  |   case 0x0b07: return "mhpmcounter7";  | 
306  | 150  |   case 0x0b08: return "mhpmcounter8";  | 
307  | 139  |   case 0x0b09: return "mhpmcounter9";  | 
308  | 100  |   case 0x0b0a: return "mhpmcounter10";  | 
309  | 599  |   case 0x0b0b: return "mhpmcounter11";  | 
310  | 294  |   case 0x0b0c: return "mhpmcounter12";  | 
311  | 202  |   case 0x0b0d: return "mhpmcounter13";  | 
312  | 147  |   case 0x0b0e: return "mhpmcounter14";  | 
313  | 383  |   case 0x0b0f: return "mhpmcounter15";  | 
314  | 591  |   case 0x0b10: return "mhpmcounter16";  | 
315  | 465  |   case 0x0b11: return "mhpmcounter17";  | 
316  | 672  |   case 0x0b12: return "mhpmcounter18";  | 
317  | 475  |   case 0x0b13: return "mhpmcounter19";  | 
318  | 139  |   case 0x0b14: return "mhpmcounter20";  | 
319  | 144  |   case 0x0b15: return "mhpmcounter21";  | 
320  | 116  |   case 0x0b16: return "mhpmcounter22";  | 
321  | 144  |   case 0x0b17: return "mhpmcounter23";  | 
322  | 160  |   case 0x0b18: return "mhpmcounter24";  | 
323  | 215  |   case 0x0b19: return "mhpmcounter25";  | 
324  | 364  |   case 0x0b1a: return "mhpmcounter26";  | 
325  | 347  |   case 0x0b1b: return "mhpmcounter27";  | 
326  | 476  |   case 0x0b1c: return "mhpmcounter28";  | 
327  | 481  |   case 0x0b1d: return "mhpmcounter29";  | 
328  | 151  |   case 0x0b1e: return "mhpmcounter30";  | 
329  | 390  |   case 0x0b1f: return "mhpmcounter31";  | 
330  | 1.48k  |   case 0x0b80: return "mcycleh";  | 
331  | 358  |   case 0x0b82: return "minstreth";  | 
332  | 99  |   case 0x0b83: return "mhpmcounter3h";  | 
333  | 376  |   case 0x0b84: return "mhpmcounter4h";  | 
334  | 127  |   case 0x0b85: return "mhpmcounter5h";  | 
335  | 198  |   case 0x0b86: return "mhpmcounter6h";  | 
336  | 309  |   case 0x0b87: return "mhpmcounter7h";  | 
337  | 160  |   case 0x0b88: return "mhpmcounter8h";  | 
338  | 617  |   case 0x0b89: return "mhpmcounter9h";  | 
339  | 455  |   case 0x0b8a: return "mhpmcounter10h";  | 
340  | 2.07k  |   case 0x0b8b: return "mhpmcounter11h";  | 
341  | 88  |   case 0x0b8c: return "mhpmcounter12h";  | 
342  | 141  |   case 0x0b8d: return "mhpmcounter13h";  | 
343  | 1.01k  |   case 0x0b8e: return "mhpmcounter14h";  | 
344  | 574  |   case 0x0b8f: return "mhpmcounter15h";  | 
345  | 659  |   case 0x0b90: return "mhpmcounter16h";  | 
346  | 136  |   case 0x0b91: return "mhpmcounter17h";  | 
347  | 306  |   case 0x0b92: return "mhpmcounter18h";  | 
348  | 450  |   case 0x0b93: return "mhpmcounter19h";  | 
349  | 127  |   case 0x0b94: return "mhpmcounter20h";  | 
350  | 133  |   case 0x0b95: return "mhpmcounter21h";  | 
351  | 190  |   case 0x0b96: return "mhpmcounter22h";  | 
352  | 277  |   case 0x0b97: return "mhpmcounter23h";  | 
353  | 566  |   case 0x0b98: return "mhpmcounter24h";  | 
354  | 649  |   case 0x0b99: return "mhpmcounter25h";  | 
355  | 196  |   case 0x0b9a: return "mhpmcounter26h";  | 
356  | 1.03k  |   case 0x0b9b: return "mhpmcounter27h";  | 
357  | 1.43k  |   case 0x0b9c: return "mhpmcounter28h";  | 
358  | 805  |   case 0x0b9d: return "mhpmcounter29h";  | 
359  | 306  |   case 0x0b9e: return "mhpmcounter30h";  | 
360  | 638  |   case 0x0b9f: return "mhpmcounter31h";  | 
361  |  |  | 
362  | 110  |   case 0x0323: return "mhpmevent3";  | 
363  | 225  |   case 0x0324: return "mhpmevent4";  | 
364  | 446  |   case 0x0325: return "mhpmevent5";  | 
365  | 121  |   case 0x0326: return "mhpmevent6";  | 
366  | 234  |   case 0x0327: return "mhpmevent7";  | 
367  | 2.43k  |   case 0x0328: return "mhpmevent8";  | 
368  | 380  |   case 0x0329: return "mhpmevent9";  | 
369  | 864  |   case 0x032a: return "mhpmevent10";  | 
370  | 721  |   case 0x032b: return "mhpmevent11";  | 
371  | 280  |   case 0x032c: return "mhpmevent12";  | 
372  | 600  |   case 0x032d: return "mhpmevent13";  | 
373  | 502  |   case 0x032e: return "mhpmevent14";  | 
374  | 166  |   case 0x032f: return "mhpmevent15";  | 
375  | 268  |   case 0x0330: return "mhpmevent16";  | 
376  | 914  |   case 0x0331: return "mhpmevent17";  | 
377  | 1.34k  |   case 0x0332: return "mhpmevent18";  | 
378  | 84  |   case 0x0333: return "mhpmevent19";  | 
379  | 782  |   case 0x0334: return "mhpmevent20";  | 
380  | 425  |   case 0x0335: return "mhpmevent21";  | 
381  | 123  |   case 0x0336: return "mhpmevent22";  | 
382  | 378  |   case 0x0337: return "mhpmevent23";  | 
383  | 86  |   case 0x0338: return "mhpmevent24";  | 
384  | 846  |   case 0x0339: return "mhpmevent25";  | 
385  | 160  |   case 0x033a: return "mhpmevent26";  | 
386  | 704  |   case 0x033b: return "mhpmevent27";  | 
387  | 316  |   case 0x033c: return "mhpmevent28";  | 
388  | 1.15k  |   case 0x033d: return "mhpmevent29";  | 
389  | 631  |   case 0x033e: return "mhpmevent30";  | 
390  | 522  |   case 0x033f: return "mhpmevent31";  | 
391  |  |  | 
392  | 86  |   case 0x07a0: return "tselect";  | 
393  | 105  |   case 0x07a1: return "tdata1";  | 
394  | 1.00k  |   case 0x07a2: return "tdata2";  | 
395  | 382  |   case 0x07a3: return "tdata3";  | 
396  |  |  | 
397  | 170  |   case 0x07b0: return "dcsr";  | 
398  | 407  |   case 0x07b1: return "dpc";  | 
399  | 110  |   case 0x07b2: return "dscratch";  | 
400  | 152k  |   }  | 
401  | 29.2k  |   return NULL;  | 
402  | 152k  | }  | 
403  |  |  | 
404  |  | static void printCSRSystemRegister(MCInst *MI, unsigned OpNo,  | 
405  |  |                                    //const MCSubtargetInfo &STI,  | 
406  |  |                                    SStream *O)   | 
407  | 152k  | { | 
408  | 152k  |   unsigned Imm = MCOperand_getImm(MCInst_getOperand(MI, OpNo));  | 
409  | 152k  |   const char *Name = getCSRSystemRegisterName(Imm);  | 
410  |  |  | 
411  | 152k  |   if (Name) { | 
412  | 122k  |     SStream_concat0(O, Name);  | 
413  | 122k  |   } else { | 
414  | 29.2k  |     SStream_concat(O, "%u", Imm);  | 
415  | 29.2k  |   }  | 
416  | 152k  | }  | 
417  |  |  | 
418  |  | static void printFenceArg(MCInst *MI, unsigned OpNo, SStream *O)   | 
419  | 5.54k  | { | 
420  | 5.54k  |     unsigned FenceArg = MCOperand_getImm(MCInst_getOperand(MI, OpNo));  | 
421  |  |     //CS_ASSERT (((FenceArg >> 4) == 0) && "Invalid immediate in printFenceArg");  | 
422  |  |  | 
423  | 5.54k  |     if ((FenceArg & RISCVFenceField_I) != 0)  | 
424  | 2.54k  |         SStream_concat0(O, "i");  | 
425  | 5.54k  |     if ((FenceArg & RISCVFenceField_O) != 0)  | 
426  | 2.16k  |         SStream_concat0(O, "o");  | 
427  | 5.54k  |   if ((FenceArg & RISCVFenceField_R) != 0)  | 
428  | 2.25k  |         SStream_concat0(O, "r");  | 
429  | 5.54k  |     if ((FenceArg & RISCVFenceField_W) != 0)  | 
430  | 2.53k  |         SStream_concat0(O, "w");  | 
431  | 5.54k  |     if (FenceArg == 0)  | 
432  | 1.54k  |         SStream_concat0(O, "unknown");  | 
433  | 5.54k  | }  | 
434  |  |  | 
435  |  | static void printFRMArg(MCInst *MI, unsigned OpNo, SStream *O)   | 
436  | 24.7k  | { | 
437  | 24.7k  |     enum RoundingMode FRMArg =   | 
438  | 24.7k  |         (enum RoundingMode)MCOperand_getImm(MCInst_getOperand(MI, OpNo));  | 
439  |  | #if 0  | 
440  |  |   auto FRMArg =  | 
441  |  |       static_cast<RISCVFPRndMode::RoundingMode>(MI->getOperand(OpNo).getImm());  | 
442  |  |   O << RISCVFPRndMode::roundingModeToString(FRMArg);  | 
443  |  | #endif  | 
444  | 24.7k  |     SStream_concat0(O, roundingModeToString(FRMArg));  | 
445  | 24.7k  | }  | 
446  |  |     | 
447  |  | #endif        // CAPSTONE_HAS_RISCV  |