From 49a4e0971952248c66ee8bbb2a92a8f1a0a6d5ab Mon Sep 17 00:00:00 2001 From: Sintendo Date: Wed, 29 Jan 2020 23:01:57 +0100 Subject: [PATCH] DSPJit: Replace/optimize LEAs - LEA is a bit silly when the source and the destination are the same. A simple ADD or SHL will do in those cases. 66 8D 04 45 00 00 00 00 lea ax,[rax*2] 66 03 C0 add ax,ax 48 8D 04 00 lea rax,[rax+rax] 48 03 C0 add rax,rax 66 8D 14 D5 00 00 00 00 lea dx,[rdx*8] 66 C1 E2 03 shl dx,3 - When scaling by 2, consider summing the register with itself instead. The former always needs a 32-bit displacement, so the sum is more compact. 66 8D 14 45 00 00 00 00 lea dx,[rax*2] 66 8D 14 00 lea dx,[rax+rax] --- Source/Core/Core/DSP/Jit/x64/DSPJitBranch.cpp | 6 +++--- Source/Core/Core/DSP/Jit/x64/DSPJitMultiplier.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/Core/Core/DSP/Jit/x64/DSPJitBranch.cpp b/Source/Core/Core/DSP/Jit/x64/DSPJitBranch.cpp index e08a6ac57e..339d81b4e3 100644 --- a/Source/Core/Core/DSP/Jit/x64/DSPJitBranch.cpp +++ b/Source/Core/Core/DSP/Jit/x64/DSPJitBranch.cpp @@ -38,7 +38,7 @@ void DSPEmitter::ReJitConditional(const UDSPInstruction opc, case 0x3: // LE - Less Equal LEA(16, EDX, MScaled(EAX, SCALE_4, 0)); XOR(16, R(EAX), R(EDX)); - LEA(16, EAX, MScaled(EAX, SCALE_2, 0)); + ADD(16, R(EAX), R(EAX)); OR(16, R(EAX), R(EDX)); TEST(16, R(EAX), Imm16(0x10)); break; @@ -56,9 +56,9 @@ void DSPEmitter::ReJitConditional(const UDSPInstruction opc, break; case 0xa: // ? case 0xb: // ? - LEA(16, EDX, MScaled(EAX, SCALE_2, 0)); + LEA(16, EDX, MRegSum(EAX, EAX)); OR(16, R(EAX), R(EDX)); - LEA(16, EDX, MScaled(EDX, SCALE_8, 0)); + SHL(16, R(EDX), Imm8(3)); NOT(16, R(EAX)); OR(16, R(EAX), R(EDX)); TEST(16, R(EAX), Imm16(0x20)); diff --git a/Source/Core/Core/DSP/Jit/x64/DSPJitMultiplier.cpp b/Source/Core/Core/DSP/Jit/x64/DSPJitMultiplier.cpp index 79e6252f12..63acadc559 100644 --- a/Source/Core/Core/DSP/Jit/x64/DSPJitMultiplier.cpp +++ b/Source/Core/Core/DSP/Jit/x64/DSPJitMultiplier.cpp @@ -30,7 +30,7 @@ void DSPEmitter::multiply() TEST(16, sr_reg, Imm16(SR_MUL_MODIFY)); FixupBranch noMult2 = J_CC(CC_NZ); // prod <<= 1; - LEA(64, RAX, MRegSum(RAX, RAX)); + ADD(64, R(RAX), R(RAX)); SetJumpTarget(noMult2); m_gpr.PutReg(DSP_REG_SR, false); // return prod; @@ -130,7 +130,7 @@ void DSPEmitter::multiply_mulx(u8 axh0, u8 axh1) TEST(16, sr_reg, Imm16(SR_MUL_MODIFY)); FixupBranch noMult2 = J_CC(CC_NZ); // prod <<= 1; - LEA(64, RAX, MRegSum(RAX, RAX)); + ADD(64, R(RAX), R(RAX)); SetJumpTarget(noMult2); m_gpr.PutReg(DSP_REG_SR, false); // return prod;