From 530475dce8d3c4e94e0737be0dc48757a78bc475 Mon Sep 17 00:00:00 2001 From: Sintendo Date: Thu, 4 Mar 2021 21:43:21 +0100 Subject: [PATCH] Jit64: divwx - Micro-optimize certain divisors When the multiplier is positive (which is the most common case), we can generate slightly better code. - Division by 30307 Before: 49 63 C5 movsxd rax,r13d 48 69 C0 65 6B 32 45 imul rax,rax,45326B65h 4C 8B C0 mov r8,rax 48 C1 E8 3F shr rax,3Fh 49 C1 F8 2D sar r8,2Dh 44 03 C0 add r8d,eax After: 49 63 C5 movsxd rax,r13d 4C 69 C0 65 6B 32 45 imul r8,rax,45326B65h C1 E8 1F shr eax,1Fh 49 C1 F8 2D sar r8,2Dh 44 03 C0 add r8d,eax --- Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index e8a865c63b..41bd9d6ea7 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -1484,6 +1484,12 @@ void Jit64::divwx(UGeckoInstruction inst) SHR(32, Rd, Imm8(31)); SAR(32, R(RSCRATCH), Imm8(m.shift)); } + else if (m.multiplier > 0) + { + IMUL(64, Rd, R(RSCRATCH), Imm32(m.multiplier)); + SHR(32, R(RSCRATCH), Imm8(31)); + SAR(64, R(Rd), Imm8(32 + m.shift)); + } else { IMUL(64, RSCRATCH, R(RSCRATCH), Imm32(m.multiplier));