[Project64] Move more x86 code in to x86/x86RecompilerOps.cpp

This commit is contained in:
zilmar 2016-07-03 15:22:14 +10:00
parent 9e0459cf5a
commit 433c76446b
9 changed files with 1609 additions and 1569 deletions

View File

@ -282,7 +282,7 @@ bool CCheats::IsValid16BitCode(const char * CheatString)
break;
case 0x81000000:
case 0xA1000000:
case 0xD1000000: // Added by Witten (witten@pj64cheats.net)
case 0xD1000000:
case 0xD3000000:
if (((CodeEntry.Command & 0xFFFFFF) & 1) == 1)
{
@ -348,7 +348,7 @@ int CCheats::ApplyCheatEntry(CMipsMemoryVM * MMU, const CODES & CodeEntry, int C
switch (Code.Command & 0xFF000000)
{
// Gameshark / AR
case 0x50000000: // Added by Witten (witten@pj64cheats.net)
case 0x50000000:
{
if ((CurrentEntry + 1) >= (int)CodeEntry.size())
{
@ -404,22 +404,22 @@ int CCheats::ApplyCheatEntry(CMipsMemoryVM * MMU, const CODES & CodeEntry, int C
Address = 0xA0000000 | (Code.Command & 0xFFFFFF);
if (Execute) { MMU->SH_VAddr(Address, Code.Value); }
break;
case 0xD0000000: // Added by Witten (witten@pj64cheats.net)
case 0xD0000000:
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
MMU->LB_VAddr(Address, bMemory);
if (bMemory != Code.Value) { Execute = false; }
return ApplyCheatEntry(MMU, CodeEntry, CurrentEntry + 1, Execute) + 1;
case 0xD1000000: // Added by Witten (witten@pj64cheats.net)
case 0xD1000000:
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
MMU->LH_VAddr(Address, wMemory);
if (wMemory != Code.Value) { Execute = false; }
return ApplyCheatEntry(MMU, CodeEntry, CurrentEntry + 1, Execute) + 1;
case 0xD2000000: // Added by Witten (witten@pj64cheats.net)
case 0xD2000000:
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
MMU->LB_VAddr(Address, bMemory);
if (bMemory == Code.Value) { Execute = false; }
return ApplyCheatEntry(MMU, CodeEntry, CurrentEntry + 1, Execute) + 1;
case 0xD3000000: // Added by Witten (witten@pj64cheats.net)
case 0xD3000000:
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
MMU->LH_VAddr(Address, wMemory);
if (wMemory == Code.Value) { Execute = false; }

View File

@ -378,11 +378,11 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_CoP1_S[7] = R4300iOp::COP1_S_NEG;
Jump_CoP1_S[8] = R4300iOp::COP1_S_ROUND_L;
Jump_CoP1_S[9] = R4300iOp::COP1_S_TRUNC_L;
Jump_CoP1_S[10] = R4300iOp::COP1_S_CEIL_L; //added by Witten
Jump_CoP1_S[11] = R4300iOp::COP1_S_FLOOR_L; //added by Witten
Jump_CoP1_S[10] = R4300iOp::COP1_S_CEIL_L;
Jump_CoP1_S[11] = R4300iOp::COP1_S_FLOOR_L;
Jump_CoP1_S[12] = R4300iOp::COP1_S_ROUND_W;
Jump_CoP1_S[13] = R4300iOp::COP1_S_TRUNC_W;
Jump_CoP1_S[14] = R4300iOp::COP1_S_CEIL_W; //added by Witten
Jump_CoP1_S[14] = R4300iOp::COP1_S_CEIL_W;
Jump_CoP1_S[15] = R4300iOp::COP1_S_FLOOR_W;
Jump_CoP1_S[16] = R4300iOp::UnknownOpcode;
Jump_CoP1_S[17] = R4300iOp::UnknownOpcode;
@ -442,13 +442,13 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_CoP1_D[6] = R4300iOp::COP1_D_MOV;
Jump_CoP1_D[7] = R4300iOp::COP1_D_NEG;
Jump_CoP1_D[8] = R4300iOp::COP1_D_ROUND_L;
Jump_CoP1_D[9] = R4300iOp::COP1_D_TRUNC_L; //added by Witten
Jump_CoP1_D[10] = R4300iOp::COP1_D_CEIL_L; //added by Witten
Jump_CoP1_D[11] = R4300iOp::COP1_D_FLOOR_L; //added by Witten
Jump_CoP1_D[9] = R4300iOp::COP1_D_TRUNC_L;
Jump_CoP1_D[10] = R4300iOp::COP1_D_CEIL_L;
Jump_CoP1_D[11] = R4300iOp::COP1_D_FLOOR_L;
Jump_CoP1_D[12] = R4300iOp::COP1_D_ROUND_W;
Jump_CoP1_D[13] = R4300iOp::COP1_D_TRUNC_W;
Jump_CoP1_D[14] = R4300iOp::COP1_D_CEIL_W; //added by Witten
Jump_CoP1_D[15] = R4300iOp::COP1_D_FLOOR_W; //added by Witten
Jump_CoP1_D[14] = R4300iOp::COP1_D_CEIL_W;
Jump_CoP1_D[15] = R4300iOp::COP1_D_FLOOR_W;
Jump_CoP1_D[16] = R4300iOp::UnknownOpcode;
Jump_CoP1_D[17] = R4300iOp::UnknownOpcode;
Jump_CoP1_D[18] = R4300iOp::UnknownOpcode;

View File

@ -26,13 +26,22 @@ CCodeBlock::CCodeBlock(uint32_t VAddrEnter, uint8_t * CompiledLocation) :
m_VAddrLast(VAddrEnter),
m_CompiledLocation(CompiledLocation),
m_EnterSection(NULL),
m_RecompilerOps(NULL),
m_Test(1)
{
memset(m_MemContents, 0, sizeof(m_MemContents));
memset(m_MemLocation, 0, sizeof(m_MemLocation));
CCodeSection * baseSection = new CCodeSection(this, VAddrEnter, 0, false);
if (baseSection == NULL)
{
g_Notify->BreakPoint(__FILE__, __LINE__);
}
m_RecompilerOps = new CRecompilerOps;
if (m_RecompilerOps == NULL)
{
g_Notify->BreakPoint(__FILE__, __LINE__);
}
m_Sections.push_back(baseSection);
baseSection->AddParent(NULL);
@ -74,6 +83,12 @@ CCodeBlock::~CCodeBlock()
delete Section;
}
m_Sections.clear();
if (m_RecompilerOps != NULL)
{
delete m_RecompilerOps;
m_RecompilerOps = NULL;
}
}
bool CCodeBlock::SetSection ( CCodeSection * & Section, CCodeSection * CurrentSection, uint32_t TargetPC, bool LinkAllowed, uint32_t CurrentPC )
@ -715,7 +730,7 @@ bool CCodeBlock::Compile()
CPU_Message("No of Sections: %d",NoOfSections() );
CPU_Message("====== recompiled code ======");
m_EnterSection->EnterCodeBlock();
m_RecompilerOps->EnterCodeBlock();
if (g_System->bLinkBlocks())
{
while (m_EnterSection->GenerateNativeCode(NextTest()));
@ -727,7 +742,7 @@ bool CCodeBlock::Compile()
return false;
}
}
m_EnterSection->CompileExitCode();
m_RecompilerOps->CompileExitCode();
uint32_t PAddr;
g_TransVaddr->TranslateVaddr(VAddrFirst(),PAddr);

View File

@ -28,7 +28,7 @@ public:
int32_t NoOfSections() const { return m_Sections.size() - 1;}
const CCodeSection & EnterSection() const { return *m_EnterSection; }
const MD5Digest & Hash() const { return m_Hash; }
CRecompilerOps * RecompilerOps() { return m_EnterSection; }
CRecompilerOps *& RecompilerOps() { return m_RecompilerOps; }
void SetVAddrFirst(uint32_t VAddr) { m_VAddrFirst = VAddr; }
void SetVAddrLast(uint32_t VAddr) { m_VAddrLast = VAddr; }
@ -69,4 +69,5 @@ private:
MD5Digest m_Hash;
uint64_t m_MemContents[2];
uint64_t * m_MemLocation[2];
CRecompilerOps * m_RecompilerOps;
};

File diff suppressed because it is too large Load Diff

View File

@ -14,8 +14,7 @@
class CCodeBlock;
class CCodeSection :
public CRecompilerOps
class CCodeSection
{
public:
typedef std::list<CCodeSection *> SECTION_LIST;
@ -26,7 +25,6 @@ public:
void SetDelaySlot();
void SetJumpAddress(uint32_t JumpPC, uint32_t TargetPC, bool PermLoop);
void SetContinueAddress(uint32_t JumpPC, uint32_t TargetPC);
void CompileCop1Test();
bool GenerateNativeCode(uint32_t Test);
void GenerateSectionLinkage();
void DetermineLoop(uint32_t Test, uint32_t Test2, uint32_t TestID);
@ -53,6 +51,7 @@ public:
uint8_t * m_CompiledLocation;
bool m_InLoop;
bool m_DelaySlot;
CRecompilerOps * & m_RecompilerOps;
/* Register Info */
CRegInfo m_RegEnter;
@ -69,9 +68,7 @@ private:
void UnlinkParent(CCodeSection * Parent, bool ContinueSection);
void InheritConstants();
void TestRegConstantStates(CRegInfo & Base, CRegInfo & Reg);
void SyncRegState(const CRegInfo & SyncTo);
bool IsAllParentLoops(CCodeSection * Parent, bool IgnoreIfCompiled, uint32_t Test);
bool ParentContinue();
bool InheritParentInfo();
bool SetupRegisterForLoop();
};

View File

@ -26,11 +26,11 @@
bool DelaySlotEffectsCompare(uint32_t PC, uint32_t Reg1, uint32_t Reg2);
LoopAnalysis::LoopAnalysis(CCodeBlock * CodeBlock, CCodeSection * Section) :
m_EnterSection(Section),
m_BlockInfo(CodeBlock),
m_PC((uint32_t)-1),
m_NextInstruction(NORMAL),
m_Test(m_BlockInfo->NextTest())
m_EnterSection(Section),
m_BlockInfo(CodeBlock),
m_PC((uint32_t)-1),
m_NextInstruction(NORMAL),
m_Test(m_BlockInfo->NextTest())
{
memset(&m_Command, 0, sizeof(m_Command));
}

View File

@ -15,10 +15,12 @@
#include <Project64-core/N64System/Recompiler/ExitInfo.h>
#include <Project64-core/N64System/Recompiler/RegInfo.h>
#include <Project64-core/N64System/Recompiler/x86/x86ops.h>
#include <Project64-core/N64System/Recompiler/JumpInfo.h>
#include <Project64-core/Settings/DebugSettings.h>
#include <Project64-core/Settings/N64SystemSettings.h>
#include <Project64-core/Settings/RecompilerSettings.h>
class CCodeBlock;
class CCodeSection;
class CRecompilerOps :
@ -61,19 +63,19 @@ public:
void COP1_BCT_Compare();
/************************* OpCode functions *************************/
static void J ();
void J ();
void JAL ();
static void ADDI ();
static void ADDIU ();
static void SLTI ();
static void SLTIU ();
static void ANDI ();
static void ORI ();
static void XORI ();
static void LUI ();
static void DADDIU ();
static void LDL ();
static void LDR ();
void ADDI ();
void ADDIU ();
void SLTI ();
void SLTIU ();
void ANDI ();
void ORI ();
void XORI ();
void LUI ();
void DADDIU ();
void LDL ();
void LDR ();
void LB ();
void LH ();
void LWL ();
@ -87,9 +89,9 @@ public:
void SWL ();
void SW ();
void SWR ();
static void SDL ();
static void SDR ();
static void CACHE ();
void SDL ();
void SDR ();
void CACHE ();
void LL ();
void LWC1 ();
void LDC1 ();
@ -100,131 +102,151 @@ public:
void SD ();
/********************** R4300i OpCodes: Special **********************/
static void SPECIAL_SLL ();
static void SPECIAL_SRL ();
static void SPECIAL_SRA ();
static void SPECIAL_SLLV ();
static void SPECIAL_SRLV ();
static void SPECIAL_SRAV ();
void SPECIAL_SLL ();
void SPECIAL_SRL ();
void SPECIAL_SRA ();
void SPECIAL_SLLV ();
void SPECIAL_SRLV ();
void SPECIAL_SRAV ();
void SPECIAL_JR ();
void SPECIAL_JALR ();
void SPECIAL_SYSCALL();
static void SPECIAL_MFLO ();
static void SPECIAL_MTLO ();
static void SPECIAL_MFHI ();
static void SPECIAL_MTHI ();
static void SPECIAL_DSLLV ();
static void SPECIAL_DSRLV ();
static void SPECIAL_DSRAV ();
static void SPECIAL_MULT ();
static void SPECIAL_MULTU ();
void SPECIAL_MFLO ();
void SPECIAL_MTLO ();
void SPECIAL_MFHI ();
void SPECIAL_MTHI ();
void SPECIAL_DSLLV ();
void SPECIAL_DSRLV ();
void SPECIAL_DSRAV ();
void SPECIAL_MULT ();
void SPECIAL_MULTU ();
void SPECIAL_DIV ();
static void SPECIAL_DIVU ();
static void SPECIAL_DMULT ();
static void SPECIAL_DMULTU ();
static void SPECIAL_DDIV ();
static void SPECIAL_DDIVU ();
static void SPECIAL_ADD ();
static void SPECIAL_ADDU ();
static void SPECIAL_SUB ();
static void SPECIAL_SUBU ();
static void SPECIAL_AND ();
static void SPECIAL_OR ();
static void SPECIAL_XOR ();
static void SPECIAL_NOR ();
static void SPECIAL_SLT ();
static void SPECIAL_SLTU ();
static void SPECIAL_DADD ();
static void SPECIAL_DADDU ();
static void SPECIAL_DSUB ();
static void SPECIAL_DSUBU ();
static void SPECIAL_DSLL ();
static void SPECIAL_DSRL ();
static void SPECIAL_DSRA ();
static void SPECIAL_DSLL32 ();
static void SPECIAL_DSRL32 ();
static void SPECIAL_DSRA32 ();
void SPECIAL_DIVU ();
void SPECIAL_DMULT ();
void SPECIAL_DMULTU ();
void SPECIAL_DDIV ();
void SPECIAL_DDIVU ();
void SPECIAL_ADD ();
void SPECIAL_ADDU ();
void SPECIAL_SUB ();
void SPECIAL_SUBU ();
void SPECIAL_AND ();
void SPECIAL_OR ();
void SPECIAL_XOR ();
void SPECIAL_NOR ();
void SPECIAL_SLT ();
void SPECIAL_SLTU ();
void SPECIAL_DADD ();
void SPECIAL_DADDU ();
void SPECIAL_DSUB ();
void SPECIAL_DSUBU ();
void SPECIAL_DSLL ();
void SPECIAL_DSRL ();
void SPECIAL_DSRA ();
void SPECIAL_DSLL32 ();
void SPECIAL_DSRL32 ();
void SPECIAL_DSRA32 ();
/************************** COP0 functions **************************/
static void COP0_MF ();
static void COP0_MT ();
void COP0_MF ();
void COP0_MT ();
/************************** COP0 CO functions ***********************/
static void COP0_CO_TLBR ();
static void COP0_CO_TLBWI ();
static void COP0_CO_TLBWR ();
static void COP0_CO_TLBP ();
void COP0_CO_TLBR ();
void COP0_CO_TLBWI ();
void COP0_CO_TLBWR ();
void COP0_CO_TLBP ();
void COP0_CO_ERET ();
/************************** COP1 functions **************************/
static void COP1_MF ();
static void COP1_DMF ();
static void COP1_CF ();
static void COP1_MT ();
static void COP1_DMT ();
static void COP1_CT ();
void COP1_MF ();
void COP1_DMF ();
void COP1_CF ();
void COP1_MT ();
void COP1_DMT ();
void COP1_CT ();
/************************** COP1: S functions ************************/
static void COP1_S_ADD ();
static void COP1_S_SUB ();
static void COP1_S_MUL ();
static void COP1_S_DIV ();
static void COP1_S_ABS ();
static void COP1_S_NEG ();
static void COP1_S_SQRT ();
static void COP1_S_MOV ();
static void COP1_S_ROUND_L ();
static void COP1_S_TRUNC_L ();
static void COP1_S_CEIL_L ();
static void COP1_S_FLOOR_L ();
static void COP1_S_ROUND_W ();
static void COP1_S_TRUNC_W ();
static void COP1_S_CEIL_W ();
static void COP1_S_FLOOR_W ();
static void COP1_S_CVT_D ();
static void COP1_S_CVT_W ();
static void COP1_S_CVT_L ();
static void COP1_S_CMP ();
void COP1_S_ADD ();
void COP1_S_SUB ();
void COP1_S_MUL ();
void COP1_S_DIV ();
void COP1_S_ABS ();
void COP1_S_NEG ();
void COP1_S_SQRT ();
void COP1_S_MOV ();
void COP1_S_ROUND_L ();
void COP1_S_TRUNC_L ();
void COP1_S_CEIL_L ();
void COP1_S_FLOOR_L ();
void COP1_S_ROUND_W ();
void COP1_S_TRUNC_W ();
void COP1_S_CEIL_W ();
void COP1_S_FLOOR_W ();
void COP1_S_CVT_D ();
void COP1_S_CVT_W ();
void COP1_S_CVT_L ();
void COP1_S_CMP ();
/************************** COP1: D functions ************************/
static void COP1_D_ADD ();
static void COP1_D_SUB ();
static void COP1_D_MUL ();
static void COP1_D_DIV ();
static void COP1_D_ABS ();
static void COP1_D_NEG ();
static void COP1_D_SQRT ();
static void COP1_D_MOV ();
static void COP1_D_ROUND_L ();
static void COP1_D_TRUNC_L ();
static void COP1_D_CEIL_L ();
static void COP1_D_FLOOR_L ();
static void COP1_D_ROUND_W ();
static void COP1_D_TRUNC_W ();
static void COP1_D_CEIL_W ();
static void COP1_D_FLOOR_W ();
static void COP1_D_CVT_S ();
static void COP1_D_CVT_W ();
static void COP1_D_CVT_L ();
static void COP1_D_CMP ();
void COP1_D_ADD ();
void COP1_D_SUB ();
void COP1_D_MUL ();
void COP1_D_DIV ();
void COP1_D_ABS ();
void COP1_D_NEG ();
void COP1_D_SQRT ();
void COP1_D_MOV ();
void COP1_D_ROUND_L ();
void COP1_D_TRUNC_L ();
void COP1_D_CEIL_L ();
void COP1_D_FLOOR_L ();
void COP1_D_ROUND_W ();
void COP1_D_TRUNC_W ();
void COP1_D_CEIL_W ();
void COP1_D_FLOOR_W ();
void COP1_D_CVT_S ();
void COP1_D_CVT_W ();
void COP1_D_CVT_L ();
void COP1_D_CMP ();
/************************** COP1: W functions ************************/
static void COP1_W_CVT_S ();
static void COP1_W_CVT_D ();
void COP1_W_CVT_S ();
void COP1_W_CVT_D ();
/************************** COP1: L functions ************************/
static void COP1_L_CVT_S ();
static void COP1_L_CVT_D ();
void COP1_L_CVT_S ();
void COP1_L_CVT_D ();
/************************** Other functions **************************/
static void UnknownOpcode ();
void UnknownOpcode ();
void CompileExitCode();
static void BeforeCallDirect(CRegInfo & RegSet);
static void AfterCallDirect(CRegInfo & RegSet);
static void EnterCodeBlock();
static void ExitCodeBlock();
void CompileExitCode();
void CompileCop1Test();
void CompileInPermLoop(CRegInfo & RegSet, uint32_t ProgramCounter);
void SyncRegState(const CRegInfo & SyncTo);
bool SetupRegisterForLoop(CCodeBlock * BlockInfo, const CRegInfo & RegSet);
CRegInfo & GetRegWorkingSet(void);
static void BeforeCallDirect(CRegInfo & RegSet);
static void AfterCallDirect(CRegInfo & RegSet);
void SetRegWorkingSet(const CRegInfo & RegInfo);
bool InheritParentInfo();
void LinkJump(CJumpInfo & JumpInfo, uint32_t SectionID = -1, uint32_t FromSectionID = -1);
void JumpToSection(CCodeSection * Section);
void JumpToUnknown(CJumpInfo * JumpInfo);
void SetCurrentPC(uint32_t ProgramCounter);
uint32_t GetCurrentPC(void);
void SetCurrentSection(CCodeSection * section);
void SetNextStepType(STEP_TYPE StepType);
STEP_TYPE GetNextStepType( void );
const OPCODE & GetOpcode ( void ) const;
void PreCompileOpcode(void);
void PostCompileOpcode ( void );
void Compile_StoreInstructClean(x86Reg AddressReg, int32_t Length);
void CompileExit(uint32_t JumpPC, uint32_t TargetPC, CRegInfo &ExitRegSet, CExitInfo::EXIT_REASON reason, bool CompileNow);
void CompileReadTLBMiss(uint32_t VirtualAddress, x86Reg LookUpReg);
void CompileReadTLBMiss(x86Reg AddressReg, x86Reg LookUpReg);
void CompileWriteTLBMiss(x86Reg AddressReg, x86Reg LookUpReg);
@ -234,12 +256,6 @@ public:
static void ChangeDefaultRoundingModel();
static void OverflowDelaySlot(bool TestTimer);
static STEP_TYPE m_NextInstruction;
static uint32_t m_CompilePC;
static OPCODE m_Opcode;
static CX86RegInfo m_RegWorkingSet;
static uint32_t m_BranchCompare;
static CCodeSection * m_Section;
/********* Helper Functions *********/
typedef CRegInfo::REG_STATE REG_STATE;
@ -350,9 +366,6 @@ public:
public:
static uint32_t CompilePC() { return m_CompilePC; }
protected:
void CompileExit(uint32_t JumpPC, uint32_t TargetPC, CRegInfo &ExitRegSet, CExitInfo::EXIT_REASON reason, bool CompileNow, void(*x86Jmp)(const char * Label, uint32_t Value));
private:
void SB_Const(uint8_t Value, uint32_t Addr);
void SB_Register(CX86Ops::x86Reg Reg, uint32_t Addr);
@ -365,7 +378,14 @@ private:
void LW_KnownAddress(x86Reg Reg, uint32_t VAddr);
void LW(bool ResultSigned, bool bRecordLLBit);
void SW(bool bCheckLLbit);
void CompileExit(uint32_t JumpPC, uint32_t TargetPC, CRegInfo &ExitRegSet, CExitInfo::EXIT_REASON reason, bool CompileNow, void(*x86Jmp)(const char * Label, uint32_t Value));
EXIT_LIST m_ExitInfo;
static STEP_TYPE m_NextInstruction;
static uint32_t m_CompilePC;
static OPCODE m_Opcode;
static CX86RegInfo m_RegWorkingSet;
static uint32_t m_BranchCompare;
static CCodeSection * m_Section;
static uint32_t m_TempValue;
};