Jit: Move divwx to ConstantPropagation

This commit is contained in:
JosJuice 2024-09-01 10:13:57 +02:00
parent 2a7b68cf81
commit dc1110e9b9
3 changed files with 11 additions and 40 deletions

View File

@ -1433,24 +1433,7 @@ void Jit64::divwx(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(a))
{
s32 i = gpr.SImm32(a), j = gpr.SImm32(b);
if (j == 0 || (i == (s32)0x80000000 && j == -1))
{
const u32 result = i < 0 ? 0xFFFFFFFF : 0x00000000;
gpr.SetImmediate32(d, result);
if (inst.OE)
GenerateConstantOverflow(true);
}
else
{
gpr.SetImmediate32(d, i / j);
if (inst.OE)
GenerateConstantOverflow(false);
}
}
else if (gpr.IsImm(a))
{ {
// Constant dividend // Constant dividend
const u32 dividend = gpr.Imm32(a); const u32 dividend = gpr.Imm32(a);

View File

@ -1421,28 +1421,7 @@ void JitArm64::divwx(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(a, 0))
{
s32 imm_a = gpr.GetImm(a);
s32 imm_b = gpr.GetImm(b);
u32 imm_d;
if (imm_b == 0 || (static_cast<u32>(imm_a) == 0x80000000 && imm_b == -1))
{
if (imm_a < 0)
imm_d = 0xFFFFFFFF;
else
imm_d = 0;
}
else
{
imm_d = static_cast<u32>(imm_a / imm_b);
}
gpr.SetImmediate(d, imm_d);
if (inst.Rc)
ComputeRC0(imm_d);
}
else if (gpr.IsImm(a, 0))
{ {
// Zero divided by anything is always zero // Zero divided by anything is always zero
gpr.SetImmediate(d, 0); gpr.SetImmediate(d, 0);

View File

@ -269,6 +269,12 @@ ConstantPropagationResult ConstantPropagation::EvaluateTable31AB(UGeckoInstructi
case 971: // divwuox case 971: // divwuox
d = d_overflow = b == 0 ? 0x1'0000'0000 : u64(a / b); d = d_overflow = b == 0 ? 0x1'0000'0000 : u64(a / b);
break; break;
case 491: // divwx
case 1003: // divwox
d = d_overflow = b == 0 || (a == 0x80000000 && b == 0xFFFFFFFF) ?
(s32(a) < 0 ? 0xFFFFFFFF : 0x1'0000'0000) :
s32(a) / s32(b);
break;
default: default:
return {}; return {};
} }
@ -308,6 +314,9 @@ ConstantPropagation::EvaluateTable31ABOneRegisterKnown(UGeckoInstruction inst, u
result.overflow = true; result.overflow = true;
return result; return result;
} }
[[fallthrough]];
case 491: // divwx
case 1003: // divwox
if (!known_reg_is_b && value == 0 && !(flags & FL_SET_OE)) if (!known_reg_is_b && value == 0 && !(flags & FL_SET_OE))
{ {
return ConstantPropagationResult(inst.RD, 0, inst.Rc); return ConstantPropagationResult(inst.RD, 0, inst.Rc);