Skip to content

Commit 00dfa28

Browse files
authored
Merge pull request #1684 from riscv-software-src/simplify-zicfilp
Avoid checking ELP before every instruction fetch
2 parents 3a70f84 + 7595995 commit 00dfa28

File tree

6 files changed

+11
-14
lines changed

6 files changed

+11
-14
lines changed

riscv/execute.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,8 @@ void processor_t::step(size_t n)
247247
{
248248
take_pending_interrupt();
249249

250+
check_if_lpad_required();
251+
250252
if (unlikely(slow_path()))
251253
{
252254
// Main simulation loop, slow path.
@@ -280,7 +282,6 @@ void processor_t::step(size_t n)
280282

281283
in_wfi = false;
282284
insn_fetch_t fetch = mmu->load_insn(pc);
283-
execute_insn_prehook(fetch.insn);
284285
if (debug && !state.serialized)
285286
disasm(fetch.insn);
286287
pc = execute_insn_logged(this, pc, fetch);
@@ -292,7 +293,6 @@ void processor_t::step(size_t n)
292293
// Main simulation loop, fast path.
293294
for (auto ic_entry = _mmu->access_icache(pc); ; ) {
294295
auto fetch = ic_entry->data;
295-
execute_insn_prehook(fetch.insn);
296296
pc = execute_insn_fast(this, pc, fetch);
297297
ic_entry = ic_entry->next;
298298
if (unlikely(ic_entry->tag != pc))

riscv/insns/c_jalr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ WRITE_REG(X_RA, tmp);
66

77
if (ZICFILP_xLPE(STATE.v, STATE.prv)) {
88
STATE.elp = ZICFILP_IS_LP_EXPECTED(insn.rvc_rs1());
9+
serialize();
910
}

riscv/insns/c_jr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ set_pc(RVC_RS1 & ~reg_t(1));
44

55
if (ZICFILP_xLPE(STATE.v, STATE.prv)) {
66
STATE.elp = ZICFILP_IS_LP_EXPECTED(insn.rvc_rs1());
7+
serialize();
78
}

riscv/insns/jalr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ WRITE_RD(tmp);
44

55
if (ZICFILP_xLPE(STATE.v, STATE.prv)) {
66
STATE.elp = ZICFILP_IS_LP_EXPECTED(insn.rs1());
7+
serialize();
78
}

riscv/processor.cc

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,6 @@ processor_t::~processor_t()
9494
delete disassembler;
9595
}
9696

97-
static void zicfilp_check_if_lpad_required(const elp_t elp, insn_t insn)
98-
{
99-
if (unlikely(elp == elp_t::LP_EXPECTED)) {
100-
// also see riscv/lpad.h for more checks performed
101-
software_check((insn.bits() & MASK_LPAD) == MATCH_LPAD, LANDING_PAD_FAULT);
102-
}
103-
}
104-
10597
static void bad_option_string(const char *option, const char *value,
10698
const char *msg)
10799
{
@@ -991,10 +983,12 @@ const char* processor_t::get_symbol(uint64_t addr)
991983
return sim->get_symbol(addr);
992984
}
993985

994-
void processor_t::execute_insn_prehook(insn_t insn)
986+
void processor_t::check_if_lpad_required()
995987
{
996-
if (extension_enabled(EXT_ZICFILP)) {
997-
zicfilp_check_if_lpad_required(state.elp, insn);
988+
if (unlikely(state.elp == elp_t::LP_EXPECTED)) {
989+
// also see insns/lpad.h for more checks performed
990+
insn_fetch_t fetch = mmu->load_insn(state.pc);
991+
software_check((fetch.insn.bits() & MASK_LPAD) == MATCH_LPAD, LANDING_PAD_FAULT);
998992
}
999993
}
1000994

riscv/processor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ class processor_t : public abstract_device_t
319319
void clear_waiting_for_interrupt() { in_wfi = false; };
320320
bool is_waiting_for_interrupt() { return in_wfi; };
321321

322-
void execute_insn_prehook(insn_t insn);
322+
void check_if_lpad_required();
323323

324324
private:
325325
const isa_parser_t * const isa;

0 commit comments

Comments
 (0)