mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-10 08:09:26 +01:00
[AArch64] Minor floating point loadstore improvements.
These use the Vector x Element FMUL instruction to improve speeds slightly. Should give ~3cycle improvement per quantized loadstore done.
This commit is contained in:
parent
b4b03641b3
commit
f54a0d3ff4
@ -137,7 +137,7 @@ u32 JitArm64::EmitBackpatchRoutine(ARM64XEmitter* emit, u32 flags, bool fastmem,
|
||||
ARM64FloatEmitter float_emit(emit);
|
||||
if (flags & BackPatchInfo::FLAG_SIZE_F32)
|
||||
{
|
||||
float_emit.FCVT(32, 64, Q0, RS);
|
||||
float_emit.FCVT(32, 64, D0, RS);
|
||||
float_emit.REV32(8, D0, D0);
|
||||
trouble_offset = (emit->GetCodePtr() - code_base) / 4;
|
||||
float_emit.STR(32, INDEX_UNSIGNED, D0, addr, 0);
|
||||
@ -215,7 +215,7 @@ u32 JitArm64::EmitBackpatchRoutine(ARM64XEmitter* emit, u32 flags, bool fastmem,
|
||||
ARM64FloatEmitter float_emit(emit);
|
||||
if (flags & BackPatchInfo::FLAG_SIZE_F32)
|
||||
{
|
||||
float_emit.FCVT(32, 64, Q0, RS);
|
||||
float_emit.FCVT(32, 64, D0, RS);
|
||||
float_emit.UMOV(32, W0, Q0, 0);
|
||||
emit->MOVI2R(X30, (u64)&PowerPC::Write_U32);
|
||||
emit->BLR(X30);
|
||||
|
@ -390,7 +390,7 @@ void JitArm64::stfXX(UGeckoInstruction inst)
|
||||
}
|
||||
else if (accessSize == 32)
|
||||
{
|
||||
m_float_emit.FCVT(32, 64, Q0, V0);
|
||||
m_float_emit.FCVT(32, 64, D0, EncodeRegToDouble(V0));
|
||||
m_float_emit.REV32(8, D0, D0);
|
||||
m_float_emit.STR(32, INDEX_UNSIGNED, D0, X1, 0);
|
||||
}
|
||||
|
@ -128,8 +128,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(addr_reg, (u64)&m_dequantizeTableS);
|
||||
ADD(scale_reg, addr_reg, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
RET(X30);
|
||||
}
|
||||
const u8* loadPairedS8Two = GetCodePtr();
|
||||
@ -142,8 +142,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(addr_reg, (u64)&m_dequantizeTableS);
|
||||
ADD(scale_reg, addr_reg, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
RET(X30);
|
||||
}
|
||||
const u8* loadPairedU16Two = GetCodePtr();
|
||||
@ -156,8 +156,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(addr_reg, (u64)&m_dequantizeTableS);
|
||||
ADD(scale_reg, addr_reg, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
RET(X30);
|
||||
}
|
||||
const u8* loadPairedS16Two = GetCodePtr();
|
||||
@ -170,8 +170,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(addr_reg, (u64)&m_dequantizeTableS);
|
||||
ADD(scale_reg, addr_reg, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
RET(X30);
|
||||
}
|
||||
|
||||
@ -192,8 +192,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(addr_reg, (u64)&m_dequantizeTableS);
|
||||
ADD(scale_reg, addr_reg, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
RET(X30);
|
||||
}
|
||||
const u8* loadPairedS8One = GetCodePtr();
|
||||
@ -206,8 +206,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(addr_reg, (u64)&m_dequantizeTableS);
|
||||
ADD(scale_reg, addr_reg, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
RET(X30);
|
||||
}
|
||||
const u8* loadPairedU16One = GetCodePtr();
|
||||
@ -220,8 +220,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(addr_reg, (u64)&m_dequantizeTableS);
|
||||
ADD(scale_reg, addr_reg, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
RET(X30);
|
||||
}
|
||||
const u8* loadPairedS16One = GetCodePtr();
|
||||
@ -234,8 +234,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(addr_reg, (u64)&m_dequantizeTableS);
|
||||
ADD(scale_reg, addr_reg, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
RET(X30);
|
||||
}
|
||||
|
||||
@ -295,8 +295,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(X2, (u64)&m_quantizeTableS);
|
||||
ADD(scale_reg, X2, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
float_emit.FCVTZU(32, D0, D0);
|
||||
float_emit.XTN(16, D0, D0);
|
||||
float_emit.XTN(8, D0, D0);
|
||||
@ -326,8 +326,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(X2, (u64)&m_quantizeTableS);
|
||||
ADD(scale_reg, X2, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
float_emit.FCVTZS(32, D0, D0);
|
||||
float_emit.XTN(16, D0, D0);
|
||||
float_emit.XTN(8, D0, D0);
|
||||
@ -358,8 +358,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(X2, (u64)&m_quantizeTableS);
|
||||
ADD(scale_reg, X2, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
float_emit.FCVTZU(32, D0, D0);
|
||||
float_emit.XTN(16, D0, D0);
|
||||
float_emit.REV16(8, D0, D0);
|
||||
@ -388,8 +388,8 @@ void JitArm64AsmRoutineManager::GenerateCommon()
|
||||
|
||||
MOVI2R(X2, (u64)&m_quantizeTableS);
|
||||
ADD(scale_reg, X2, scale_reg, ArithOption(scale_reg, ST_LSL, 3));
|
||||
float_emit.LD1R(32, D1, scale_reg);
|
||||
float_emit.FMUL(32, D0, D0, D1);
|
||||
float_emit.LDR(32, INDEX_UNSIGNED, D1, scale_reg, 0);
|
||||
float_emit.FMUL(32, D0, D0, D1, 0);
|
||||
float_emit.FCVTZS(32, D0, D0);
|
||||
float_emit.XTN(16, D0, D0);
|
||||
float_emit.REV16(8, D0, D0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user