+ disasm_insn_t(const char* name, uint32_t match, uint32_t mask,
+ const std::vector<const arg_t*>& args)
+ : match(match), mask(mask), args(args), name(name) {}
+
+ bool operator == (insn_t insn) const
+ {
+ return (insn.bits() & mask) == match;
+ }
+
+ std::string to_string(insn_t insn) const
+ {
+ std::stringstream s;
+ int len;
+ for (len = 0; name[len]; len++)
+ s << (name[len] == '_' ? '.' : name[len]);
+
+ if (args.size())
+ {
+ s << std::string(std::max(1, 8 - len), ' ');
+ for (size_t i = 0; i < args.size()-1; i++)
+ s << args[i]->to_string(insn) << ", ";
+ s << args[args.size()-1]->to_string(insn);
+ }
+ return s.str();
+ }
+
+ uint32_t get_match() const { return match; }
+ uint32_t get_mask() const { return mask; }
+
+ private:
+ uint32_t match;
+ uint32_t mask;
+ std::vector<const arg_t*> args;
+ const char* name;
+};
+
+class disassembler_t
+{
+ public:
+ disassembler_t(int xlen);
+ ~disassembler_t();
+ std::string disassemble(insn_t insn) const;
+ void add_insn(disasm_insn_t* insn);