mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-03-12 22:56:52 +01:00
Jit: Move divwux to ConstantPropagation
This commit is contained in:
parent
e425a3e6fd
commit
2a7b68cf81
@ -1321,22 +1321,7 @@ void Jit64::divwux(UGeckoInstruction inst)
|
||||
JITDISABLE(bJITIntegerOff);
|
||||
int a = inst.RA, b = inst.RB, d = inst.RD;
|
||||
|
||||
if (gpr.IsImm(a, b))
|
||||
{
|
||||
if (gpr.Imm32(b) == 0)
|
||||
{
|
||||
gpr.SetImmediate32(d, 0);
|
||||
if (inst.OE)
|
||||
GenerateConstantOverflow(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
gpr.SetImmediate32(d, gpr.Imm32(a) / gpr.Imm32(b));
|
||||
if (inst.OE)
|
||||
GenerateConstantOverflow(false);
|
||||
}
|
||||
}
|
||||
else if (gpr.IsImm(b))
|
||||
if (gpr.IsImm(b))
|
||||
{
|
||||
u32 divisor = gpr.Imm32(b);
|
||||
if (divisor == 0)
|
||||
|
@ -1350,15 +1350,7 @@ void JitArm64::divwux(UGeckoInstruction inst)
|
||||
|
||||
int a = inst.RA, b = inst.RB, d = inst.RD;
|
||||
|
||||
if (gpr.IsImm(a) && gpr.IsImm(b))
|
||||
{
|
||||
u32 i = gpr.GetImm(a), j = gpr.GetImm(b);
|
||||
gpr.SetImmediate(d, j == 0 ? 0 : i / j);
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC0(gpr.GetImm(d));
|
||||
}
|
||||
else if (gpr.IsImm(b))
|
||||
if (gpr.IsImm(b))
|
||||
{
|
||||
const u32 divisor = gpr.GetImm(b);
|
||||
|
||||
|
@ -225,9 +225,9 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi
|
||||
if (!has_a || !has_b)
|
||||
{
|
||||
if (has_a)
|
||||
return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RA));
|
||||
return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RA), false);
|
||||
else if (has_b)
|
||||
return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RB));
|
||||
return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RB), true);
|
||||
else if (inst.RA == inst.RB)
|
||||
return EvaluateTable31ABIdenticalRegisters(inst, flags);
|
||||
else
|
||||
@ -265,6 +265,10 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi
|
||||
case 747: // mullwox
|
||||
d = d_overflow = s64(s32(a)) * s64(s32(b));
|
||||
break;
|
||||
case 459: // divwux
|
||||
case 971: // divwuox
|
||||
d = d_overflow = b == 0 ? 0x1'0000'0000 : u64(a / b);
|
||||
break;
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
@ -278,8 +282,8 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi
|
||||
}
|
||||
|
||||
ConstantPropagationResult
|
||||
ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags,
|
||||
u32 value) const
|
||||
ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags, u32 value,
|
||||
bool known_reg_is_b) const
|
||||
{
|
||||
switch (inst.SUBOP10)
|
||||
{
|
||||
@ -295,6 +299,20 @@ ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u
|
||||
return result;
|
||||
}
|
||||
break;
|
||||
case 459: // divwux
|
||||
case 971: // divwuox
|
||||
if (known_reg_is_b && value == 0)
|
||||
{
|
||||
ConstantPropagationResult result(inst.RD, 0, inst.Rc);
|
||||
if (flags & FL_SET_OE)
|
||||
result.overflow = true;
|
||||
return result;
|
||||
}
|
||||
if (!known_reg_is_b && value == 0 && !(flags & FL_SET_OE))
|
||||
{
|
||||
return ConstantPropagationResult(inst.RD, 0, inst.Rc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return {};
|
||||
|
@ -89,7 +89,7 @@ private:
|
||||
ConstantPropagationResult EvaluateTable31S(UGeckoInstruction inst) const;
|
||||
ConstantPropagationResult EvaluateTable31AB(UGeckoInstruction inst, u64 flags) const;
|
||||
ConstantPropagationResult EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags,
|
||||
u32 value) const;
|
||||
u32 value, bool known_reg_is_b) const;
|
||||
ConstantPropagationResult EvaluateTable31ABIdenticalRegisters(UGeckoInstruction inst,
|
||||
u64 flags) const;
|
||||
ConstantPropagationResult EvaluateTable31SB(UGeckoInstruction inst) const;
|
||||
|
Loading…
x
Reference in New Issue
Block a user