e2981d4a75ef0b2c506e9ba30e118a79a5ad42c9
[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
14 class arg_t
15 {
16 public:
17 virtual std::string to_string(insn_t val) const = 0;
18 virtual ~arg_t() {}
19 };
20
21 class disasm_insn_t
22 {
23 public:
24 disasm_insn_t(const char* name, uint32_t match, uint32_t mask,
25 const std::vector<const arg_t*>& args)
26 : match(match), mask(mask), args(args), name(name) {}
27
28 bool operator == (insn_t insn) const
29 {
30 return (insn.bits() & mask) == match;
31 }
32
33 std::string to_string(insn_t insn) const
34 {
35 std::stringstream s;
36 int len;
37 for (len = 0; name[len]; len++)
38 s << (name[len] == '_' ? '.' : name[len]);
39
40 if (args.size())
41 {
42 s << std::string(std::max(1, 8 - len), ' ');
43 for (size_t i = 0; i < args.size()-1; i++)
44 s << args[i]->to_string(insn) << ", ";
45 s << args[args.size()-1]->to_string(insn);
46 }
47 return s.str();
48 }
49
50 uint32_t get_match() const { return match; }
51 uint32_t get_mask() const { return mask; }
52
53 private:
54 uint32_t match;
55 uint32_t mask;
56 std::vector<const arg_t*> args;
57 const char* name;
58 };
59
60 class disassembler_t
61 {
62 public:
63 disassembler_t(int xlen);
64 ~disassembler_t();
65 std::string disassemble(insn_t insn) const;
66 void add_insn(disasm_insn_t* insn);
67 private:
68 static const int HASH_SIZE = 256;
69 std::vector<const disasm_insn_t*> chain[HASH_SIZE+1];
70 const disasm_insn_t* lookup(insn_t insn) const;
71 };
72
73 #endif