From 62f80a008cff4eb3c417b91b7d28a4b3602208fd Mon Sep 17 00:00:00 2001 From: Sintendo Date: Tue, 26 Jan 2021 23:25:19 +0100 Subject: [PATCH] Jit64: boolX - Special case or with 0 Bitwise or with zero is just a fancy MOV, really. - Example 1 Before: 41 BA 00 00 00 00 mov r10d,0 45 0B D1 or r10d,r9d After: 45 8B D1 mov r10d,r9d - Example 2 Before: 41 83 CA 00 or r10d,0 After: Nothing! --- .../Core/Core/PowerPC/Jit64/Jit_Integer.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index 7bca28fd4b..b2a76be60e 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -766,7 +766,15 @@ void Jit64::boolX(UGeckoInstruction inst) RCX64Reg Ra = gpr.Bind(a, RCMode::Write); RegCache::Realize(Rj, Ra); - if (complement_b) + if (imm == 0) + { + if (a != j) + MOV(32, Ra, Rj); + if (final_not || complement_b) + NOT(32, Ra); + needs_test = true; + } + else if (complement_b) { if (a != j) MOV(32, Ra, Rj); @@ -778,11 +786,12 @@ void Jit64::boolX(UGeckoInstruction inst) if (a != j) MOV(32, Ra, Rj); OR(32, Ra, Imm32(imm)); - } - if (final_not) { - NOT(32, Ra); - needs_test = true; + if (final_not) + { + NOT(32, Ra); + needs_test = true; + } } } else