mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-10 16:19:28 +01:00
JitArm64: Read BATs in psq_l/psq_st address check
Same approach as Jit64 here as well.
This commit is contained in:
parent
93e968208e
commit
15eb56142a
@ -235,7 +235,8 @@ protected:
|
|||||||
// jumps to the returned FixupBranch. Clobbers tmp and the 17 lower bits of addr_out.
|
// jumps to the returned FixupBranch. Clobbers tmp and the 17 lower bits of addr_out.
|
||||||
Arm64Gen::FixupBranch BATAddressLookup(Arm64Gen::ARM64Reg addr_out, Arm64Gen::ARM64Reg addr_in,
|
Arm64Gen::FixupBranch BATAddressLookup(Arm64Gen::ARM64Reg addr_out, Arm64Gen::ARM64Reg addr_in,
|
||||||
Arm64Gen::ARM64Reg tmp, const void* bat_table);
|
Arm64Gen::ARM64Reg tmp, const void* bat_table);
|
||||||
Arm64Gen::FixupBranch CheckIfSafeAddress(Arm64Gen::ARM64Reg addr);
|
Arm64Gen::FixupBranch CheckIfSafeAddress(Arm64Gen::ARM64Reg addr, Arm64Gen::ARM64Reg tmp1,
|
||||||
|
Arm64Gen::ARM64Reg tmp2);
|
||||||
|
|
||||||
void DoJit(u32 em_address, JitBlock* b, u32 nextPC);
|
void DoJit(u32 em_address, JitBlock* b, u32 nextPC);
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "Common/CommonFuncs.h"
|
#include "Common/CommonFuncs.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Common/Logging/Log.h"
|
#include "Common/Logging/Log.h"
|
||||||
|
#include "Common/MathUtil.h"
|
||||||
#include "Common/StringUtil.h"
|
#include "Common/StringUtil.h"
|
||||||
#include "Common/Swap.h"
|
#include "Common/Swap.h"
|
||||||
|
|
||||||
@ -62,7 +63,12 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode, AR
|
|||||||
if (fastmem)
|
if (fastmem)
|
||||||
{
|
{
|
||||||
if (do_farcode && emitting_routine)
|
if (do_farcode && emitting_routine)
|
||||||
slowmem_fixup = CheckIfSafeAddress(addr);
|
{
|
||||||
|
const ARM64Reg temp1 = flags & BackPatchInfo::FLAG_STORE ? ARM64Reg::W0 : ARM64Reg::W3;
|
||||||
|
const ARM64Reg temp2 = ARM64Reg::W2;
|
||||||
|
|
||||||
|
slowmem_fixup = CheckIfSafeAddress(addr, temp1, temp2);
|
||||||
|
}
|
||||||
|
|
||||||
if ((flags & BackPatchInfo::FLAG_STORE) && (flags & BackPatchInfo::FLAG_FLOAT))
|
if ((flags & BackPatchInfo::FLAG_STORE) && (flags & BackPatchInfo::FLAG_FLOAT))
|
||||||
{
|
{
|
||||||
|
@ -288,11 +288,15 @@ FixupBranch JitArm64::BATAddressLookup(ARM64Reg addr_out, ARM64Reg addr_in, ARM6
|
|||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
FixupBranch JitArm64::CheckIfSafeAddress(Arm64Gen::ARM64Reg addr)
|
FixupBranch JitArm64::CheckIfSafeAddress(Arm64Gen::ARM64Reg addr, Arm64Gen::ARM64Reg tmp1,
|
||||||
|
Arm64Gen::ARM64Reg tmp2)
|
||||||
{
|
{
|
||||||
// FIXME: This doesn't correctly account for the BAT configuration.
|
tmp2 = EncodeRegTo64(tmp2);
|
||||||
TST(addr, LogicalImm(0x0c000000, 32));
|
|
||||||
FixupBranch pass = B(CC_EQ);
|
MOVP2R(tmp2, PowerPC::dbat_table.data());
|
||||||
|
LSR(tmp1, addr, PowerPC::BAT_INDEX_SHIFT);
|
||||||
|
LDR(tmp1, tmp2, ArithOption(tmp1, true));
|
||||||
|
FixupBranch pass = TBNZ(tmp1, IntLog2(PowerPC::BAT_PHYSICAL_BIT));
|
||||||
FixupBranch fail = B();
|
FixupBranch fail = B();
|
||||||
SetJumpTarget(pass);
|
SetJumpTarget(pass);
|
||||||
return fail;
|
return fail;
|
||||||
|
@ -40,7 +40,7 @@ void JitArm64::psq_lXX(UGeckoInstruction inst)
|
|||||||
fpr.Lock(ARM64Reg::Q0);
|
fpr.Lock(ARM64Reg::Q0);
|
||||||
if (!js.assumeNoPairedQuantize)
|
if (!js.assumeNoPairedQuantize)
|
||||||
{
|
{
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W2);
|
gpr.Lock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W3);
|
||||||
fpr.Lock(ARM64Reg::Q1);
|
fpr.Lock(ARM64Reg::Q1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ void JitArm64::psq_lXX(UGeckoInstruction inst)
|
|||||||
fpr.Unlock(ARM64Reg::Q0);
|
fpr.Unlock(ARM64Reg::Q0);
|
||||||
if (!js.assumeNoPairedQuantize)
|
if (!js.assumeNoPairedQuantize)
|
||||||
{
|
{
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W2);
|
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W3);
|
||||||
fpr.Unlock(ARM64Reg::Q1);
|
fpr.Unlock(ARM64Reg::Q1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -489,12 +489,13 @@ void JitArm64::GenerateQuantizedLoads()
|
|||||||
// X0 is the address
|
// X0 is the address
|
||||||
// X1 is the scale
|
// X1 is the scale
|
||||||
// X2 is a temporary
|
// X2 is a temporary
|
||||||
|
// X3 is a temporary (used in EmitBackpatchRoutine)
|
||||||
// X30 is LR
|
// X30 is LR
|
||||||
// Q0 is the return
|
// Q0 is the return
|
||||||
// Q1 is a temporary
|
// Q1 is a temporary
|
||||||
ARM64Reg addr_reg = ARM64Reg::X0;
|
ARM64Reg addr_reg = ARM64Reg::X0;
|
||||||
ARM64Reg scale_reg = ARM64Reg::X1;
|
ARM64Reg scale_reg = ARM64Reg::X1;
|
||||||
BitSet32 gprs_to_push = CALLER_SAVED_GPRS & ~BitSet32{0, 2};
|
BitSet32 gprs_to_push = CALLER_SAVED_GPRS & ~BitSet32{0, 2, 3};
|
||||||
BitSet32 fprs_to_push = BitSet32(0xFFFFFFFF) & ~BitSet32{0, 1};
|
BitSet32 fprs_to_push = BitSet32(0xFFFFFFFF) & ~BitSet32{0, 1};
|
||||||
ARM64FloatEmitter float_emit(this);
|
ARM64FloatEmitter float_emit(this);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user