From dbb8f588c7ac5c6c4586804c072c87de730ef00c Mon Sep 17 00:00:00 2001 From: Bram Speeckaert Date: Tue, 1 Nov 2022 11:10:00 +0100 Subject: [PATCH] JitArm64: cmpl - Optimize a == 0 case By explicitly handling this, we can avoid materializing zero in a register. Before: 0x52800019 mov w25, #0x0 0xb94087b6 ldr w22, [x29, #0x84] 0xcb16033b sub x27, x25, x22 After: 0xb94087b9 ldr w25, [x29, #0x84] 0xcb1903fb neg x27, x25 --- .../Core/PowerPC/JitArm64/JitArm64_Integer.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index 2fc1524809..6c0d159be8 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -615,16 +615,19 @@ void JitArm64::cmpl(UGeckoInstruction inst) u64 A = gpr.GetImm(a); u64 B = gpr.GetImm(b); MOVI2R(CR, A - B); - return; } - - if (gpr.IsImm(b) && !gpr.GetImm(b)) + else if (gpr.IsImm(a) && !gpr.GetImm(a)) + { + NEG(CR, EncodeRegTo64(gpr.R(b))); + } + else if (gpr.IsImm(b) && !gpr.GetImm(b)) { MOV(EncodeRegTo32(CR), gpr.R(a)); - return; } - - SUB(gpr.CR(crf), EncodeRegTo64(gpr.R(a)), EncodeRegTo64(gpr.R(b))); + else + { + SUB(CR, EncodeRegTo64(gpr.R(a)), EncodeRegTo64(gpr.R(b))); + } } void JitArm64::cmpi(UGeckoInstruction inst)