{project64] Move compiling load/store instructions in to x86/x86RecompilerOps.cpp

This commit is contained in:
zilmar 2016-06-29 23:40:36 +10:00
parent 97816b15c9
commit c8cd2914a6
7 changed files with 3444 additions and 3476 deletions

View File

@ -483,11 +483,11 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
Jump_CoP1_S[7] = COP1_S_NEG; Jump_CoP1_S[7] = COP1_S_NEG;
Jump_CoP1_S[8] = COP1_S_ROUND_L; Jump_CoP1_S[8] = COP1_S_ROUND_L;
Jump_CoP1_S[9] = COP1_S_TRUNC_L; Jump_CoP1_S[9] = COP1_S_TRUNC_L;
Jump_CoP1_S[10] = COP1_S_CEIL_L; //added by Witten Jump_CoP1_S[10] = COP1_S_CEIL_L;
Jump_CoP1_S[11] = COP1_S_FLOOR_L; //added by Witten Jump_CoP1_S[11] = COP1_S_FLOOR_L;
Jump_CoP1_S[12] = COP1_S_ROUND_W; Jump_CoP1_S[12] = COP1_S_ROUND_W;
Jump_CoP1_S[13] = COP1_S_TRUNC_W; Jump_CoP1_S[13] = COP1_S_TRUNC_W;
Jump_CoP1_S[14] = COP1_S_CEIL_W; //added by Witten Jump_CoP1_S[14] = COP1_S_CEIL_W;
Jump_CoP1_S[15] = COP1_S_FLOOR_W; Jump_CoP1_S[15] = COP1_S_FLOOR_W;
Jump_CoP1_S[16] = UnknownOpcode; Jump_CoP1_S[16] = UnknownOpcode;
Jump_CoP1_S[17] = UnknownOpcode; Jump_CoP1_S[17] = UnknownOpcode;
@ -547,13 +547,13 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
Jump_CoP1_D[6] = COP1_D_MOV; Jump_CoP1_D[6] = COP1_D_MOV;
Jump_CoP1_D[7] = COP1_D_NEG; Jump_CoP1_D[7] = COP1_D_NEG;
Jump_CoP1_D[8] = COP1_D_ROUND_L; Jump_CoP1_D[8] = COP1_D_ROUND_L;
Jump_CoP1_D[9] = COP1_D_TRUNC_L; //added by Witten Jump_CoP1_D[9] = COP1_D_TRUNC_L;
Jump_CoP1_D[10] = COP1_D_CEIL_L; //added by Witten Jump_CoP1_D[10] = COP1_D_CEIL_L;
Jump_CoP1_D[11] = COP1_D_FLOOR_L; //added by Witten Jump_CoP1_D[11] = COP1_D_FLOOR_L;
Jump_CoP1_D[12] = COP1_D_ROUND_W; Jump_CoP1_D[12] = COP1_D_ROUND_W;
Jump_CoP1_D[13] = COP1_D_TRUNC_W; Jump_CoP1_D[13] = COP1_D_TRUNC_W;
Jump_CoP1_D[14] = COP1_D_CEIL_W; //added by Witten Jump_CoP1_D[14] = COP1_D_CEIL_W;
Jump_CoP1_D[15] = COP1_D_FLOOR_W; //added by Witten Jump_CoP1_D[15] = COP1_D_FLOOR_W;
Jump_CoP1_D[16] = UnknownOpcode; Jump_CoP1_D[16] = UnknownOpcode;
Jump_CoP1_D[17] = UnknownOpcode; Jump_CoP1_D[17] = UnknownOpcode;
Jump_CoP1_D[18] = UnknownOpcode; Jump_CoP1_D[18] = UnknownOpcode;
@ -2474,13 +2474,13 @@ void R4300iOp::COP1_S_TRUNC_L()
} }
void R4300iOp::COP1_S_CEIL_L() void R4300iOp::COP1_S_CEIL_L()
{ //added by Witten {
TEST_COP1_USABLE_EXCEPTION(); TEST_COP1_USABLE_EXCEPTION();
Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_UPWARD); Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_UPWARD);
} }
void R4300iOp::COP1_S_FLOOR_L() void R4300iOp::COP1_S_FLOOR_L()
{ //added by Witten {
TEST_COP1_USABLE_EXCEPTION(); TEST_COP1_USABLE_EXCEPTION();
Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_DOWNWARD); Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_DOWNWARD);
} }
@ -2498,7 +2498,7 @@ void R4300iOp::COP1_S_TRUNC_W()
} }
void R4300iOp::COP1_S_CEIL_W() void R4300iOp::COP1_S_CEIL_W()
{ //added by Witten {
TEST_COP1_USABLE_EXCEPTION(); TEST_COP1_USABLE_EXCEPTION();
Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_UPWARD); Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_UPWARD);
} }
@ -2665,19 +2665,19 @@ void R4300iOp::COP1_D_ROUND_L()
} }
void R4300iOp::COP1_D_TRUNC_L() void R4300iOp::COP1_D_TRUNC_L()
{ //added by Witten {
TEST_COP1_USABLE_EXCEPTION(); TEST_COP1_USABLE_EXCEPTION();
Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_TOWARDZERO); Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_TOWARDZERO);
} }
void R4300iOp::COP1_D_CEIL_L() void R4300iOp::COP1_D_CEIL_L()
{ //added by Witten {
TEST_COP1_USABLE_EXCEPTION(); TEST_COP1_USABLE_EXCEPTION();
Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_UPWARD); Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_UPWARD);
} }
void R4300iOp::COP1_D_FLOOR_L() void R4300iOp::COP1_D_FLOOR_L()
{ //added by Witten {
TEST_COP1_USABLE_EXCEPTION(); TEST_COP1_USABLE_EXCEPTION();
Double_RoundToInteger64(&*(uint64_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_S[m_Opcode.fs], FE_DOWNWARD); Double_RoundToInteger64(&*(uint64_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_S[m_Opcode.fs], FE_DOWNWARD);
} }
@ -2695,13 +2695,13 @@ void R4300iOp::COP1_D_TRUNC_W()
} }
void R4300iOp::COP1_D_CEIL_W() void R4300iOp::COP1_D_CEIL_W()
{ //added by Witten {
TEST_COP1_USABLE_EXCEPTION(); TEST_COP1_USABLE_EXCEPTION();
Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_UPWARD); Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_UPWARD);
} }
void R4300iOp::COP1_D_FLOOR_W() void R4300iOp::COP1_D_FLOOR_W()
{ //added by Witten {
TEST_COP1_USABLE_EXCEPTION(); TEST_COP1_USABLE_EXCEPTION();
Double_RoundToInteger32(&*(uint32_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_S[m_Opcode.fs], FE_DOWNWARD); Double_RoundToInteger32(&*(uint32_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_S[m_Opcode.fs], FE_DOWNWARD);
} }

View File

@ -162,11 +162,11 @@ public:
static void COP1_S_NEG(); static void COP1_S_NEG();
static void COP1_S_ROUND_L(); static void COP1_S_ROUND_L();
static void COP1_S_TRUNC_L(); static void COP1_S_TRUNC_L();
static void COP1_S_CEIL_L(); //added by Witten static void COP1_S_CEIL_L();
static void COP1_S_FLOOR_L(); //added by Witten static void COP1_S_FLOOR_L();
static void COP1_S_ROUND_W(); static void COP1_S_ROUND_W();
static void COP1_S_TRUNC_W(); static void COP1_S_TRUNC_W();
static void COP1_S_CEIL_W(); //added by Witten static void COP1_S_CEIL_W();
static void COP1_S_FLOOR_W(); static void COP1_S_FLOOR_W();
static void COP1_S_CVT_D(); static void COP1_S_CVT_D();
static void COP1_S_CVT_W(); static void COP1_S_CVT_W();
@ -183,13 +183,13 @@ public:
static void COP1_D_MOV(); static void COP1_D_MOV();
static void COP1_D_NEG(); static void COP1_D_NEG();
static void COP1_D_ROUND_L(); static void COP1_D_ROUND_L();
static void COP1_D_TRUNC_L(); //added by Witten static void COP1_D_TRUNC_L();
static void COP1_D_CEIL_L(); //added by Witten static void COP1_D_CEIL_L();
static void COP1_D_FLOOR_L(); //added by Witten static void COP1_D_FLOOR_L();
static void COP1_D_ROUND_W(); static void COP1_D_ROUND_W();
static void COP1_D_TRUNC_W(); static void COP1_D_TRUNC_W();
static void COP1_D_CEIL_W(); //added by Witten static void COP1_D_CEIL_W();
static void COP1_D_FLOOR_W(); //added by Witten static void COP1_D_FLOOR_W();
static void COP1_D_CVT_S(); static void COP1_D_CVT_S();
static void COP1_D_CVT_W(); static void COP1_D_CVT_W();
static void COP1_D_CVT_L(); static void COP1_D_CVT_L();

File diff suppressed because it is too large Load Diff

View File

@ -116,44 +116,7 @@ public:
//Compilation Functions //Compilation Functions
void ResetMemoryStack(); void ResetMemoryStack();
void Compile_LB();
void Compile_LBU();
void Compile_LH();
void Compile_LHU();
void Compile_LW();
void Compile_LL();
void Compile_LWC1();
void Compile_LWU();
void Compile_LWL();
void Compile_LWR();
void Compile_LD();
void Compile_LDC1();
void Compile_LDL();
void Compile_LDR();
void Compile_SB();
void Compile_SH();
void Compile_SW();
void Compile_SWL();
void Compile_SWR();
void Compile_SD();
void Compile_SDL();
void Compile_SDR();
void Compile_SC();
void Compile_SWC1();
void Compile_SDC1();
void ResetMemoryStack(CRegInfo& RegInfo); void ResetMemoryStack(CRegInfo& RegInfo);
void Compile_LB(CX86Ops::x86Reg Reg, uint32_t Addr, bool SignExtend);
void Compile_LH(CX86Ops::x86Reg Reg, uint32_t Addr, bool SignExtend);
void Compile_LW(CX86Ops::x86Reg Reg, uint32_t Addr);
void Compile_SB_Const(uint8_t Value, uint32_t Addr);
void Compile_SB_Register(CX86Ops::x86Reg Reg, uint32_t Addr);
void Compile_SH_Const(uint16_t Value, uint32_t Addr);
void Compile_SH_Register(CX86Ops::x86Reg Reg, uint32_t Addr);
void Compile_SW_Const(uint32_t Value, uint32_t Addr);
void Compile_SW_Register(CX86Ops::x86Reg Reg, uint32_t Addr);
//Functions for TLB notification //Functions for TLB notification
void TLB_Mapped(uint32_t VAddr, uint32_t Len, uint32_t PAddr, bool bReadOnly); void TLB_Mapped(uint32_t VAddr, uint32_t Len, uint32_t PAddr, bool bReadOnly);
@ -172,6 +135,7 @@ private:
CMipsMemoryVM(const CMipsMemoryVM&); // Disable copy constructor CMipsMemoryVM(const CMipsMemoryVM&); // Disable copy constructor
CMipsMemoryVM& operator=(const CMipsMemoryVM&); // Disable assignment CMipsMemoryVM& operator=(const CMipsMemoryVM&); // Disable assignment
friend CRecompilerOps;
void Compile_LW(bool ResultSigned, bool bRecordLLbit); void Compile_LW(bool ResultSigned, bool bRecordLLbit);
void Compile_SW(bool bCheckLLbit); void Compile_SW(bool bCheckLLbit);
@ -187,8 +151,6 @@ private:
bool SH_NonMemory(uint32_t PAddr, uint16_t Value); bool SH_NonMemory(uint32_t PAddr, uint16_t Value);
bool SW_NonMemory(uint32_t PAddr, uint32_t Value); bool SW_NonMemory(uint32_t PAddr, uint32_t Value);
void Compile_StoreInstructClean(x86Reg AddressReg, int32_t Length);
static void Load32RDRAMRegisters(void); static void Load32RDRAMRegisters(void);
static void Load32SPRegisters(void); static void Load32SPRegisters(void);
static void Load32DPCommand(void); static void Load32DPCommand(void);
@ -261,7 +223,6 @@ private:
uint32_t m_HalfLine; uint32_t m_HalfLine;
uint32_t m_HalfLineCheck; uint32_t m_HalfLineCheck;
uint32_t m_FieldSerration; uint32_t m_FieldSerration;
uint32_t m_TempValue;
//Initializing and resetting information about the memory system //Initializing and resetting information about the memory system
void FreeMemory(); void FreeMemory();
@ -275,4 +236,5 @@ private:
static uint32_t m_MemLookupAddress; static uint32_t m_MemLookupAddress;
static MIPS_DWORD m_MemLookupValue; static MIPS_DWORD m_MemLookupValue;
static bool m_MemLookupValid; static bool m_MemLookupValid;
static uint32_t RegModValue;
}; };

