diff options
author | RSDuck <RSDuck@users.noreply.github.com> | 2022-08-22 00:39:08 +0200 |
---|---|---|
committer | RSDuck <RSDuck@users.noreply.github.com> | 2022-08-22 00:39:08 +0200 |
commit | 32609bbc980d2a496b40f29c41ac2e39f7651230 (patch) | |
tree | 9a43296ecad29084439ca32d39b4c36111224925 /src | |
parent | d56219c33c1e59d5975b5c0c72d2b5dd230c1d7f (diff) |
invalidate JIT blocks in ARM7 WVRAM when it's remapped
Diffstat (limited to 'src')
-rw-r--r-- | src/ARMJIT.cpp | 29 | ||||
-rw-r--r-- | src/ARMJIT.h | 1 | ||||
-rw-r--r-- | src/CP15.cpp | 3 | ||||
-rw-r--r-- | src/GPU.cpp | 2 |
4 files changed, 32 insertions, 3 deletions
diff --git a/src/ARMJIT.cpp b/src/ARMJIT.cpp index 99e5a3f..32f20d5 100644 --- a/src/ARMJIT.cpp +++ b/src/ARMJIT.cpp @@ -1086,11 +1086,34 @@ void InvalidateByAddr(u32 localAddr) void CheckAndInvalidateITCM() { - for (u32 i = 0; i < ITCMPhysicalSize; i+=16) + for (u32 i = 0; i < ITCMPhysicalSize; i+=512) { - if (CodeIndexITCM[i / 512].Code & (1 << ((i & 0x1FF) / 16))) + if (CodeIndexITCM[i / 512].Code) { - InvalidateByAddr(i | (ARMJIT_Memory::memregion_ITCM << 27)); + // maybe using bitscan would be better here? + // The thing is that in densely populated sets + // The old fashioned way can actually be faster + for (u32 j = 0; j < 512; j += 16) + { + if (CodeIndexITCM[i / 512].Code & (1 << ((j & 0x1FF) / 16))) + InvalidateByAddr((i+j) | (ARMJIT_Memory::memregion_ITCM << 27)); + } + } + } +} + +void CheckAndInvalidateWVRAM(int bank) +{ + u32 start = bank == 1 ? 0x20000 : 0; + for (u32 i = start; i < start+0x20000; i+=512) + { + if (CodeIndexARM7WVRAM[i / 512].Code) + { + for (u32 j = 0; j < 512; j += 16) + { + if (CodeIndexARM7WVRAM[i / 512].Code & (1 << ((j & 0x1FF) / 16))) + InvalidateByAddr((i+j) | (ARMJIT_Memory::memregion_VWRAM << 27)); + } } } } diff --git a/src/ARMJIT.h b/src/ARMJIT.h index ec2161a..97c79cd 100644 --- a/src/ARMJIT.h +++ b/src/ARMJIT.h @@ -44,6 +44,7 @@ void DeInit(); void Reset(); void CheckAndInvalidateITCM(); +void CheckAndInvalidateWVRAM(int bank); void InvalidateByAddr(u32 pseudoPhysical); diff --git a/src/CP15.cpp b/src/CP15.cpp index 2548ece..4fe91cf 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -134,6 +134,9 @@ void ARMv5::UpdateITCMSetting() if (CP15Control & (1<<18)) { ITCMSize = 0x200 << ((ITCMSetting >> 1) & 0x1F); +#ifdef JIT_ENABLED + FastBlockLookupSize = 0; +#endif } else { diff --git a/src/GPU.cpp b/src/GPU.cpp index 47a69cc..cf7adc8 100644 --- a/src/GPU.cpp +++ b/src/GPU.cpp @@ -20,6 +20,7 @@ #include <string.h> #include "NDS.h" #include "GPU.h" +#include "ARMJIT.h" #include "GPU2D_Soft.h" @@ -653,6 +654,7 @@ void MapVRAM_CD(u32 bank, u8 cnt) VRAMMap_ARM7[ofs] |= bankmask; memset(VRAMDirty[bank].Data, 0xFF, sizeof(VRAMDirty[bank].Data)); VRAMSTAT |= (1 << (bank-2)); + ARMJIT::CheckAndInvalidateWVRAM(ofs); break; case 3: // texture |