summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorskidau <skidau@gmail.com>2014-10-13 18:00:45 +1100
committerskidau <skidau@gmail.com>2014-10-13 18:00:45 +1100
commit7b44e7935638d5fd2beedd16d3a41b9ccacc9bd7 (patch)
treeff3756144493c04df9217b7d84716885a20fa53f /Source/Core
parent69a2d0cb967377ea5a70e3f29ea29569477d5eb7 (diff)
Changed the FAST_TLB_CACHE to update its state only if the TLB cache is accessed by the game (not by Dolphin). The FAST_TLB_CACHE (written by booto) is faster and accurate to the hardware. Enabled the FAST_TLB_CACHE by default.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/HW/MemmapFunctions.cpp86
1 files changed, 13 insertions, 73 deletions
diff --git a/Source/Core/Core/HW/MemmapFunctions.cpp b/Source/Core/Core/HW/MemmapFunctions.cpp
index 6575206e3e..51fa475c25 100644
--- a/Source/Core/Core/HW/MemmapFunctions.cpp
+++ b/Source/Core/Core/HW/MemmapFunctions.cpp
@@ -694,8 +694,6 @@ void SDRUpdated()
// TLB cache
-//#define FAST_TLB_CACHE
-
#define TLB_SIZE 128
#define TLB_WAYS 2
#define NUM_TLBS 2
@@ -715,62 +713,39 @@ struct tlb_entry
};
// TODO: tlb needs to be in ppcState for save-state purposes.
-#ifdef FAST_TLB_CACHE
static tlb_entry tlb[NUM_TLBS][TLB_SIZE/TLB_WAYS][TLB_WAYS];
-#endif
static u32 LookupTLBPageAddress(const XCheckTLBFlag _Flag, const u32 vpa, u32 *paddr)
{
-#ifdef FAST_TLB_CACHE
tlb_entry *tlbe = tlb[_Flag == FLAG_OPCODE][(vpa>>HW_PAGE_INDEX_SHIFT)&HW_PAGE_INDEX_MASK];
if (tlbe[0].tag == (vpa & ~0xfff) && !(tlbe[0].flags & TLB_FLAG_INVALID))
{
- tlbe[0].flags |= TLB_FLAG_MOST_RECENT;
- tlbe[1].flags &= ~TLB_FLAG_MOST_RECENT;
+ if (_Flag != FLAG_NO_EXCEPTION)
+ {
+ tlbe[0].flags |= TLB_FLAG_MOST_RECENT;
+ tlbe[1].flags &= ~TLB_FLAG_MOST_RECENT;
+ }
*paddr = tlbe[0].paddr | (vpa & 0xfff);
return 1;
}
if (tlbe[1].tag == (vpa & ~0xfff) && !(tlbe[1].flags & TLB_FLAG_INVALID))
{
- tlbe[1].flags |= TLB_FLAG_MOST_RECENT;
- tlbe[0].flags &= ~TLB_FLAG_MOST_RECENT;
- *paddr = tlbe[1].paddr | (vpa & 0xfff);
- return 1;
- }
- return 0;
-#else
- u32 _Address = vpa;
- if (_Flag == FLAG_OPCODE)
- {
- for (u32 i = (PowerPC::ppcState.itlb_last); i > (PowerPC::ppcState.itlb_last - 128); i--)
+ if (_Flag != FLAG_NO_EXCEPTION)
{
- if ((_Address & ~0xfff) == (PowerPC::ppcState.itlb_va[i & 127]))
- {
- *paddr = PowerPC::ppcState.itlb_pa[i & 127] | (_Address & 0xfff);
- PowerPC::ppcState.itlb_last = i;
- return 1;
- }
- }
- }
- else
- {
- for (u32 i = (PowerPC::ppcState.dtlb_last); i > (PowerPC::ppcState.dtlb_last - 128); i--)
- {
- if ((_Address & ~0xfff) == (PowerPC::ppcState.dtlb_va[i & 127]))
- {
- *paddr = PowerPC::ppcState.dtlb_pa[i & 127] | (_Address & 0xfff);
- PowerPC::ppcState.dtlb_last = i;
- return 1;
- }
+ tlbe[1].flags |= TLB_FLAG_MOST_RECENT;
+ tlbe[0].flags &= ~TLB_FLAG_MOST_RECENT;
}
+ *paddr = tlbe[1].paddr | (vpa & 0xfff);
+ return 1;
}
return 0;
-#endif
}
static void UpdateTLBEntry(const XCheckTLBFlag _Flag, UPTE2 PTE2, const u32 vpa)
{
-#ifdef FAST_TLB_CACHE
+ if (_Flag != FLAG_NO_EXCEPTION)
+ return;
+
tlb_entry *tlbe = tlb[_Flag == FLAG_OPCODE][(vpa>>HW_PAGE_INDEX_SHIFT)&HW_PAGE_INDEX_MASK];
if ((tlbe[0].flags & TLB_FLAG_MOST_RECENT) == 0)
{
@@ -786,29 +761,10 @@ static void UpdateTLBEntry(const XCheckTLBFlag _Flag, UPTE2 PTE2, const u32 vpa)
tlbe[1].paddr = PTE2.RPN << HW_PAGE_INDEX_SHIFT;
tlbe[1].tag = vpa & ~0xfff;
}
-#else
- if (_Flag == FLAG_OPCODE)
- {
- // ITLB cache
- PowerPC::ppcState.itlb_last++;
- PowerPC::ppcState.itlb_last &= 127;
- PowerPC::ppcState.itlb_pa[PowerPC::ppcState.itlb_last] = PTE2.RPN << HW_PAGE_INDEX_SHIFT;
- PowerPC::ppcState.itlb_va[PowerPC::ppcState.itlb_last] = vpa & ~0xfff;
- }
- else
- {
- // DTLB cache
- PowerPC::ppcState.dtlb_last++;
- PowerPC::ppcState.dtlb_last &= 127;
- PowerPC::ppcState.dtlb_pa[PowerPC::ppcState.dtlb_last] = PTE2.RPN << HW_PAGE_INDEX_SHIFT;
- PowerPC::ppcState.dtlb_va[PowerPC::ppcState.dtlb_last] = vpa & ~0xfff;
- }
-#endif
}
void InvalidateTLBEntry(u32 vpa)
{
-#ifdef FAST_TLB_CACHE
tlb_entry *tlbe = tlb[0][(vpa>>HW_PAGE_INDEX_SHIFT)&HW_PAGE_INDEX_MASK];
if (tlbe[0].tag == (vpa & ~0xfff))
{
@@ -827,22 +783,6 @@ void InvalidateTLBEntry(u32 vpa)
{
tlbe_i[1].flags |= TLB_FLAG_INVALID;
}
-#else
- u32 _Address = vpa;
- for (int i = 0; i < 128; i++)
- {
- if ((_Address & ~0xfff) == (PowerPC::ppcState.dtlb_va[(PowerPC::ppcState.dtlb_last + i) & 127]))
- {
- PowerPC::ppcState.dtlb_pa[(PowerPC::ppcState.dtlb_last + i) & 127] = 0;
- PowerPC::ppcState.dtlb_va[(PowerPC::ppcState.dtlb_last + i) & 127] = 0;
- }
- if ((_Address & ~0xfff) == (PowerPC::ppcState.itlb_va[(PowerPC::ppcState.itlb_last + i) & 127]))
- {
- PowerPC::ppcState.itlb_pa[(PowerPC::ppcState.itlb_last + i) & 127] = 0;
- PowerPC::ppcState.itlb_va[(PowerPC::ppcState.itlb_last + i) & 127] = 0;
- }
- }
-#endif
}
// Page Address Translation