Small optimizations

This commit is contained in:
Henrik Rydgard 2013-11-12 00:18:49 +01:00
parent efc35103e5
commit 84f20a1cad
4 changed files with 42 additions and 21 deletions

View file

@ -64,6 +64,7 @@ static const float zero = 0.0f;
const u32 MEMORY_ALIGNED16( noSignMask[4] ) = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF};
const u32 MEMORY_ALIGNED16( signBitLower[4] ) = {0x80000000, 0, 0, 0};
const float MEMORY_ALIGNED16( oneOneOneOne[4] ) = {1.0f, 1.0f, 1.0f, 1.0f};
const u32 MEMORY_ALIGNED16( solidOnes[4] ) = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
void Jit::Comp_VPFX(MIPSOpcode op)
{
@ -881,13 +882,14 @@ void Jit::Comp_Vcmp(MIPSOpcode op) {
// Some, we just fall back to the interpreter.
switch (cond) {
case VC_EN: // c = my_isnan(s[i]); break;
case VC_EI: // c = my_isinf(s[i]); break;
case VC_ES: // c = my_isnan(s[i]) || my_isinf(s[i]); break; // Tekken Dark Resurrection
case VC_NN: // c = !my_isnan(s[i]); break;
case VC_NI: // c = !my_isinf(s[i]); break;
case VC_NS: // c = !my_isnan(s[i]) && !my_isinf(s[i]); break;
DISABLE;
break;
case VC_EN: // c = my_isnan(s[i]); break;
case VC_NN: // c = !my_isnan(s[i]); break;
default:
break;
}
@ -916,7 +918,20 @@ void Jit::Comp_Vcmp(MIPSOpcode op) {
bool compareToZero = false;
int comparison = -1;
bool flip = false;
bool inverse = false;
switch (cond) {
case VC_EN:
comparison = CMP_UNORD;
compareTwo = true;
break;
case VC_NN:
comparison = CMP_UNORD;
compareTwo = true;
inverse = true;
break;
case VC_EQ: // c = s[i] == t[i]; break;
comparison = CMP_EQ;
compareTwo = true;
@ -975,6 +990,9 @@ void Jit::Comp_Vcmp(MIPSOpcode op) {
MOVSS(XMM1, fpr.V(sregs[i]));
CMPSS(XMM1, R(XMM0), comparison);
}
if (inverse) {
XORPS(XMM1, M((void *)&solidOnes));
}
MOVSS(M((void *) &ssCompareTemp), XMM1);
if (i == 0 && n == 1) {

View file

@ -274,6 +274,23 @@ inline void MemcpyUnchecked(void *to_data, const u32 from_address, const u32 len
memcpy(to_data, GetPointerUnchecked(from_address), len);
}
inline bool IsValidAddress(const u32 address) {
if ((address & 0x3E000000) == 0x08000000) {
return true;
}
else if ((address & 0x3F800000) == 0x04000000) {
return true;
}
else if ((address & 0xBFFF0000) == 0x00010000) {
return true;
}
else if ((address & 0x3F000000) >= 0x08000000 && (address & 0x3F000000) < 0x08000000 + g_MemorySize) {
return true;
}
else
return false;
}
template<class T>
void ReadStruct(u32 address, T *ptr)

View file

@ -145,23 +145,6 @@ inline void WriteToHardware(u32 address, const T data)
// =====================
bool IsValidAddress(const u32 address) {
if ((address & 0x3E000000) == 0x08000000) {
return true;
}
else if ((address & 0x3F800000) == 0x04000000) {
return true;
}
else if ((address & 0xBFFF0000) == 0x00010000) {
return true;
}
else if ((address & 0x3F000000) >= 0x08000000 && (address & 0x3F000000) < 0x08000000 + g_MemorySize) {
return true;
}
else
return false;
}
bool IsRAMAddress(const u32 address) {
if ((address & 0x3E000000) == 0x08000000) {
return true;

View file

@ -994,8 +994,6 @@ void GLES_GPU::ExecuteOpInternal(u32 op, u32 diff) {
}
break;
case GE_CMD_CLUTADDR:
case GE_CMD_CLUTADDRUPPER:
case GE_CMD_CLUTFORMAT:
if (diff) {
gstate_c.textureChanged = true;
@ -1003,6 +1001,11 @@ void GLES_GPU::ExecuteOpInternal(u32 op, u32 diff) {
// This could be used to "dirty" textures with clut.
break;
case GE_CMD_CLUTADDR:
case GE_CMD_CLUTADDRUPPER:
// Hm, LOADCLUT actually changes the CLUT so no need to dirty here.
break;
case GE_CMD_LOADCLUT:
gstate_c.textureChanged = true;
textureCache_.LoadClut();