Cache instructions implemented but broken lmao. Commented out for now
This commit is contained in:
+44
-10
@@ -1,27 +1,61 @@
|
||||
#pragma once
|
||||
#include <common.hpp>
|
||||
#include <array>
|
||||
|
||||
namespace n64 {
|
||||
struct alignas(32) InstructionCache {
|
||||
struct alignas(32) ICacheLine {
|
||||
bool valid;
|
||||
u32 data[8];
|
||||
u32 ptag;
|
||||
|
||||
private:
|
||||
friend struct Interpreter;
|
||||
int GetLineIndex(u64 vaddr) { return (vaddr >> 5) & 0x1FF; }
|
||||
u32 GetLineStart(u64 paddr) { return paddr & ~0x1F; }
|
||||
};
|
||||
|
||||
struct alignas(32) DataCache {
|
||||
struct alignas(32) DCacheLine {
|
||||
bool valid, dirty;
|
||||
u8 data[16];
|
||||
u32 ptag;
|
||||
int index;
|
||||
};
|
||||
|
||||
struct Cop0;
|
||||
|
||||
inline const u32 GetPhysicalAddressPTag(const u32 paddr) { return paddr >> 12; }
|
||||
inline const int GetICacheLineIndex(u64 vaddr) { return (vaddr >> 5) & 0x1FF; }
|
||||
inline const u32 GetICacheLineStart(u64 paddr) { return paddr & ~0x1F; }
|
||||
inline const int GetDCacheLineIndex(u64 vaddr) { return (vaddr >> 4) & 0x1FF; }
|
||||
inline const u32 GetDCacheLineStart(u64 paddr) { return paddr & ~0xF; }
|
||||
|
||||
struct InstructionCache {
|
||||
std::array<ICacheLine, 512> lines;
|
||||
|
||||
void FillLine(u64, u32);
|
||||
void InvalidateIndex(u64 vaddr) { lines[GetICacheLineIndex(vaddr)].valid = false; }
|
||||
void StoreTag(u64, u32, Cop0 &);
|
||||
void LoadTag(u64 vaddr);
|
||||
|
||||
void WriteBack(u64 vaddr, u32 paddr, u32 ptag);
|
||||
void InvalidateIndex(u64 vaddr, u32 ptag) {
|
||||
int lineIndex = GetICacheLineIndex(vaddr);
|
||||
if (lines[lineIndex].valid && lines[lineIndex].ptag == ptag)
|
||||
lines[lineIndex].valid = false;
|
||||
}
|
||||
|
||||
private:
|
||||
friend struct Interpreter;
|
||||
int GetLineIndex(u64 vaddr) { return (vaddr >> 4) & 0x1FF; }
|
||||
u32 GetLineStart(u64 paddr) { return paddr & ~0xF; }
|
||||
};
|
||||
|
||||
struct DataCache {
|
||||
std::array<DCacheLine, 512> lines;
|
||||
|
||||
void StoreTag(u64, u32, Cop0 &);
|
||||
void LoadTag(u64 vaddr);
|
||||
template <bool invalidate = false>
|
||||
void WriteBack(u64 vaddr, u32 paddr);
|
||||
template <bool invalidate = false>
|
||||
void WriteBack(u64 vaddr, u32 paddr, u32 ptag);
|
||||
void InvalidateIndex(u64 vaddr) { lines[GetDCacheLineIndex(vaddr)].valid = false; }
|
||||
void InvalidateIndex(u64 vaddr, u32 ptag) {
|
||||
int lineIndex = GetDCacheLineIndex(vaddr);
|
||||
if (lines[lineIndex].valid && lines[lineIndex].ptag == ptag)
|
||||
lines[lineIndex].valid = false;
|
||||
}
|
||||
};
|
||||
} // namespace n64
|
||||
|
||||
Reference in New Issue
Block a user