mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-09 14:08:58 +01:00
Jit: Move multiplication by 0 optimization to ConstantPropagation
This commit is contained in:
parent
ed83dd8773
commit
c64b981ed8
@ -1201,13 +1201,6 @@ void Jit64::MultiplyImmediate(u32 imm, int a, int d, bool overflow)
|
||||
RCX64Reg Rd = gpr.Bind(d, RCMode::Write);
|
||||
RegCache::Realize(Ra, Rd);
|
||||
|
||||
// simplest cases first
|
||||
if (imm == 0)
|
||||
{
|
||||
XOR(32, Rd, Rd);
|
||||
return;
|
||||
}
|
||||
|
||||
if (imm == (u32)-1)
|
||||
{
|
||||
if (d != a)
|
||||
|
@ -832,14 +832,7 @@ void JitArm64::addic(UGeckoInstruction inst)
|
||||
|
||||
bool JitArm64::MultiplyImmediate(u32 imm, int a, int d, bool rc)
|
||||
{
|
||||
if (imm == 0)
|
||||
{
|
||||
// Multiplication by zero (0).
|
||||
gpr.SetImmediate(d, 0);
|
||||
if (rc)
|
||||
ComputeRC0(gpr.GetImm(d));
|
||||
}
|
||||
else if (imm == 1)
|
||||
if (imm == 1)
|
||||
{
|
||||
// Multiplication by one (1).
|
||||
if (d != a)
|
||||
|
@ -64,6 +64,9 @@ ConstantPropagationResult ConstantPropagation::EvaluateInstruction(UGeckoInstruc
|
||||
|
||||
ConstantPropagationResult ConstantPropagation::EvaluateMulImm(UGeckoInstruction inst) const
|
||||
{
|
||||
if (inst.SIMM_16 == 0)
|
||||
return ConstantPropagationResult(inst.RD, 0);
|
||||
|
||||
if (!HasGPR(inst.RA))
|
||||
return {};
|
||||
|
||||
@ -202,8 +205,17 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31S(UGeckoInstructio
|
||||
ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstruction inst,
|
||||
u64 flags) const
|
||||
{
|
||||
if (!HasGPR(inst.RA, inst.RB))
|
||||
return {};
|
||||
const bool has_a = HasGPR(inst.RA);
|
||||
const bool has_b = HasGPR(inst.RB);
|
||||
if (!has_a || !has_b)
|
||||
{
|
||||
if (has_a)
|
||||
return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RA));
|
||||
else if (has_b)
|
||||
return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RB));
|
||||
else
|
||||
return {};
|
||||
}
|
||||
|
||||
u64 d;
|
||||
s64 d_overflow;
|
||||
@ -241,6 +253,29 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi
|
||||
return result;
|
||||
}
|
||||
|
||||
ConstantPropagationResult
|
||||
ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags,
|
||||
u32 value) const
|
||||
{
|
||||
switch (inst.SUBOP10)
|
||||
{
|
||||
case 11: // mulhwux
|
||||
case 75: // mulhwx
|
||||
case 235: // mullwx
|
||||
case 747: // mullwox
|
||||
if (value == 0)
|
||||
{
|
||||
ConstantPropagationResult result(inst.RD, 0, inst.Rc);
|
||||
if (flags & FL_SET_OE)
|
||||
result.overflow = false;
|
||||
return result;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
ConstantPropagationResult ConstantPropagation::EvaluateTable31SB(UGeckoInstruction inst) const
|
||||
{
|
||||
const bool has_s = HasGPR(inst.RS);
|
||||
|
@ -87,6 +87,8 @@ private:
|
||||
ConstantPropagationResult EvaluateTable31Negx(UGeckoInstruction inst, u64 flags) const;
|
||||
ConstantPropagationResult EvaluateTable31S(UGeckoInstruction inst) const;
|
||||
ConstantPropagationResult EvaluateTable31AB(UGeckoInstruction inst, u64 flags) const;
|
||||
ConstantPropagationResult EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags,
|
||||
u32 value) const;
|
||||
ConstantPropagationResult EvaluateTable31SB(UGeckoInstruction inst) const;
|
||||
ConstantPropagationResult EvaluateTable31SBOneRegisterKnown(UGeckoInstruction inst, u32 value,
|
||||
bool known_reg_is_b) const;
|
||||
|
Loading…
x
Reference in New Issue
Block a user