summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorskidau <skidau@gmail.com>2012-01-03 10:20:20 +1100
committerskidau <skidau@gmail.com>2012-01-03 10:20:20 +1100
commitd399e6b26d698f2e43f46e54bfac9db4b40f14cd (patch)
tree748dba5098d180eb15ce8803c28dffbec2532e65 /Source/Core
parent67e38fb6c654cae2e693fabe520f5c3a94970850 (diff)
Reordered the safe write path of the stfd instruction.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStoreFloating.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStoreFloating.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStoreFloating.cpp
index 46e888f935..41c9a3ceb7 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStoreFloating.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStoreFloating.cpp
@@ -172,6 +172,11 @@ void Jit64::stfd(UGeckoInstruction inst)
int s = inst.RS;
int a = inst.RA;
+ if (!a)
+ {
+ Default(inst);
+ return;
+ }
u32 mem_mask = Memory::ADDR_MASK_HW_ACCESS;
if (Core::g_CoreStartupParameter.bMMU ||
@@ -219,13 +224,14 @@ void Jit64::stfd(UGeckoInstruction inst)
// Safe but slow routine
MOVAPD(XMM0, fpr.R(s));
+ PSRLQ(XMM0, 32);
MOVD_xmm(R(EAX), XMM0);
- SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 4);
+ SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 0);
- PSRLQ(XMM0, 32);
+ MOVAPD(XMM0, fpr.R(s));
MOVD_xmm(R(EAX), XMM0);
LEA(32, ABI_PARAM1, MDisp(gpr.R(a).GetSimpleReg(), offset));
- SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 0);
+ SafeWriteRegToReg(EAX, ABI_PARAM1, 32, 4);
SetJumpTarget(exit);