/src/capstonev5/arch/RISCV/RISCVInstPrinter.c
Line | Count | Source (jump to first uncovered line) |
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.30k | { |
57 | 1.30k | unsigned reg = 0; |
58 | 1.30k | int64_t imm = 0; |
59 | | |
60 | 1.30k | CS_ASSERT(3 == MI->flat_insn->detail->riscv.op_count); |
61 | 1.30k | CS_ASSERT(RISCV_OP_REG == MI->flat_insn->detail->riscv.operands[0].type); |
62 | | |
63 | 1.30k | if (RISCV_OP_IMM == MI->flat_insn->detail->riscv.operands[1].type) { |
64 | 1.30k | CS_ASSERT(RISCV_OP_REG == MI->flat_insn->detail->riscv.operands[2].type); |
65 | 1.30k | imm = MI->flat_insn->detail->riscv.operands[1].imm; |
66 | 1.30k | reg = MI->flat_insn->detail->riscv.operands[2].reg; |
67 | 1.30k | } 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.30k | MI->flat_insn->detail->riscv.operands[1].type = RISCV_OP_MEM; |
75 | 1.30k | MI->flat_insn->detail->riscv.op_count--; |
76 | 1.30k | MI->flat_insn->detail->riscv.operands[1].mem.base = reg; |
77 | 1.30k | MI->flat_insn->detail->riscv.operands[1].mem.disp = imm; |
78 | | |
79 | 1.30k | return; |
80 | 1.30k | } |
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 | 53.8k | { |
87 | 53.8k | 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 | 53.8k | if (/*NoAliases ||*/ !printAliasInstr(MI, O, info)) |
97 | 39.1k | printInstruction(MI, O, MRI); |
98 | | //printAnnotation(O, Annot); |
99 | | // fix load/store type insttuction |
100 | 53.8k | if (MI->csh->detail && |
101 | 53.8k | MI->flat_insn->detail->riscv.need_effective_addr) |
102 | 1.30k | fixDetailOfEffectiveAddr(MI); |
103 | | |
104 | 53.8k | return; |
105 | 53.8k | } |
106 | | |
107 | | static void printRegName(SStream *OS, unsigned RegNo) |
108 | 89.0k | { |
109 | 89.0k | SStream_concat0(OS, getRegisterName(RegNo, RISCV_ABIRegAltName)); |
110 | 89.0k | } |
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 | 107k | { |
118 | 107k | unsigned reg; |
119 | 107k | int64_t Imm = 0; |
120 | | |
121 | 107k | MCOperand *MO = MCInst_getOperand(MI, OpNo); |
122 | | |
123 | 107k | if (MCOperand_isReg(MO)) { |
124 | 89.0k | reg = MCOperand_getReg(MO); |
125 | 89.0k | printRegName(O, reg); |
126 | 89.0k | if (MI->csh->detail) { |
127 | 89.0k | MI->flat_insn->detail->riscv.operands[MI->flat_insn->detail->riscv.op_count].type = RISCV_OP_REG; |
128 | 89.0k | MI->flat_insn->detail->riscv.operands[MI->flat_insn->detail->riscv.op_count].reg = reg; |
129 | 89.0k | MI->flat_insn->detail->riscv.op_count++; |
130 | 89.0k | } |
131 | 89.0k | } else { |
132 | 18.5k | CS_ASSERT(MCOperand_isImm(MO) && "Unknown operand kind in printOperand"); |
133 | 18.5k | Imm = MCOperand_getImm(MO); |
134 | 18.5k | if (Imm >= 0) { |
135 | 16.1k | if (Imm > HEX_THRESHOLD) |
136 | 9.67k | SStream_concat(O, "0x%" PRIx64, Imm); |
137 | 6.52k | else |
138 | 6.52k | SStream_concat(O, "%" PRIu64, Imm); |
139 | 16.1k | } else { |
140 | 2.34k | if (Imm < -HEX_THRESHOLD) |
141 | 2.21k | SStream_concat(O, "-0x%" PRIx64, -Imm); |
142 | 136 | else |
143 | 136 | SStream_concat(O, "-%" PRIu64, -Imm); |
144 | 2.34k | } |
145 | | |
146 | 18.5k | if (MI->csh->detail) { |
147 | 18.5k | MI->flat_insn->detail->riscv.operands[MI->flat_insn->detail->riscv.op_count].type = RISCV_OP_IMM; |
148 | 18.5k | MI->flat_insn->detail->riscv.operands[MI->flat_insn->detail->riscv.op_count].imm = Imm; |
149 | 18.5k | MI->flat_insn->detail->riscv.op_count++; |
150 | 18.5k | } |
151 | 18.5k | } |
152 | | |
153 | | //CS_ASSERT(MO.isExpr() && "Unknown operand kind in printOperand"); |
154 | | |
155 | 107k | return; |
156 | 107k | } |
157 | | |
158 | | static const char *getCSRSystemRegisterName(unsigned CsrNo) |
159 | 32.7k | { |
160 | 32.7k | switch (CsrNo) { |
161 | | /* |
162 | | * From RISC-V Privileged Architecture Version 1.10. |
163 | | * In the same order as Table 2.5. |
164 | | */ |
165 | 43 | case 0x0000: return "ustatus"; |
166 | 215 | case 0x0004: return "uie"; |
167 | 43 | case 0x0005: return "utvec"; |
168 | | |
169 | 34 | case 0x0040: return "uscratch"; |
170 | 40 | case 0x0041: return "uepc"; |
171 | 310 | case 0x0042: return "ucause"; |
172 | 98 | case 0x0043: return "utval"; |
173 | 54 | case 0x0044: return "uip"; |
174 | | |
175 | 160 | case 0x0001: return "fflags"; |
176 | 577 | case 0x0002: return "frm"; |
177 | 783 | case 0x0003: return "fcsr"; |
178 | | |
179 | 315 | case 0x0c00: return "cycle"; |
180 | 539 | case 0x0c01: return "time"; |
181 | 177 | case 0x0c02: return "instret"; |
182 | 202 | case 0x0c03: return "hpmcounter3"; |
183 | 317 | case 0x0c04: return "hpmcounter4"; |
184 | 182 | case 0x0c05: return "hpmcounter5"; |
185 | 165 | case 0x0c06: return "hpmcounter6"; |
186 | 110 | case 0x0c07: return "hpmcounter7"; |
187 | 42 | case 0x0c08: return "hpmcounter8"; |
188 | 23 | case 0x0c09: return "hpmcounter9"; |
189 | 110 | case 0x0c0a: return "hpmcounter10"; |
190 | 120 | case 0x0c0b: return "hpmcounter11"; |
191 | 19 | case 0x0c0c: return "hpmcounter12"; |
192 | 30 | case 0x0c0d: return "hpmcounter13"; |
193 | 50 | case 0x0c0e: return "hpmcounter14"; |
194 | 83 | case 0x0c0f: return "hpmcounter15"; |
195 | 65 | case 0x0c10: return "hpmcounter16"; |
196 | 23 | case 0x0c11: return "hpmcounter17"; |
197 | 41 | case 0x0c12: return "hpmcounter18"; |
198 | 39 | case 0x0c13: return "hpmcounter19"; |
199 | 238 | case 0x0c14: return "hpmcounter20"; |
200 | 85 | case 0x0c15: return "hpmcounter21"; |
201 | 148 | case 0x0c16: return "hpmcounter22"; |
202 | 45 | case 0x0c17: return "hpmcounter23"; |
203 | 8 | case 0x0c18: return "hpmcounter24"; |
204 | 6 | case 0x0c19: return "hpmcounter25"; |
205 | 101 | case 0x0c1a: return "hpmcounter26"; |
206 | 78 | case 0x0c1b: return "hpmcounter27"; |
207 | 81 | case 0x0c1c: return "hpmcounter28"; |
208 | 350 | case 0x0c1d: return "hpmcounter29"; |
209 | 96 | case 0x0c1e: return "hpmcounter30"; |
210 | 141 | case 0x0c1f: return "hpmcounter31"; |
211 | 102 | case 0x0c80: return "cycleh"; |
212 | 98 | case 0x0c81: return "timeh"; |
213 | 377 | case 0x0c82: return "instreth"; |
214 | 76 | case 0x0c83: return "hpmcounter3h"; |
215 | 50 | case 0x0c84: return "hpmcounter4h"; |
216 | 50 | case 0x0c85: return "hpmcounter5h"; |
217 | 311 | case 0x0c86: return "hpmcounter6h"; |
218 | 194 | case 0x0c87: return "hpmcounter7h"; |
219 | 69 | case 0x0c88: return "hpmcounter8h"; |
220 | 7 | case 0x0c89: return "hpmcounter9h"; |
221 | 31 | case 0x0c8a: return "hpmcounter10h"; |
222 | 205 | case 0x0c8b: return "hpmcounter11h"; |
223 | 250 | case 0x0c8c: return "hpmcounter12h"; |
224 | 141 | case 0x0c8d: return "hpmcounter13h"; |
225 | 52 | case 0x0c8e: return "hpmcounter14h"; |
226 | 42 | case 0x0c8f: return "hpmcounter15h"; |
227 | 78 | case 0x0c90: return "hpmcounter16h"; |
228 | 55 | case 0x0c91: return "hpmcounter17h"; |
229 | 75 | case 0x0c92: return "hpmcounter18h"; |
230 | 61 | case 0x0c93: return "hpmcounter19h"; |
231 | 31 | case 0x0c94: return "hpmcounter20h"; |
232 | 43 | case 0x0c95: return "hpmcounter21h"; |
233 | 103 | case 0x0c96: return "hpmcounter22h"; |
234 | 56 | case 0x0c97: return "hpmcounter23h"; |
235 | 12 | case 0x0c98: return "hpmcounter24h"; |
236 | 178 | case 0x0c99: return "hpmcounter25h"; |
237 | 72 | case 0x0c9a: return "hpmcounter26h"; |
238 | 263 | case 0x0c9b: return "hpmcounter27h"; |
239 | 1.05k | case 0x0c9c: return "hpmcounter28h"; |
240 | 261 | case 0x0c9d: return "hpmcounter29h"; |
241 | 11 | case 0x0c9e: return "hpmcounter30h"; |
242 | 388 | case 0x0c9f: return "hpmcounter31h"; |
243 | | |
244 | 146 | case 0x0100: return "sstatus"; |
245 | 149 | case 0x0102: return "sedeleg"; |
246 | 130 | case 0x0103: return "sideleg"; |
247 | 47 | case 0x0104: return "sie"; |
248 | 11 | case 0x0105: return "stvec"; |
249 | 82 | case 0x0106: return "scounteren"; |
250 | | |
251 | 137 | case 0x0140: return "sscratch"; |
252 | 15 | case 0x0141: return "sepc"; |
253 | 18 | case 0x0142: return "scause"; |
254 | 47 | case 0x0143: return "stval"; |
255 | 27 | case 0x0144: return "sip"; |
256 | | |
257 | 39 | case 0x0180: return "satp"; |
258 | | |
259 | 614 | case 0x0f11: return "mvendorid"; |
260 | 388 | case 0x0f12: return "marchid"; |
261 | 90 | case 0x0f13: return "mimpid"; |
262 | 29 | case 0x0f14: return "mhartid"; |
263 | | |
264 | 62 | case 0x0300: return "mstatus"; |
265 | 38 | case 0x0301: return "misa"; |
266 | 357 | case 0x0302: return "medeleg"; |
267 | 64 | case 0x0303: return "mideleg"; |
268 | 54 | case 0x0304: return "mie"; |
269 | 15 | case 0x0305: return "mtvec"; |
270 | 43 | case 0x0306: return "mcounteren"; |
271 | | |
272 | 12 | case 0x0340: return "mscratch"; |
273 | 103 | case 0x0341: return "mepc"; |
274 | 28 | case 0x0342: return "mcause"; |
275 | 48 | case 0x0343: return "mtval"; |
276 | 87 | case 0x0344: return "mip"; |
277 | | |
278 | 42 | case 0x03a0: return "pmpcfg0"; |
279 | 256 | case 0x03a1: return "pmpcfg1"; |
280 | 151 | case 0x03a2: return "pmpcfg2"; |
281 | 38 | case 0x03a3: return "pmpcfg3"; |
282 | 26 | case 0x03b0: return "pmpaddr0"; |
283 | 54 | case 0x03b1: return "pmpaddr1"; |
284 | 46 | case 0x03b2: return "pmpaddr2"; |
285 | 15 | case 0x03b3: return "pmpaddr3"; |
286 | 32 | case 0x03b4: return "pmpaddr4"; |
287 | 13 | case 0x03b5: return "pmpaddr5"; |
288 | 70 | case 0x03b6: return "pmpaddr6"; |
289 | 593 | case 0x03b7: return "pmpaddr7"; |
290 | 47 | case 0x03b8: return "pmpaddr8"; |
291 | 235 | case 0x03b9: return "pmpaddr9"; |
292 | 34 | case 0x03ba: return "pmpaddr10"; |
293 | 131 | case 0x03bb: return "pmpaddr11"; |
294 | 14 | case 0x03bc: return "pmpaddr12"; |
295 | 69 | case 0x03bd: return "pmpaddr14"; |
296 | 45 | case 0x03be: return "pmpaddr13"; |
297 | 50 | case 0x03bf: return "pmpaddr15"; |
298 | | |
299 | 192 | case 0x0b00: return "mcycle"; |
300 | 167 | case 0x0b02: return "minstret"; |
301 | 151 | case 0x0b03: return "mhpmcounter3"; |
302 | 114 | case 0x0b04: return "mhpmcounter4"; |
303 | 11 | case 0x0b05: return "mhpmcounter5"; |
304 | 35 | case 0x0b06: return "mhpmcounter6"; |
305 | 77 | case 0x0b07: return "mhpmcounter7"; |
306 | 29 | case 0x0b08: return "mhpmcounter8"; |
307 | 14 | case 0x0b09: return "mhpmcounter9"; |
308 | 382 | case 0x0b0a: return "mhpmcounter10"; |
309 | 115 | case 0x0b0b: return "mhpmcounter11"; |
310 | 14 | case 0x0b0c: return "mhpmcounter12"; |
311 | 6 | case 0x0b0d: return "mhpmcounter13"; |
312 | 46 | case 0x0b0e: return "mhpmcounter14"; |
313 | 258 | case 0x0b0f: return "mhpmcounter15"; |
314 | 105 | case 0x0b10: return "mhpmcounter16"; |
315 | 102 | case 0x0b11: return "mhpmcounter17"; |
316 | 277 | case 0x0b12: return "mhpmcounter18"; |
317 | 87 | case 0x0b13: return "mhpmcounter19"; |
318 | 35 | case 0x0b14: return "mhpmcounter20"; |
319 | 7 | case 0x0b15: return "mhpmcounter21"; |
320 | 16 | case 0x0b16: return "mhpmcounter22"; |
321 | 8 | case 0x0b17: return "mhpmcounter23"; |
322 | 8 | case 0x0b18: return "mhpmcounter24"; |
323 | 46 | case 0x0b19: return "mhpmcounter25"; |
324 | 37 | case 0x0b1a: return "mhpmcounter26"; |
325 | 87 | case 0x0b1b: return "mhpmcounter27"; |
326 | 98 | case 0x0b1c: return "mhpmcounter28"; |
327 | 179 | case 0x0b1d: return "mhpmcounter29"; |
328 | 18 | case 0x0b1e: return "mhpmcounter30"; |
329 | 8 | case 0x0b1f: return "mhpmcounter31"; |
330 | 262 | case 0x0b80: return "mcycleh"; |
331 | 263 | case 0x0b82: return "minstreth"; |
332 | 79 | case 0x0b83: return "mhpmcounter3h"; |
333 | 55 | case 0x0b84: return "mhpmcounter4h"; |
334 | 72 | case 0x0b85: return "mhpmcounter5h"; |
335 | 230 | case 0x0b86: return "mhpmcounter6h"; |
336 | 84 | case 0x0b87: return "mhpmcounter7h"; |
337 | 16 | case 0x0b88: return "mhpmcounter8h"; |
338 | 39 | case 0x0b89: return "mhpmcounter9h"; |
339 | 127 | case 0x0b8a: return "mhpmcounter10h"; |
340 | 220 | case 0x0b8b: return "mhpmcounter11h"; |
341 | 18 | case 0x0b8c: return "mhpmcounter12h"; |
342 | 13 | case 0x0b8d: return "mhpmcounter13h"; |
343 | 425 | case 0x0b8e: return "mhpmcounter14h"; |
344 | 440 | case 0x0b8f: return "mhpmcounter15h"; |
345 | 314 | case 0x0b90: return "mhpmcounter16h"; |
346 | 157 | case 0x0b91: return "mhpmcounter17h"; |
347 | 311 | case 0x0b92: return "mhpmcounter18h"; |
348 | 21 | case 0x0b93: return "mhpmcounter19h"; |
349 | 31 | case 0x0b94: return "mhpmcounter20h"; |
350 | 51 | case 0x0b95: return "mhpmcounter21h"; |
351 | 14 | case 0x0b96: return "mhpmcounter22h"; |
352 | 59 | case 0x0b97: return "mhpmcounter23h"; |
353 | 62 | case 0x0b98: return "mhpmcounter24h"; |
354 | 17 | case 0x0b99: return "mhpmcounter25h"; |
355 | 82 | case 0x0b9a: return "mhpmcounter26h"; |
356 | 67 | case 0x0b9b: return "mhpmcounter27h"; |
357 | 138 | case 0x0b9c: return "mhpmcounter28h"; |
358 | 144 | case 0x0b9d: return "mhpmcounter29h"; |
359 | 176 | case 0x0b9e: return "mhpmcounter30h"; |
360 | 24 | case 0x0b9f: return "mhpmcounter31h"; |
361 | | |
362 | 57 | case 0x0323: return "mhpmevent3"; |
363 | 59 | case 0x0324: return "mhpmevent4"; |
364 | 20 | case 0x0325: return "mhpmevent5"; |
365 | 32 | case 0x0326: return "mhpmevent6"; |
366 | 99 | case 0x0327: return "mhpmevent7"; |
367 | 127 | case 0x0328: return "mhpmevent8"; |
368 | 199 | case 0x0329: return "mhpmevent9"; |
369 | 87 | case 0x032a: return "mhpmevent10"; |
370 | 14 | case 0x032b: return "mhpmevent11"; |
371 | 19 | case 0x032c: return "mhpmevent12"; |
372 | 34 | case 0x032d: return "mhpmevent13"; |
373 | 57 | case 0x032e: return "mhpmevent14"; |
374 | 272 | case 0x032f: return "mhpmevent15"; |
375 | 82 | case 0x0330: return "mhpmevent16"; |
376 | 266 | case 0x0331: return "mhpmevent17"; |
377 | 577 | case 0x0332: return "mhpmevent18"; |
378 | 38 | case 0x0333: return "mhpmevent19"; |
379 | 76 | case 0x0334: return "mhpmevent20"; |
380 | 71 | case 0x0335: return "mhpmevent21"; |
381 | 107 | case 0x0336: return "mhpmevent22"; |
382 | 67 | case 0x0337: return "mhpmevent23"; |
383 | 125 | case 0x0338: return "mhpmevent24"; |
384 | 578 | case 0x0339: return "mhpmevent25"; |
385 | 54 | case 0x033a: return "mhpmevent26"; |
386 | 76 | case 0x033b: return "mhpmevent27"; |
387 | 161 | case 0x033c: return "mhpmevent28"; |
388 | 113 | case 0x033d: return "mhpmevent29"; |
389 | 327 | case 0x033e: return "mhpmevent30"; |
390 | 176 | case 0x033f: return "mhpmevent31"; |
391 | | |
392 | 6 | case 0x07a0: return "tselect"; |
393 | 141 | case 0x07a1: return "tdata1"; |
394 | 23 | case 0x07a2: return "tdata2"; |
395 | 12 | case 0x07a3: return "tdata3"; |
396 | | |
397 | 14 | case 0x07b0: return "dcsr"; |
398 | 16 | case 0x07b1: return "dpc"; |
399 | 8 | case 0x07b2: return "dscratch"; |
400 | 32.7k | } |
401 | 5.77k | return NULL; |
402 | 32.7k | } |
403 | | |
404 | | static void printCSRSystemRegister(MCInst *MI, unsigned OpNo, |
405 | | //const MCSubtargetInfo &STI, |
406 | | SStream *O) |
407 | 32.7k | { |
408 | 32.7k | unsigned Imm = MCOperand_getImm(MCInst_getOperand(MI, OpNo)); |
409 | 32.7k | const char *Name = getCSRSystemRegisterName(Imm); |
410 | | |
411 | 32.7k | if (Name) { |
412 | 26.9k | SStream_concat0(O, Name); |
413 | 26.9k | } else { |
414 | 5.77k | SStream_concat(O, "%u", Imm); |
415 | 5.77k | } |
416 | 32.7k | } |
417 | | |
418 | | static void printFenceArg(MCInst *MI, unsigned OpNo, SStream *O) |
419 | 1.83k | { |
420 | 1.83k | unsigned FenceArg = MCOperand_getImm(MCInst_getOperand(MI, OpNo)); |
421 | | //CS_ASSERT (((FenceArg >> 4) == 0) && "Invalid immediate in printFenceArg"); |
422 | | |
423 | 1.83k | if ((FenceArg & RISCVFenceField_I) != 0) |
424 | 824 | SStream_concat0(O, "i"); |
425 | 1.83k | if ((FenceArg & RISCVFenceField_O) != 0) |
426 | 863 | SStream_concat0(O, "o"); |
427 | 1.83k | if ((FenceArg & RISCVFenceField_R) != 0) |
428 | 660 | SStream_concat0(O, "r"); |
429 | 1.83k | if ((FenceArg & RISCVFenceField_W) != 0) |
430 | 778 | SStream_concat0(O, "w"); |
431 | 1.83k | if (FenceArg == 0) |
432 | 602 | SStream_concat0(O, "unknown"); |
433 | 1.83k | } |
434 | | |
435 | | static void printFRMArg(MCInst *MI, unsigned OpNo, SStream *O) |
436 | 6.03k | { |
437 | 6.03k | enum RoundingMode FRMArg = |
438 | 6.03k | (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 | 6.03k | SStream_concat0(O, roundingModeToString(FRMArg)); |
445 | 6.03k | } |
446 | | |
447 | | #endif // CAPSTONE_HAS_RISCV |