summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorSoren Jorvang <soren.jorvang@gmail.com>2010-08-02 10:36:33 +0000
committerSoren Jorvang <soren.jorvang@gmail.com>2010-08-02 10:36:33 +0000
commitbbc69a64ad1dfe1075b228018ddd51cf56229f6e (patch)
tree7a138e23466e05087c2c776be0f7e375b1114729 /Source/Core
parentfcf2fb2b9bbf13748b560f96d276798d40f8e1fd (diff)
Revert parts of r6032 that break OS X and probably other non-Windows
platforms as well. It would seem that ABI_PARAMx will have to be used more consistently elsewhere to match up with a change to use them here. Not sure yet why I still need the final section of Jit64::stX. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6035 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp33
1 files changed, 24 insertions, 9 deletions
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp
index 097ec7e4a8..ca0bcc1513 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp
@@ -412,14 +412,12 @@ void Jit64::stX(UGeckoInstruction inst)
//Still here? Do regular path.
- gpr.FlushLockX(ABI_PARAM1, ABI_PARAM2);
- gpr.Lock(s, a);
- if (update && offset)
- gpr.LoadToX64(a, true, true);
- MOV(32, R(ABI_PARAM2), gpr.R(a));
- MOV(32, R(ABI_PARAM1), gpr.R(s));
- SafeWriteRegToReg(ABI_PARAM1, ABI_PARAM2, accessSize, offset);
-
+ gpr.FlushLockX(ECX, EDX);
+ gpr.Lock(a);
+ MOV(32, R(EDX), gpr.R(a));
+ MOV(32, R(ECX), gpr.R(s));
+ if (offset)
+ ADD(32, R(EDX), Imm32((u32)offset));
if (update && offset)
{
MEMCHECK_START
@@ -428,7 +426,24 @@ void Jit64::stX(UGeckoInstruction inst)
MEMCHECK_END
}
-
+ TEST(32, R(EDX), Imm32(0x0C000000));
+ FixupBranch unsafe_addr = J_CC(CC_NZ);
+ BSWAP(accessSize, ECX);
+#ifdef _M_X64
+ MOV(accessSize, MComplex(RBX, EDX, SCALE_1, 0), R(ECX));
+#else
+ AND(32, R(EDX), Imm32(Memory::MEMVIEW32_MASK));
+ MOV(accessSize, MDisp(EDX, (u32)Memory::base), R(ECX));
+#endif
+ FixupBranch skip_call = J();
+ SetJumpTarget(unsafe_addr);
+ switch (accessSize)
+ {
+ case 32: ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U32, 2), ECX, EDX); break;
+ case 16: ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U16, 2), ECX, EDX); break;
+ case 8: ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U8, 2), ECX, EDX); break;
+ }
+ SetJumpTarget(skip_call);
gpr.UnlockAll();
gpr.UnlockAllX();
}