mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-31 18:32:43 +00:00
JitArm64: Implement memcheck for psq_lXX/psq_stXX without update
This commit is contained in:
parent
9e43796912
commit
61c73061e9
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user