JitArm64_Integer: cmp - Add shifted 12-bit constant

You can encode a shifted 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:
0x52bff01a   mov    w26, #-0x800000           ; =-8388608
0x93407f1b   sxtw   x27, w24
0xcb3ac37b   sub    x27, x27, w26, sxtw

After:
0x93407f1b   sxtw   x27, w24
0x9160037b   add    x27, x27, #0x800, lsl #12 ; =0x800000
This commit is contained in:
Sintendo 2025-02-01 17:58:14 +01:00
parent 01eed0a758
commit 075c35602f

View File

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