+ reg_t offset = addr & (sizeof(insn_t) * (ICACHE_ENTRIES-1));
+ offset *= sizeof(icache_entry_t) / sizeof(insn_t);
+ icache_entry_t* entry = (icache_entry_t*)((char*)icache + offset);
+ insn_fetch_t data = entry->data;
+ if (likely(entry->tag == addr))
+ return data;
+
+ void* iaddr = translate(addr, sizeof(insn_t), false, true);
+ insn_fetch_t fetch;
+ fetch.insn.pad = *(decltype(fetch.insn.insn.bits())*)iaddr;
+ fetch.func = proc->decode_insn(fetch.insn.insn);
+
+ entry->tag = addr;
+ entry->data = fetch;
+
+ reg_t paddr = (char*)iaddr - mem;
+ if (!tracer.empty() && tracer.interested_in_range(paddr, paddr + sizeof(insn_t), false, true))