diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp index ca0bcc1513..e553bf5609 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_LoadStore.cpp @@ -413,37 +413,22 @@ void Jit64::stX(UGeckoInstruction inst) //Still here? Do regular path. gpr.FlushLockX(ECX, EDX); - gpr.Lock(a); + gpr.Lock(s, a); + if (update && offset) + gpr.LoadToX64(a, true, true); MOV(32, R(EDX), gpr.R(a)); MOV(32, R(ECX), gpr.R(s)); - if (offset) - ADD(32, R(EDX), Imm32((u32)offset)); + SafeWriteRegToReg(ECX, EDX, accessSize, offset); + if (update && offset) { MEMCHECK_START - ADD(32, gpr.R(a), Imm32(offset)); + ADD(32, gpr.R(a), Imm32((u32)offset)); 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(); } diff --git a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp index 22d80c5cc4..3f5d39a364 100644 --- a/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp +++ b/Source/Core/Core/Src/PowerPC/JitCommon/Jit_Util.cpp @@ -175,11 +175,7 @@ void EmuCodeBlock::SafeWriteRegToReg(X64Reg reg_value, X64Reg reg_addr, int acce case 8: ABI_CallFunctionRR(thunks.ProtectFunction((void *)&Memory::Write_U8, 2), reg_value, reg_addr); break; } FixupBranch exit = J(); - - if (!Core::g_CoreStartupParameter.bMMU || Core::g_CoreStartupParameter.bUseFastMem) - { - SetJumpTarget(fast); - } + SetJumpTarget(fast); UnsafeWriteRegToReg(reg_value, reg_addr, accessSize, 0, swap); SetJumpTarget(exit); }