From 274e34ddf175cb6feae7c7b0465d3e02eb6e3902 Mon Sep 17 00:00:00 2001 From: Bram Speeckaert Date: Wed, 2 Nov 2022 21:41:03 +0100 Subject: [PATCH] JitArm64: MultiplyImmediate - Handle -(2^n) + 1 Let's take advantage of ARM64's input register shifting one last time, shall we? Before: 0x1280005b mov w27, #-0x3 0x1b1b7f18 mul w24, w24, w27 After: 0x4b180b18 sub w24, w24, w24, lsl #2 --- Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index e3dac61ed0..4810e875b3 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -927,6 +927,16 @@ bool JitArm64::MultiplyImmediate(u32 imm, int a, int d, bool rc) if (rc) ComputeRC0(gpr.R(d)); } + else if (MathUtil::IsPow2(~imm + 2)) + { + // Multiplication by a negative power of two plus one (-(2^n) + 1). + const int shift = IntLog2(~imm + 2); + + gpr.BindToRegister(d, d == a); + SUB(gpr.R(d), gpr.R(a), gpr.R(a), ArithOption(gpr.R(a), ShiftType::LSL, shift)); + if (rc) + ComputeRC0(gpr.R(d)); + } else { // Immediate did not match any known special cases.