diff options
Diffstat (limited to 'riscv/processor.h')
| -rw-r--r-- | riscv/processor.h | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/riscv/processor.h b/riscv/processor.h index cb05210..db7b8ba 100644 --- a/riscv/processor.h +++ b/riscv/processor.h @@ -404,7 +404,17 @@ private: void parse_priv_string(const char*); void register_base_instructions(); - insn_func_t decode_insn(insn_t insn); + + insn_func_t ALWAYS_INLINE decode_insn(insn_t insn) + { + const auto& pool = opcode_map[insn.bits() % std::size(opcode_map)]; + + for (auto p = pool.begin(); ; ++p) { + if ((insn.bits() & p->mask) == p->match) { + return p->func; + } + } + } // Track repeated executions for processor_t::disasm() uint64_t last_pc, last_bits, executions; |
