Browse Source

DRY in selecting instruction functions

pull/899/head
Andrew Waterman 4 years ago
parent
commit
5b7cdbe1cf
  1. 6
      riscv/processor.cc
  2. 2
      riscv/processor.h

6
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)

2
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

Loading…
Cancel
Save