From e5e0f85b50feb943e761944ca4a368402a1600f2 Mon Sep 17 00:00:00 2001 From: refractionpcsx2 Date: Fri, 29 Jan 2016 23:01:43 +0000 Subject: [PATCH] Vif Rec: Emulate Mode = 3 for test, not sure any games use it. Interpreter is still wrong, but currently crashy on this test, as it doesn't get this far I'm scared to change it in case it kills other stuff --- pcsx2/x86/newVif_Dynarec.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/pcsx2/x86/newVif_Dynarec.cpp b/pcsx2/x86/newVif_Dynarec.cpp index eb34a0b051..c764be1990 100644 --- a/pcsx2/x86/newVif_Dynarec.cpp +++ b/pcsx2/x86/newVif_Dynarec.cpp @@ -118,14 +118,29 @@ void VifUnpackSSE_Dynarec::doMaskWrite(const xRegisterSSE& regX) const { if (m5 < 0xf) { xPXOR(xmmTemp, xmmTemp); - mergeVectors(xmmTemp, xmmRow, xmmTemp, m5); - xPADD.D(regX, xmmTemp); - if (doMode==2) mergeVectors(xmmRow, regX, xmmTemp, m5); + if (doMode == 3) + { + mergeVectors(xmmRow, regX, xmmTemp, m5); + } + else + { + mergeVectors(xmmTemp, xmmRow, xmmTemp, m5); + xPADD.D(regX, xmmTemp); + if (doMode == 2) mergeVectors(xmmRow, regX, xmmTemp, m5); + } + } else { - xPADD.D(regX, xmmRow); - if (doMode==2){ xMOVAPS(xmmRow, regX); } + if (doMode == 3) + { + xMOVAPS(xmmRow, regX); + } + else + { + xPADD.D(regX, xmmRow); + if (doMode == 2) { xMOVAPS(xmmRow, regX); } + } } } xMOVAPS(ptr32[dstIndirect], regX); @@ -135,7 +150,7 @@ void VifUnpackSSE_Dynarec::writeBackRow() const { const int idx = v.idx; xMOVAPS(ptr128[&(MTVU_VifX.MaskRow)], xmmRow); - DevCon.WriteLn("nVif: writing back row reg! [doMode = 2]"); + DevCon.WriteLn("nVif: writing back row reg! [doMode = %d]", doMode); // ToDo: Do we need to write back to vifregs.rX too!? :/ } @@ -239,7 +254,7 @@ void VifUnpackSSE_Dynarec::CompileRoutine() { } } - if (doMode==2) writeBackRow(); + if (doMode>=2) writeBackRow(); xRET(); }