diff options
Diffstat (limited to 'src/ARMJIT.cpp')
| -rw-r--r-- | src/ARMJIT.cpp | 31 | 
1 files changed, 27 insertions, 4 deletions
| diff --git a/src/ARMJIT.cpp b/src/ARMJIT.cpp index 2f9cad9..32f20d5 100644 --- a/src/ARMJIT.cpp +++ b/src/ARMJIT.cpp @@ -1,5 +1,5 @@  /* -    Copyright 2016-2021 Arisotura, RSDuck +    Copyright 2016-2022 melonDS team      This file is part of melonDS. @@ -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)); +            }          }      }  } |