From 923576c93cbe0916f0ff95b5d1cf26482e1786f7 Mon Sep 17 00:00:00 2001 From: zilmar Date: Wed, 17 Oct 2012 20:04:11 +1100 Subject: [PATCH] Added tracking of end block to detect if block should be split --- .../N64 System/Recompiler/Code Block.cpp | 48 ++++++++++++++----- .../N64 System/Recompiler/Code Section.cpp | 2 + .../N64 System/Recompiler/Code Section.h | 3 +- .../N64 System/Recompiler/Loop Analysis.cpp | 9 ++-- 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/Source/Project64/N64 System/Recompiler/Code Block.cpp b/Source/Project64/N64 System/Recompiler/Code Block.cpp index 20dbbb519..b4b316054 100644 --- a/Source/Project64/N64 System/Recompiler/Code Block.cpp +++ b/Source/Project64/N64 System/Recompiler/Code Block.cpp @@ -43,7 +43,7 @@ bool CCodeBlock::SetSection ( CCodeSection * & Section, CCodeSection * CurrentSe _Notify->BreakPoint(__FILE__,__LINE__); } - if (TargetPC > ((CurrentPC + 0x1000) & 0xFFFFF000)) + if (TargetPC >= ((CurrentPC + 0x1000) & 0xFFFFF000)) { return false; } @@ -92,19 +92,28 @@ bool CCodeBlock::SetSection ( CCodeSection * & Section, CCodeSection * CurrentSe } SplitSection = itr->second; } - CCodeSection * BaseSection = Section; - BaseSection->SetJumpAddress(SplitSection->m_Jump.JumpPC, SplitSection->m_Jump.TargetPC,SplitSection->m_Jump.PermLoop); - BaseSection->m_JumpSection = SplitSection->m_JumpSection; - BaseSection->SetContinueAddress(SplitSection->m_Cont.JumpPC,SplitSection->m_Cont.TargetPC); - BaseSection->m_ContinueSection = SplitSection->m_ContinueSection; - BaseSection->m_JumpSection->SwitchParent(SplitSection,BaseSection); - BaseSection->m_ContinueSection->SwitchParent(SplitSection,BaseSection); - BaseSection->AddParent(SplitSection); + if (SplitSection->m_EndPC == (DWORD)-1) + { + _Notify->BreakPoint(__FILE__,__LINE__); + } + if (SplitSection->m_EndPC >= TargetPC) + { + CCodeSection * BaseSection = Section; + BaseSection->m_EndPC = SplitSection->m_EndPC; + BaseSection->SetJumpAddress(SplitSection->m_Jump.JumpPC, SplitSection->m_Jump.TargetPC,SplitSection->m_Jump.PermLoop); + BaseSection->m_JumpSection = SplitSection->m_JumpSection; + BaseSection->SetContinueAddress(SplitSection->m_Cont.JumpPC,SplitSection->m_Cont.TargetPC); + BaseSection->m_ContinueSection = SplitSection->m_ContinueSection; + BaseSection->m_JumpSection->SwitchParent(SplitSection,BaseSection); + BaseSection->m_ContinueSection->SwitchParent(SplitSection,BaseSection); + BaseSection->AddParent(SplitSection); - SplitSection->m_JumpSection = NULL; - SplitSection->m_ContinueSection = BaseSection; - SplitSection->SetContinueAddress(TargetPC - 4, TargetPC); - SplitSection->SetJumpAddress((DWORD)-1,(DWORD)-1,false); + SplitSection->m_EndPC = TargetPC - 4; + SplitSection->m_JumpSection = NULL; + SplitSection->m_ContinueSection = BaseSection; + SplitSection->SetContinueAddress(TargetPC - 4, TargetPC); + SplitSection->SetJumpAddress((DWORD)-1,(DWORD)-1,false); + } } } return true; @@ -132,6 +141,7 @@ bool CCodeBlock::CreateBlockLinkage ( CCodeSection * EnterSection ) SetSection(CurrentSection->m_ContinueSection, CurrentSection, TestPC,true,TestPC); CurrentSection->SetContinueAddress(TestPC - 4, TestPC); } + CurrentSection->m_EndPC = TestPC - 4; CurrentSection = itr->second; CPU_Message("Section %d",CurrentSection->m_SectionID); if (EnterSection != m_EnterSection) @@ -152,6 +162,7 @@ bool CCodeBlock::CreateBlockLinkage ( CCodeSection * EnterSection ) bool LikelyBranch, EndBlock, IncludeDelaySlot, PermLoop; DWORD TargetPC, ContinuePC, SectionCount = m_Sections.size(); + CurrentSection->m_EndPC = TestPC; if (!AnalyzeInstruction(TestPC, TargetPC, ContinuePC, LikelyBranch, IncludeDelaySlot, EndBlock, PermLoop)) { _Notify->BreakPoint(__FILE__,__LINE__); @@ -160,6 +171,10 @@ bool CCodeBlock::CreateBlockLinkage ( CCodeSection * EnterSection ) if (TargetPC == (DWORD)-1 && !EndBlock) { + if (ContinuePC != (DWORD)-1) + { + _Notify->BreakPoint(__FILE__,__LINE__); + } continue; } @@ -180,10 +195,12 @@ bool CCodeBlock::CreateBlockLinkage ( CCodeSection * EnterSection ) if (LikelyBranch) { + CPU_Message(__FUNCTION__ ": SetJumpAddress TestPC = %X Target = %X",TestPC,TestPC + 4); CurrentSection->SetJumpAddress(TestPC, TestPC + 4,false); if (SetSection(CurrentSection->m_JumpSection, CurrentSection, TestPC + 4,false,TestPC)) { CCodeSection * JumpSection = CurrentSection->m_JumpSection; + JumpSection->m_EndPC = TestPC + 4; JumpSection->SetJumpAddress(TestPC, TargetPC,false); JumpSection->SetDelaySlot(); SetSection(JumpSection->m_JumpSection,CurrentSection->m_JumpSection,TargetPC,true,TestPC); @@ -193,6 +210,7 @@ bool CCodeBlock::CreateBlockLinkage ( CCodeSection * EnterSection ) } else if (TargetPC != ((DWORD)-1)) { + CPU_Message(__FUNCTION__ ": SetJumpAddress TestPC = %X Target = %X",TestPC,TargetPC); CurrentSection->SetJumpAddress(TestPC, TargetPC,PermLoop); if (PermLoop || !SetSection(CurrentSection->m_JumpSection, CurrentSection, TargetPC,true,TestPC)) { @@ -279,6 +297,10 @@ bool CCodeBlock::CreateBlockLinkage ( CCodeSection * EnterSection ) if (!CreateBlockLinkage(Section)) { return false; } break; } + if (CurrentSection->m_EndPC == (DWORD)-1) + { + _Notify->BreakPoint(__FILE__,__LINE__); + } return true; } diff --git a/Source/Project64/N64 System/Recompiler/Code Section.cpp b/Source/Project64/N64 System/Recompiler/Code Section.cpp index 2954ff052..7e8f2444e 100644 --- a/Source/Project64/N64 System/Recompiler/Code Section.cpp +++ b/Source/Project64/N64 System/Recompiler/Code Section.cpp @@ -77,6 +77,7 @@ int DelaySlotEffectsJump (DWORD JumpPC) { CCodeSection::CCodeSection( CCodeBlock * CodeBlock, DWORD EnterPC, DWORD ID, bool LinkAllowed) : m_BlockInfo(CodeBlock), m_EnterPC(EnterPC), + m_EndPC((DWORD)-1), m_SectionID(ID), m_ContinueSection(NULL), m_JumpSection(NULL), @@ -1926,6 +1927,7 @@ void CCodeSection::DisplaySectionInformation (void) { CPU_Message("====== Section %d ======",m_SectionID); CPU_Message("Start PC: %X",m_EnterPC); + CPU_Message("End PC: %X",m_EndPC); CPU_Message("CompiledLocation: %X",m_CompiledLocation); if (!m_ParentSection.empty()) { diff --git a/Source/Project64/N64 System/Recompiler/Code Section.h b/Source/Project64/N64 System/Recompiler/Code Section.h index 73a21ddd5..3e9302ed7 100644 --- a/Source/Project64/N64 System/Recompiler/Code Section.h +++ b/Source/Project64/N64 System/Recompiler/Code Section.h @@ -31,8 +31,9 @@ public: /* Block Connection info */ SECTION_LIST m_ParentSection; CCodeBlock * const m_BlockInfo; - const DWORD m_EnterPC; const DWORD m_SectionID; + const DWORD m_EnterPC; + DWORD m_EndPC; CCodeSection * m_ContinueSection; CCodeSection * m_JumpSection; bool m_EndSection; // if this section does not link diff --git a/Source/Project64/N64 System/Recompiler/Loop Analysis.cpp b/Source/Project64/N64 System/Recompiler/Loop Analysis.cpp index 179e63eda..8dfff3abf 100644 --- a/Source/Project64/N64 System/Recompiler/Loop Analysis.cpp +++ b/Source/Project64/N64 System/Recompiler/Loop Analysis.cpp @@ -2,6 +2,8 @@ #define CHECKED_BUILD 1 +int DelaySlotEffectsCompare ( DWORD PC, DWORD Reg1, DWORD Reg2 ); + LoopAnalysis::LoopAnalysis(CCodeBlock * CodeBlock, CCodeSection * Section) : m_EnterSection(Section), m_BlockInfo(CodeBlock), @@ -400,7 +402,9 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section) case R4300i_BGTZ: m_NextInstruction = DELAY_SLOT; #ifdef CHECKED_BUILD - if (Section->m_Cont.TargetPC != m_PC + 8) + if (Section->m_Cont.TargetPC != m_PC + 8 && + Section->m_ContinueSection != NULL && + Section->m_Cont.TargetPC != (DWORD)-1) { _Notify->BreakPoint(__FILE__,__LINE__); } @@ -410,13 +414,10 @@ bool LoopAnalysis::CheckLoopRegisterUsage( CCodeSection * Section) } if (m_PC == Section->m_Jump.TargetPC) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix if (!DelaySlotEffectsCompare(m_PC,m_Command.rs,m_Command.rt) && !Section->m_Jump.PermLoop) { _Notify->BreakPoint(__FILE__,__LINE__); } -#endif } #endif break;