diff options
-rw-r--r-- | riscv/processor.cc | 6 | ||||
-rw-r--r-- | riscv/processor.h | 2 |
2 files changed, 5 insertions, 3 deletions
diff --git a/riscv/processor.cc b/riscv/processor.cc index e7e60bf..625159f 100644 --- a/riscv/processor.cc +++ b/riscv/processor.cc @@ -1027,11 +1027,11 @@ insn_func_t processor_t::decode_insn(insn_t insn) size_t idx = insn.bits() % OPCODE_CACHE_SIZE; insn_desc_t desc = opcode_cache[idx]; - if (unlikely(insn.bits() != desc.match || !(xlen == 64 ? desc.rv64 : desc.rv32))) { + if (unlikely(insn.bits() != desc.match || !desc.func(xlen))) { // fall back to linear search int cnt = 0; insn_desc_t* p = &instructions[0]; - while ((insn.bits() & p->mask) != p->match || !(xlen == 64 ? p->rv64 : p->rv32)) + while ((insn.bits() & p->mask) != p->match || !desc.func(xlen)) p++, cnt++; desc = *p; @@ -1048,7 +1048,7 @@ insn_func_t processor_t::decode_insn(insn_t insn) opcode_cache[idx].match = insn.bits(); } - return xlen == 64 ? desc.rv64 : desc.rv32; + return desc.func(xlen); } void processor_t::register_insn(insn_desc_t desc) diff --git a/riscv/processor.h b/riscv/processor.h index c32f624..2d14bb3 100644 --- a/riscv/processor.h +++ b/riscv/processor.h @@ -29,6 +29,8 @@ struct insn_desc_t insn_bits_t mask; insn_func_t rv32; insn_func_t rv64; + + insn_func_t func(int xlen) { return xlen == 64 ? rv64 : rv32; } }; // regnum, data |