x86/iR5900Analysis: Correct backprop for VNNNi

This commit is contained in:
Stenzek 2022-12-26 15:32:02 +10:00 committed by refractionpcsx2
parent ebcb3b413c
commit d6332e796e
2 changed files with 21 additions and 11 deletions

View File

@ -217,7 +217,7 @@ struct EEINST
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 fpuregs[33]; // ACC=32
u8 vfregs[33]; // ACC=32
u8 vfregs[34]; // ACC=32, I=33
u8 viregs[16];
// uses XMMTYPE_ flags; if type == XMMTYPE_TEMP, not used

View File

@ -367,7 +367,6 @@ void COP2MicroFinishPass::Run(u32 start, u32 end, EEINST* inst_cache)
// Otherwise the last use flag won't get set.
/////////////////////////////////////////////////////////////////////
// Preserve XMM flag from later reads, some instructions can operate in XMM.
#define recBackpropSetGPRRead(reg) \
do \
{ \
@ -376,7 +375,7 @@ void COP2MicroFinishPass::Run(u32 start, u32 end, EEINST* inst_cache)
if (!(pinst->regs[reg] & EEINST_USED)) \
pinst->regs[reg] |= EEINST_LASTUSE; \
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); \
} \
} while (0)
@ -970,6 +969,7 @@ void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst)
const u32 funct = (code & 0x3F);
constexpr u32 VF_ACC = 32;
constexpr u32 VF_I = 33;
switch (fmt)
{
@ -1069,24 +1069,34 @@ void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst)
case 30: // VMULi
case 31: // VMINIi
case 34: // VADDi
case 35: // VMADDi
case 38: // VSUBi
recBackpropSetVFWrite(fd);
recBackpropSetVFRead(fs);
recBackpropSetVFRead(VF_I);
break;
case 35: // VMADDi
case 39: // VMSUBi
recBackpropSetVFWrite(fd);
recBackpropSetVFRead(fs);
// recBackpropSetVIRead(REG_I);
recBackpropSetVFRead(fd);
recBackpropSetVFRead(VF_ACC);
recBackpropSetVFRead(VF_I);
break;
case 28: // VMULq
case 32: // VADDq
case 33: // VMADDq
case 37: // VMSUBq
case 36: // VSUBq
recBackpropSetVFWrite(fd);
recBackpropSetVFRead(fs);
// recBackpropSetVIRead(REG_Q);
recBackpropSetVFRead(fd);
break;
case 33: // VMADDq
case 37: // VMSUBq
recBackpropSetVFWrite(fd);
recBackpropSetVFRead(fs);
// recBackpropSetVIRead(REG_Q);
recBackpropSetVFRead(VF_ACC);
break;
case 48: // VIADD
@ -1182,7 +1192,7 @@ void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst)
case 38: // VSUBAi
recBackpropSetVFWrite(VF_ACC);
recBackpropSetVFRead(fs);
// recBackpropSetVIRead(REG_I);
recBackpropSetVFRead(VF_I);
recBackpropSetVFRead(VF_ACC);
break;
@ -1190,7 +1200,7 @@ void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst)
case 39: // VMSUBAi
recBackpropSetVFWrite(VF_ACC);
recBackpropSetVFRead(fs);
// recBackpropSetVIRead(REG_I);
recBackpropSetVFRead(VF_I);
recBackpropSetVFRead(VF_ACC);
break;