diff --git a/src/CP15.cpp b/src/CP15.cpp index f2fb9b75..be0c0839 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -296,7 +296,7 @@ void ARMv5::UpdatePURegions(const bool update_all) // PU disabled u8 mask = CP15_MAP_READABLE | CP15_MAP_WRITEABLE | CP15_MAP_EXECUTABLE; - if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) mask |= CP15_MAP_DCACHEABLE | CP15_MAP_DCACHEWRITEBACK ; + if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) mask |= CP15_MAP_DCACHEABLE | CP15_MAP_DCACHEWRITEBACK; if (CP15Control & CP15_CACHE_CR_ICACHEENABLE) mask |= CP15_MAP_ICACHEABLE; memset(PU_UserMap, mask, CP15_MAP_ENTRYCOUNT); @@ -371,13 +371,13 @@ u32 ARMv5::ICacheLookup(const u32 addr) const u32 tag = (addr & ~(ICACHE_LINELENGTH - 1)); const u32 id = ((addr >> ICACHE_LINELENGTH_LOG2) & (ICACHE_LINESPERSET-1)) << ICACHE_SETS_LOG2; - for (int set=0;set> 14][2]; if (CodeMem.Mem) @@ -412,17 +412,8 @@ u32 ARMv5::ICacheLookup(const u32 addr) } u32 line; -#if 0 - // caclulate in which cacheline the data is to be filled - // The code below is doing the same as the if-less below - // It increases performance by reducing banches. - // The code is kept here for readability. - // - // NOTE: If you need to update either part, you need - // to update the other too to keep them in sync! - // - if (CP15Control & CP15_CACHE_CR_ROUNDROBIN) + if (CP15Control & CP15_CACHE_CR_ROUNDROBIN) [[likely]] { line = ICacheCount; ICacheCount = (line+1) & (ICACHE_SETS-1); @@ -434,7 +425,7 @@ u32 ARMv5::ICacheLookup(const u32 addr) if (ICacheLockDown) { - if (ICacheLockDown & CACHE_LOCKUP_L) + if (ICacheLockDown & CACHE_LOCKUP_L) [[unlikely]] { // load into locked up cache // into the selected set @@ -446,17 +437,7 @@ u32 ARMv5::ICacheLookup(const u32 addr) } } -#else - // Do the same as above but instead of using if-else - // utilize the && and || operators to skip parts of the operations - // With the order of comparison we can put the most likely path - // checked first - - bool doLockDown = (ICacheLockDown & CACHE_LOCKUP_L); - bool roundRobin = CP15Control & CP15_CACHE_CR_ROUNDROBIN; - (!roundRobin && (line = RandomLineIndex())) || (roundRobin && (ICacheCount = line = ((ICacheCount+1) & (ICACHE_SETS-1)))) ; - (!doLockDown && (line = (line | ICacheLockDown & (ICACHE_SETS-1))+id)) || (doLockDown && (line = (ICacheLockDown & (ICACHE_SETS-1))+id)); -#endif + line += id; u32* ptr = (u32 *)&ICache[line << ICACHE_LINELENGTH_LOG2]; @@ -484,11 +465,11 @@ void ARMv5::ICacheInvalidateByAddr(const u32 addr) const u32 tag = (addr & ~(ICACHE_LINELENGTH - 1)) | CACHE_FLAG_VALID; const u32 id = ((addr >> ICACHE_LINELENGTH_LOG2) & (ICACHE_LINESPERSET-1)) << ICACHE_SETS_LOG2; - for (int set=0;set> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_ICACHEABLE ; + return PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_ICACHEABLE; } u32 ARMv5::DCacheLookup(const u32 addr) { //Log(LogLevel::Debug,"DCache load @ %08x\n", addr); - const u32 tag = (addr & ~(DCACHE_LINELENGTH - 1)) ; + const u32 tag = (addr & ~(DCACHE_LINELENGTH - 1)); const u32 id = ((addr >> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1)) << DCACHE_SETS_LOG2; - for (int set=0;set> 14][2]; if (addr < ITCMSize) @@ -574,51 +555,31 @@ u32 ARMv5::DCacheLookup(const u32 addr) } u32 line; -#if 0 - // caclulate in which cacheline the data is to be filled - // The code below is doing the same as the if-less below - // It increases performance by reducing banches. - // The code is kept here for readability. - // - // NOTE: If you need to update either part, you need - // to update the other too to keep them in sync! - // - if (CP15Control & CP15_CACHE_CR_ROUNDROBIN) + if (CP15Control & CP15_CACHE_CR_ROUNDROBIN) [[likely]] { line = DCacheCount; DCacheCount = (line+1) & (DCACHE_SETS-1); } else { - line = DCacheRandom(); + line = RandomLineIndex(); } - // Update the selected set depending on the DCache LockDown register if (DCacheLockDown) { - if (DCacheLockDown & CACHE_LOCKUP_L) + if (DCacheLockDown & CACHE_LOCKUP_L) [[unlikely]] { // load into locked up cache // into the selected set - line = (DCacheLockDown & (DCACHE_SETS-1)) + id; + line = DCacheLockDown & (DCACHE_SETS-1); } else { - u8 minSet = ICacheLockDown & (DCACHE_SETS-1); - line = (line | minSet) + id; + u8 minSet = DCacheLockDown & (DCACHE_SETS-1); + line = line | minSet; } - } -#else - // Do the same as above but instead of using if-else - // utilize the && and || operators to skip parts of the operations - // With the order of comparison we can put the most likely path - // checked first - - bool doLockDown = (DCacheLockDown & CACHE_LOCKUP_L); - bool roundRobin = CP15Control & CP15_CACHE_CR_ROUNDROBIN; - (!roundRobin && (line = RandomLineIndex())) || (roundRobin && (DCacheCount = line = ((DCacheCount+1) & (DCACHE_SETS-1)))); - (!doLockDown && (line = (line | DCacheLockDown & (DCACHE_SETS-1))+id)) || (doLockDown && (line = (DCacheLockDown & (DCACHE_SETS-1))+id)); -#endif + } + line += id; u32* ptr = (u32 *)&DCache[line << DCACHE_LINELENGTH_LOG2]; @@ -661,7 +622,7 @@ bool ARMv5::DCacheWrite32(const u32 addr, const u32 val) //Log(LogLevel::Debug, "Cache write 32: %08lx <= %08lx\n", addr, val); - for (int set=0;set> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1)) << DCACHE_SETS_LOG2; //Log(LogLevel::Debug, "Cache write 16: %08lx <= %04x\n", addr, val); - for (int set=0;set> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1)) << DCACHE_SETS_LOG2;; + const u32 id = ((addr >> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1)) << DCACHE_SETS_LOG2; //Log(LogLevel::Debug, "Cache write 8: %08lx <= %02x\n", addr, val); - for (int set=0;set> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1)) << DCACHE_SETS_LOG2; - for (int set=0;set> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1)) << DCACHE_SETS_LOG2; - for (int set=0;set> 2]); if (tag+i < ITCMSize) { - *(u32*)&ITCM[(tag+i) & (ITCMPhysicalSize - 1)] = ptr[i >> 2] ; + *(u32*)&ITCM[(tag+i) & (ITCMPhysicalSize - 1)] = ptr[i >> 2]; NDS.JIT.CheckAndInvalidate<0, ARMJIT_Memory::memregion_ITCM>(tag+i); } else if (((tag+i) & DTCMMask) == DTCMBase) @@ -861,7 +822,7 @@ void ARMv5::DCacheClearByASetAndWay(const u8 cacheSet, const u8 cacheLine) //Log(LogLevel::Debug, " WB Value %08x\n", ptr[i >> 2]); if (tag+i < ITCMSize) { - *(u32*)&ITCM[(tag+i) & (ITCMPhysicalSize - 1)] = ptr[i >> 2] ; + *(u32*)&ITCM[(tag+i) & (ITCMPhysicalSize - 1)] = ptr[i >> 2]; NDS.JIT.CheckAndInvalidate<0, ARMJIT_Memory::memregion_ITCM>(tag+i); } else if (((tag+i) & DTCMMask) == DTCMBase) @@ -880,7 +841,7 @@ void ARMv5::DCacheClearByASetAndWay(const u8 cacheSet, const u8 cacheLine) bool ARMv5::IsAddressDCachable(const u32 addr) const { - return PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEABLE ; + return PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEABLE; } void ARMv5::CP15Write(const u32 id, const u32 val) @@ -993,7 +954,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val) PU_DataRW = 0; #pragma GCC ivdep #pragma GCC unroll 8 - for (int i=0;i> (i * 2) & 3) << (i * CP15_REGIONACCESS_BITS_PER_REGION); #if 0 @@ -1025,7 +986,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val) PU_CodeRW = 0; #pragma GCC ivdep #pragma GCC unroll 8 - for (int i=0;i> (i * 2) & 3) << (i * CP15_REGIONACCESS_BITS_PER_REGION); #if 0 @@ -1310,7 +1271,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val) // Bit 0..Way-1: locked ways // The Cache is 4 way associative // But all bits are r/w - DCacheLockDown = val ; + DCacheLockDown = val; Log(LogLevel::Debug,"ICacheLockDown\n"); return; case 0x901: @@ -1464,7 +1425,7 @@ u32 ARMv5::CP15Read(const u32 id) const u32 ret = 0; #pragma GCC ivdep #pragma GCC unroll 8 - for (int i=0;i> (i * CP15_REGIONACCESS_BITS_PER_REGION) & CP15_REGIONACCESS_REGIONMASK) << (i*2); return ret; } @@ -1475,7 +1436,7 @@ u32 ARMv5::CP15Read(const u32 id) const // 0x503 returns all 4 bits per region u32 ret = 0; #pragma GCC unroll 8 - for (int i=0;i> (i * CP15_REGIONACCESS_BITS_PER_REGION) & CP15_REGIONACCESS_REGIONMASK) << (i*2); return ret; }