diff options
| author | Soren Jorvang <soren.jorvang@gmail.com> | 2010-08-02 10:36:33 +0000 |
|---|---|---|
| committer | Soren Jorvang <soren.jorvang@gmail.com> | 2010-08-02 10:36:33 +0000 |
| commit | bbc69a64ad1dfe1075b228018ddd51cf56229f6e (patch) | |
| tree | 7a138e23466e05087c2c776be0f7e375b1114729 /Source/Core | |
| parent | fcf2fb2b9bbf13748b560f96d276798d40f8e1fd (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.cpp | 33 |
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(); } |
