From 61c73061e93309640923e537408bd4c4fa2b7fdf Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 12 Oct 2021 17:32:57 +0200 Subject: [PATCH] JitArm64: Implement memcheck for psq_lXX/psq_stXX without update --- .../JitArm64/JitArm64_LoadStorePaired.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStorePaired.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStorePaired.cpp index 141db6f487..7f22e5e8fc 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStorePaired.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStorePaired.cpp @@ -8,6 +8,7 @@ #include "Core/Core.h" #include "Core/CoreTiming.h" +#include "Core/PowerPC/Gekko.h" #include "Core/PowerPC/JitArm64/Jit.h" #include "Core/PowerPC/JitArm64/JitArm64_RegCache.h" #include "Core/PowerPC/PPCTables.h" @@ -19,7 +20,6 @@ void JitArm64::psq_lXX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(bJITLoadStorePairedOff); - FALLBACK_IF(jo.memcheck); // If we have a fastmem arena, the asm routines assume address translation is on. FALLBACK_IF(!js.assumeNoPairedQuantize && jo.fastmem_arena && !MSR.DR); @@ -36,6 +36,8 @@ void JitArm64::psq_lXX(UGeckoInstruction inst) const int i = indexed ? inst.Ix : inst.I; const int w = indexed ? inst.Wx : inst.W; + FALLBACK_IF(jo.memcheck && update); + gpr.Lock(ARM64Reg::W0, ARM64Reg::W30); fpr.Lock(ARM64Reg::Q0); if (!js.assumeNoPairedQuantize) @@ -47,7 +49,7 @@ void JitArm64::psq_lXX(UGeckoInstruction inst) constexpr ARM64Reg addr_reg = ARM64Reg::W0; constexpr ARM64Reg scale_reg = ARM64Reg::W1; constexpr ARM64Reg type_reg = ARM64Reg::W2; - ARM64Reg VS = fpr.RW(inst.RS, RegType::Single); + ARM64Reg VS = fpr.RW(inst.RS, RegType::Single, false); if (inst.RA || update) // Always uses the register on update { @@ -80,7 +82,8 @@ void JitArm64::psq_lXX(UGeckoInstruction inst) // Wipe the registers we are using as temporaries gprs_in_use[DecodeReg(ARM64Reg::W0)] = false; fprs_in_use[DecodeReg(ARM64Reg::Q0)] = false; - fprs_in_use[DecodeReg(VS)] = 0; + if (!jo.memcheck) + fprs_in_use[DecodeReg(VS)] = 0; u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_32; if (!w) @@ -99,6 +102,8 @@ void JitArm64::psq_lXX(UGeckoInstruction inst) LDR(EncodeRegTo64(type_reg), ARM64Reg::X30, ArithOption(EncodeRegTo64(type_reg), true)); BLR(EncodeRegTo64(type_reg)); + WriteConditionalExceptionExit(EXCEPTION_DSI, ARM64Reg::X30, ARM64Reg::Q1); + m_float_emit.ORR(EncodeRegToDouble(VS), ARM64Reg::D0, ARM64Reg::D0); } @@ -108,6 +113,9 @@ void JitArm64::psq_lXX(UGeckoInstruction inst) m_float_emit.INS(32, VS, 1, ARM64Reg::Q0, 0); } + const ARM64Reg VS_again = fpr.RW(inst.RS, RegType::Single, true); + ASSERT(VS == VS_again); + gpr.Unlock(ARM64Reg::W0, ARM64Reg::W30); fpr.Unlock(ARM64Reg::Q0); if (!js.assumeNoPairedQuantize) @@ -121,7 +129,6 @@ void JitArm64::psq_stXX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(bJITLoadStorePairedOff); - FALLBACK_IF(jo.memcheck); // If we have a fastmem arena, the asm routines assume address translation is on. FALLBACK_IF(!js.assumeNoPairedQuantize && jo.fastmem_arena && !MSR.DR); @@ -137,6 +144,8 @@ void JitArm64::psq_stXX(UGeckoInstruction inst) const int i = indexed ? inst.Ix : inst.I; const int w = indexed ? inst.Wx : inst.W; + FALLBACK_IF(jo.memcheck && update); + if (!js.assumeNoPairedQuantize) fpr.Lock(ARM64Reg::Q0, ARM64Reg::Q1); @@ -229,6 +238,8 @@ void JitArm64::psq_stXX(UGeckoInstruction inst) MOVP2R(ARM64Reg::X30, w ? single_store_quantized : paired_store_quantized); LDR(EncodeRegTo64(type_reg), ARM64Reg::X30, ArithOption(EncodeRegTo64(type_reg), true)); BLR(EncodeRegTo64(type_reg)); + + WriteConditionalExceptionExit(EXCEPTION_DSI, ARM64Reg::X30, ARM64Reg::Q1); } if (js.assumeNoPairedQuantize && !have_single)