aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/processor.cc6
-rw-r--r--riscv/processor.h2
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