1 // See LICENSE for license details.
3 #ifndef _RISCV_DISASM_H
4 #define _RISCV_DISASM_H
11 extern const char* xpr_name
[NXPR
];
12 extern const char* fpr_name
[NFPR
];
13 extern const char* csr_name(int which
);
18 virtual std::string
to_string(insn_t val
) const = 0;
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
) {}
29 bool operator == (insn_t insn
) const
31 return (insn
.bits() & mask
) == match
;
34 std::string
to_string(insn_t insn
) const
38 for (len
= 0; name
[len
]; len
++)
39 s
<< (name
[len
] == '_' ? '.' : name
[len
]);
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
);
51 uint32_t get_match() const { return match
; }
52 uint32_t get_mask() const { return mask
; }
57 std::vector
<const arg_t
*> args
;
64 disassembler_t(int xlen
);
66 std::string
disassemble(insn_t insn
) const;
67 void add_insn(disasm_insn_t
* insn
);
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;