Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #11764 from Minty-Meeo/ppc-cache-extendo-ram
Do not use magic numbers for RAM sizes/masks in PPCCache
  • Loading branch information
Pokechu22 committed Apr 22, 2023
2 parents be1f2a6 + 9ba2667 commit 8fbfee0
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 30 deletions.
68 changes: 41 additions & 27 deletions Source/Core/Core/PowerPC/PPCCache.cpp
Expand Up @@ -3,6 +3,7 @@

#include "Core/PowerPC/PPCCache.h"

#include <algorithm>
#include <array>

#include "Common/ChunkFile.h"
Expand Down Expand Up @@ -99,9 +100,9 @@ void Cache::Reset()
valid.fill(0);
plru.fill(0);
modified.fill(0);
lookup_table.fill(0xFF);
lookup_table_ex.fill(0xFF);
lookup_table_vmem.fill(0xFF);
std::fill(lookup_table.begin(), lookup_table.end(), 0xFF);
std::fill(lookup_table_ex.begin(), lookup_table_ex.end(), 0xFF);
std::fill(lookup_table_vmem.begin(), lookup_table_vmem.end(), 0xFF);
}

void InstructionCache::Reset()
Expand All @@ -112,8 +113,14 @@ void InstructionCache::Reset()

void Cache::Init()
{
auto& system = Core::System::GetInstance();
auto& memory = system.GetMemory();

data.fill({});
addrs.fill({});
lookup_table.resize(memory.GetRamSize() >> 5);
lookup_table_ex.resize(memory.GetExRamSize() >> 5);
lookup_table_vmem.resize(memory.GetFakeVMemSize() >> 5);
Reset();
}

Expand Down Expand Up @@ -160,6 +167,9 @@ void Cache::FlushAll()

