aboutsummaryrefslogtreecommitdiff
path: root/riscv/processor.h
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/processor.h')
-rw-r--r--riscv/processor.h12
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;