[Project64] Move fpu used in to Reg Base
This commit is contained in:
parent
5a62e305f6
commit
d1be767d24
|
@ -12,12 +12,55 @@
|
|||
#include <Project64-core/N64System/Recompiler/RegBase.h>
|
||||
|
||||
CRegBase::CRegBase() :
|
||||
m_CycleCount(0)
|
||||
m_CycleCount(0),
|
||||
m_Fpu_Used(false)
|
||||
{
|
||||
m_MIPS_RegState[0] = STATE_CONST_32_SIGN;
|
||||
for (int32_t i = 1; i < 32; i++)
|
||||
for (int32_t i = 0; i < 32; i++)
|
||||
{
|
||||
m_MIPS_RegState[i] = STATE_UNKNOWN;
|
||||
m_MIPS_RegVal[i].DW = 0;
|
||||
}
|
||||
m_MIPS_RegState[0] = STATE_CONST_32_SIGN;
|
||||
}
|
||||
|
||||
bool CRegBase::operator==(const CRegBase& right) const
|
||||
{
|
||||
for (uint32_t count = 0; count < 32; count++)
|
||||
{
|
||||
if (m_MIPS_RegState[count] != right.m_MIPS_RegState[count])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (m_MIPS_RegState[count] == STATE_UNKNOWN)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (m_MIPS_RegVal[count].DW != right.m_MIPS_RegVal[count].DW)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (m_CycleCount != right.m_CycleCount) { return false; }
|
||||
if (m_Fpu_Used != right.m_Fpu_Used) { return false; }
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRegBase::operator!=(const CRegBase& right) const
|
||||
{
|
||||
return !(right == *this);
|
||||
}
|
||||
|
||||
CRegBase& CRegBase::operator=(const CRegBase& right)
|
||||
{
|
||||
memcpy(&m_MIPS_RegState, &right.m_MIPS_RegState, sizeof(m_MIPS_RegState));
|
||||
memcpy(&m_MIPS_RegVal, &right.m_MIPS_RegVal, sizeof(m_MIPS_RegVal));
|
||||
m_CycleCount = right.m_CycleCount;
|
||||
m_Fpu_Used = right.m_Fpu_Used;
|
||||
#ifdef _DEBUG
|
||||
if (*this != right)
|
||||
{
|
||||
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||
}
|
||||
#endif
|
||||
return *this;
|
||||
}
|
|
@ -69,8 +69,17 @@ public:
|
|||
void SetBlockCycleCount(uint32_t CyleCount) { m_CycleCount = CyleCount; }
|
||||
uint32_t GetBlockCycleCount() const { return m_CycleCount; }
|
||||
|
||||
void SetFpuBeenUsed(bool FpuUsed) { m_Fpu_Used = FpuUsed; }
|
||||
bool GetFpuBeenUsed() const { return m_Fpu_Used; }
|
||||
|
||||
CRegBase& operator=(const CRegBase&);
|
||||
|
||||
bool operator==(const CRegBase& right) const;
|
||||
bool operator!=(const CRegBase& right) const;
|
||||
|
||||
protected:
|
||||
REG_STATE m_MIPS_RegState[32];
|
||||
MIPS_DWORD m_MIPS_RegVal[32];
|
||||
uint32_t m_CycleCount;
|
||||
bool m_Fpu_Used;
|
||||
};
|
||||
|
|
|
@ -8851,12 +8851,14 @@ void CX86RecompilerOps::CompileExitCode()
|
|||
|
||||
void CX86RecompilerOps::CompileCop1Test()
|
||||
{
|
||||
if (m_RegWorkingSet.FpuBeenUsed())
|
||||
if (m_RegWorkingSet.GetFpuBeenUsed())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TestVariable(STATUS_CU1, &g_Reg->STATUS_REGISTER, "STATUS_REGISTER");
|
||||
CompileExit(m_CompilePC, m_CompilePC, m_RegWorkingSet, CExitInfo::COP1_Unuseable, false, JeLabel32);
|
||||
m_RegWorkingSet.FpuBeenUsed() = true;
|
||||
m_RegWorkingSet.SetFpuBeenUsed(true);
|
||||
}
|
||||
|
||||
void CX86RecompilerOps::CompileInPermLoop(CRegInfo & RegSet, uint32_t ProgramCounter)
|
||||
|
|
|
@ -27,10 +27,8 @@ const char *Format_Name[] = { "Unknown", "dword", "qword", "float", "double" };
|
|||
|
||||
CX86RegInfo::CX86RegInfo() :
|
||||
m_Stack_TopPos(0),
|
||||
m_Fpu_Used(false),
|
||||
m_RoundingModel(RoundUnknown)
|
||||
{
|
||||
m_MIPS_RegVal[0].DW = 0;
|
||||
m_RegMapLo[0] = x86_Unknown;
|
||||
m_RegMapHi[0] = x86_Unknown;
|
||||
|
||||
|
@ -65,13 +63,10 @@ CX86RegInfo::~CX86RegInfo()
|
|||
|
||||
CX86RegInfo& CX86RegInfo::operator=(const CX86RegInfo& right)
|
||||
{
|
||||
m_CycleCount = right.m_CycleCount;
|
||||
CRegBase::operator=(right);
|
||||
m_Stack_TopPos = right.m_Stack_TopPos;
|
||||
m_Fpu_Used = right.m_Fpu_Used;
|
||||
m_RoundingModel = right.m_RoundingModel;
|
||||
|
||||
memcpy(&m_MIPS_RegState, &right.m_MIPS_RegState, sizeof(m_MIPS_RegState));
|
||||
memcpy(&m_MIPS_RegVal, &right.m_MIPS_RegVal, sizeof(m_MIPS_RegVal));
|
||||
memcpy(&m_RegMapLo, &right.m_RegMapLo, sizeof(m_RegMapLo));
|
||||
memcpy(&m_RegMapHi, &right.m_RegMapHi, sizeof(m_RegMapHi));
|
||||
memcpy(&m_x86reg_MappedTo, &right.m_x86reg_MappedTo, sizeof(m_x86reg_MappedTo));
|
||||
|
@ -94,30 +89,19 @@ CX86RegInfo& CX86RegInfo::operator=(const CX86RegInfo& right)
|
|||
|
||||
bool CX86RegInfo::operator==(const CX86RegInfo& right) const
|
||||
{
|
||||
if (!CRegBase::operator==(right))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int32_t count;
|
||||
|
||||
for (count = 0; count < 32; count++)
|
||||
{
|
||||
if (m_MIPS_RegState[count] != right.m_MIPS_RegState[count])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (m_MIPS_RegState[count] == STATE_UNKNOWN)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (m_MIPS_RegVal[count].DW != right.m_MIPS_RegVal[count].DW)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (count = 0; count < 10; count++)
|
||||
{
|
||||
if (m_x86reg_MappedTo[count] != right.m_x86reg_MappedTo[count]) { return false; }
|
||||
if (m_x86reg_Protected[count] != right.m_x86reg_Protected[count]) { return false; }
|
||||
if (m_x86reg_MapOrder[count] != right.m_x86reg_MapOrder[count]) { return false; }
|
||||
}
|
||||
if (m_CycleCount != right.m_CycleCount) { return false; }
|
||||
if (m_Stack_TopPos != right.m_Stack_TopPos) { return false; }
|
||||
|
||||
for (count = 0; count < 8; count++)
|
||||
|
|
|
@ -108,7 +108,6 @@ public:
|
|||
int32_t & FpuMappedTo(int32_t Reg) { return m_x86fpu_MappedTo[Reg]; }
|
||||
FPU_STATE & FpuState(int32_t Reg) { return m_x86fpu_State[Reg]; }
|
||||
FPU_ROUND & FpuRoundingModel(int32_t Reg) { return m_x86fpu_RoundingModel[Reg]; }
|
||||
bool & FpuBeenUsed() { return m_Fpu_Used; }
|
||||
|
||||
FPU_ROUND GetRoundingModel() const { return m_RoundingModel; }
|
||||
void SetRoundingModel(FPU_ROUND RoundingModel) { m_RoundingModel = RoundingModel; }
|
||||
|
@ -132,7 +131,6 @@ private:
|
|||
bool m_x86fpu_StateChanged[8];
|
||||
FPU_ROUND m_x86fpu_RoundingModel[8];
|
||||
|
||||
bool m_Fpu_Used;
|
||||
FPU_ROUND m_RoundingModel;
|
||||
|
||||
static uint32_t m_fpuControl;
|
||||
|
|
Loading…
Reference in New Issue