mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-12-16 04:09:39 +00:00
Jit: Move divwux to ConstantPropagation
This commit is contained in:
parent
c7d8a0b276
commit
fc6c278007
@ -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)
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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 {};
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user