JitArm64_Integer: cmp - Add 12-bit constant

You can encode a 12-bit immediate in an ADD instruction on ARM64. If the
negated constant fits in this range, we can exploit this to avoid
materializing the immediate.

This approach saves an instruction if it does not need to be
materialized in a register afterwards. Otherwise, we just materialize
it later and the total number of instructions stays the same.

Before:
0x12800019   mov    w25, #-0x1                ; =-1
0x93407f5b   sxtw   x27, w26
0xcb39c37b   sub    x27, x27, w25, sxtw

After:
0x93407f5b   sxtw   x27, w26
0x9100077b   add    x27, x27, #0x1
This commit is contained in:
Sintendo 2025-02-01 17:02:10 +01:00
parent 352cbc4772
commit 01eed0a758

View File

@ -663,6 +663,11 @@ void JitArm64::cmp(UGeckoInstruction inst)
SXTW(CR, gpr.R(a));
SUB(CR, CR, gpr.GetImm(b) >> 12, true);
}
else if (gpr.IsImm(b) && (((~gpr.GetImm(b) + 1) & 0xFFF) == (~gpr.GetImm(b) + 1)))
{
SXTW(CR, gpr.R(a));
ADD(CR, CR, ~gpr.GetImm(b) + 1);
}
else
{
ARM64Reg RA = gpr.R(a);