mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-25 07:21:14 +01:00
JitArm64: Track single precision in load/store.
This commit is contained in:
parent
1e59dc1025
commit
ae1b5ff9e8
@ -86,7 +86,6 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode,
|
|||||||
{
|
{
|
||||||
m_float_emit.LDR(32, EncodeRegToDouble(RS), X28, addr);
|
m_float_emit.LDR(32, EncodeRegToDouble(RS), X28, addr);
|
||||||
m_float_emit.REV32(8, EncodeRegToDouble(RS), EncodeRegToDouble(RS));
|
m_float_emit.REV32(8, EncodeRegToDouble(RS), EncodeRegToDouble(RS));
|
||||||
m_float_emit.FCVT(64, 32, EncodeRegToDouble(RS), EncodeRegToDouble(RS));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -214,7 +213,6 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode,
|
|||||||
MOVI2R(X30, (u64)&PowerPC::Read_U32);
|
MOVI2R(X30, (u64)&PowerPC::Read_U32);
|
||||||
BLR(X30);
|
BLR(X30);
|
||||||
m_float_emit.INS(32, RS, 0, X0);
|
m_float_emit.INS(32, RS, 0, X0);
|
||||||
m_float_emit.FCVT(64, 32, EncodeRegToDouble(RS), EncodeRegToDouble(RS));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -76,7 +76,7 @@ void JitArm64::lfXX(UGeckoInstruction inst)
|
|||||||
u32 imm_addr = 0;
|
u32 imm_addr = 0;
|
||||||
bool is_immediate = false;
|
bool is_immediate = false;
|
||||||
|
|
||||||
RegType type = !!(flags & BackPatchInfo::FLAG_SIZE_F64) ? REG_LOWER_PAIR : REG_DUP;
|
RegType type = !!(flags & BackPatchInfo::FLAG_SIZE_F64) ? REG_LOWER_PAIR : REG_DUP_SINGLE;
|
||||||
|
|
||||||
gpr.Lock(W0, W30);
|
gpr.Lock(W0, W30);
|
||||||
fpr.Lock(Q0);
|
fpr.Lock(Q0);
|
||||||
|
@ -62,20 +62,17 @@ void JitArm64::psq_l(UGeckoInstruction inst)
|
|||||||
|
|
||||||
if (js.assumeNoPairedQuantize)
|
if (js.assumeNoPairedQuantize)
|
||||||
{
|
{
|
||||||
VS = fpr.RW(inst.RS, REG_REG);
|
VS = fpr.RW(inst.RS, REG_REG_SINGLE);
|
||||||
if (!inst.W)
|
if (!inst.W)
|
||||||
{
|
{
|
||||||
ADD(EncodeRegTo64(addr_reg), EncodeRegTo64(addr_reg), X28);
|
ADD(EncodeRegTo64(addr_reg), EncodeRegTo64(addr_reg), X28);
|
||||||
m_float_emit.LD1(32, 1, EncodeRegToDouble(VS), EncodeRegTo64(addr_reg));
|
m_float_emit.LD1(32, 1, EncodeRegToDouble(VS), EncodeRegTo64(addr_reg));
|
||||||
m_float_emit.REV32(8, VS, VS);
|
|
||||||
m_float_emit.FCVTL(64, VS, VS);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_float_emit.LDR(32, VS, EncodeRegTo64(addr_reg), X28);
|
m_float_emit.LDR(32, VS, EncodeRegTo64(addr_reg), X28);
|
||||||
m_float_emit.REV32(8, VS, VS);
|
|
||||||
m_float_emit.FCVT(64, 32, EncodeRegToDouble(VS), EncodeRegToDouble(VS));
|
|
||||||
}
|
}
|
||||||
|
m_float_emit.REV32(8, EncodeRegToDouble(VS), EncodeRegToDouble(VS));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -87,17 +84,14 @@ void JitArm64::psq_l(UGeckoInstruction inst)
|
|||||||
LDR(X30, X30, ArithOption(EncodeRegTo64(type_reg), true));
|
LDR(X30, X30, ArithOption(EncodeRegTo64(type_reg), true));
|
||||||
BLR(X30);
|
BLR(X30);
|
||||||
|
|
||||||
VS = fpr.RW(inst.RS, REG_REG);
|
VS = fpr.RW(inst.RS, REG_REG_SINGLE);
|
||||||
if (!inst.W)
|
m_float_emit.ORR(EncodeRegToDouble(VS), D0, D0);
|
||||||
m_float_emit.FCVTL(64, VS, D0);
|
|
||||||
else
|
|
||||||
m_float_emit.FCVT(64, 32, EncodeRegToDouble(VS), D0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inst.W)
|
if (inst.W)
|
||||||
{
|
{
|
||||||
m_float_emit.FMOV(D0, 0x70); // 1.0 as a Double
|
m_float_emit.FMOV(S0, 0x70); // 1.0 as a Single
|
||||||
m_float_emit.INS(64, VS, 1, Q0, 0);
|
m_float_emit.INS(32, VS, 1, Q0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpr.Unlock(W0, W1, W2, W30);
|
gpr.Unlock(W0, W1, W2, W30);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user