Browse Source

Move Zca-enabled check off the critical path

pull/2151/head
Andrew Waterman 9 months ago
parent
commit
abf47872e3
  1. 12
      riscv/common.h
  2. 2
      riscv/csrs.cc
  3. 3
      riscv/insn_template.cc
  4. 3
      riscv/processor.cc

12
riscv/common.h

@ -19,4 +19,16 @@
# define UNUSED
#endif
#ifndef __has_builtin
# define __has_builtin(x) 0
#endif
#if __has_cpp_attribute(assume)
# define assume(x) [[assume(x)]]
#elif __has_builtin(__builtin_assume)
# define assume(x) __builtin_assume(x)
#else
# define assume(x) ((void) 0)
#endif
#endif

2
riscv/csrs.cc

@ -773,6 +773,8 @@ bool misa_csr_t::unlogged_write(const reg_t val) noexcept {
}
}
proc->get_mmu()->flush_tlb();
return basic_csr_t::unlogged_write(new_misa);
}

3
riscv/insn_template.cc

@ -6,7 +6,8 @@
#define DECODE_MACRO_USAGE_LOGGED 0
#define PROLOGUE \
reg_t npc = sext_xlen(pc + insn_length(OPCODE))
reg_t npc = sext_xlen(pc + insn_length(OPCODE)); \
if (!p->extension_enabled(EXT_ZCA)) assume(insn_length(OPCODE) % 4 == 0)
#define EPILOGUE \
trace_opcode(p, OPCODE, insn); \

3
riscv/processor.cc

@ -662,6 +662,9 @@ reg_t processor_t::throw_instruction_address_misaligned(reg_t pc)
insn_func_t processor_t::decode_insn(insn_t insn)
{
if (!extension_enabled(EXT_ZCA) && insn_length(insn.bits()) % 4)
return &::illegal_instruction;
// look up opcode in hash table
size_t idx = insn.bits() % OPCODE_CACHE_SIZE;
auto [hit, desc] = opcode_cache[idx].lookup(insn.bits());

Loading…
Cancel
Save