mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-25 23:29:44 -06:00
Merge pull request #2921 from Sonicadvance1/aarch64_optimize_lmw
[AArch64] Optimize lmw.
This commit is contained in:
@ -543,16 +543,47 @@ void JitArm64::lmw(UGeckoInstruction inst)
|
|||||||
MOVI2R(WA, (u32)(s32)(s16)inst.SIMM_16);
|
MOVI2R(WA, (u32)(s32)(s16)inst.SIMM_16);
|
||||||
}
|
}
|
||||||
|
|
||||||
u8* base = UReg_MSR(MSR).DR ? Memory::logical_base : Memory::physical_base;
|
ADD(XA, XA, X28);
|
||||||
MOVK(XA, ((u64)base >> 32) & 0xFFFF, SHIFT_32);
|
|
||||||
|
|
||||||
for (int i = inst.RD; i < 32; i++)
|
for (int i = inst.RD; i < 32; i++)
|
||||||
|
{
|
||||||
|
int remaining = 32 - i;
|
||||||
|
if (remaining >= 4)
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(i + 3, false);
|
||||||
|
gpr.BindToRegister(i + 2, false);
|
||||||
|
gpr.BindToRegister(i + 1, false);
|
||||||
|
gpr.BindToRegister(i, false);
|
||||||
|
ARM64Reg RX4 = gpr.R(i + 3);
|
||||||
|
ARM64Reg RX3 = gpr.R(i + 2);
|
||||||
|
ARM64Reg RX2 = gpr.R(i + 1);
|
||||||
|
ARM64Reg RX1 = gpr.R(i);
|
||||||
|
LDP(INDEX_POST, EncodeRegTo64(RX1), EncodeRegTo64(RX3), XA, 16);
|
||||||
|
REV32(EncodeRegTo64(RX1), EncodeRegTo64(RX1));
|
||||||
|
REV32(EncodeRegTo64(RX3), EncodeRegTo64(RX3));
|
||||||
|
ORR(EncodeRegTo64(RX2), ZR, EncodeRegTo64(RX1), ArithOption(EncodeRegTo64(RX1), ST_LSR, 32));
|
||||||
|
ORR(EncodeRegTo64(RX4), ZR, EncodeRegTo64(RX3), ArithOption(EncodeRegTo64(RX3), ST_LSR, 32));
|
||||||
|
i+=3;
|
||||||
|
}
|
||||||
|
else if (remaining >= 2)
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(i + 1, false);
|
||||||
|
gpr.BindToRegister(i, false);
|
||||||
|
ARM64Reg RX2 = gpr.R(i + 1);
|
||||||
|
ARM64Reg RX1 = gpr.R(i);
|
||||||
|
LDP(INDEX_POST, RX1, RX2, XA, 8);
|
||||||
|
REV32(RX1, RX1);
|
||||||
|
REV32(RX2, RX2);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
gpr.BindToRegister(i, false);
|
gpr.BindToRegister(i, false);
|
||||||
ARM64Reg RX = gpr.R(i);
|
ARM64Reg RX = gpr.R(i);
|
||||||
LDR(INDEX_UNSIGNED, RX, XA, (i - inst.RD) * 4);
|
LDR(INDEX_POST, RX, XA, 4);
|
||||||
REV32(RX, RX);
|
REV32(RX, RX);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gpr.Unlock(WA);
|
gpr.Unlock(WA);
|
||||||
}
|
}
|
||||||
|
@ -206,6 +206,8 @@ void Arm64GPRCache::BindToRegister(u32 preg, bool do_load)
|
|||||||
{
|
{
|
||||||
OpArg& reg = m_guest_registers[preg];
|
OpArg& reg = m_guest_registers[preg];
|
||||||
|
|
||||||
|
reg.ResetLastUsed();
|
||||||
|
|
||||||
reg.SetDirty(true);
|
reg.SetDirty(true);
|
||||||
if (reg.GetType() == REG_NOTLOADED)
|
if (reg.GetType() == REG_NOTLOADED)
|
||||||
{
|
{
|
||||||
@ -331,6 +333,9 @@ void Arm64FPRCache::BindToRegister(u32 preg, bool do_load, bool only_lower)
|
|||||||
OpArg& reg = m_guest_registers[preg];
|
OpArg& reg = m_guest_registers[preg];
|
||||||
|
|
||||||
bool was_dirty = reg.IsDirty();
|
bool was_dirty = reg.IsDirty();
|
||||||
|
|
||||||
|
reg.ResetLastUsed();
|
||||||
|
|
||||||
reg.SetDirty(true);
|
reg.SetDirty(true);
|
||||||
switch (reg.GetType())
|
switch (reg.GetType())
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user