mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-09-21 11:51:48 +02:00
[ARM] Have both fastmem and non-fastmem paths for floating point loadstores because fastmem is completely broken garbage on Android at this point in time.
This commit is contained in:
parent
5866859ff0
commit
8e2e5a4e70
1 changed files with 86 additions and 28 deletions
|
@ -142,25 +142,54 @@ void JitArm::lfXX(UGeckoInstruction inst)
|
||||||
if (update)
|
if (update)
|
||||||
MOV(RA, rB);
|
MOV(RA, rB);
|
||||||
|
|
||||||
Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK)
|
if (Core::g_CoreStartupParameter.bFastmem)
|
||||||
BIC(rB, rB, mask); // 1
|
|
||||||
MOVI2R(rA, (u32)Memory::base, false); // 2-3
|
|
||||||
ADD(rB, rB, rA); // 4
|
|
||||||
|
|
||||||
NEONXEmitter nemit(this);
|
|
||||||
if (single)
|
|
||||||
{
|
{
|
||||||
VLDR(S0, rB, 0);
|
Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK)
|
||||||
nemit.VREV32(I_8, D0, D0); // Byte swap to result
|
BIC(rB, rB, mask); // 1
|
||||||
VCVT(v0, S0, 0);
|
MOVI2R(rA, (u32)Memory::base, false); // 2-3
|
||||||
VCVT(v1, S0, 0);
|
ADD(rB, rB, rA); // 4
|
||||||
}
|
|
||||||
|
NEONXEmitter nemit(this);
|
||||||
|
if (single)
|
||||||
|
{
|
||||||
|
VLDR(S0, rB, 0);
|
||||||
|
nemit.VREV32(I_8, D0, D0); // Byte swap to result
|
||||||
|
VCVT(v0, S0, 0);
|
||||||
|
VCVT(v1, S0, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VLDR(v0, rB, 0);
|
||||||
|
nemit.VREV64(I_8, v0, v0); // Byte swap to result
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VLDR(v0, rB, 0);
|
PUSH(4, R0, R1, R2, R3);
|
||||||
nemit.VREV64(I_8, v0, v0); // Byte swap to result
|
MOV(R0, rB);
|
||||||
|
if (single)
|
||||||
|
{
|
||||||
|
MOVI2R(rA, (u32)&Memory::Read_U32);
|
||||||
|
BL(rA);
|
||||||
|
|
||||||
|
VMOV(S0, R0);
|
||||||
|
|
||||||
|
VCVT(v0, S0, 0);
|
||||||
|
VCVT(v1, S0, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MOVI2R(rA, (u32)&Memory::Read_F64);
|
||||||
|
BL(rA);
|
||||||
|
|
||||||
|
#if !defined(__ARM_PCS_VFP) // SoftFP returns in R0 and R1
|
||||||
|
VMOV(v0, R0);
|
||||||
|
#else
|
||||||
|
VMOV(v0, D0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
POP(4, R0, R1, R2, R3);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(rA, rB);
|
gpr.Unlock(rA, rB);
|
||||||
SetJumpTarget(DoNotLoad);
|
SetJumpTarget(DoNotLoad);
|
||||||
}
|
}
|
||||||
|
@ -275,23 +304,52 @@ void JitArm::stfXX(UGeckoInstruction inst)
|
||||||
MOV(RA, rB);
|
MOV(RA, rB);
|
||||||
SetCC();
|
SetCC();
|
||||||
}
|
}
|
||||||
|
if (Core::g_CoreStartupParameter.bFastmem)
|
||||||
Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK)
|
|
||||||
BIC(rB, rB, mask); // 1
|
|
||||||
MOVI2R(rA, (u32)Memory::base, false); // 2-3
|
|
||||||
ADD(rB, rB, rA); // 4
|
|
||||||
|
|
||||||
NEONXEmitter nemit(this);
|
|
||||||
if (single)
|
|
||||||
{
|
{
|
||||||
VCVT(S0, v0, 0);
|
Operand2 mask(3, 1); // ~(Memory::MEMVIEW32_MASK)
|
||||||
nemit.VREV32(I_8, D0, D0);
|
BIC(rB, rB, mask); // 1
|
||||||
VSTR(S0, rB, 0);
|
MOVI2R(rA, (u32)Memory::base, false); // 2-3
|
||||||
|
ADD(rB, rB, rA); // 4
|
||||||
|
|
||||||
|
NEONXEmitter nemit(this);
|
||||||
|
if (single)
|
||||||
|
{
|
||||||
|
VCVT(S0, v0, 0);
|
||||||
|
nemit.VREV32(I_8, D0, D0);
|
||||||
|
VSTR(S0, rB, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nemit.VREV64(I_8, D0, v0);
|
||||||
|
VSTR(D0, rB, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nemit.VREV64(I_8, D0, v0);
|
PUSH(4, R0, R1, R2, R3);
|
||||||
VSTR(D0, rB, 0);
|
if (single)
|
||||||
|
{
|
||||||
|
MOVI2R(rA, (u32)&Memory::Write_U32);
|
||||||
|
VMOV(R0, S0);
|
||||||
|
MOV(R1, rB);
|
||||||
|
|
||||||
|
BL(rA);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MOVI2R(rA, (u32)&Memory::Write_F64);
|
||||||
|
#if !defined(__ARM_PCS_VFP) // SoftFP returns in R0 and R1
|
||||||
|
VMOV(R0, v0);
|
||||||
|
MOV(R2, rB);
|
||||||
|
#else
|
||||||
|
VMOV(D0, v0);
|
||||||
|
MOV(R0, rB);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
BL(rA);
|
||||||
|
}
|
||||||
|
POP(4, R0, R1, R2, R3);
|
||||||
}
|
}
|
||||||
gpr.Unlock(rA, rB);
|
gpr.Unlock(rA, rB);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue