aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2022-01-06 15:41:12 -0800
committerAndrew Waterman <andrew@sifive.com>2022-01-06 15:42:38 -0800
commit5b7cdbe1cf75112bd2a472b7490b15fa7078d798 (patch)
tree18792b68df01868a8349de1b7c529f34c0784b43
parent336a5813fd3f72d5081344466bcbd3275227dae7 (diff)
downloadriscv-isa-sim-5b7cdbe1cf75112bd2a472b7490b15fa7078d798.zip
riscv-isa-sim-5b7cdbe1cf75112bd2a472b7490b15fa7078d798.tar.gz
riscv-isa-sim-5b7cdbe1cf75112bd2a472b7490b15fa7078d798.tar.bz2
DRY in selecting instruction functions
-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