From f25611f388e34ec3610a90f8f862cb0ad5679ef9 Mon Sep 17 00:00:00 2001 From: Bram Speeckaert Date: Tue, 1 Nov 2022 19:58:27 +0100 Subject: [PATCH] JitArm64: MultiplyImmediate - Handle 1 Multiplication by one is also trivial. Depending on the registers involved, either a single MOV or no instructions will be generated. Before: 0x52800038 mov w24, #0x1 0x1b1a7f1b mul w27, w24, w26 After: 0x2a1a03fb mov w27, w26 Before: 0x52800039 mov w25, #0x1 0x1b1a7f3a mul w26, w25, w26 After: Nothing! --- 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 96e4325106..fb56ce7060 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -884,6 +884,16 @@ bool JitArm64::MultiplyImmediate(u32 imm, int a, int d, bool rc) if (rc) ComputeRC0(gpr.GetImm(d)); } + else if (imm == 1) + { + if (d != a) + { + gpr.BindToRegister(d, false); + MOV(gpr.R(d), gpr.R(a)); + } + if (rc) + ComputeRC0(gpr.R(d)); + } else { // Immediate did not match any known special cases.