mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-08 13:43:33 +01:00
JitArm64: Optimize ConvertDoubleToSingle
This commit is contained in:
parent
6e0a5876ef
commit
28e4869c43
@ -220,6 +220,8 @@ private:
|
|||||||
// AsmRoutines
|
// AsmRoutines
|
||||||
void GenerateAsm();
|
void GenerateAsm();
|
||||||
void GenerateCommonAsm();
|
void GenerateCommonAsm();
|
||||||
|
void GenerateConvertDoubleToSingle();
|
||||||
|
void GenerateQuantizedLoadStores();
|
||||||
|
|
||||||
// Profiling
|
// Profiling
|
||||||
void BeginTimeProfile(JitBlock* b);
|
void BeginTimeProfile(JitBlock* b);
|
||||||
|
@ -397,12 +397,12 @@ void JitArm64::ConvertDoubleToSingleLower(ARM64Reg dest_reg, ARM64Reg src_reg)
|
|||||||
{
|
{
|
||||||
FlushCarry();
|
FlushCarry();
|
||||||
|
|
||||||
const BitSet32 gpr_saved = gpr.GetCallerSavedUsed();
|
const BitSet32 gpr_saved = gpr.GetCallerSavedUsed() & BitSet32{0, 1, 2, 3, 30};
|
||||||
ABI_PushRegisters(gpr_saved);
|
ABI_PushRegisters(gpr_saved);
|
||||||
|
|
||||||
m_float_emit.UMOV(64, ARM64Reg::X0, src_reg, 0);
|
m_float_emit.UMOV(64, ARM64Reg::X0, src_reg, 0);
|
||||||
QuickCallFunction(ARM64Reg::X1, &ConvertToSingle);
|
BL(cdts);
|
||||||
m_float_emit.INS(32, dest_reg, 0, ARM64Reg::W0);
|
m_float_emit.INS(32, dest_reg, 0, ARM64Reg::W1);
|
||||||
|
|
||||||
ABI_PopRegisters(gpr_saved);
|
ABI_PopRegisters(gpr_saved);
|
||||||
}
|
}
|
||||||
@ -411,16 +411,16 @@ void JitArm64::ConvertDoubleToSinglePair(ARM64Reg dest_reg, ARM64Reg src_reg)
|
|||||||
{
|
{
|
||||||
FlushCarry();
|
FlushCarry();
|
||||||
|
|
||||||
const BitSet32 gpr_saved = gpr.GetCallerSavedUsed();
|
const BitSet32 gpr_saved = gpr.GetCallerSavedUsed() & BitSet32{0, 1, 2, 3, 30};
|
||||||
ABI_PushRegisters(gpr_saved);
|
ABI_PushRegisters(gpr_saved);
|
||||||
|
|
||||||
m_float_emit.UMOV(64, ARM64Reg::X0, src_reg, 0);
|
m_float_emit.UMOV(64, ARM64Reg::X0, src_reg, 0);
|
||||||
QuickCallFunction(ARM64Reg::X1, &ConvertToSingle);
|
BL(cdts);
|
||||||
m_float_emit.INS(32, dest_reg, 0, ARM64Reg::W0);
|
m_float_emit.INS(32, dest_reg, 0, ARM64Reg::W1);
|
||||||
|
|
||||||
m_float_emit.UMOV(64, ARM64Reg::X0, src_reg, 1);
|
m_float_emit.UMOV(64, ARM64Reg::X0, src_reg, 1);
|
||||||
QuickCallFunction(ARM64Reg::X1, &ConvertToSingle);
|
BL(cdts);
|
||||||
m_float_emit.INS(32, dest_reg, 1, ARM64Reg::W0);
|
m_float_emit.INS(32, dest_reg, 1, ARM64Reg::W1);
|
||||||
|
|
||||||
ABI_PopRegisters(gpr_saved);
|
ABI_PopRegisters(gpr_saved);
|
||||||
}
|
}
|
||||||
|
@ -194,6 +194,39 @@ void JitArm64::GenerateAsm()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JitArm64::GenerateCommonAsm()
|
void JitArm64::GenerateCommonAsm()
|
||||||
|
{
|
||||||
|
GetAsmRoutines()->cdts = GetCodePtr();
|
||||||
|
GenerateConvertDoubleToSingle();
|
||||||
|
JitRegister::Register(GetAsmRoutines()->cdts, GetCodePtr(), "JIT_cdts");
|
||||||
|
|
||||||
|
GenerateQuantizedLoadStores();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Input in X0, output in W1, clobbers X0-X3 and flags.
|
||||||
|
void JitArm64::GenerateConvertDoubleToSingle()
|
||||||
|
{
|
||||||
|
UBFX(ARM64Reg::X2, ARM64Reg::X0, 52, 11);
|
||||||
|
SUB(ARM64Reg::W3, ARM64Reg::W2, 874);
|
||||||
|
CMP(ARM64Reg::W3, 896 - 874);
|
||||||
|
LSR(ARM64Reg::X1, ARM64Reg::X0, 32);
|
||||||
|
FixupBranch denormal = B(CCFlags::CC_LS);
|
||||||
|
|
||||||
|
ANDI2R(ARM64Reg::X1, ARM64Reg::X1, 0xc0000000);
|
||||||
|
BFXIL(ARM64Reg::X1, ARM64Reg::X0, 29, 30);
|
||||||
|
RET();
|
||||||
|
|
||||||
|
SetJumpTarget(denormal);
|
||||||
|
LSR(ARM64Reg::X3, ARM64Reg::X0, 21);
|
||||||
|
MOVZ(ARM64Reg::X0, 905);
|
||||||
|
ORRI2R(ARM64Reg::W3, ARM64Reg::W3, 0x80000000);
|
||||||
|
SUB(ARM64Reg::W2, ARM64Reg::W0, ARM64Reg::W2);
|
||||||
|
LSRV(ARM64Reg::W2, ARM64Reg::W3, ARM64Reg::W2);
|
||||||
|
ANDI2R(ARM64Reg::X3, ARM64Reg::X1, 0x80000000);
|
||||||
|
ORR(ARM64Reg::X1, ARM64Reg::X3, ARM64Reg::X2);
|
||||||
|
RET();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JitArm64::GenerateQuantizedLoadStores()
|
||||||
{
|
{
|
||||||
// X0 is the scale
|
// X0 is the scale
|
||||||
// X1 is address
|
// X1 is address
|
||||||
@ -654,6 +687,4 @@ void JitArm64::GenerateCommonAsm()
|
|||||||
paired_store_quantized[29] = storeSingleU16Slow;
|
paired_store_quantized[29] = storeSingleU16Slow;
|
||||||
paired_store_quantized[30] = storeSingleS8Slow;
|
paired_store_quantized[30] = storeSingleS8Slow;
|
||||||
paired_store_quantized[31] = storeSingleS16Slow;
|
paired_store_quantized[31] = storeSingleS16Slow;
|
||||||
|
|
||||||
GetAsmRoutines()->mfcr = nullptr;
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user