mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Don't need separate variables for writemask. Some optimizations.
This commit is contained in:
parent
456172c5a6
commit
d22e258943
6 changed files with 40 additions and 46 deletions
|
@ -760,7 +760,7 @@ int sceSdSetMember_(pspChnnlsvContext2& ctx, u8* data, int alignedLen)
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
if (alignedLen & 0xF != 0)
|
||||
if ((alignedLen & 0xF) != 0)
|
||||
{
|
||||
return -1025;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue