From b469981c7259a84608b951ca36d064eca6392667 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 31 Aug 2024 12:04:01 +0200 Subject: [PATCH] Jit: Move mulli to ConstantPropagation --- Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp | 9 +-------- Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp | 7 +------ .../Core/PowerPC/JitCommon/ConstantPropagation.cpp | 10 ++++++++++ .../Core/Core/PowerPC/JitCommon/ConstantPropagation.h | 1 + 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp index 935c212bbc..b4ac8df181 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp @@ -1262,14 +1262,7 @@ void Jit64::mulli(UGeckoInstruction inst) int a = inst.RA, d = inst.RD; u32 imm = inst.SIMM_16; - if (gpr.IsImm(a)) - { - gpr.SetImmediate32(d, gpr.Imm32(a) * imm); - } - else - { - MultiplyImmediate(imm, a, d, false); - } + MultiplyImmediate(imm, a, d, false); } void Jit64::mullwx(UGeckoInstruction inst) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index b78f1a838b..96dc459057 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -959,12 +959,7 @@ void JitArm64::mulli(UGeckoInstruction inst) int a = inst.RA, d = inst.RD; - if (gpr.IsImm(a)) - { - s32 i = (s32)gpr.GetImm(a); - gpr.SetImmediate(d, i * inst.SIMM_16); - } - else if (MultiplyImmediate((u32)(s32)inst.SIMM_16, a, d, false)) + if (MultiplyImmediate((u32)(s32)inst.SIMM_16, a, d, false)) { // Code is generated inside MultiplyImmediate, nothing to be done here. } diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp index d5f05b6f2b..f3de311dee 100644 --- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp @@ -31,6 +31,8 @@ ConstantPropagationResult ConstantPropagation::EvaluateInstruction(UGeckoInstruc { switch (inst.OPCD) { + case 7: // mulli + return EvaluateMulImm(inst); case 12: // addic case 13: // addic. return EvaluateAddImmCarry(inst); @@ -60,6 +62,14 @@ ConstantPropagationResult ConstantPropagation::EvaluateInstruction(UGeckoInstruc } } +ConstantPropagationResult ConstantPropagation::EvaluateMulImm(UGeckoInstruction inst) const +{ + if (!HasGPR(inst.RA)) + return {}; + + return ConstantPropagationResult(inst.RD, m_gpr_values[inst.RA] * inst.SIMM_16); +} + ConstantPropagationResult ConstantPropagation::EvaluateAddImm(UGeckoInstruction inst) const { const s32 immediate = inst.OPCD & 1 ? inst.SIMM_16 << 16 : inst.SIMM_16; diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h index b0718688ce..9b8070caf1 100644 --- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h +++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h @@ -77,6 +77,7 @@ public: void Clear() { m_gpr_values_known = BitSet32{}; } private: + ConstantPropagationResult EvaluateMulImm(UGeckoInstruction inst) const; ConstantPropagationResult EvaluateAddImm(UGeckoInstruction inst) const; ConstantPropagationResult EvaluateAddImmCarry(UGeckoInstruction inst) const; ConstantPropagationResult EvaluateRlwinmxRlwnmx(UGeckoInstruction inst, u32 shift) const;