mirror of https://github.com/PCSX2/pcsx2.git
x86/iR5900Analysis: Correct backprop for VNNNi
This commit is contained in:
parent
ebcb3b413c
commit
d6332e796e
|
@ -217,7 +217,7 @@ struct EEINST
|
||||||
u16 info; // extra info, if 1 inst is COP1, 2 inst is COP2. Also uses EEINST_XMM
|
u16 info; // extra info, if 1 inst is COP1, 2 inst is COP2. Also uses EEINST_XMM
|
||||||
u8 regs[34]; // includes HI/LO (HI=32, LO=33)
|
u8 regs[34]; // includes HI/LO (HI=32, LO=33)
|
||||||
u8 fpuregs[33]; // ACC=32
|
u8 fpuregs[33]; // ACC=32
|
||||||
u8 vfregs[33]; // ACC=32
|
u8 vfregs[34]; // ACC=32, I=33
|
||||||
u8 viregs[16];
|
u8 viregs[16];
|
||||||
|
|
||||||
// uses XMMTYPE_ flags; if type == XMMTYPE_TEMP, not used
|
// uses XMMTYPE_ flags; if type == XMMTYPE_TEMP, not used
|
||||||
|
|
|
@ -367,7 +367,6 @@ void COP2MicroFinishPass::Run(u32 start, u32 end, EEINST* inst_cache)
|
||||||
// Otherwise the last use flag won't get set.
|
// Otherwise the last use flag won't get set.
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Preserve XMM flag from later reads, some instructions can operate in XMM.
|
|
||||||
#define recBackpropSetGPRRead(reg) \
|
#define recBackpropSetGPRRead(reg) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
|
@ -376,7 +375,7 @@ void COP2MicroFinishPass::Run(u32 start, u32 end, EEINST* inst_cache)
|
||||||
if (!(pinst->regs[reg] & EEINST_USED)) \
|
if (!(pinst->regs[reg] & EEINST_USED)) \
|
||||||
pinst->regs[reg] |= EEINST_LASTUSE; \
|
pinst->regs[reg] |= EEINST_LASTUSE; \
|
||||||
prev->regs[reg] = (EEINST_LIVE | EEINST_USED); \
|
prev->regs[reg] = (EEINST_LIVE | EEINST_USED); \
|
||||||
pinst->regs[reg] = EEINST_USED; \
|
pinst->regs[reg] = (pinst->regs[reg] & ~EEINST_XMM) | EEINST_USED; \
|
||||||
_recFillRegister(*pinst, XMMTYPE_GPRREG, reg, 0); \
|
_recFillRegister(*pinst, XMMTYPE_GPRREG, reg, 0); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -970,6 +969,7 @@ void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst)
|
||||||
const u32 funct = (code & 0x3F);
|
const u32 funct = (code & 0x3F);
|
||||||
|
|
||||||
constexpr u32 VF_ACC = 32;
|
constexpr u32 VF_ACC = 32;
|
||||||
|
constexpr u32 VF_I = 33;
|
||||||
|
|
||||||
switch (fmt)
|
switch (fmt)
|
||||||
{
|
{
|
||||||
|
@ -1069,24 +1069,34 @@ void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst)
|
||||||
case 30: // VMULi
|
case 30: // VMULi
|
||||||
case 31: // VMINIi
|
case 31: // VMINIi
|
||||||
case 34: // VADDi
|
case 34: // VADDi
|
||||||
case 35: // VMADDi
|
|
||||||
case 38: // VSUBi
|
case 38: // VSUBi
|
||||||
|
recBackpropSetVFWrite(fd);
|
||||||
|
recBackpropSetVFRead(fs);
|
||||||
|
recBackpropSetVFRead(VF_I);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 35: // VMADDi
|
||||||
case 39: // VMSUBi
|
case 39: // VMSUBi
|
||||||
recBackpropSetVFWrite(fd);
|
recBackpropSetVFWrite(fd);
|
||||||
recBackpropSetVFRead(fs);
|
recBackpropSetVFRead(fs);
|
||||||
// recBackpropSetVIRead(REG_I);
|
recBackpropSetVFRead(VF_ACC);
|
||||||
recBackpropSetVFRead(fd);
|
recBackpropSetVFRead(VF_I);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 28: // VMULq
|
case 28: // VMULq
|
||||||
case 32: // VADDq
|
case 32: // VADDq
|
||||||
case 33: // VMADDq
|
|
||||||
case 37: // VMSUBq
|
|
||||||
case 36: // VSUBq
|
case 36: // VSUBq
|
||||||
recBackpropSetVFWrite(fd);
|
recBackpropSetVFWrite(fd);
|
||||||
recBackpropSetVFRead(fs);
|
recBackpropSetVFRead(fs);
|
||||||
// recBackpropSetVIRead(REG_Q);
|
// recBackpropSetVIRead(REG_Q);
|
||||||
recBackpropSetVFRead(fd);
|
break;
|
||||||
|
|
||||||
|
case 33: // VMADDq
|
||||||
|
case 37: // VMSUBq
|
||||||
|
recBackpropSetVFWrite(fd);
|
||||||
|
recBackpropSetVFRead(fs);
|
||||||
|
// recBackpropSetVIRead(REG_Q);
|
||||||
|
recBackpropSetVFRead(VF_ACC);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 48: // VIADD
|
case 48: // VIADD
|
||||||
|
@ -1182,7 +1192,7 @@ void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst)
|
||||||
case 38: // VSUBAi
|
case 38: // VSUBAi
|
||||||
recBackpropSetVFWrite(VF_ACC);
|
recBackpropSetVFWrite(VF_ACC);
|
||||||
recBackpropSetVFRead(fs);
|
recBackpropSetVFRead(fs);
|
||||||
// recBackpropSetVIRead(REG_I);
|
recBackpropSetVFRead(VF_I);
|
||||||
recBackpropSetVFRead(VF_ACC);
|
recBackpropSetVFRead(VF_ACC);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1190,7 +1200,7 @@ void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst)
|
||||||
case 39: // VMSUBAi
|
case 39: // VMSUBAi
|
||||||
recBackpropSetVFWrite(VF_ACC);
|
recBackpropSetVFWrite(VF_ACC);
|
||||||
recBackpropSetVFRead(fs);
|
recBackpropSetVFRead(fs);
|
||||||
// recBackpropSetVIRead(REG_I);
|
recBackpropSetVFRead(VF_I);
|
||||||
recBackpropSetVFRead(VF_ACC);
|
recBackpropSetVFRead(VF_ACC);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue