diff options
| author | Bram Speeckaert <bram.speeckaert@gmail.com> | 2022-11-01 12:00:16 +0100 |
|---|---|---|
| committer | Bram Speeckaert <bram.speeckaert@gmail.com> | 2022-11-01 12:00:32 +0100 |
| commit | 82f22cdfa1fbaeaac8cf608294c4dc730ee0f099 (patch) | |
| tree | 48b9dc22cb830060db7215d589e10843212a4441 /Source/Core | |
| parent | 592ba31e224c062fe558dad21d2f605196df0b31 (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.cpp | 5 |
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)); |
