diff options
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/Src/PowerPC/Jit64/JitRegCache.cpp | 8 |
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;
}
|