View File

@ -1125,32 +1125,32 @@ bool CCodeSection::GenerateNativeCode(uint32_t Test)
case R4300i_BGTZL:Compile_BranchLikely(BGTZ_Compare, false); break; case R4300i_BGTZL:Compile_BranchLikely(BGTZ_Compare, false); break;
case R4300i_BLEZL:Compile_BranchLikely(BLEZ_Compare, false); break; case R4300i_BLEZL:Compile_BranchLikely(BLEZ_Compare, false); break;
case R4300i_DADDIU: DADDIU(); break; case R4300i_DADDIU: DADDIU(); break;
case R4300i_LDL: g_MMU->Compile_LDL(); break; case R4300i_LDL: LDL(); break;
case R4300i_LDR: g_MMU->Compile_LDR(); break; case R4300i_LDR: LDR(); break;
case R4300i_LB: g_MMU->Compile_LB(); break; case R4300i_LB: LB(); break;
case R4300i_LH: g_MMU->Compile_LH(); break; case R4300i_LH: LH(); break;
case R4300i_LWL: g_MMU->Compile_LWL(); break; case R4300i_LWL: LWL(); break;
case R4300i_LW: g_MMU->Compile_LW(); break; case R4300i_LW: LW(); break;
case R4300i_LBU: g_MMU->Compile_LBU(); break; case R4300i_LBU: LBU(); break;
case R4300i_LHU: g_MMU->Compile_LHU(); break; case R4300i_LHU: LHU(); break;
case R4300i_LWR: g_MMU->Compile_LWR(); break; case R4300i_LWR: LWR(); break;
case R4300i_LWU: g_MMU->Compile_LWU(); break; //added by Witten case R4300i_LWU: LWU(); break; //added by Witten
case R4300i_SB: g_MMU->Compile_SB(); break; case R4300i_SB: SB(); break;
case R4300i_SH: g_MMU->Compile_SH(); break; case R4300i_SH: SH(); break;
case R4300i_SWL: g_MMU->Compile_SWL(); break; case R4300i_SWL: SWL(); break;
case R4300i_SW: g_MMU->Compile_SW(); break; case R4300i_SW: SW(); break;
case R4300i_SWR: g_MMU->Compile_SWR(); break; case R4300i_SWR: SWR(); break;
case R4300i_SDL: g_MMU->Compile_SDL(); break; case R4300i_SDL: SDL(); break;
case R4300i_SDR: g_MMU->Compile_SDR(); break; case R4300i_SDR: SDR(); break;
case R4300i_CACHE: CACHE(); break; case R4300i_CACHE: CACHE(); break;
case R4300i_LL: g_MMU->Compile_LL(); break; case R4300i_LL: LL(); break;
case R4300i_LWC1: g_MMU->Compile_LWC1(); break; case R4300i_LWC1: LWC1(); break;
case R4300i_LDC1: g_MMU->Compile_LDC1(); break; case R4300i_LDC1: LDC1(); break;
case R4300i_SC: g_MMU->Compile_SC(); break; case R4300i_SC: SC(); break;
case R4300i_LD: g_MMU->Compile_LD(); break; case R4300i_LD: LD(); break;
case R4300i_SWC1: g_MMU->Compile_SWC1(); break; case R4300i_SWC1: SWC1(); break;
case R4300i_SDC1: g_MMU->Compile_SDC1(); break; case R4300i_SDC1: SDC1(); break;
case R4300i_SD: g_MMU->Compile_SD(); break; case R4300i_SD: SD(); break;
default: default:
UnknownOpcode(); break; UnknownOpcode(); break;
} }

