all repos — mgba @ 1a71b8b11adc020f2227c6ab65d8b4704c13e36e

mGBA Game Boy Advance Emulator

GBA Memory: Slightly simplify prefetch logic
Vicki Pfau vi@endrift.com
Sun, 29 Oct 2017 17:09:54 -0700
commit

1a71b8b11adc020f2227c6ab65d8b4704c13e36e

parent

7b5a9b4f65f5ba6687ccc368359c5add20906d92

1 files changed, 8 insertions(+), 9 deletions(-)

jump to
M src/gba/memory.csrc/gba/memory.c

@@ -1499,9 +1499,11 @@

int32_t previousLoads = 0; // Don't prefetch too much if we're overlapping with a previous prefetch - uint32_t dist = (memory->lastPrefetchedPc - cpu->gprs[ARM_PC]) >> 1; - if (dist < 8) { - previousLoads = dist; + uint32_t dist = (memory->lastPrefetchedPc - cpu->gprs[ARM_PC]); + int32_t maxLoads = 8; + if (dist < 16) { + previousLoads = dist >> 1; + maxLoads -= previousLoads; } int32_t s = cpu->memory.activeSeqCycles16;

@@ -1511,12 +1513,9 @@ // Figure out how many sequential loads we can jam in

int32_t stall = s; int32_t loads = 1; - if (stall < wait) { - int32_t maxLoads = 8 - previousLoads; - while (stall < wait && loads < maxLoads) { - stall += s; - ++loads; - } + while (stall < wait && loads < maxLoads) { + stall += s; + ++loads; } if (stall > wait) { // The wait cannot take less time than the prefetch stalls