Jit: Move divwux to ConstantPropagation

This commit is contained in:
JosJuice 2024-09-01 09:31:34 +02:00
parent e425a3e6fd
commit 2a7b68cf81
4 changed files with 25 additions and 30 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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 {};

View File

@ -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;