1 // See LICENSE for license details.
3 #ifndef _RISCV_DISASM_H
4 #define _RISCV_DISASM_H
11 static const char* xpr_name
[] = {
12 "zero", "ra", "s0", "s1", "s2", "s3", "s4", "s5",
13 "s6", "s7", "s8", "s9", "s10", "s11", "sp", "tp",
14 "v0", "v1", "a0", "a1", "a2", "a3", "a4", "a5",
15 "a6", "a7", "t0", "t1", "t2", "t3", "t4", "gp"
18 static const char* fpr_name
[] = {
19 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7",
20 "fs8", "fs9", "fs10", "fs11", "fs12", "fs13", "fs14", "fs15",
21 "fv0", "fv1", "fa0", "fa1", "fa2", "fa3", "fa4", "fa5",
22 "fa6", "fa7", "ft0", "ft1", "ft2", "ft3", "ft4", "ft5"
28 virtual std::string
to_string(insn_t val
) const = 0;
35 disasm_insn_t(const char* name
, uint32_t match
, uint32_t mask
,
36 const std::vector
<const arg_t
*>& args
)
37 : match(match
), mask(mask
), args(args
), name(name
) {}
39 bool operator == (insn_t insn
) const
41 return (insn
.bits() & mask
) == match
;
44 std::string
to_string(insn_t insn
) const
48 for (len
= 0; name
[len
]; len
++)
49 s
<< (name
[len
] == '_' ? '.' : name
[len
]);
53 s
<< std::string(std::max(1, 8 - len
), ' ');
54 for (size_t i
= 0; i
< args
.size()-1; i
++)
55 s
<< args
[i
]->to_string(insn
) << ", ";
56 s
<< args
[args
.size()-1]->to_string(insn
);
61 uint32_t get_match() const { return match
; }
62 uint32_t get_mask() const { return mask
; }
67 std::vector
<const arg_t
*> args
;
76 std::string
disassemble(insn_t insn
);
77 void add_insn(disasm_insn_t
* insn
);
79 static const int HASH_SIZE
= 256;
80 std::vector
<const disasm_insn_t
*> chain
[HASH_SIZE
+1];
81 const disasm_insn_t
* lookup(insn_t insn
);