diff --git a/Core/MIPS/x86/CompFPU.cpp b/Core/MIPS/x86/CompFPU.cpp index 08d1b5d78f..17d7bf85a6 100644 --- a/Core/MIPS/x86/CompFPU.cpp +++ b/Core/MIPS/x86/CompFPU.cpp @@ -319,28 +319,21 @@ void Jit::Comp_mxc1(MIPSOpcode op) switch((op >> 21) & 0x1f) { case 0: // R(rt) = FI(fs); break; //mfc1 - if (rt != MIPS_REG_ZERO) - { - // Cross move! slightly tricky - fpr.StoreFromRegister(fs); - gpr.Lock(rt); + if (rt != MIPS_REG_ZERO) { + fpr.BindToRegister(fs, true, false); // TODO: Seems the V register becomes dirty here? It shouldn't. gpr.BindToRegister(rt, false, true); - MOV(32, gpr.R(rt), fpr.R(fs)); - gpr.UnlockAll(); + MOVD_xmm(gpr.R(rt), fpr.RX(fs)); } - return; + break; case 2: // R(rt) = currentMIPS->ReadFCR(fs); break; //cfc1 Comp_Generic(op); return; case 4: //FI(fs) = R(rt); break; //mtc1 - // Cross move! slightly tricky - gpr.StoreFromRegister(rt); - fpr.SpillLock(fs); - fpr.BindToRegister(fs, false, true); - MOVSS(fpr.RX(fs), gpr.R(rt)); - fpr.ReleaseSpillLocks(); + gpr.BindToRegister(rt, true, false); + fpr.BindToRegister(fs, false, true); // TODO: Seems the V register becomes dirty here? It shouldn't. + MOVD_xmm(fpr.RX(fs), gpr.R(rt)); return; case 6: //currentMIPS->WriteFCR(fs, R(rt)); break; //ctc1 diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index c45c61fbda..b262db9479 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -1556,10 +1556,9 @@ void Jit::Comp_Mftv(MIPSOpcode op) { // rt = 0, imm = 255 appears to be used as a CPU interlock by some games. if (rt != MIPS_REG_ZERO) { if (imm < 128) { //R(rt) = VI(imm); - // TODO: Avoid goind through memory - fpr.StoreFromRegisterV(imm); + fpr.MapRegV(imm, 0); // TODO: Seems the V register becomes dirty here? It shouldn't. gpr.BindToRegister(rt, false, true); - MOV(32, gpr.R(rt), fpr.V(imm)); + MOVD_xmm(gpr.R(rt), fpr.VX(imm)); } else if (imm < 128 + VFPU_CTRL_MAX) { //mfvc // In case we have a saved prefix. FlushPrefixV(); @@ -1573,11 +1572,10 @@ void Jit::Comp_Mftv(MIPSOpcode op) { break; case 7: //mtv - if (imm < 128) { - fpr.StoreFromRegisterV(imm); + if (imm < 128) { // VI(imm) = R(rt); + fpr.MapRegV(imm, MAP_DIRTY | MAP_NOINIT); // TODO: Seems the V register becomes dirty here? It shouldn't. gpr.BindToRegister(rt, true, false); - MOV(32, fpr.V(imm), gpr.R(rt)); - // VI(imm) = R(rt); + MOVD_xmm(fpr.VX(imm), gpr.R(rt)); } else if (imm < 128 + VFPU_CTRL_MAX) { //mtvc //currentMIPS->vfpuCtrl[imm - 128] = R(rt); gpr.BindToRegister(rt, true, false); MOV(32, M(¤tMIPS->vfpuCtrl[imm - 128]), gpr.R(rt));