Jit: Move mulli to ConstantPropagation

This commit is contained in:
JosJuice 2024-08-31 12:04:01 +02:00
parent 4392ef174d
commit 3f12145f50
4 changed files with 13 additions and 14 deletions

@ -1262,14 +1262,7 @@ void Jit64::mulli(UGeckoInstruction inst)
int a = inst.RA, d = inst.RD; int a = inst.RA, d = inst.RD;
u32 imm = inst.SIMM_16; u32 imm = inst.SIMM_16;
if (gpr.IsImm(a)) MultiplyImmediate(imm, a, d, false);
{
gpr.SetImmediate32(d, gpr.Imm32(a) * imm);
}
else
{
MultiplyImmediate(imm, a, d, false);
}
} }
void Jit64::mullwx(UGeckoInstruction inst) void Jit64::mullwx(UGeckoInstruction inst)

@ -906,12 +906,7 @@ void JitArm64::mulli(UGeckoInstruction inst)
int a = inst.RA, d = inst.RD; int a = inst.RA, d = inst.RD;
if (gpr.IsImm(a)) if (MultiplyImmediate((u32)(s32)inst.SIMM_16, a, d, false))
{
s32 i = (s32)gpr.GetImm(a);
gpr.SetImmediate(d, i * inst.SIMM_16);
}
else if (MultiplyImmediate((u32)(s32)inst.SIMM_16, a, d, false))
{ {
// Code is generated inside MultiplyImmediate, nothing to be done here. // Code is generated inside MultiplyImmediate, nothing to be done here.
} }

@ -31,6 +31,8 @@ ConstantPropagationResult ConstantPropagation::EvaluateInstruction(UGeckoInstruc
{ {
switch (inst.OPCD) switch (inst.OPCD)
{ {
case 7: // mulli
return EvaluateMulImm(inst);
case 12: // addic case 12: // addic
case 13: // addic. case 13: // addic.
return EvaluateAddImmCarry(inst); return EvaluateAddImmCarry(inst);
@ -60,6 +62,14 @@ ConstantPropagationResult ConstantPropagation::EvaluateInstruction(UGeckoInstruc
} }
} }
ConstantPropagationResult ConstantPropagation::EvaluateMulImm(UGeckoInstruction inst) const
{
if (!HasGPR(inst.RA))
return {};
return ConstantPropagationResult(inst.RD, m_gpr_values[inst.RA] * inst.SIMM_16);
}
ConstantPropagationResult ConstantPropagation::EvaluateAddImm(UGeckoInstruction inst) const ConstantPropagationResult ConstantPropagation::EvaluateAddImm(UGeckoInstruction inst) const
{ {
const s32 immediate = inst.OPCD & 1 ? inst.SIMM_16 << 16 : inst.SIMM_16; const s32 immediate = inst.OPCD & 1 ? inst.SIMM_16 << 16 : inst.SIMM_16;

@ -77,6 +77,7 @@ public:
void Clear() { m_gpr_values_known = BitSet32{}; } void Clear() { m_gpr_values_known = BitSet32{}; }
private: private:
ConstantPropagationResult EvaluateMulImm(UGeckoInstruction inst) const;
ConstantPropagationResult EvaluateAddImm(UGeckoInstruction inst) const; ConstantPropagationResult EvaluateAddImm(UGeckoInstruction inst) const;
ConstantPropagationResult EvaluateAddImmCarry(UGeckoInstruction inst) const; ConstantPropagationResult EvaluateAddImmCarry(UGeckoInstruction inst) const;
ConstantPropagationResult EvaluateRlwinmxRlwnmx(UGeckoInstruction inst, u32 shift) const; ConstantPropagationResult EvaluateRlwinmxRlwnmx(UGeckoInstruction inst, u32 shift) const;