CPU/Recompiler/AArch32: Reduce register usage of Mul
This commit is contained in:
parent
23dff0a9b6
commit
cce1ec598c
|
@ -665,20 +665,23 @@ void CodeGenerator::EmitCmp(HostReg to_reg, const Value& value)
|
||||||
void CodeGenerator::EmitMul(HostReg to_reg_hi, HostReg to_reg_lo, const Value& lhs, const Value& rhs,
|
void CodeGenerator::EmitMul(HostReg to_reg_hi, HostReg to_reg_lo, const Value& lhs, const Value& rhs,
|
||||||
bool signed_multiply)
|
bool signed_multiply)
|
||||||
{
|
{
|
||||||
Value lhs_in_reg = GetValueInHostRegister(lhs);
|
// We could use GetValueInHostRegister() here, but we run out of registers...
|
||||||
Value rhs_in_reg = GetValueInHostRegister(rhs);
|
// Value lhs_in_reg = GetValueInHostRegister(lhs);
|
||||||
|
// Value rhs_in_reg = GetValueInHostRegister(rhs);
|
||||||
|
const HostReg lhs_in_reg = lhs.IsInHostRegister() ? lhs.GetHostRegister() : (EmitCopyValue(RARG1, lhs), RARG1);
|
||||||
|
const HostReg rhs_in_reg = rhs.IsInHostRegister() ? rhs.GetHostRegister() : (EmitCopyValue(RARG2, rhs), RARG2);
|
||||||
|
|
||||||
if (lhs.size < RegSize_64)
|
if (lhs.size < RegSize_64)
|
||||||
{
|
{
|
||||||
if (signed_multiply)
|
if (signed_multiply)
|
||||||
{
|
{
|
||||||
m_emit->smull(GetHostReg32(to_reg_lo), GetHostReg32(to_reg_hi), GetHostReg32(lhs_in_reg.host_reg),
|
m_emit->smull(GetHostReg32(to_reg_lo), GetHostReg32(to_reg_hi), GetHostReg32(lhs_in_reg),
|
||||||
GetHostReg32(rhs_in_reg.host_reg));
|
GetHostReg32(rhs_in_reg));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_emit->umull(GetHostReg32(to_reg_lo), GetHostReg32(to_reg_hi), GetHostReg32(lhs_in_reg.host_reg),
|
m_emit->umull(GetHostReg32(to_reg_lo), GetHostReg32(to_reg_hi), GetHostReg32(lhs_in_reg),
|
||||||
GetHostReg32(rhs_in_reg.host_reg));
|
GetHostReg32(rhs_in_reg));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue