summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorBram Speeckaert <bram.speeckaert@gmail.com>2022-11-02 21:41:03 +0100
committerBram Speeckaert <bram.speeckaert@gmail.com>2022-11-02 21:53:19 +0100
commit274e34ddf175cb6feae7c7b0465d3e02eb6e3902 (patch)
tree8f90e09245ce9681dcd97aa2b961a30b6cfb47cf /Source/Core
parent7073a135c659d59f1874b69250d54f34cfb33da2 (diff)
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
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp10
1 files changed, 10 insertions, 0 deletions
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.