reduce memtimings lut granularity

This commit is contained in:
Jaklyy 2024-10-15 21:20:10 -04:00
parent c605c93d8e
commit 21763ceed3
4 changed files with 15 additions and 24 deletions

View File

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

View File

@ -292,8 +292,6 @@ void ARMv5::UpdatePURegion(const u32 n)
PU_UserMap[i] = usermask; PU_UserMap[i] = usermask;
PU_PrivMap[i] = privmask; PU_PrivMap[i] = privmask;
} }
UpdateRegionTimings(start, end);
} }
void ARMv5::UpdatePURegions(const bool update_all) void ARMv5::UpdatePURegions(const bool update_all)
@ -307,7 +305,6 @@ void ARMv5::UpdatePURegions(const bool update_all)
memset(PU_UserMap, mask, CP15_MAP_ENTRYCOUNT); memset(PU_UserMap, mask, CP15_MAP_ENTRYCOUNT);
memset(PU_PrivMap, mask, CP15_MAP_ENTRYCOUNT); memset(PU_PrivMap, mask, CP15_MAP_ENTRYCOUNT);
UpdateRegionTimings(0x00000, CP15_MAP_ENTRYCOUNT);
return; return;
} }
@ -322,10 +319,6 @@ void ARMv5::UpdatePURegions(const bool update_all)
UpdatePURegion(n); UpdatePURegion(n);
} }
// TODO: this is way unoptimized
// should be okay unless the game keeps changing shit, tho
if (update_all) UpdateRegionTimings(0x00000, CP15_MAP_ENTRYCOUNT);
// TODO: throw exception if the region we're running in has become non-executable, I guess // TODO: throw exception if the region we're running in has become non-executable, I guess
} }
@ -333,8 +326,7 @@ void ARMv5::UpdateRegionTimings(u32 addrstart, u32 addrend)
{ {
for (u32 i = addrstart; i < addrend; i++) for (u32 i = addrstart; i < addrend; i++)
{ {
u8 pu = PU_Map[i]; u8* bustimings = NDS.ARM9MemTimings[i];
u8* bustimings = NDS.ARM9MemTimings[i >> 2];
// checkme: should these be (bus timings shifted) - 1 or ((bustimings - 1) shifted) + 1 // checkme: should these be (bus timings shifted) - 1 or ((bustimings - 1) shifted) + 1
// should the last cycle be halved...? // should the last cycle be halved...?
@ -630,7 +622,8 @@ u32 ARMv5::DCacheLookup(const u32 addr)
// first N32 remaining S32 // first N32 remaining S32
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][2]; NDS.ARM9Timestamp += ((NDS.ARM9MemTimings[tag >> 14][2] + (NDS.ARM9MemTimings[tag >> 14][3] * ((DCACHE_LINELENGTH / 4) - 2)) - 1) << NDS.ARM9ClockShift) + 1;
DataCycles = NDS.ARM9MemTimings[tag>>14][3] << NDS.ARM9ClockShift;
if ((addr >> 24) == 0x02) if ((addr >> 24) == 0x02)
{ {
@ -640,8 +633,6 @@ u32 ARMv5::DCacheLookup(const u32 addr)
} }
else DataRegion = NDS.ARM9Regions[addr>>14]; else DataRegion = NDS.ARM9Regions[addr>>14];
NDS.ARM9Timestamp += ((NDS.ARM9MemTimings[tag >> 14][2] + (NDS.ARM9MemTimings[tag >> 14][3] * ((DCACHE_LINELENGTH / 4) - 2)) - 1) << NDS.ARM9ClockShift) + 1;
DataCycles = NDS.ARM9MemTimings[tag>>14][3] << NDS.ARM9ClockShift;
return ptr[(addr & (DCACHE_LINELENGTH-1)) >> 2]; return ptr[(addr & (DCACHE_LINELENGTH-1)) >> 2];
} }
@ -1794,7 +1785,7 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch)
#endif #endif
} }
CodeCycles = MemTimings[addr >> 12][1]; CodeCycles = MemTimings[addr >> 14][1];
if (PU_Map[addr>>12] & 0x30) if (PU_Map[addr>>12] & 0x30)
WriteBufferDrain(); WriteBufferDrain();
@ -1862,7 +1853,7 @@ bool ARMv5::DataRead8(u32 addr, u32* val)
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][0]; DataCycles = MemTimings[addr >> 14][0];
if ((addr >> 24) == 0x02) if ((addr >> 24) == 0x02)
{ {
@ -1924,7 +1915,7 @@ bool ARMv5::DataRead16(u32 addr, u32* val)
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][0]; DataCycles = MemTimings[addr >> 14][0];
if ((addr >> 24) == 0x02) if ((addr >> 24) == 0x02)
{ {
@ -1986,7 +1977,7 @@ bool ARMv5::DataRead32(u32 addr, u32* val)
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][1]; DataCycles = MemTimings[addr >> 14][1];
if ((addr >> 24) == 0x02) if ((addr >> 24) == 0x02)
{ {
@ -2048,7 +2039,7 @@ bool ARMv5::DataRead32S(u32 addr, u32* val)
if (!(addr & 0x3FF)) return DataRead32(addr, val); // bursts cannot cross a 1kb boundary if (!(addr & 0x3FF)) return DataRead32(addr, val); // bursts cannot cross a 1kb boundary
DataCycles = MemTimings[addr >> 12][2]; DataCycles = MemTimings[addr >> 14][2];
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
@ -2111,7 +2102,7 @@ bool ARMv5::DataWrite8(u32 addr, u8 val)
{ {
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][0]; DataCycles = MemTimings[addr >> 14][0];
if ((addr >> 24) == 0x02) if ((addr >> 24) == 0x02)
{ {
@ -2191,7 +2182,7 @@ bool ARMv5::DataWrite16(u32 addr, u16 val)
{ {
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][0]; DataCycles = MemTimings[addr >> 14][0];
if ((addr >> 24) == 0x02) if ((addr >> 24) == 0x02)
{ {
@ -2272,7 +2263,7 @@ bool ARMv5::DataWrite32(u32 addr, u32 val)
{ {
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
DataCycles = MemTimings[addr >> 12][1]; DataCycles = MemTimings[addr >> 14][1];
if ((addr >> 24) == 0x02) if ((addr >> 24) == 0x02)
{ {
@ -2362,7 +2353,7 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val)
else DataRegion = NDS.ARM9Regions[addr>>14]; else DataRegion = NDS.ARM9Regions[addr>>14];
BusWrite32(addr, val); BusWrite32(addr, val);
DataCycles += MemTimings[addr >> 12][2]; DataCycles += MemTimings[addr >> 14][2];
} }
else else
{ {

View File

@ -1288,7 +1288,7 @@ void DSi::Set_SCFG_Clock9(u16 val)
ARM9Timestamp <<= ARM9ClockShift; ARM9Timestamp <<= ARM9ClockShift;
ARM9Target <<= ARM9ClockShift; ARM9Target <<= ARM9ClockShift;
ARM9.UpdateRegionTimings(0x00000, 0x100000); ARM9.UpdateRegionTimings(0x00000, 0x40000);
} }
void DSi::Set_SCFG_MC(u32 val) void DSi::Set_SCFG_MC(u32 val)

View File

@ -179,7 +179,7 @@ void NDS::SetARM9RegionTimings(u32 addrstart, u32 addrend, u32 region, int buswi
ARM9Regions[i] = region; ARM9Regions[i] = region;
} }
ARM9.UpdateRegionTimings(addrstart<<2, addrend<<2); ARM9.UpdateRegionTimings(addrstart, addrend);
} }
void NDS::SetARM7RegionTimings(u32 addrstart, u32 addrend, u32 region, int buswidth, int nonseq, int seq) void NDS::SetARM7RegionTimings(u32 addrstart, u32 addrend, u32 region, int buswidth, int nonseq, int seq)