Skip to content

Commit 5bea40c

Browse files
authored
Merge pull request #2147 from riscv-software-src/zicfilp-improvements
Two Zicfilp improvements
2 parents c4524fc + cd3df04 commit 5bea40c

File tree

7 files changed

+20
-14
lines changed

7 files changed

+20
-14
lines changed

riscv/decode_macros.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,3 +374,10 @@ inline long double to_f(float128_t f) { long double r; memcpy(&r, &f, sizeof(r))
374374
#define ZICFILP_IS_LP_EXPECTED(reg_num) \
375375
(((reg_num) != 1 && (reg_num) != 5 && (reg_num) != 7) ? \
376376
elp_t::LP_EXPECTED : elp_t::NO_LP_EXPECTED)
377+
#define maybe_set_elp(reg_num) \
378+
if (unlikely(p->extension_enabled(EXT_ZICFILP))) { \
379+
if (unlikely(ZICFILP_IS_LP_EXPECTED(reg_num) == elp_t::LP_EXPECTED)) { \
380+
serialize(); \
381+
return p->set_lpad_expected(npc); \
382+
} \
383+
}

riscv/insns/c_jalr.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,4 @@ reg_t tmp = npc;
44
set_pc(RVC_RS1 & ~reg_t(1));
55
WRITE_REG(X_RA, tmp);
66

7-
if (ZICFILP_xLPE(STATE.v, STATE.prv)) {
8-
STATE.elp = ZICFILP_IS_LP_EXPECTED(insn.rvc_rs1());
9-
serialize();
10-
}
7+
maybe_set_elp(insn.rvc_rs1());

riscv/insns/c_jr.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,4 @@ require_extension(EXT_ZCA);
22
require(insn.rvc_rs1() != 0);
33
set_pc(RVC_RS1 & ~reg_t(1));
44

5-
if (ZICFILP_xLPE(STATE.v, STATE.prv)) {
6-
STATE.elp = ZICFILP_IS_LP_EXPECTED(insn.rvc_rs1());
7-
serialize();
8-
}
5+
maybe_set_elp(insn.rvc_rs1());

riscv/insns/jalr.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,4 @@ reg_t tmp = npc;
33
set_pc((RS1 + insn.i_imm()) & ~reg_t(1));
44
WRITE_RD(tmp);
55

6-
if (ZICFILP_xLPE(STATE.v, STATE.prv)) {
7-
STATE.elp = ZICFILP_IS_LP_EXPECTED(insn.rs1());
8-
serialize();
9-
}
6+
maybe_set_elp(insn.rs1());

riscv/mmu.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,7 @@ class mmu_t
346346

347347
inline insn_fetch_t load_insn(reg_t addr)
348348
{
349-
icache_entry_t entry;
350-
return refill_icache(addr, &entry)->data;
349+
return refill_icache(addr, &icache[icache_index(addr)])->data;
351350
}
352351

353352
std::tuple<bool, uintptr_t, reg_t> ALWAYS_INLINE access_tlb(const dtlb_entry_t* tlb, reg_t vaddr, reg_t allowed_flags = 0, reg_t required_flags = 0)

riscv/processor.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,14 @@ void processor_t::check_if_lpad_required()
572572
}
573573
}
574574

575+
reg_t processor_t::set_lpad_expected(reg_t pc)
576+
{
577+
auto p = this;
578+
if (ZICFILP_xLPE(state.v, state.prv))
579+
state.elp = elp_t::LP_EXPECTED;
580+
return pc;
581+
}
582+
575583
void processor_t::disasm(insn_t insn)
576584
{
577585
uint64_t bits = insn.bits();

riscv/processor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ class processor_t : public abstract_device_t
379379
bool is_waiting_for_interrupt() { return in_wfi; };
380380

381381
void check_if_lpad_required();
382+
reg_t set_lpad_expected(reg_t pc);
382383

383384
reg_t select_an_interrupt_with_default_priority(reg_t enabled_interrupts) const;
384385

0 commit comments

Comments
 (0)