mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-03 19:42:45 +01:00
Jit: Move divwx to ConstantPropagation
This commit is contained in:
parent
2a7b68cf81
commit
dc1110e9b9
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user