From 3aaf1a2b8bad78d648c15cd68c24ce6aa362e3e6 Mon Sep 17 00:00:00 2001 From: Bram Speeckaert Date: Tue, 1 Nov 2022 20:58:16 +0100 Subject: [PATCH] JitArm64: MultiplyImmediate - Handle 2^n Turn multiplications by a power of two into bitshifts. Before: 0x52800817 mov w23, #0x40 0x1b167ef6 mul w22, w23, w22 After: 0x531a66d6 lsl w22, w22, #6 --- 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 fb56ce7060..70dfea5f99 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -7,6 +7,7 @@ #include "Common/Assert.h" #include "Common/BitUtils.h" #include "Common/CommonTypes.h" +#include "Common/MathUtil.h" #include "Core/Core.h" #include "Core/CoreTiming.h" @@ -894,6 +895,15 @@ bool JitArm64::MultiplyImmediate(u32 imm, int a, int d, bool rc) if (rc) ComputeRC0(gpr.R(d)); } + else if (MathUtil::IsPow2(imm)) + { + const int shift = IntLog2(imm); + + gpr.BindToRegister(d, d == a); + LSL(gpr.R(d), gpr.R(a), shift); + if (rc) + ComputeRC0(gpr.R(d)); + } else { // Immediate did not match any known special cases.