Merge pull request #14132 from JosJuice/jitarm64-bindtoregister-getimm

JitArm64: Call GetImm before BindToRegister in subfcx
This commit is contained in:
JosJuice 2025-11-18 17:53:13 +01:00 committed by GitHub
commit 48d9a04383
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1267,7 +1267,11 @@ void JitArm64::subfcx(UGeckoInstruction inst)
int a = inst.RA, b = inst.RB, d = inst.RD;
if (gpr.IsImm(a, 0))
if (gpr.IsImm(a))
{
const u32 imm = gpr.GetImm(a);
if (imm == 0)
{
if (d != b)
{
@ -1277,33 +1281,32 @@ void JitArm64::subfcx(UGeckoInstruction inst)
ComputeCarry(true);
if (inst.Rc)
ComputeRC0(gpr.R(d));
return;
}
else if (gpr.IsImm(a) && ((gpr.GetImm(a) & 0xFFF) == gpr.GetImm(a)))
const bool low_12 = (imm & 0xFFF) == imm;
const bool high_12 = (imm & 0xFFF000) == imm;
if (low_12 || high_12)
{
gpr.BindToRegister(d, d == b);
CARRY_IF_NEEDED(SUB, SUBS, gpr.R(d), gpr.R(b), gpr.GetImm(a));
CARRY_IF_NEEDED(SUB, SUBS, gpr.R(d), gpr.R(b), high_12 ? imm >> 12 : imm, high_12);
ComputeCarry();
if (inst.Rc)
ComputeRC0(gpr.R(d));
return;
}
else if (gpr.IsImm(a) && ((gpr.GetImm(a) & 0xFFF000) == gpr.GetImm(a)))
{
gpr.BindToRegister(d, d == b);
CARRY_IF_NEEDED(SUB, SUBS, gpr.R(d), gpr.R(b), gpr.GetImm(a) >> 12, true);
ComputeCarry();
if (inst.Rc)
ComputeRC0(gpr.R(d));
}
else if (gpr.IsImm(b, 0))
if (gpr.IsImm(b, 0))
{
gpr.BindToRegister(d, d == a);
CARRY_IF_NEEDED(NEG, NEGS, gpr.R(d), gpr.R(a));
ComputeCarry();
if (inst.Rc)
ComputeRC0(gpr.R(d));
return;
}
else
{
gpr.BindToRegister(d, d == a || d == b);
// d = b - a
@ -1314,7 +1317,6 @@ void JitArm64::subfcx(UGeckoInstruction inst)
if (inst.Rc)
ComputeRC0(gpr.R(d));
}
}
void JitArm64::subfzex(UGeckoInstruction inst)
{