more optimizations

This commit is contained in:
Jaklyy 2024-10-14 23:43:11 -04:00
parent ca7d938bb1
commit d8d2fcd94a
3 changed files with 58 additions and 92 deletions

View File

@ -269,7 +269,7 @@ void ARM::DoSavestate(Savestate* file)
if (!Num)
{
SetupCodeMem(R[15]); // should fix it
((ARMv5*)this)->RegionCodeCycles = ((ARMv5*)this)->MemTimings[R[15] >> 12][0];
((ARMv5*)this)->RegionCodeCycles = ((ARMv5*)this)->MemTimings[R[15] >> 12][2];
if ((CPSR & 0x1F) == 0x10)
((ARMv5*)this)->PU_Map = ((ARMv5*)this)->PU_UserMap;

View File

@ -670,7 +670,7 @@ public:
u8* PU_Map; //! Current valid Region Mapping (is either @ref PU_PrivMap or PU_UserMap)
// code/16N/32N/32S
u8 MemTimings[CP15_MAP_ENTRYCOUNT][4];
u8 MemTimings[CP15_MAP_ENTRYCOUNT][3];
bool (*GetMemRegion)(u32 addr, bool write, MemRegion* region);

View File

@ -338,26 +338,26 @@ void ARMv5::UpdateRegionTimings(u32 addrstart, u32 addrend)
// checkme: should these be (bus timings shifted) - 1 or ((bustimings - 1) shifted) + 1
// should the last cycle be halved...?
if (pu & CP15_MAP_ICACHEABLE)
/*if (pu & CP15_MAP_ICACHEABLE)
{
MemTimings[i][0] = 0xFF;//kCodeCacheTiming;
}
else
{
MemTimings[i][0] = ((bustimings[2] - 1) << NDS.ARM9ClockShift) + 1;
}
}*/
/*
if (pu & CP15_MAP_DCACHEABLE)
{
MemTimings[i][1] = kDataCacheTiming;
MemTimings[i][2] = kDataCacheTiming;
MemTimings[i][3] = 1;
}
else
else*/
{
MemTimings[i][1] = ((bustimings[0] - 1) << NDS.ARM9ClockShift) + 1;
MemTimings[i][2] = ((bustimings[2] - 1) << NDS.ARM9ClockShift) + 1;
MemTimings[i][3] = bustimings[3] << NDS.ARM9ClockShift; // inaccurate but ehgh
MemTimings[i][0] = ((bustimings[0] - 1) << NDS.ARM9ClockShift) + 1;
MemTimings[i][1] = ((bustimings[2] - 1) << NDS.ARM9ClockShift) + 1;
MemTimings[i][2] = bustimings[3] << NDS.ARM9ClockShift; // inaccurate but ehgh
}
}
}
@ -1784,28 +1784,18 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch)
#if !DISABLE_ICACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
//if (!NDS.IsJITEnabled())
#endif
{
if (CP15Control & CP15_CACHE_CR_ICACHEENABLE)
{
if (IsAddressICachable(addr))
{
return ICacheLookup(addr);
}
}
}
#endif
CodeCycles = MemTimings[addr >> 12][0];
if (CodeCycles == 0xFF) // cached memory. hax
{
if (branch || !(addr & (ICACHE_LINELENGTH-1)))
CodeCycles = kCodeCacheTiming;//ICacheLookup(addr);
else
CodeCycles = 1;
}
CodeCycles = MemTimings[addr >> 12][1];
WriteBufferDrain();
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
@ -1854,10 +1844,8 @@ bool ARMv5::DataRead8(u32 addr, u32* val)
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
//if (!NDS.IsJITEnabled())
#endif
{
if (CP15Control & CP15_CACHE_CR_DCACHEENABLE)
{
if (IsAddressDCachable(addr))
{
@ -1866,14 +1854,13 @@ bool ARMv5::DataRead8(u32 addr, u32* val)
return true;
}
}
}
#endif
WriteBufferDrain();
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][1];
DataCycles = MemTimings[addr >> 12][0];
if ((addr >> 24) == 0x02)
{
@ -1918,10 +1905,8 @@ bool ARMv5::DataRead16(u32 addr, u32* val)
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
//if (!NDS.IsJITEnabled())
#endif
{
if (CP15Control & CP15_CACHE_CR_DCACHEENABLE)
{
if (IsAddressDCachable(addr))
{
@ -1930,14 +1915,13 @@ bool ARMv5::DataRead16(u32 addr, u32* val)
return true;
}
}
}
#endif
WriteBufferDrain();
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][1];
DataCycles = MemTimings[addr >> 12][0];
if ((addr >> 24) == 0x02)
{
@ -1982,10 +1966,8 @@ bool ARMv5::DataRead32(u32 addr, u32* val)
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
//if (!NDS.IsJITEnabled())
#endif
{
if (CP15Control & CP15_CACHE_CR_DCACHEENABLE)
{
if (IsAddressDCachable(addr))
{
@ -1994,14 +1976,13 @@ bool ARMv5::DataRead32(u32 addr, u32* val)
return true;
}
}
}
#endif
WriteBufferDrain();
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][2];
DataCycles = MemTimings[addr >> 12][1];
if ((addr >> 24) == 0x02)
{
@ -2045,10 +2026,8 @@ bool ARMv5::DataRead32S(u32 addr, u32* val)
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
//if (!NDS.IsJITEnabled())
#endif
{
if (CP15Control & CP15_CACHE_CR_DCACHEENABLE)
{
if (IsAddressDCachable(addr))
{
@ -2056,7 +2035,6 @@ bool ARMv5::DataRead32S(u32 addr, u32* val)
return true;
}
}
}
#endif
WriteBufferDrain();
@ -2065,7 +2043,7 @@ bool ARMv5::DataRead32S(u32 addr, u32* val)
if (!(addr & 0x3FF)) return DataRead32(addr, val); // bursts cannot cross a 1kb boundary
DataCycles = MemTimings[addr >> 12][3];
DataCycles = MemTimings[addr >> 12][2];
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
@ -2113,10 +2091,8 @@ bool ARMv5::DataWrite8(u32 addr, u8 val)
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
//if (!NDS.IsJITEnabled())
#endif
{
if (CP15Control & CP15_CACHE_CR_DCACHEENABLE)
{
if (IsAddressDCachable(addr))
{
@ -2124,14 +2100,13 @@ bool ARMv5::DataWrite8(u32 addr, u8 val)
return true;
}
}
}
#endif
if (!(PU_Map[addr>>12] & (0x30)))
{
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][1];
DataCycles = MemTimings[addr >> 12][0];
if ((addr >> 24) == 0x02)
{
@ -2196,10 +2171,8 @@ bool ARMv5::DataWrite16(u32 addr, u16 val)
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
//if (!NDS.IsJITEnabled())
#endif
{
if (CP15Control & CP15_CACHE_CR_DCACHEENABLE)
{
if (IsAddressDCachable(addr))
{
@ -2207,14 +2180,13 @@ bool ARMv5::DataWrite16(u32 addr, u16 val)
return true;
}
}
}
#endif
if (!(PU_Map[addr>>12] & 0x30))
{
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][1];
DataCycles = MemTimings[addr >> 12][0];
if ((addr >> 24) == 0x02)
{
@ -2279,10 +2251,8 @@ bool ARMv5::DataWrite32(u32 addr, u32 val)
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
//if (!NDS.IsJITEnabled())
#endif
{
if (CP15Control & CP15_CACHE_CR_DCACHEENABLE)
{
if (IsAddressDCachable(addr))
{
@ -2291,14 +2261,13 @@ bool ARMv5::DataWrite32(u32 addr, u32 val)
return true;
}
}
}
#endif
if (!(PU_Map[addr>>12] & 0x30))
{
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][2];
DataCycles = MemTimings[addr >> 12][1];
if ((addr >> 24) == 0x02)
{
@ -2362,10 +2331,8 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val)
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
//if (!NDS.IsJITEnabled())
#endif
{
if (CP15Control & CP15_CACHE_CR_DCACHEENABLE)
{
if (IsAddressDCachable(addr))
{
@ -2373,7 +2340,6 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val)
return true;
}
}
}
#endif
if (!(PU_Map[addr>>12] & 0x30))
@ -2391,7 +2357,7 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val)
else DataRegion = NDS.ARM9Regions[addr>>14];
BusWrite32(addr, val);
DataCycles += MemTimings[addr >> 12][3];
DataCycles += MemTimings[addr >> 12][2];
}
else
{