From 82f22cdfa1fbaeaac8cf608294c4dc730ee0f099 Mon Sep 17 00:00:00 2001 From: Bram Speeckaert Date: Tue, 1 Nov 2022 12:00:16 +0100 Subject: [PATCH] JitArm64: cmp - Optimize a == -1 case By explicitly handling this, we can avoid materializing -1 in a register and generate more efficient code by taking advantage of -x == ~x + 1. Before: 0x12800015 mov w21, #-0x1 0x93407eb9 sxtw x25, w21 0x93407ef8 sxtw x24, w23 0xcb180338 sub x24, x25, x24 After: 0x2a3703f8 mvn w24, w23 0x93407f18 sxtw x24, w24 --- Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index 2166a1427d..6378c322e7 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -584,6 +584,11 @@ void JitArm64::cmp(UGeckoInstruction inst) NEG(EncodeRegTo32(CR), gpr.R(b)); SXTW(CR, EncodeRegTo32(CR)); } + else if (gpr.IsImm(a) && gpr.GetImm(a) == 0xFFFFFFFF) + { + MVN(EncodeRegTo32(CR), gpr.R(b)); + SXTW(CR, EncodeRegTo32(CR)); + } else if (gpr.IsImm(b) && !gpr.GetImm(b)) { SXTW(CR, gpr.R(a));