mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-08 15:20:45 +01:00
JitArm64_Integer: subfzex - Constant folding
When both the input register and the carry flag are constants, the result can be precomputed. Before: 0x52800016 mov w22, #0x0 ; =0 0x2a3603f6 mvn w22, w22 After:
This commit is contained in:
parent
fa13457abb
commit
7410bc2025
@ -1359,39 +1359,49 @@ void JitArm64::subfzex(UGeckoInstruction inst)
|
|||||||
|
|
||||||
int a = inst.RA, d = inst.RD;
|
int a = inst.RA, d = inst.RD;
|
||||||
|
|
||||||
gpr.BindToRegister(d, d == a);
|
if (gpr.IsImm(a) && HasConstantCarry())
|
||||||
|
{
|
||||||
|
const u32 imm = ~gpr.GetImm(a);
|
||||||
|
const u32 carry = js.carryFlag == CarryFlag::ConstantTrue;
|
||||||
|
gpr.SetImmediate(d, imm + carry);
|
||||||
|
ComputeCarry(Interpreter::Helper_Carry(imm, carry));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(d, d == a);
|
||||||
|
|
||||||
switch (js.carryFlag)
|
switch (js.carryFlag)
|
||||||
{
|
|
||||||
case CarryFlag::InPPCState:
|
|
||||||
{
|
|
||||||
{
|
{
|
||||||
auto WA = gpr.GetScopedReg();
|
case CarryFlag::InPPCState:
|
||||||
LDRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_ca));
|
{
|
||||||
MVN(gpr.R(d), gpr.R(a));
|
{
|
||||||
CARRY_IF_NEEDED(ADD, ADDS, gpr.R(d), gpr.R(d), WA);
|
auto WA = gpr.GetScopedReg();
|
||||||
|
LDRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_ca));
|
||||||
|
MVN(gpr.R(d), gpr.R(a));
|
||||||
|
CARRY_IF_NEEDED(ADD, ADDS, gpr.R(d), gpr.R(d), WA);
|
||||||
|
}
|
||||||
|
ComputeCarry();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CarryFlag::InHostCarry:
|
||||||
|
{
|
||||||
|
CARRY_IF_NEEDED(SBC, SBCS, gpr.R(d), ARM64Reg::WZR, gpr.R(a));
|
||||||
|
ComputeCarry();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CarryFlag::ConstantTrue:
|
||||||
|
{
|
||||||
|
CARRY_IF_NEEDED(NEG, NEGS, gpr.R(d), gpr.R(a));
|
||||||
|
ComputeCarry();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CarryFlag::ConstantFalse:
|
||||||
|
{
|
||||||
|
MVN(gpr.R(d), gpr.R(a));
|
||||||
|
ComputeCarry(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ComputeCarry();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CarryFlag::InHostCarry:
|
|
||||||
{
|
|
||||||
CARRY_IF_NEEDED(SBC, SBCS, gpr.R(d), ARM64Reg::WZR, gpr.R(a));
|
|
||||||
ComputeCarry();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CarryFlag::ConstantTrue:
|
|
||||||
{
|
|
||||||
CARRY_IF_NEEDED(NEG, NEGS, gpr.R(d), gpr.R(a));
|
|
||||||
ComputeCarry();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CarryFlag::ConstantFalse:
|
|
||||||
{
|
|
||||||
MVN(gpr.R(d), gpr.R(a));
|
|
||||||
ComputeCarry(false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inst.Rc)
|
if (inst.Rc)
|
||||||
|
Loading…
Reference in New Issue
Block a user