{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[8] = COP1_S_ROUND_L;
Jump_CoP1_S[9] = COP1_S_TRUNC_L;
Jump_CoP1_S[10] = COP1_S_CEIL_L; //added by Witten
Jump_CoP1_S[11] = COP1_S_FLOOR_L; //added by Witten
Jump_CoP1_S[10] = COP1_S_CEIL_L;
Jump_CoP1_S[11] = COP1_S_FLOOR_L;
Jump_CoP1_S[12] = COP1_S_ROUND_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[16] = UnknownOpcode;
Jump_CoP1_S[17] = UnknownOpcode;
@ -547,13 +547,13 @@ R4300iOp::Func * R4300iOp::BuildInterpreter()
Jump_CoP1_D[6] = COP1_D_MOV;
Jump_CoP1_D[7] = COP1_D_NEG;
Jump_CoP1_D[8] = COP1_D_ROUND_L;
Jump_CoP1_D[9] = COP1_D_TRUNC_L; //added by Witten
Jump_CoP1_D[10] = COP1_D_CEIL_L; //added by Witten
Jump_CoP1_D[11] = COP1_D_FLOOR_L; //added by Witten
Jump_CoP1_D[9] = COP1_D_TRUNC_L;
Jump_CoP1_D[10] = COP1_D_CEIL_L;
Jump_CoP1_D[11] = COP1_D_FLOOR_L;
Jump_CoP1_D[12] = COP1_D_ROUND_W;
Jump_CoP1_D[13] = COP1_D_TRUNC_W;
Jump_CoP1_D[14] = COP1_D_CEIL_W; //added by Witten
Jump_CoP1_D[15] = COP1_D_FLOOR_W; //added by Witten
Jump_CoP1_D[14] = COP1_D_CEIL_W;
Jump_CoP1_D[15] = COP1_D_FLOOR_W;
Jump_CoP1_D[16] = UnknownOpcode;
Jump_CoP1_D[17] = UnknownOpcode;
Jump_CoP1_D[18] = UnknownOpcode;
@ -2474,13 +2474,13 @@ void R4300iOp::COP1_S_TRUNC_L()
}
void R4300iOp::COP1_S_CEIL_L()
{ //added by Witten
{
TEST_COP1_USABLE_EXCEPTION();
Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_UPWARD);
}
void R4300iOp::COP1_S_FLOOR_L()
{ //added by Witten
{
TEST_COP1_USABLE_EXCEPTION();
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()
{ //added by Witten
{
TEST_COP1_USABLE_EXCEPTION();
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()
{ //added by Witten
{
TEST_COP1_USABLE_EXCEPTION();
Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_TOWARDZERO);
}
void R4300iOp::COP1_D_CEIL_L()
{ //added by Witten
{
TEST_COP1_USABLE_EXCEPTION();
Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_UPWARD);
}
void R4300iOp::COP1_D_FLOOR_L()
{ //added by Witten
{
TEST_COP1_USABLE_EXCEPTION();
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()
{ //added by Witten
{
TEST_COP1_USABLE_EXCEPTION();
Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_UPWARD);
}
void R4300iOp::COP1_D_FLOOR_W()
{ //added by Witten
{
TEST_COP1_USABLE_EXCEPTION();
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_ROUND_L();
static void COP1_S_TRUNC_L();
static void COP1_S_CEIL_L(); //added by Witten
static void COP1_S_FLOOR_L(); //added by Witten
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(); //added by Witten
static void COP1_S_CEIL_W();
static void COP1_S_FLOOR_W();
static void COP1_S_CVT_D();
static void COP1_S_CVT_W();
@ -183,13 +183,13 @@ public:
static void COP1_D_MOV();
static void COP1_D_NEG();
static void COP1_D_ROUND_L();
static void COP1_D_TRUNC_L(); //added by Witten
static void COP1_D_CEIL_L(); //added by Witten
static void COP1_D_FLOOR_L(); //added by Witten
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(); //added by Witten
static void COP1_D_FLOOR_W(); //added by Witten
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();

File diff suppressed because it is too large Load Diff

View File

@ -116,44 +116,7 @@ public:
//Compilation Functions
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 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
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& operator=(const CMipsMemoryVM&); // Disable assignment
friend CRecompilerOps;
void Compile_LW(bool ResultSigned, bool bRecordLLbit);
void Compile_SW(bool bCheckLLbit);
@ -187,8 +151,6 @@ private:
bool SH_NonMemory(uint32_t PAddr, uint16_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 Load32SPRegisters(void);
static void Load32DPCommand(void);
@ -261,7 +223,6 @@ private:
uint32_t m_HalfLine;
uint32_t m_HalfLineCheck;
uint32_t m_FieldSerration;
uint32_t m_TempValue;
//Initializing and resetting information about the memory system
void FreeMemory();
@ -275,4 +236,5 @@ private:
static uint32_t m_MemLookupAddress;
static MIPS_DWORD m_MemLookupValue;
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_BLEZL:Compile_BranchLikely(BLEZ_Compare, false); break;
case R4300i_DADDIU: DADDIU(); break;
case R4300i_LDL: g_MMU->Compile_LDL(); break;
case R4300i_LDR: g_MMU->Compile_LDR(); break;
case R4300i_LB: g_MMU->Compile_LB(); break;
case R4300i_LH: g_MMU->Compile_LH(); break;
case R4300i_LWL: g_MMU->Compile_LWL(); break;
case R4300i_LW: g_MMU->Compile_LW(); break;
case R4300i_LBU: g_MMU->Compile_LBU(); break;
case R4300i_LHU: g_MMU->Compile_LHU(); break;
case R4300i_LWR: g_MMU->Compile_LWR(); break;
case R4300i_LWU: g_MMU->Compile_LWU(); break; //added by Witten
case R4300i_SB: g_MMU->Compile_SB(); break;
case R4300i_SH: g_MMU->Compile_SH(); break;
case R4300i_SWL: g_MMU->Compile_SWL(); break;
case R4300i_SW: g_MMU->Compile_SW(); break;
case R4300i_SWR: g_MMU->Compile_SWR(); break;
case R4300i_SDL: g_MMU->Compile_SDL(); break;
case R4300i_SDR: g_MMU->Compile_SDR(); break;
case R4300i_LDL: LDL(); break;
case R4300i_LDR: LDR(); break;
case R4300i_LB: LB(); break;
case R4300i_LH: LH(); break;
case R4300i_LWL: LWL(); break;
case R4300i_LW: LW(); break;
case R4300i_LBU: LBU(); break;
case R4300i_LHU: LHU(); break;
case R4300i_LWR: LWR(); break;
case R4300i_LWU: LWU(); break; //added by Witten
case R4300i_SB: SB(); break;
case R4300i_SH: SH(); break;
case R4300i_SWL: SWL(); break;
case R4300i_SW: SW(); break;
case R4300i_SWR: SWR(); break;
case R4300i_SDL: SDL(); break;
case R4300i_SDR: SDR(); break;
case R4300i_CACHE: CACHE(); break;
case R4300i_LL: g_MMU->Compile_LL(); break;
case R4300i_LWC1: g_MMU->Compile_LWC1(); break;
case R4300i_LDC1: g_MMU->Compile_LDC1(); break;
case R4300i_SC: g_MMU->Compile_SC(); break;
case R4300i_LD: g_MMU->Compile_LD(); break;
case R4300i_SWC1: g_MMU->Compile_SWC1(); break;
case R4300i_SDC1: g_MMU->Compile_SDC1(); break;
case R4300i_SD: g_MMU->Compile_SD(); break;
case R4300i_LL: LL(); break;
case R4300i_LWC1: LWC1(); break;
case R4300i_LDC1: LDC1(); break;
case R4300i_SC: SC(); break;
case R4300i_LD: LD(); break;
case R4300i_SWC1: SWC1(); break;
case R4300i_SDC1: SDC1(); break;
case R4300i_SD: SD(); break;
default:
UnknownOpcode(); break;
}

View File

@ -60,32 +60,32 @@ public:
static void XORI ();
static void LUI ();
static void DADDIU ();
// static void LDL ();
// static void LDR ();
// static void LB ();
// static void LH ();
// static void LWL ();
// static void LW ();
// static void LBU ();
// static void LHU ();
// static void LWR ();
// static void LWU (); //added by Witten
// static void SB ();
// static void SH ();
// static void SWL ();
// static void SW ();
// static void SWR ();
// static void SDL ();
// static void SDR ();
static void LDL ();
static void LDR ();
void LB ();
void LH ();
void LWL ();
void LW ();
void LBU ();
void LHU ();
void LWR ();
void LWU ();
void SB ();
void SH ();
void SWL ();
void SW ();
void SWR ();
static void SDL ();
static void SDR ();
static void CACHE ();
// static void LL ();
// static void LWC1 ();
// static void LDC1 ();
// static void LD ();
// static void SC ();
// static void SWC1 ();
// static void SDC1 ();
// static void SD ();
void LL ();
void LWC1 ();
void LDC1 ();
void LD ();
void SC ();
void SWC1 ();
void SDC1 ();
void SD ();
/********************** R4300i OpCodes: Special **********************/
static void SPECIAL_SLL ();
@ -163,11 +163,11 @@ public:
static void COP1_S_MOV ();
static void COP1_S_ROUND_L ();
static void COP1_S_TRUNC_L ();
static void COP1_S_CEIL_L (); //added by Witten
static void COP1_S_FLOOR_L (); //added by Witten
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 (); //added by Witten
static void COP1_S_CEIL_W ();
static void COP1_S_FLOOR_W ();
static void COP1_S_CVT_D ();
static void COP1_S_CVT_W ();
@ -184,13 +184,13 @@ public:
static void COP1_D_SQRT ();
static void COP1_D_MOV ();
static void COP1_D_ROUND_L ();
static void COP1_D_TRUNC_L (); //added by Witten
static void COP1_D_CEIL_L (); //added by Witten
static void COP1_D_FLOOR_L (); //added by Witten
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 (); //added by Witten
static void COP1_D_FLOOR_W (); //added by Witten
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 ();
@ -212,6 +212,7 @@ public:
static void AfterCallDirect(CRegInfo & RegSet);
static void EnterCodeBlock();
static void ExitCodeBlock();
void Compile_StoreInstructClean(x86Reg AddressReg, int32_t Length);
void CompileReadTLBMiss(uint32_t VirtualAddress, x86Reg LookUpReg);
void CompileReadTLBMiss(x86Reg AddressReg, x86Reg LookUpReg);
void CompileWriteTLBMiss(x86Reg AddressReg, x86Reg LookUpReg);
@ -337,6 +338,22 @@ 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);
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;
static uint32_t m_TempValue;
};