JitArm64_Integer: cmp - Subtract 12-bit constant

You can encode a 12-bit immediate in a SUB instruction on ARM64.
Constants in this range do not need to be sign extended, so 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:
0x52800416   mov    w22, #0x20                ; =32
0x93407f78   sxtw   x24, w27
0xcb36c318   sub    x24, x24, w22, sxtw

After:
0x93407f78   sxtw   x24, w27
0xd1008318   sub    x24, x24, #0x20
This commit is contained in:
Sintendo 2025-02-01 16:50:08 +01:00
parent 8291cff46d
commit 4a29e0e4f4

View File

@ -652,9 +652,11 @@ void JitArm64::cmp(UGeckoInstruction inst)
SXTW(CR, gpr.R(b));
MVN(CR, CR);
}
else if (gpr.IsImm(b) && !gpr.GetImm(b))
else if (gpr.IsImm(b) && (gpr.GetImm(b) & 0xFFF) == gpr.GetImm(b))
{
SXTW(CR, gpr.R(a));
if (const u32 imm = gpr.GetImm(b); imm != 0)
SUB(CR, CR, imm);
}
else
{