From 9a19314969d004b5c7611d4603b55bacab664f7a Mon Sep 17 00:00:00 2001 From: Fiora Date: Sat, 6 Sep 2014 12:48:58 -0700 Subject: [PATCH] JIT: make memcheck macro support an inverted mode --- Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp | 4 ++-- Source/Core/Core/PowerPC/Jit64/Jit_LoadStoreFloating.cpp | 2 +- Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp | 4 ++-- Source/Core/Core/PowerPC/JitCommon/Jit_Util.cpp | 9 +++------ Source/Core/Core/PowerPC/JitCommon/Jit_Util.h | 6 ++++-- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp index 853bae8702..fe7f94e8eb 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStore.cpp @@ -238,7 +238,7 @@ void Jit64::lXXx(UGeckoInstruction inst) if (update && storeAddress) { gpr.BindToRegister(a, true, true); - MEMCHECK_START + MEMCHECK_START(false) MOV(32, gpr.R(a), opAddress); MEMCHECK_END } @@ -413,7 +413,7 @@ void Jit64::stX(UGeckoInstruction inst) if (update && offset) { - MEMCHECK_START + MEMCHECK_START(false) gpr.KillImmediate(a, true, true); ADD(32, gpr.R(a), Imm32((u32)offset)); diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStoreFloating.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStoreFloating.cpp index 687327bb37..8090c2499e 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStoreFloating.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStoreFloating.cpp @@ -65,7 +65,7 @@ void Jit64::lfXXX(UGeckoInstruction inst) fpr.Lock(d); fpr.BindToRegister(d, js.memcheck || !single); - MEMCHECK_START + MEMCHECK_START(false) if (single) { ConvertSingleToDouble(fpr.RX(d), RSCRATCH, true); diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp index b5f1e19a61..5f87d22ecb 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_LoadStorePaired.cpp @@ -63,7 +63,7 @@ void Jit64::psq_st(UGeckoInstruction inst) if (update && offset && js.memcheck) { - MEMCHECK_START + MEMCHECK_START(false) ADD(32, gpr.R(a), Imm32((u32)offset)); MEMCHECK_END } @@ -100,7 +100,7 @@ void Jit64::psq_l(UGeckoInstruction inst) CALLptr(MScaled(RSCRATCH, SCALE_8, (u32)(u64)asm_routines.pairedLoadQuantized)); - MEMCHECK_START + MEMCHECK_START(false) CVTPS2PD(fpr.RX(s), R(XMM0)); if (update && offset && js.memcheck) { diff --git a/Source/Core/Core/PowerPC/JitCommon/Jit_Util.cpp b/Source/Core/Core/PowerPC/JitCommon/Jit_Util.cpp index c0041173ed..55b7382408 100644 --- a/Source/Core/Core/PowerPC/JitCommon/Jit_Util.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/Jit_Util.cpp @@ -318,8 +318,7 @@ void EmuCodeBlock::SafeLoadToReg(X64Reg reg_value, const Gen::OpArg & opAddress, } ABI_PopRegistersAndAdjustStack(registersInUse, 0); - MEMCHECK_START - + MEMCHECK_START(false) if (signExtend && accessSize < 32) { // Need to sign extend values coming from the Read_U* functions. @@ -329,7 +328,6 @@ void EmuCodeBlock::SafeLoadToReg(X64Reg reg_value, const Gen::OpArg & opAddress, { MOVZX(64, accessSize, reg_value, R(ABI_RETURN)); } - MEMCHECK_END } } @@ -379,8 +377,7 @@ void EmuCodeBlock::SafeLoadToReg(X64Reg reg_value, const Gen::OpArg & opAddress, } ABI_PopRegistersAndAdjustStack(registersInUse, rsp_alignment); - MEMCHECK_START - + MEMCHECK_START(false) if (signExtend && accessSize < 32) { // Need to sign extend values coming from the Read_U* functions. @@ -390,8 +387,8 @@ void EmuCodeBlock::SafeLoadToReg(X64Reg reg_value, const Gen::OpArg & opAddress, { MOVZX(64, accessSize, reg_value, R(ABI_RETURN)); } - MEMCHECK_END + if (farcode.Enabled()) { exit = J(true); diff --git a/Source/Core/Core/PowerPC/JitCommon/Jit_Util.h b/Source/Core/Core/PowerPC/JitCommon/Jit_Util.h index 0fed69871c..e004df69ce 100644 --- a/Source/Core/Core/PowerPC/JitCommon/Jit_Util.h +++ b/Source/Core/Core/PowerPC/JitCommon/Jit_Util.h @@ -11,11 +11,13 @@ namespace MMIO { class Mapping; } -#define MEMCHECK_START \ +// If inv is true, invert the check (i.e. skip over the associated code if an exception hits, +// instead of skipping over the code if an exception isn't hit). +#define MEMCHECK_START(inv) \ Gen::FixupBranch memException; \ if (jit->js.memcheck) \ { TEST(32, PPCSTATE(Exceptions), Gen::Imm32(EXCEPTION_DSI)); \ - memException = J_CC(Gen::CC_NZ, true); } + memException = J_CC((inv) ? Gen::CC_Z : Gen::CC_NZ, true); } #define MEMCHECK_END \ if (jit->js.memcheck) \