Jit: Move divwux to ConstantPropagation

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

View File

@ -1321,22 +1321,7 @@ void Jit64::divwux(UGeckoInstruction inst)
JITDISABLE(bJITIntegerOff); JITDISABLE(bJITIntegerOff);
int a = inst.RA, b = inst.RB, d = inst.RD; int a = inst.RA, b = inst.RB, d = inst.RD;
if (gpr.IsImm(a, b)) if (gpr.IsImm(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))
{ {
u32 divisor = gpr.Imm32(b); u32 divisor = gpr.Imm32(b);
if (divisor == 0) if (divisor == 0)

View File

@ -1554,15 +1554,7 @@ void JitArm64::divwux(UGeckoInstruction inst)
int a = inst.RA, b = inst.RB, d = inst.RD; int a = inst.RA, b = inst.RB, d = inst.RD;
if (gpr.IsImm(a) && gpr.IsImm(b)) if (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))
{ {
const u32 divisor = gpr.GetImm(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 || !has_b)
{ {
if (has_a) if (has_a)
return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RA)); return EvaluateTable31ABOneRegisterKnown(inst, flags, GetGPR(inst.RA), false);
else if (has_b) 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) else if (inst.RA == inst.RB)
return EvaluateTable31ABIdenticalRegisters(inst, flags); return EvaluateTable31ABIdenticalRegisters(inst, flags);
else else
@ -265,6 +265,10 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi
case 747: // mullwox case 747: // mullwox
d = d_overflow = s64(s32(a)) * s64(s32(b)); d = d_overflow = s64(s32(a)) * s64(s32(b));
break; break;
case 459: // divwux
case 971: // divwuox
d = d_overflow = b == 0 ? 0x1'0000'0000 : u64(a / b);
break;
default: default:
return {}; return {};
} }
@ -278,8 +282,8 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi
} }
ConstantPropagationResult ConstantPropagationResult
ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags, ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags, u32 value,
u32 value) const bool known_reg_is_b) const
{ {
switch (inst.SUBOP10) switch (inst.SUBOP10)
{ {
@ -295,6 +299,20 @@ ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u
return result; return result;
} }
break; 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 {}; return {};

View File

@ -89,7 +89,7 @@ private:
ConstantPropagationResult EvaluateTable31S(UGeckoInstruction inst) const; ConstantPropagationResult EvaluateTable31S(UGeckoInstruction inst) const;
ConstantPropagationResult EvaluateTable31AB(UGeckoInstruction inst, u64 flags) const; ConstantPropagationResult EvaluateTable31AB(UGeckoInstruction inst, u64 flags) const;
ConstantPropagationResult EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags, ConstantPropagationResult EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u64 flags,
u32 value) const; u32 value, bool known_reg_is_b) const;
ConstantPropagationResult EvaluateTable31ABIdenticalRegisters(UGeckoInstruction inst, ConstantPropagationResult EvaluateTable31ABIdenticalRegisters(UGeckoInstruction inst,
u64 flags) const; u64 flags) const;
ConstantPropagationResult EvaluateTable31SB(UGeckoInstruction inst) const; ConstantPropagationResult EvaluateTable31SB(UGeckoInstruction inst) const;