View File

@ -60,32 +60,32 @@ public:
static void XORI (); static void XORI ();
static void LUI (); static void LUI ();
static void DADDIU (); static void DADDIU ();
// static void LDL (); static void LDL ();
// static void LDR (); static void LDR ();
// static void LB (); void LB ();
// static void LH (); void LH ();
// static void LWL (); void LWL ();
// static void LW (); void LW ();
// static void LBU (); void LBU ();
// static void LHU (); void LHU ();
// static void LWR (); void LWR ();
// static void LWU (); //added by Witten void LWU ();
// static void SB (); void SB ();
// static void SH (); void SH ();
// static void SWL (); void SWL ();
// static void SW (); void SW ();
// static void SWR (); void SWR ();
// static void SDL (); static void SDL ();
// static void SDR (); static void SDR ();
static void CACHE (); static void CACHE ();
// static void LL (); void LL ();
// static void LWC1 (); void LWC1 ();
// static void LDC1 (); void LDC1 ();
// static void LD (); void LD ();
// static void SC (); void SC ();
// static void SWC1 (); void SWC1 ();
// static void SDC1 (); void SDC1 ();
// static void SD (); void SD ();
/********************** R4300i OpCodes: Special **********************/ /********************** R4300i OpCodes: Special **********************/
static void SPECIAL_SLL (); static void SPECIAL_SLL ();
@ -163,11 +163,11 @@ public:
static void COP1_S_MOV (); static void COP1_S_MOV ();
static void COP1_S_ROUND_L (); static void COP1_S_ROUND_L ();
static void COP1_S_TRUNC_L (); static void COP1_S_TRUNC_L ();
static void COP1_S_CEIL_L (); //added by Witten static void COP1_S_CEIL_L ();
static void COP1_S_FLOOR_L (); //added by Witten static void COP1_S_FLOOR_L ();
static void COP1_S_ROUND_W (); static void COP1_S_ROUND_W ();
static void COP1_S_TRUNC_W (); static void COP1_S_TRUNC_W ();
static void COP1_S_CEIL_W (); //added by Witten static void COP1_S_CEIL_W ();
static void COP1_S_FLOOR_W (); static void COP1_S_FLOOR_W ();
static void COP1_S_CVT_D (); static void COP1_S_CVT_D ();
static void COP1_S_CVT_W (); static void COP1_S_CVT_W ();
@ -184,13 +184,13 @@ public:
static void COP1_D_SQRT (); static void COP1_D_SQRT ();
static void COP1_D_MOV (); static void COP1_D_MOV ();
static void COP1_D_ROUND_L (); static void COP1_D_ROUND_L ();
static void COP1_D_TRUNC_L (); //added by Witten static void COP1_D_TRUNC_L ();
static void COP1_D_CEIL_L (); //added by Witten static void COP1_D_CEIL_L ();
static void COP1_D_FLOOR_L (); //added by Witten static void COP1_D_FLOOR_L ();
static void COP1_D_ROUND_W (); static void COP1_D_ROUND_W ();
static void COP1_D_TRUNC_W (); static void COP1_D_TRUNC_W ();
static void COP1_D_CEIL_W (); //added by Witten static void COP1_D_CEIL_W ();
static void COP1_D_FLOOR_W (); //added by Witten static void COP1_D_FLOOR_W ();
static void COP1_D_CVT_S (); static void COP1_D_CVT_S ();
static void COP1_D_CVT_W (); static void COP1_D_CVT_W ();
static void COP1_D_CVT_L (); static void COP1_D_CVT_L ();
@ -212,6 +212,7 @@ public:
static void AfterCallDirect(CRegInfo & RegSet); static void AfterCallDirect(CRegInfo & RegSet);
static void EnterCodeBlock(); static void EnterCodeBlock();
static void ExitCodeBlock(); static void ExitCodeBlock();
void Compile_StoreInstructClean(x86Reg AddressReg, int32_t Length);
void CompileReadTLBMiss(uint32_t VirtualAddress, x86Reg LookUpReg); void CompileReadTLBMiss(uint32_t VirtualAddress, x86Reg LookUpReg);
void CompileReadTLBMiss(x86Reg AddressReg, x86Reg LookUpReg); void CompileReadTLBMiss(x86Reg AddressReg, x86Reg LookUpReg);
void CompileWriteTLBMiss(x86Reg AddressReg, x86Reg LookUpReg); void CompileWriteTLBMiss(x86Reg AddressReg, x86Reg LookUpReg);
@ -337,6 +338,22 @@ public:
public: public:
static uint32_t CompilePC() { return m_CompilePC; } 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)); 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);
void SH_Const(uint16_t Value, uint32_t Addr);
void SH_Register(CX86Ops::x86Reg Reg, uint32_t Addr);
void SW_Const(uint32_t Value, uint32_t Addr);
void SW_Register(CX86Ops::x86Reg Reg, uint32_t Addr);
void LB_KnownAddress(x86Reg Reg, uint32_t VAddr, bool SignExtend);
void LH_KnownAddress(x86Reg Reg, uint32_t VAddr, bool SignExtend);
void LW_KnownAddress(x86Reg Reg, uint32_t VAddr);
void LW(bool ResultSigned, bool bRecordLLBit);
void SW(bool bCheckLLbit);
EXIT_LIST m_ExitInfo; EXIT_LIST m_ExitInfo;
static uint32_t m_TempValue;
}; };