Skip to content

Commit d96724b

Browse files
committed
tmp
1 parent 02a73af commit d96724b

File tree

2 files changed

+6
-18
lines changed

2 files changed

+6
-18
lines changed

riscv/execute.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ void processor_t::step(size_t n)
305305
for (auto ic_entry = _mmu->access_icache(pc); ; ) {
306306
auto fetch = ic_entry->data;
307307
pc = execute_insn_fast(this, pc, fetch);
308-
ic_entry = ic_entry->next;
308+
ic_entry = &_mmu->icache[_mmu->icache_index(pc)];
309309
if (unlikely(ic_entry->tag != pc))
310310
break;
311311
if (unlikely(instret + 1 == n))

riscv/mmu.h

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ struct insn_fetch_t
4242

4343
struct icache_entry_t {
4444
reg_t tag;
45-
struct icache_entry_t* next;
4645
insn_fetch_t data;
4746
};
4847

@@ -291,7 +290,7 @@ class mmu_t
291290
return have_reservation;
292291
}
293292

294-
static const reg_t ICACHE_ENTRIES = 1024;
293+
static const reg_t ICACHE_ENTRIES = 4096;
295294

296295
inline size_t icache_index(reg_t addr)
297296
{
@@ -311,26 +310,15 @@ class mmu_t
311310
inline icache_entry_t* refill_icache(reg_t addr, icache_entry_t* entry)
312311
{
313312
insn_bits_t insn = fetch_insn_parcel(addr);
313+
unsigned length = insn_length(insn);
314314

315-
int length = insn_length(insn);
316-
317-
if (likely(length == 4)) {
318-
insn |= (insn_bits_t)fetch_insn_parcel(addr + 2) << 16;
319-
} else if (length == 2) {
320-
// entire instruction already fetched
321-
} else if (length == 6) {
322-
insn |= (insn_bits_t)fetch_insn_parcel(addr + 2) << 16;
323-
insn |= (insn_bits_t)fetch_insn_parcel(addr + 4) << 32;
324-
} else {
325-
static_assert(sizeof(insn_bits_t) == 8, "insn_bits_t must be uint64_t");
326-
insn |= (insn_bits_t)fetch_insn_parcel(addr + 2) << 16;
327-
insn |= (insn_bits_t)fetch_insn_parcel(addr + 4) << 32;
328-
insn |= (insn_bits_t)fetch_insn_parcel(addr + 6) << 48;
315+
for (unsigned pos = sizeof(insn_parcel_t); pos < length; pos += sizeof(insn_parcel_t)) {
316+
insn |= fetch_insn_parcel(addr + pos) << (8 * pos);
317+
length = insn_length(insn);
329318
}
330319

331320
insn_fetch_t fetch = {proc->decode_insn(insn), insn};
332321
entry->tag = addr;
333-
entry->next = &icache[icache_index(addr + length)];
334322
entry->data = fetch;
335323

336324
auto [check_tracer, _, paddr] = access_tlb(tlb_insn, addr, TLB_FLAGS, TLB_CHECK_TRACER);

0 commit comments

Comments
 (0)