summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorBram Speeckaert <bram.speeckaert@gmail.com>2022-11-01 12:00:16 +0100
committerBram Speeckaert <bram.speeckaert@gmail.com>2022-11-01 12:00:32 +0100
commit82f22cdfa1fbaeaac8cf608294c4dc730ee0f099 (patch)
tree48b9dc22cb830060db7215d589e10843212a4441 /Source/Core
parent592ba31e224c062fe558dad21d2f605196df0b31 (diff)
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
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp5
1 files changed, 5 insertions, 0 deletions
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));