summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp
index 645475d92e..2392f22dd3 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp
@@ -198,6 +198,7 @@ namespace Jit64
if (regs[preg].away && regs[preg].location.IsSimpleReg())
{
xregs[regs[preg].location.GetSimpleReg()].free = true;
+ xregs[regs[preg].location.GetSimpleReg()].dirty = false;
regs[preg].away = false;
}
}
@@ -291,7 +292,7 @@ namespace Jit64
if (xlocks[xr]) PanicAlert("GetFreeXReg returned locked register");
xregs[xr].free = false;
xregs[xr].ppcReg = i;
- xregs[xr].dirty = makeDirty;
+ xregs[xr].dirty = makeDirty || regs[i].location.IsImm();
OpArg newloc = ::Gen::R(xr);
if (doLoad || regs[i].location.IsImm())
MOV(32, newloc, regs[i].location);
@@ -321,11 +322,13 @@ namespace Jit64
{
if (regs[i].away)
{
+ bool doStore = true;
if (regs[i].location.IsSimpleReg())
{
X64Reg xr = RX(i);
xregs[xr].free = true;
xregs[xr].ppcReg = -1;
+ doStore = xregs[xr].dirty;
xregs[xr].dirty = false;
}
else
@@ -333,7 +336,8 @@ namespace Jit64
//must be immediate - do nothing
}
OpArg newLoc = GetDefaultLocation(i);
- MOV(32, newLoc, regs[i].location);
+ if (doStore)
+ MOV(32, newLoc, regs[i].location);
regs[i].location = newLoc;
regs[i].away = false;
}