Cleaned up more code related to the code block
This commit is contained in:
parent
afedaf38d6
commit
347d358e39
|
@ -5,7 +5,6 @@ CCodeBlock::CCodeBlock(DWORD VAddrEnter, BYTE * RecompPos) :
|
||||||
m_VAddrFirst(VAddrEnter),
|
m_VAddrFirst(VAddrEnter),
|
||||||
m_VAddrLast(VAddrEnter),
|
m_VAddrLast(VAddrEnter),
|
||||||
m_CompiledLocation(RecompPos),
|
m_CompiledLocation(RecompPos),
|
||||||
m_NoOfSections(1),
|
|
||||||
m_Test(1),
|
m_Test(1),
|
||||||
m_EnterSection(new CCodeSection(this, VAddrEnter, 1, false))
|
m_EnterSection(new CCodeSection(this, VAddrEnter, 1, false))
|
||||||
{
|
{
|
||||||
|
@ -28,6 +27,16 @@ CCodeBlock::CCodeBlock(DWORD VAddrEnter, BYTE * RecompPos) :
|
||||||
AnalyseBlock();
|
AnalyseBlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CCodeBlock::~CCodeBlock()
|
||||||
|
{
|
||||||
|
for (SectionList::iterator itr = m_Sections.begin(); itr != m_Sections.end(); itr++)
|
||||||
|
{
|
||||||
|
CCodeSection * Section = *itr;
|
||||||
|
delete Section;
|
||||||
|
}
|
||||||
|
m_Sections.clear();
|
||||||
|
}
|
||||||
|
|
||||||
bool CCodeBlock::SetSection ( CCodeSection * & Section, CCodeSection * CurrentSection, DWORD TargetPC, bool LinkAllowed, DWORD CurrentPC )
|
bool CCodeBlock::SetSection ( CCodeSection * & Section, CCodeSection * CurrentSection, DWORD TargetPC, bool LinkAllowed, DWORD CurrentPC )
|
||||||
{
|
{
|
||||||
if (Section != NULL)
|
if (Section != NULL)
|
||||||
|
@ -105,8 +114,9 @@ bool CCodeBlock::CreateBlockLinkage ( CCodeSection * EnterSection )
|
||||||
{
|
{
|
||||||
CCodeSection * CurrentSection = EnterSection;
|
CCodeSection * CurrentSection = EnterSection;
|
||||||
|
|
||||||
for (DWORD TestPC = EnterSection->m_EnterPC, EndPC = ((EnterSection->m_EnterPC + 0x1000) & 0xFFFFF000); TestPC < EndPC; TestPC += 4)
|
for (DWORD TestPC = EnterSection->m_EnterPC, EndPC = ((EnterSection->m_EnterPC + 0x1000) & 0xFFFFF000); TestPC <= EndPC; TestPC += 4)
|
||||||
{
|
{
|
||||||
|
if (TestPC != EndPC)
|
||||||
{
|
{
|
||||||
SectionMap::const_iterator itr = m_SectionMap.find(TestPC);
|
SectionMap::const_iterator itr = m_SectionMap.find(TestPC);
|
||||||
if (itr != m_SectionMap.end() && CurrentSection != itr->second)
|
if (itr != m_SectionMap.end() && CurrentSection != itr->second)
|
||||||
|
@ -123,6 +133,9 @@ bool CCodeBlock::CreateBlockLinkage ( CCodeSection * EnterSection )
|
||||||
}
|
}
|
||||||
CurrentSection = itr->second;
|
CurrentSection = itr->second;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
CurrentSection->m_EndSection = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LikelyBranch, EndBlock, IncludeDelaySlot;
|
bool LikelyBranch, EndBlock, IncludeDelaySlot;
|
||||||
|
@ -306,6 +319,11 @@ bool CCodeBlock::AnalyzeInstruction ( DWORD PC, DWORD & TargetPC, DWORD & Contin
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case R4300i_JAL:
|
||||||
|
EndBlock = true;
|
||||||
|
IncludeDelaySlot = true;
|
||||||
|
break;
|
||||||
|
break;
|
||||||
case R4300i_BEQ:
|
case R4300i_BEQ:
|
||||||
TargetPC = PC + ((short)Command.offset << 2) + 4;
|
TargetPC = PC + ((short)Command.offset << 2) + 4;
|
||||||
if (Command.rs != 0 || Command.rt != 0)
|
if (Command.rs != 0 || Command.rt != 0)
|
||||||
|
@ -315,6 +333,8 @@ bool CCodeBlock::AnalyzeInstruction ( DWORD PC, DWORD & TargetPC, DWORD & Contin
|
||||||
IncludeDelaySlot = true;
|
IncludeDelaySlot = true;
|
||||||
break;
|
break;
|
||||||
case R4300i_BNE:
|
case R4300i_BNE:
|
||||||
|
case R4300i_BLEZ:
|
||||||
|
case R4300i_BGTZ:
|
||||||
TargetPC = PC + ((short)Command.offset << 2) + 4;
|
TargetPC = PC + ((short)Command.offset << 2) + 4;
|
||||||
ContinuePC = PC + 8;
|
ContinuePC = PC + 8;
|
||||||
IncludeDelaySlot = true;
|
IncludeDelaySlot = true;
|
||||||
|
@ -343,8 +363,14 @@ bool CCodeBlock::AnalyzeInstruction ( DWORD PC, DWORD & TargetPC, DWORD & Contin
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case R4300i_CP1:
|
case R4300i_CP1:
|
||||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
switch (Command.fmt) {
|
||||||
return false;
|
case R4300i_COP1_MF: case R4300i_COP1_CF: case R4300i_COP1_MT: case R4300i_COP1_CT:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case R4300i_ANDI: case R4300i_ORI: case R4300i_XORI: case R4300i_LUI:
|
case R4300i_ANDI: case R4300i_ORI: case R4300i_XORI: case R4300i_LUI:
|
||||||
case R4300i_ADDI: case R4300i_ADDIU: case R4300i_SLTI: case R4300i_SLTIU:
|
case R4300i_ADDI: case R4300i_ADDIU: case R4300i_SLTI: case R4300i_SLTIU:
|
||||||
case R4300i_DADDI: case R4300i_DADDIU: case R4300i_LB: case R4300i_LH:
|
case R4300i_DADDI: case R4300i_DADDIU: case R4300i_LB: case R4300i_LH:
|
||||||
|
@ -377,11 +403,6 @@ bool CCodeBlock::Compile()
|
||||||
|
|
||||||
EnterCodeBlock();
|
EnterCodeBlock();
|
||||||
|
|
||||||
/*if (bLinkBlocks()) {
|
|
||||||
for (int i = 0; i < m_NoOfSections; i ++) {
|
|
||||||
m_EnterSection.DisplaySectionInformation(i + 1,NextTest());
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
if (_SyncSystem) {
|
if (_SyncSystem) {
|
||||||
//if ((DWORD)BlockInfo.CompiledLocation == 0x60A7B73B) { X86BreakPoint(__FILE__,__LINE__); }
|
//if ((DWORD)BlockInfo.CompiledLocation == 0x60A7B73B) { X86BreakPoint(__FILE__,__LINE__); }
|
||||||
//MoveConstToVariable((DWORD)BlockInfo.CompiledLocation,&CurrentBlock,"CurrentBlock");
|
//MoveConstToVariable((DWORD)BlockInfo.CompiledLocation,&CurrentBlock,"CurrentBlock");
|
||||||
|
|
|
@ -3,22 +3,21 @@ class CCodeBlock :
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CCodeBlock(DWORD VAddrEnter, BYTE * RecompPos );
|
CCodeBlock(DWORD VAddrEnter, BYTE * RecompPos );
|
||||||
|
~CCodeBlock();
|
||||||
|
|
||||||
bool Compile ( void );
|
bool Compile ( void );
|
||||||
|
|
||||||
inline DWORD VAddrEnter ( void ) const { return m_VAddrEnter; }
|
inline DWORD VAddrEnter ( void ) const { return m_VAddrEnter; }
|
||||||
inline DWORD VAddrFirst ( void ) const { return m_VAddrFirst; }
|
inline DWORD VAddrFirst ( void ) const { return m_VAddrFirst; }
|
||||||
inline DWORD VAddrLast ( void ) const { return m_VAddrLast; }
|
inline DWORD VAddrLast ( void ) const { return m_VAddrLast; }
|
||||||
inline BYTE * CompiledLocation ( void ) const { return m_CompiledLocation; }
|
inline BYTE * CompiledLocation ( void ) const { return m_CompiledLocation; }
|
||||||
inline int NoOfSections ( void ) const { return m_NoOfSections; }
|
inline int NoOfSections ( void ) const { return m_Sections.size(); }
|
||||||
inline const CCodeSection & EnterSection ( void ) const { return *m_EnterSection; }
|
inline const CCodeSection & EnterSection ( void ) const { return *m_EnterSection; }
|
||||||
inline const MD5Digest & Hash ( void ) const { return m_Hash; }
|
inline const MD5Digest & Hash ( void ) const { return m_Hash; }
|
||||||
|
|
||||||
inline void SetVAddrFirst ( DWORD VAddr ) { m_VAddrFirst = VAddr; }
|
inline void SetVAddrFirst ( DWORD VAddr ) { m_VAddrFirst = VAddr; }
|
||||||
inline void SetVAddrLast ( DWORD VAddr ) { m_VAddrLast = VAddr; }
|
inline void SetVAddrLast ( DWORD VAddr ) { m_VAddrLast = VAddr; }
|
||||||
|
|
||||||
inline void IncSectionCount ( void ) { m_NoOfSections += 1; }
|
|
||||||
|
|
||||||
CCodeSection * ExistingSection ( DWORD Addr ) { return m_EnterSection->ExistingSection(Addr,NextTest()); }
|
CCodeSection * ExistingSection ( DWORD Addr ) { return m_EnterSection->ExistingSection(Addr,NextTest()); }
|
||||||
bool SectionAccessible ( DWORD m_SectionID ) { return m_EnterSection->SectionAccessible(m_SectionID,NextTest()); }
|
bool SectionAccessible ( DWORD m_SectionID ) { return m_EnterSection->SectionAccessible(m_SectionID,NextTest()); }
|
||||||
|
|
||||||
|
@ -29,6 +28,10 @@ public:
|
||||||
DWORD NextTest ( void );
|
DWORD NextTest ( void );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
CCodeBlock(void); // Disable default constructor
|
||||||
|
CCodeBlock(const CCodeBlock&); // Disable copy constructor
|
||||||
|
CCodeBlock& operator=(const CCodeBlock&); // Disable assignment
|
||||||
|
|
||||||
bool AnalyseBlock ( void );
|
bool AnalyseBlock ( void );
|
||||||
void CompileExitCode ( void );
|
void CompileExitCode ( void );
|
||||||
|
|
||||||
|
@ -43,7 +46,6 @@ private:
|
||||||
DWORD m_VAddrFirst; // the address of the first opcode in the block
|
DWORD m_VAddrFirst; // the address of the first opcode in the block
|
||||||
DWORD m_VAddrLast; // the address of the first opcode in the block
|
DWORD m_VAddrLast; // the address of the first opcode in the block
|
||||||
BYTE * m_CompiledLocation; // What address is this compiled at
|
BYTE * m_CompiledLocation; // What address is this compiled at
|
||||||
int m_NoOfSections; // The number of sections this block uses
|
|
||||||
|
|
||||||
typedef std::map<DWORD,CCodeSection *> SectionMap;
|
typedef std::map<DWORD,CCodeSection *> SectionMap;
|
||||||
typedef std::list<CCodeSection *> SectionList;
|
typedef std::list<CCodeSection *> SectionList;
|
||||||
|
|
|
@ -1351,7 +1351,7 @@ bool CCodeSection::GenerateX86Code ( DWORD Test )
|
||||||
GenerateSectionLinkage();
|
GenerateSectionLinkage();
|
||||||
m_NextInstruction = END_BLOCK;
|
m_NextInstruction = END_BLOCK;
|
||||||
}
|
}
|
||||||
else if (m_CompilePC == ContinueSectionPC)
|
else if (m_NextInstruction != END_BLOCK && m_CompilePC == ContinueSectionPC)
|
||||||
{
|
{
|
||||||
if (m_NextInstruction != NORMAL)
|
if (m_NextInstruction != NORMAL)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue