mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-08 13:43:33 +01: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/Core.h"
|
||||||
#include "Core/CoreTiming.h"
|
#include "Core/CoreTiming.h"
|
||||||
|
#include "Core/PowerPC/Gekko.h"
|
||||||
#include "Core/PowerPC/JitArm64/Jit.h"
|
#include "Core/PowerPC/JitArm64/Jit.h"
|
||||||
#include "Core/PowerPC/JitArm64/JitArm64_RegCache.h"
|
#include "Core/PowerPC/JitArm64/JitArm64_RegCache.h"
|
||||||
#include "Core/PowerPC/PPCTables.h"
|
#include "Core/PowerPC/PPCTables.h"
|
||||||
@ -19,7 +20,6 @@ void JitArm64::psq_lXX(UGeckoInstruction inst)
|
|||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
JITDISABLE(bJITLoadStorePairedOff);
|
JITDISABLE(bJITLoadStorePairedOff);
|
||||||
FALLBACK_IF(jo.memcheck);
|
|
||||||
|
|
||||||
// If we have a fastmem arena, the asm routines assume address translation is on.
|
// If we have a fastmem arena, the asm routines assume address translation is on.
|
||||||
FALLBACK_IF(!js.assumeNoPairedQuantize && jo.fastmem_arena && !MSR.DR);
|
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 i = indexed ? inst.Ix : inst.I;
|
||||||
const int w = indexed ? inst.Wx : inst.W;
|
const int w = indexed ? inst.Wx : inst.W;
|
||||||
|
|
||||||
|
FALLBACK_IF(jo.memcheck && update);
|
||||||
|
|
||||||
gpr.Lock(ARM64Reg::W0, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W0, ARM64Reg::W30);
|
||||||
fpr.Lock(ARM64Reg::Q0);
|
fpr.Lock(ARM64Reg::Q0);
|
||||||
if (!js.assumeNoPairedQuantize)
|
if (!js.assumeNoPairedQuantize)
|
||||||
@ -47,7 +49,7 @@ void JitArm64::psq_lXX(UGeckoInstruction inst)
|
|||||||
constexpr ARM64Reg addr_reg = ARM64Reg::W0;
|
constexpr ARM64Reg addr_reg = ARM64Reg::W0;
|
||||||
constexpr ARM64Reg scale_reg = ARM64Reg::W1;
|
constexpr ARM64Reg scale_reg = ARM64Reg::W1;
|
||||||
constexpr ARM64Reg type_reg = ARM64Reg::W2;
|
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
|
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
|
// Wipe the registers we are using as temporaries
|
||||||
gprs_in_use[DecodeReg(ARM64Reg::W0)] = false;
|
gprs_in_use[DecodeReg(ARM64Reg::W0)] = false;
|
||||||
fprs_in_use[DecodeReg(ARM64Reg::Q0)] = 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;
|
u32 flags = BackPatchInfo::FLAG_LOAD | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_32;
|
||||||
if (!w)
|
if (!w)
|
||||||
@ -99,6 +102,8 @@ void JitArm64::psq_lXX(UGeckoInstruction inst)
|
|||||||
LDR(EncodeRegTo64(type_reg), ARM64Reg::X30, ArithOption(EncodeRegTo64(type_reg), true));
|
LDR(EncodeRegTo64(type_reg), ARM64Reg::X30, ArithOption(EncodeRegTo64(type_reg), true));
|
||||||
BLR(EncodeRegTo64(type_reg));
|
BLR(EncodeRegTo64(type_reg));
|
||||||
|
|
||||||
|
WriteConditionalExceptionExit(EXCEPTION_DSI, ARM64Reg::X30, ARM64Reg::Q1);
|
||||||
|
|
||||||
m_float_emit.ORR(EncodeRegToDouble(VS), ARM64Reg::D0, ARM64Reg::D0);
|
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);
|
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);
|
gpr.Unlock(ARM64Reg::W0, ARM64Reg::W30);
|
||||||
fpr.Unlock(ARM64Reg::Q0);
|
fpr.Unlock(ARM64Reg::Q0);
|
||||||
if (!js.assumeNoPairedQuantize)
|
if (!js.assumeNoPairedQuantize)
|
||||||
@ -121,7 +129,6 @@ void JitArm64::psq_stXX(UGeckoInstruction inst)
|
|||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
JITDISABLE(bJITLoadStorePairedOff);
|
JITDISABLE(bJITLoadStorePairedOff);
|
||||||
FALLBACK_IF(jo.memcheck);
|
|
||||||
|
|
||||||
// If we have a fastmem arena, the asm routines assume address translation is on.
|
// If we have a fastmem arena, the asm routines assume address translation is on.
|
||||||
FALLBACK_IF(!js.assumeNoPairedQuantize && jo.fastmem_arena && !MSR.DR);
|
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 i = indexed ? inst.Ix : inst.I;
|
||||||
const int w = indexed ? inst.Wx : inst.W;
|
const int w = indexed ? inst.Wx : inst.W;
|
||||||
|
|
||||||
|
FALLBACK_IF(jo.memcheck && update);
|
||||||
|
|
||||||
if (!js.assumeNoPairedQuantize)
|
if (!js.assumeNoPairedQuantize)
|
||||||
fpr.Lock(ARM64Reg::Q0, ARM64Reg::Q1);
|
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);
|
MOVP2R(ARM64Reg::X30, w ? single_store_quantized : paired_store_quantized);
|
||||||
LDR(EncodeRegTo64(type_reg), ARM64Reg::X30, ArithOption(EncodeRegTo64(type_reg), true));
|
LDR(EncodeRegTo64(type_reg), ARM64Reg::X30, ArithOption(EncodeRegTo64(type_reg), true));
|
||||||
BLR(EncodeRegTo64(type_reg));
|
BLR(EncodeRegTo64(type_reg));
|
||||||
|
|
||||||
|
WriteConditionalExceptionExit(EXCEPTION_DSI, ARM64Reg::X30, ARM64Reg::Q1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (js.assumeNoPairedQuantize && !have_single)
|
if (js.assumeNoPairedQuantize && !have_single)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user