Add an api to get the name for a CSR.
[riscv-isa-sim.git] / riscv / disasm.h
1 // See LICENSE for license details.
2
3 #ifndef _RISCV_DISASM_H
4 #define _RISCV_DISASM_H
5
6 #include "decode.h"
7 #include <string>
8 #include <sstream>
9 #include <vector>
10
11 extern const char* xpr_name[NXPR];
12 extern const char* fpr_name[NFPR];
13 extern const char* csr_name(int which);
14
15 class arg_t
16 {
17 public:
18 virtual std::string to_string(insn_t val) const = 0;
19 virtual ~arg_t() {}
20 };
21
22 class disasm_insn_t
23 {
24 public:
25 disasm_insn_t(const char* name, uint32_t match, uint32_t mask,
26 const std::vector<const arg_t*>& args)
27 : match(match), mask(mask), args(args), name(name) {}
28
29 bool operator == (insn_t insn) const
30 {
31 return (insn.bits() & mask) == match;
32 }
33
34 std::string to_string(insn_t insn) const
35 {
36 std::stringstream s;
37 int len;
38 for (len = 0; name[len]; len++)
39 s << (name[len] == '_' ? '.' : name[len]);
40
41 if (args.size())
42 {
43 s << std::string(std::max(1, 8 - len), ' ');
44 for (size_t i = 0; i < args.size()-1; i++)
45 s << args[i]->to_string(insn) << ", ";
46 s << args[args.size()-1]->to_string(insn);
47 }
48 return s.str();
49 }
50
51 uint32_t get_match() const { return match; }
52 uint32_t get_mask() const { return mask; }
53
54 private:
55 uint32_t match;
56 uint32_t mask;
57 std::vector<const arg_t*> args;
58 const char* name;
59 };
60
61 class disassembler_t
62 {
63 public:
64 disassembler_t(int xlen);
65 ~disassembler_t();
66 std::string disassemble(insn_t insn) const;
67 void add_insn(disasm_insn_t* insn);
68 private:
69 static const int HASH_SIZE = 256;
70 std::vector<const disasm_insn_t*> chain[HASH_SIZE+1];
71 const disasm_insn_t* lookup(insn_t insn) const;
72 };
73
74 #endif