void Cache::Invalidate(u32 addr)
{
auto& system = Core::System::GetInstance();
auto& memory = system.GetMemory();

auto [set, way] = GetCache(addr, true);

if (way == 0xff)
Expand All @@ -168,11 +178,11 @@ void Cache::Invalidate(u32 addr)
if (valid[set] & (1U << way))
{
if (addrs[set][way] & CACHE_VMEM_BIT)
lookup_table_vmem[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table_vmem[(addrs[set][way] & memory.GetFakeVMemMask()) >> 5] = 0xff;
else if (addrs[set][way] & CACHE_EXRAM_BIT)
lookup_table_ex[(addrs[set][way] >> 5) & 0x1fffff] = 0xff;
lookup_table_ex[(addrs[set][way] & memory.GetExRamMask()) >> 5] = 0xff;
else
lookup_table[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table[(addrs[set][way] & memory.GetRamMask()) >> 5] = 0xff;

valid[set] &= ~(1U << way);
modified[set] &= ~(1U << way);
Expand All @@ -195,11 +205,11 @@ void Cache::Flush(u32 addr)
memory.CopyToEmu((addr & ~0x1f), reinterpret_cast<u8*>(data[set][way].data()), 32);

if (addrs[set][way] & CACHE_VMEM_BIT)
lookup_table_vmem[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table_vmem[(addrs[set][way] & memory.GetFakeVMemMask()) >> 5] = 0xff;
else if (addrs[set][way] & CACHE_EXRAM_BIT)
lookup_table_ex[(addrs[set][way] >> 5) & 0x1fffff] = 0xff;
lookup_table_ex[(addrs[set][way] & memory.GetExRamMask()) >> 5] = 0xff;
else
lookup_table[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table[(addrs[set][way] & memory.GetRamMask()) >> 5] = 0xff;

valid[set] &= ~(1U << way);
modified[set] &= ~(1U << way);
Expand All @@ -222,15 +232,15 @@ std::pair<u32, u32> Cache::GetCache(u32 addr, bool locked)

if (addr & CACHE_VMEM_BIT)
{
way = lookup_table_vmem[(addr >> 5) & 0xfffff];
way = lookup_table_vmem[(addr & memory.GetFakeVMemMask()) >> 5];
}
else if (addr & CACHE_EXRAM_BIT)
{
way = lookup_table_ex[(addr >> 5) & 0x1fffff];
way = lookup_table_ex[(addr & memory.GetExRamMask()) >> 5];
}
else
{
way = lookup_table[(addr >> 5) & 0xfffff];
way = lookup_table[(addr & memory.GetRamMask()) >> 5];
}

// load to the cache
Expand All @@ -249,22 +259,22 @@ std::pair<u32, u32> Cache::GetCache(u32 addr, bool locked)
memory.CopyToEmu(addrs[set][way], reinterpret_cast<u8*>(data[set][way].data()), 32);

if (addrs[set][way] & CACHE_VMEM_BIT)
lookup_table_vmem[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table_vmem[(addrs[set][way] & memory.GetFakeVMemMask()) >> 5] = 0xff;
else if (addrs[set][way] & CACHE_EXRAM_BIT)
lookup_table_ex[(addrs[set][way] >> 5) & 0x1fffff] = 0xff;
lookup_table_ex[(addrs[set][way] & memory.GetExRamMask()) >> 5] = 0xff;
else
lookup_table[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table[(addrs[set][way] & memory.GetRamMask()) >> 5] = 0xff;
}

// load
memory.CopyFromEmu(reinterpret_cast<u8*>(data[set][way].data()), (addr & ~0x1f), 32);

if (addr & CACHE_VMEM_BIT)
lookup_table_vmem[(addr >> 5) & 0xfffff] = way;
lookup_table_vmem[(addr & memory.GetFakeVMemMask()) >> 5] = way;
else if (addr & CACHE_EXRAM_BIT)
lookup_table_ex[(addr >> 5) & 0x1fffff] = way;
lookup_table_ex[(addr & memory.GetExRamMask()) >> 5] = way;
else
lookup_table[(addr >> 5) & 0xfffff] = way;
lookup_table[(addr & memory.GetRamMask()) >> 5] = way;

addrs[set][way] = addr;
valid[set] |= (1 << way);
Expand Down Expand Up @@ -341,6 +351,9 @@ void Cache::Write(u32 addr, const void* buffer, u32 len, bool locked)

void Cache::DoState(PointerWrap& p)
{
auto& system = Core::System::GetInstance();
auto& memory = system.GetMemory();

if (p.IsReadMode())
{
// Clear valid parts of the lookup tables (this is done instead of using fill(0xff) to avoid
Expand All @@ -352,11 +365,11 @@ void Cache::DoState(PointerWrap& p)
if ((valid[set] & (1 << way)) != 0)
{
if (addrs[set][way] & CACHE_VMEM_BIT)
lookup_table_vmem[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table_vmem[(addrs[set][way] & memory.GetFakeVMemMask()) >> 5] = 0xff;
else if (addrs[set][way] & CACHE_EXRAM_BIT)
lookup_table_ex[(addrs[set][way] >> 5) & 0x1fffff] = 0xff;
lookup_table_ex[(addrs[set][way] & memory.GetExRamMask()) >> 5] = 0xff;
else
lookup_table[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table[(addrs[set][way] & memory.GetRamMask()) >> 5] = 0xff;
}
}
}
Expand All @@ -378,11 +391,11 @@ void Cache::DoState(PointerWrap& p)
if ((valid[set] & (1 << way)) != 0)
{
if (addrs[set][way] & CACHE_VMEM_BIT)
lookup_table_vmem[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table_vmem[(addrs[set][way] & memory.GetFakeVMemMask()) >> 5] = 0xff;
else if (addrs[set][way] & CACHE_EXRAM_BIT)
lookup_table_ex[(addrs[set][way] >> 5) & 0x1fffff] = 0xff;
lookup_table_ex[(addrs[set][way] & memory.GetExRamMask()) >> 5] = 0xff;
else
lookup_table[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table[(addrs[set][way] & memory.GetRamMask()) >> 5] = 0xff;
}
}
}
Expand All @@ -405,6 +418,7 @@ u32 InstructionCache::ReadInstruction(u32 addr)
void InstructionCache::Invalidate(u32 addr)
{
auto& system = Core::System::GetInstance();
auto& memory = system.GetMemory();
auto& ppc_state = system.GetPPCState();
if (!HID0(ppc_state).ICE || m_disable_icache)
return;
Expand All @@ -416,11 +430,11 @@ void InstructionCache::Invalidate(u32 addr)
if (valid[set] & (1U << way))
{
if (addrs[set][way] & CACHE_VMEM_BIT)
lookup_table_vmem[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table_vmem[(addrs[set][way] & memory.GetFakeVMemMask()) >> 5] = 0xff;
else if (addrs[set][way] & CACHE_EXRAM_BIT)
lookup_table_ex[(addrs[set][way] >> 5) & 0x1fffff] = 0xff;
lookup_table_ex[(addrs[set][way] & memory.GetExRamMask()) >> 5] = 0xff;
else
lookup_table[(addrs[set][way] >> 5) & 0xfffff] = 0xff;
lookup_table[(addrs[set][way] & memory.GetRamMask()) >> 5] = 0xff;
}
}
valid[set] = 0;
Expand Down
7 changes: 4 additions & 3 deletions Source/Core/Core/PowerPC/PPCCache.h
Expand Up @@ -5,6 +5,7 @@

#include <array>
#include <optional>
#include <vector>

#include "Common/CommonTypes.h"

Expand Down Expand Up @@ -36,9 +37,9 @@ struct Cache

// Note: This is only for performance purposes; this same data could be computed at runtime
// from the tags and valid fields (and that's how it's done on the actual cache)
std::array<u8, 1 << 20> lookup_table{};
std::array<u8, 1 << 21> lookup_table_ex{};
std::array<u8, 1 << 20> lookup_table_vmem{};
std::vector<u8> lookup_table{};
std::vector<u8> lookup_table_ex{};
std::vector<u8> lookup_table_vmem{};

void Store(u32 addr);
void Invalidate(u32 addr);
Expand Down

0 comments on commit 8fbfee0

Please sign in to comment.