+ for (size_t i = 0; i < n; state.count++, i++)
+ execute_insn(true);
+ }
+ else while (n > 0)
+ {
+ size_t idx = (state.pc / sizeof(insn_t)) % ICACHE_SIZE;
+ auto ic_entry_init = &_mmu->icache[idx], ic_entry = ic_entry_init;
+
+ #define update_count() { \
+ size_t i = ic_entry - ic_entry_init; \
+ state.count += i; \
+ if (i >= n) break; \
+ n -= i; }
+
+ #define ICACHE_ACCESS(idx) { \
+ insn_t insn = ic_entry->data.insn.insn; \
+ insn_func_t func = ic_entry->data.func; \
+ if (unlikely(ic_entry->tag != state.pc)) break; \
+ ic_entry++; \
+ state.pc = func(this, insn, state.pc); }
+
+ switch (idx) while (true)