mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-09-12 04:22:15 +00:00
JitArm64: Remove now unnecessary locking of temp registers
This commit is contained in:
parent
cc33510577
commit
c9e6171d04
3 changed files with 36 additions and 78 deletions
|
@ -31,7 +31,7 @@ void JitArm64::SafeLoadToReg(u32 dest, s32 addr, s32 offsetReg, u32 flags, s32 o
|
||||||
{
|
{
|
||||||
// We want to make sure to not get LR as a temp register
|
// We want to make sure to not get LR as a temp register
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
||||||
if (jo.memcheck || !jo.fastmem)
|
if (jo.memcheck)
|
||||||
gpr.Lock(ARM64Reg::W0);
|
gpr.Lock(ARM64Reg::W0);
|
||||||
|
|
||||||
gpr.BindToRegister(dest, dest == (u32)addr || dest == (u32)offsetReg, false);
|
gpr.BindToRegister(dest, dest == (u32)addr || dest == (u32)offsetReg, false);
|
||||||
|
@ -127,7 +127,7 @@ void JitArm64::SafeLoadToReg(u32 dest, s32 addr, s32 offsetReg, u32 flags, s32 o
|
||||||
BitSet32 scratch_fprs;
|
BitSet32 scratch_fprs;
|
||||||
if (!update || early_update)
|
if (!update || early_update)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
||||||
if (jo.memcheck || !jo.fastmem)
|
if (jo.memcheck)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
||||||
if (!jo.memcheck)
|
if (!jo.memcheck)
|
||||||
scratch_gprs[DecodeReg(dest_reg)] = true;
|
scratch_gprs[DecodeReg(dest_reg)] = true;
|
||||||
|
@ -170,7 +170,7 @@ void JitArm64::SafeLoadToReg(u32 dest, s32 addr, s32 offsetReg, u32 flags, s32 o
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30);
|
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30);
|
||||||
if (jo.memcheck || !jo.fastmem)
|
if (jo.memcheck)
|
||||||
gpr.Unlock(ARM64Reg::W0);
|
gpr.Unlock(ARM64Reg::W0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,9 +178,7 @@ void JitArm64::SafeStoreFromReg(s32 dest, u32 value, s32 regOffset, u32 flags, s
|
||||||
bool update)
|
bool update)
|
||||||
{
|
{
|
||||||
// We want to make sure to not get LR as a temp register
|
// We want to make sure to not get LR as a temp register
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W2, ARM64Reg::W30);
|
||||||
if (!jo.fastmem)
|
|
||||||
gpr.Lock(ARM64Reg::W0);
|
|
||||||
|
|
||||||
// Don't materialize zero.
|
// Don't materialize zero.
|
||||||
ARM64Reg RS = gpr.IsImm(value, 0) ? ARM64Reg::WZR : gpr.R(value);
|
ARM64Reg RS = gpr.IsImm(value, 0) ? ARM64Reg::WZR : gpr.R(value);
|
||||||
|
@ -274,11 +272,8 @@ void JitArm64::SafeStoreFromReg(s32 dest, u32 value, s32 regOffset, u32 flags, s
|
||||||
|
|
||||||
BitSet32 scratch_gprs;
|
BitSet32 scratch_gprs;
|
||||||
BitSet32 scratch_fprs;
|
BitSet32 scratch_fprs;
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
|
||||||
if (!update || early_update)
|
if (!update || early_update)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W2)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W2)] = true;
|
||||||
if (!jo.fastmem)
|
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
|
||||||
|
|
||||||
u32 access_size = BackPatchInfo::GetFlagSize(flags);
|
u32 access_size = BackPatchInfo::GetFlagSize(flags);
|
||||||
u32 mmio_address = 0;
|
u32 mmio_address = 0;
|
||||||
|
@ -319,7 +314,6 @@ void JitArm64::SafeStoreFromReg(s32 dest, u32 value, s32 regOffset, u32 flags, s
|
||||||
}
|
}
|
||||||
else if (mmio_address)
|
else if (mmio_address)
|
||||||
{
|
{
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W2)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W2)] = true;
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W30)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W30)] = true;
|
||||||
scratch_gprs[DecodeReg(RS)] = true;
|
scratch_gprs[DecodeReg(RS)] = true;
|
||||||
|
@ -341,9 +335,7 @@ void JitArm64::SafeStoreFromReg(s32 dest, u32 value, s32 regOffset, u32 flags, s
|
||||||
MOV(gpr.R(dest), addr_reg);
|
MOV(gpr.R(dest), addr_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W30);
|
gpr.Unlock(ARM64Reg::W2, ARM64Reg::W30);
|
||||||
if (!jo.fastmem)
|
|
||||||
gpr.Unlock(ARM64Reg::W0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FixupBranch JitArm64::BATAddressLookup(ARM64Reg addr_out, ARM64Reg addr_in, ARM64Reg tmp,
|
FixupBranch JitArm64::BATAddressLookup(ARM64Reg addr_out, ARM64Reg addr_in, ARM64Reg tmp,
|
||||||
|
@ -526,7 +518,7 @@ void JitArm64::lmw(UGeckoInstruction inst)
|
||||||
s32 offset = inst.SIMM_16;
|
s32 offset = inst.SIMM_16;
|
||||||
|
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
||||||
if (jo.memcheck || !jo.fastmem)
|
if (jo.memcheck)
|
||||||
gpr.Lock(ARM64Reg::W0);
|
gpr.Lock(ARM64Reg::W0);
|
||||||
|
|
||||||
// MMU games make use of a >= d despite this being invalid according to the PEM.
|
// MMU games make use of a >= d despite this being invalid according to the PEM.
|
||||||
|
@ -598,7 +590,7 @@ void JitArm64::lmw(UGeckoInstruction inst)
|
||||||
BitSet32 scratch_gprs;
|
BitSet32 scratch_gprs;
|
||||||
BitSet32 scratch_fprs;
|
BitSet32 scratch_fprs;
|
||||||
scratch_gprs[DecodeReg(addr_reg)] = true;
|
scratch_gprs[DecodeReg(addr_reg)] = true;
|
||||||
if (jo.memcheck || !jo.fastmem)
|
if (jo.memcheck)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
||||||
if (!jo.memcheck)
|
if (!jo.memcheck)
|
||||||
scratch_gprs[DecodeReg(dest_reg)] = true;
|
scratch_gprs[DecodeReg(dest_reg)] = true;
|
||||||
|
@ -633,7 +625,7 @@ void JitArm64::lmw(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30);
|
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30);
|
||||||
if (jo.memcheck || !jo.fastmem)
|
if (jo.memcheck)
|
||||||
gpr.Unlock(ARM64Reg::W0);
|
gpr.Unlock(ARM64Reg::W0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -645,9 +637,7 @@ void JitArm64::stmw(UGeckoInstruction inst)
|
||||||
u32 a = inst.RA, s = inst.RS;
|
u32 a = inst.RA, s = inst.RS;
|
||||||
s32 offset = inst.SIMM_16;
|
s32 offset = inst.SIMM_16;
|
||||||
|
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W2, ARM64Reg::W30);
|
||||||
if (!jo.fastmem)
|
|
||||||
gpr.Lock(ARM64Reg::W0);
|
|
||||||
|
|
||||||
ARM64Reg addr_reg = ARM64Reg::W2;
|
ARM64Reg addr_reg = ARM64Reg::W2;
|
||||||
bool a_is_addr_base_reg = false;
|
bool a_is_addr_base_reg = false;
|
||||||
|
@ -715,10 +705,7 @@ void JitArm64::stmw(UGeckoInstruction inst)
|
||||||
|
|
||||||
BitSet32 scratch_gprs;
|
BitSet32 scratch_gprs;
|
||||||
BitSet32 scratch_fprs;
|
BitSet32 scratch_fprs;
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
|
||||||
scratch_gprs[DecodeReg(addr_reg)] = true;
|
scratch_gprs[DecodeReg(addr_reg)] = true;
|
||||||
if (!jo.fastmem)
|
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
|
||||||
|
|
||||||
EmitBackpatchRoutine(flags, MemAccessMode::Auto, src_reg, EncodeRegTo64(addr_reg), scratch_gprs,
|
EmitBackpatchRoutine(flags, MemAccessMode::Auto, src_reg, EncodeRegTo64(addr_reg), scratch_gprs,
|
||||||
scratch_fprs);
|
scratch_fprs);
|
||||||
|
@ -753,9 +740,7 @@ void JitArm64::stmw(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W30);
|
gpr.Unlock(ARM64Reg::W2, ARM64Reg::W30);
|
||||||
if (!jo.fastmem)
|
|
||||||
gpr.Unlock(ARM64Reg::W0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JitArm64::dcbx(UGeckoInstruction inst)
|
void JitArm64::dcbx(UGeckoInstruction inst)
|
||||||
|
@ -975,14 +960,8 @@ void JitArm64::dcbz(UGeckoInstruction inst)
|
||||||
int a = inst.RA, b = inst.RB;
|
int a = inst.RA, b = inst.RB;
|
||||||
|
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
||||||
if (!jo.fastmem)
|
|
||||||
gpr.Lock(ARM64Reg::W0);
|
|
||||||
|
|
||||||
Common::ScopeGuard register_guard([&] {
|
Common::ScopeGuard register_guard([&] { gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30); });
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30);
|
|
||||||
if (!jo.fastmem)
|
|
||||||
gpr.Unlock(ARM64Reg::W0);
|
|
||||||
});
|
|
||||||
|
|
||||||
constexpr ARM64Reg addr_reg = ARM64Reg::W1;
|
constexpr ARM64Reg addr_reg = ARM64Reg::W1;
|
||||||
constexpr ARM64Reg temp_reg = ARM64Reg::W30;
|
constexpr ARM64Reg temp_reg = ARM64Reg::W30;
|
||||||
|
@ -1049,8 +1028,6 @@ void JitArm64::dcbz(UGeckoInstruction inst)
|
||||||
BitSet32 scratch_gprs;
|
BitSet32 scratch_gprs;
|
||||||
BitSet32 scratch_fprs;
|
BitSet32 scratch_fprs;
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
||||||
if (!jo.fastmem)
|
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
|
||||||
|
|
||||||
EmitBackpatchRoutine(BackPatchInfo::FLAG_ZERO_256, MemAccessMode::Auto, ARM64Reg::W1,
|
EmitBackpatchRoutine(BackPatchInfo::FLAG_ZERO_256, MemAccessMode::Auto, ARM64Reg::W1,
|
||||||
EncodeRegTo64(addr_reg), scratch_gprs, scratch_fprs);
|
EncodeRegTo64(addr_reg), scratch_gprs, scratch_fprs);
|
||||||
|
|
|
@ -78,8 +78,7 @@ void JitArm64::lfXX(UGeckoInstruction inst)
|
||||||
(flags & BackPatchInfo::FLAG_SIZE_64) != 0 ? RegType::LowerPair : RegType::DuplicatedSingle;
|
(flags & BackPatchInfo::FLAG_SIZE_64) != 0 ? RegType::LowerPair : RegType::DuplicatedSingle;
|
||||||
|
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
||||||
fpr.Lock(ARM64Reg::Q0);
|
if (jo.memcheck)
|
||||||
if (jo.memcheck || !jo.fastmem)
|
|
||||||
gpr.Lock(ARM64Reg::W0);
|
gpr.Lock(ARM64Reg::W0);
|
||||||
|
|
||||||
const ARM64Reg VD = fpr.RW(inst.FD, type, false);
|
const ARM64Reg VD = fpr.RW(inst.FD, type, false);
|
||||||
|
@ -168,9 +167,8 @@ void JitArm64::lfXX(UGeckoInstruction inst)
|
||||||
BitSet32 scratch_fprs;
|
BitSet32 scratch_fprs;
|
||||||
if (!update || early_update)
|
if (!update || early_update)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
||||||
if (jo.memcheck || !jo.fastmem)
|
if (jo.memcheck)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::Q0)] = true;
|
|
||||||
if (!jo.memcheck)
|
if (!jo.memcheck)
|
||||||
scratch_fprs[DecodeReg(VD)] = true;
|
scratch_fprs[DecodeReg(VD)] = true;
|
||||||
|
|
||||||
|
@ -194,8 +192,7 @@ void JitArm64::lfXX(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30);
|
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30);
|
||||||
fpr.Unlock(ARM64Reg::Q0);
|
if (jo.memcheck)
|
||||||
if (jo.memcheck || !jo.fastmem)
|
|
||||||
gpr.Unlock(ARM64Reg::W0);
|
gpr.Unlock(ARM64Reg::W0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,8 +262,6 @@ void JitArm64::stfXX(UGeckoInstruction inst)
|
||||||
u32 imm_addr = 0;
|
u32 imm_addr = 0;
|
||||||
bool is_immediate = false;
|
bool is_immediate = false;
|
||||||
|
|
||||||
fpr.Lock(ARM64Reg::Q0);
|
|
||||||
|
|
||||||
const bool have_single = fpr.IsSingle(inst.FS, true);
|
const bool have_single = fpr.IsSingle(inst.FS, true);
|
||||||
|
|
||||||
Arm64FPRCache::ScopedARM64Reg V0 =
|
Arm64FPRCache::ScopedARM64Reg V0 =
|
||||||
|
@ -279,9 +274,7 @@ void JitArm64::stfXX(UGeckoInstruction inst)
|
||||||
V0 = std::move(single_reg);
|
V0 = std::move(single_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W2, ARM64Reg::W30);
|
||||||
if (!jo.fastmem)
|
|
||||||
gpr.Lock(ARM64Reg::W0);
|
|
||||||
|
|
||||||
ARM64Reg addr_reg = ARM64Reg::W2;
|
ARM64Reg addr_reg = ARM64Reg::W2;
|
||||||
|
|
||||||
|
@ -370,12 +363,8 @@ void JitArm64::stfXX(UGeckoInstruction inst)
|
||||||
|
|
||||||
BitSet32 scratch_gprs;
|
BitSet32 scratch_gprs;
|
||||||
BitSet32 scratch_fprs;
|
BitSet32 scratch_fprs;
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
|
||||||
if (!update || early_update)
|
if (!update || early_update)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W2)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W2)] = true;
|
||||||
if (!jo.fastmem)
|
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
|
||||||
scratch_fprs[DecodeReg(ARM64Reg::Q0)] = true;
|
|
||||||
|
|
||||||
if (is_immediate)
|
if (is_immediate)
|
||||||
{
|
{
|
||||||
|
@ -426,8 +415,5 @@ void JitArm64::stfXX(UGeckoInstruction inst)
|
||||||
MOV(gpr.R(a), addr_reg);
|
MOV(gpr.R(a), addr_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W30);
|
gpr.Unlock(ARM64Reg::W2, ARM64Reg::W30);
|
||||||
fpr.Unlock(ARM64Reg::Q0);
|
|
||||||
if (!jo.fastmem)
|
|
||||||
gpr.Unlock(ARM64Reg::W0);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,13 +39,12 @@ void JitArm64::psq_lXX(UGeckoInstruction inst)
|
||||||
const int w = indexed ? inst.Wx : inst.W;
|
const int w = indexed ? inst.Wx : inst.W;
|
||||||
|
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W1, ARM64Reg::W30);
|
||||||
fpr.Lock(ARM64Reg::Q0);
|
|
||||||
if (!js.assumeNoPairedQuantize)
|
if (!js.assumeNoPairedQuantize)
|
||||||
{
|
{
|
||||||
gpr.Lock(ARM64Reg::W0, ARM64Reg::W2, ARM64Reg::W3);
|
gpr.Lock(ARM64Reg::W0, ARM64Reg::W2, ARM64Reg::W3);
|
||||||
fpr.Lock(ARM64Reg::Q1);
|
fpr.Lock(ARM64Reg::Q0, ARM64Reg::Q1);
|
||||||
}
|
}
|
||||||
else if (jo.memcheck || !jo.fastmem)
|
else if (jo.memcheck)
|
||||||
{
|
{
|
||||||
gpr.Lock(ARM64Reg::W0);
|
gpr.Lock(ARM64Reg::W0);
|
||||||
}
|
}
|
||||||
|
@ -84,9 +83,8 @@ void JitArm64::psq_lXX(UGeckoInstruction inst)
|
||||||
|
|
||||||
if (!update || early_update)
|
if (!update || early_update)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
||||||
if (jo.memcheck || !jo.fastmem)
|
if (jo.memcheck)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
||||||
scratch_fprs[DecodeReg(ARM64Reg::Q0)] = true;
|
|
||||||
if (!jo.memcheck)
|
if (!jo.memcheck)
|
||||||
scratch_fprs[DecodeReg(VS)] = true;
|
scratch_fprs[DecodeReg(VS)] = true;
|
||||||
|
|
||||||
|
@ -133,13 +131,12 @@ void JitArm64::psq_lXX(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30);
|
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W30);
|
||||||
fpr.Unlock(ARM64Reg::Q0);
|
|
||||||
if (!js.assumeNoPairedQuantize)
|
if (!js.assumeNoPairedQuantize)
|
||||||
{
|
{
|
||||||
gpr.Unlock(ARM64Reg::W0, ARM64Reg::W2, ARM64Reg::W3);
|
gpr.Unlock(ARM64Reg::W0, ARM64Reg::W2, ARM64Reg::W3);
|
||||||
fpr.Unlock(ARM64Reg::Q1);
|
fpr.Unlock(ARM64Reg::Q0, ARM64Reg::Q1);
|
||||||
}
|
}
|
||||||
else if (jo.memcheck || !jo.fastmem)
|
else if (jo.memcheck)
|
||||||
{
|
{
|
||||||
gpr.Unlock(ARM64Reg::W0);
|
gpr.Unlock(ARM64Reg::W0);
|
||||||
}
|
}
|
||||||
|
@ -166,9 +163,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;
|
||||||
|
|
||||||
fpr.Lock(ARM64Reg::Q0);
|
|
||||||
if (!js.assumeNoPairedQuantize)
|
if (!js.assumeNoPairedQuantize)
|
||||||
fpr.Lock(ARM64Reg::Q1);
|
fpr.Lock(ARM64Reg::Q0, ARM64Reg::Q1);
|
||||||
|
|
||||||
const bool have_single = fpr.IsSingle(inst.RS);
|
const bool have_single = fpr.IsSingle(inst.RS);
|
||||||
|
|
||||||
|
@ -204,11 +200,13 @@ void JitArm64::psq_stXX(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Lock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W30);
|
gpr.Lock(ARM64Reg::W2, ARM64Reg::W30);
|
||||||
if (!js.assumeNoPairedQuantize || !jo.fastmem)
|
if (!js.assumeNoPairedQuantize)
|
||||||
gpr.Lock(ARM64Reg::W0);
|
{
|
||||||
if (!js.assumeNoPairedQuantize && !jo.fastmem)
|
gpr.Lock(ARM64Reg::W0, ARM64Reg::W1);
|
||||||
gpr.Lock(ARM64Reg::W3);
|
if (!jo.fastmem)
|
||||||
|
gpr.Lock(ARM64Reg::W3);
|
||||||
|
}
|
||||||
|
|
||||||
constexpr ARM64Reg type_reg = ARM64Reg::W0;
|
constexpr ARM64Reg type_reg = ARM64Reg::W0;
|
||||||
constexpr ARM64Reg scale_reg = ARM64Reg::W1;
|
constexpr ARM64Reg scale_reg = ARM64Reg::W1;
|
||||||
|
@ -241,11 +239,8 @@ void JitArm64::psq_stXX(UGeckoInstruction inst)
|
||||||
BitSet32 scratch_gprs;
|
BitSet32 scratch_gprs;
|
||||||
BitSet32 scratch_fprs;
|
BitSet32 scratch_fprs;
|
||||||
|
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W1)] = true;
|
|
||||||
if (!update || early_update)
|
if (!update || early_update)
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W2)] = true;
|
scratch_gprs[DecodeReg(ARM64Reg::W2)] = true;
|
||||||
if (!jo.fastmem)
|
|
||||||
scratch_gprs[DecodeReg(ARM64Reg::W0)] = true;
|
|
||||||
|
|
||||||
u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_32;
|
u32 flags = BackPatchInfo::FLAG_STORE | BackPatchInfo::FLAG_FLOAT | BackPatchInfo::FLAG_SIZE_32;
|
||||||
if (!w)
|
if (!w)
|
||||||
|
@ -278,12 +273,12 @@ void JitArm64::psq_stXX(UGeckoInstruction inst)
|
||||||
MOV(gpr.R(inst.RA), addr_reg);
|
MOV(gpr.R(inst.RA), addr_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(ARM64Reg::W1, ARM64Reg::W2, ARM64Reg::W30);
|
gpr.Unlock(ARM64Reg::W2, ARM64Reg::W30);
|
||||||
fpr.Unlock(ARM64Reg::Q0);
|
|
||||||
if (!js.assumeNoPairedQuantize || !jo.fastmem)
|
|
||||||
gpr.Unlock(ARM64Reg::W0);
|
|
||||||
if (!js.assumeNoPairedQuantize && !jo.fastmem)
|
|
||||||
gpr.Unlock(ARM64Reg::W3);
|
|
||||||
if (!js.assumeNoPairedQuantize)
|
if (!js.assumeNoPairedQuantize)
|
||||||
fpr.Unlock(ARM64Reg::Q1);
|
{
|
||||||
|
gpr.Unlock(ARM64Reg::W0, ARM64Reg::W1);
|
||||||
|
if (!jo.fastmem)
|
||||||
|
gpr.Unlock(ARM64Reg::W3);
|
||||||
|
fpr.Unlock(ARM64Reg::Q0, ARM64Reg::Q1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue