Don't need separate variables for writemask. Some optimizations.

This commit is contained in:
Henrik Rydgard 2013-02-15 22:56:38 +01:00
parent 456172c5a6
commit d22e258943
6 changed files with 40 additions and 46 deletions

View file

@ -760,7 +760,7 @@ int sceSdSetMember_(pspChnnlsvContext2& ctx, u8* data, int alignedLen)
{
return 0;
}
if (alignedLen & 0xF != 0)
if ((alignedLen & 0xF) != 0)
{
return -1025;
}

View file

@ -79,9 +79,6 @@ void MIPSState::Reset()
vfpuCtrl[VFPU_CTRL_RCX6] = 0x3f800000;
vfpuCtrl[VFPU_CTRL_RCX7] = 0x3f800000;
bool b[4] = {false, false, false, false};
SetWriteMask(b);
pc = 0;
hi = 0;
lo = 0;
@ -115,7 +112,6 @@ void MIPSState::DoState(PointerWrap &p)
p.DoArray(f, sizeof(f) / sizeof(f[0]));
p.DoArray(v, sizeof(v) / sizeof(v[0]));
p.DoArray(vfpuCtrl, sizeof(vfpuCtrl) / sizeof(vfpuCtrl[0]));
p.DoArray(vfpuWriteMask, sizeof(vfpuWriteMask) / sizeof(vfpuWriteMask[0]));
p.Do(pc);
p.Do(nextPC);
p.Do(downcount);
@ -131,12 +127,6 @@ void MIPSState::DoState(PointerWrap &p)
p.DoMarker("MIPSState");
}
void MIPSState::SetWriteMask(const bool wm[4])
{
for (int i = 0; i < 4; i++)
vfpuWriteMask[i] = wm[i];
}
void MIPSState::SingleStep()
{
int cycles = MIPS_SingleStep();

View file

@ -120,7 +120,6 @@ public:
float f[32];
float v[128];
u32 vfpuCtrl[16];
bool vfpuWriteMask[4];
u32 pc;
u32 nextPC;
@ -144,7 +143,13 @@ public:
void WriteFCR(int reg, int value);
u32 ReadFCR(int reg);
void SetWriteMask(const bool wm[4]);
u8 VfpuWriteMask() const {
return (vfpuCtrl[VFPU_CTRL_DPREFIX] >> 8) & 0xF;
}
bool VfpuWriteMask(int i) const {
return (vfpuCtrl[VFPU_CTRL_DPREFIX] >> (8 + i)) & 1;
}
void Irq();
void SWI();

View file

@ -159,7 +159,6 @@ void ApplyPrefixD(float *v, VectorSize size, bool onlyWriteMask = false)
}
}
}
currentMIPS->SetWriteMask(writeMask);
}
void EatPrefixes()
@ -167,8 +166,6 @@ void EatPrefixes()
currentMIPS->vfpuCtrl[VFPU_CTRL_SPREFIX] = 0xe4; // passthru
currentMIPS->vfpuCtrl[VFPU_CTRL_TPREFIX] = 0xe4; // passthru
currentMIPS->vfpuCtrl[VFPU_CTRL_DPREFIX] = 0;
static const bool noWriteMask[4] = {false, false, false, false};
currentMIPS->SetWriteMask(noWriteMask);
}
namespace MIPSInt

View file

@ -89,23 +89,20 @@ void ReadVector(float *rd, VectorSize size, int reg)
int length = 0;
int transpose = (reg>>5) & 1;
switch (size)
{
switch (size) {
case V_Single: transpose = 0; row=(reg>>5)&3; length = 1; break;
case V_Pair: row=(reg>>5)&2; length = 2; break;
case V_Triple: row=(reg>>6)&1; length = 3; break;
case V_Quad: row=(reg>>5)&2; length = 4; break;
}
for (int i = 0; i < length; i++)
{
int index = mtx * 4;
if (transpose)
index += ((row+i)&3) + col*32;
else
index += col + ((row+i)&3)*32;
rd[i] = V(index);
}
if (transpose) {
for (int i = 0; i < length; i++)
rd[i] = V(mtx * 4 + ((row+i)&3) + col*32);
} else {
for (int i = 0; i < length; i++)
rd[i] = V(mtx * 4 + col + ((row+i)&3)*32);
}
}
void WriteVector(const float *rd, VectorSize size, int reg)
@ -124,18 +121,28 @@ void WriteVector(const float *rd, VectorSize size, int reg)
case V_Quad: row=(reg>>5)&2; length = 4; break;
}
for (int i = 0; i < length; i++)
{
if (!currentMIPS->vfpuWriteMask[i])
{
int index = mtx * 4;
if (transpose)
index += ((row+i)&3) + col*32;
else
index += col + ((row+i)&3)*32;
V(index) = rd[i];
}
}
if (currentMIPS->VfpuWriteMask() == 0) {
if (transpose) {
for (int i = 0; i < length; i++)
V(mtx * 4 + ((row+i)&3) + col*32) = rd[i];
} else {
for (int i = 0; i < length; i++)
V(mtx * 4 + col + ((row+i)&3)*32) = rd[i];
}
} else {
for (int i = 0; i < length; i++)
{
if (!currentMIPS->VfpuWriteMask(i))
{
int index = mtx * 4;
if (transpose)
index += ((row+i)&3) + col*32;
else
index += col + ((row+i)&3)*32;
V(index) = rd[i];
}
}
}
}
void ReadMatrix(float *rd, MatrixSize size, int reg)
@ -190,7 +197,8 @@ void WriteMatrix(const float *rd, MatrixSize size, int reg)
{
for (int j=0; j<side; j++)
{
if (!currentMIPS->vfpuWriteMask[i])
// Hm, I wonder if this should affect matrices at all.
if (!currentMIPS->VfpuWriteMask(i))
{
int index = mtx * 4;
if (transpose)

View file

@ -129,12 +129,6 @@ void Jit::FlushPrefixV()
if ((js.prefixDFlag & JitState::PREFIX_DIRTY) != 0)
{
MOV(32, M((void *)&mips_->vfpuCtrl[VFPU_CTRL_DPREFIX]), Imm32(js.prefixD));
_dbg_assert_msg_(JIT, sizeof(bool) <= 4, "Bools shouldn't be that big?");
const size_t bool_stride = 4 / sizeof(bool);
for (size_t i = 0; i < ARRAY_SIZE(mips_->vfpuWriteMask); i += bool_stride)
MOV(32, M((void *)&mips_->vfpuWriteMask[i]), Imm32(*(u32 *)&js.writeMask[i]));
js.prefixDFlag = (JitState::PrefixState) (js.prefixDFlag & ~JitState::PREFIX_DIRTY);
}
}