From 7b44e7935638d5fd2beedd16d3a41b9ccacc9bd7 Mon Sep 17 00:00:00 2001 From: skidau Date: Mon, 13 Oct 2014 18:00:45 +1100 Subject: [PATCH] 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. --- Source/Core/Core/HW/MemmapFunctions.cpp | 86 ++++--------------------- 1 file 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; + if (_Flag != FLAG_NO_EXCEPTION) + { + 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 ((_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; - } - } - } - 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