diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index 229bb9c4713..b78f1a838b5 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -871,30 +871,16 @@ void JitArm64::addic(UGeckoInstruction inst) int a = inst.RA, d = inst.RD; bool rc = inst.OPCD == 13; s32 simm = inst.SIMM_16; - u32 imm = (u32)simm; - if (gpr.IsImm(a)) + gpr.BindToRegister(d, d == a); { - u32 i = gpr.GetImm(a); - gpr.SetImmediate(d, i + imm); - - bool has_carry = Interpreter::Helper_Carry(i, imm); - ComputeCarry(has_carry); - if (rc) - ComputeRC0(gpr.GetImm(d)); + auto WA = gpr.GetScopedReg(); + CARRY_IF_NEEDED(ADDI2R, ADDSI2R, gpr.R(d), gpr.R(a), simm, WA); } - else - { - gpr.BindToRegister(d, d == a); - { - auto WA = gpr.GetScopedReg(); - CARRY_IF_NEEDED(ADDI2R, ADDSI2R, gpr.R(d), gpr.R(a), simm, WA); - } - ComputeCarry(); - if (rc) - ComputeRC0(gpr.R(d)); - } + ComputeCarry(); + if (rc) + ComputeRC0(gpr.R(d)); } bool JitArm64::MultiplyImmediate(u32 imm, int a, int d, bool rc) diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp index cffa4f77901..d5f05b6f2b0 100644 --- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.cpp @@ -6,6 +6,7 @@ #include #include "Core/PowerPC/Gekko.h" +#include "Core/PowerPC/Interpreter/Interpreter.h" #include "Core/PowerPC/PPCTables.h" namespace JitCommon @@ -30,6 +31,9 @@ ConstantPropagationResult ConstantPropagation::EvaluateInstruction(UGeckoInstruc { switch (inst.OPCD) { + case 12: // addic + case 13: // addic. + return EvaluateAddImmCarry(inst); case 14: // addi case 15: // addis return EvaluateAddImm(inst); @@ -69,6 +73,19 @@ ConstantPropagationResult ConstantPropagation::EvaluateAddImm(UGeckoInstruction return ConstantPropagationResult(inst.RD, m_gpr_values[inst.RA] + immediate); } +ConstantPropagationResult ConstantPropagation::EvaluateAddImmCarry(UGeckoInstruction inst) const +{ + if (!HasGPR(inst.RA)) + return {}; + + const u32 a = m_gpr_values[inst.RA]; + const bool rc = inst.OPCD & 1; + + ConstantPropagationResult result(inst.RD, a + inst.SIMM_16, rc); + result.carry = Interpreter::Helper_Carry(a, inst.SIMM_16); + return result; +} + ConstantPropagationResult ConstantPropagation::EvaluateRlwinmxRlwnmx(UGeckoInstruction inst, u32 shift) const { diff --git a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h index e003d2e4195..b0718688ce5 100644 --- a/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h +++ b/Source/Core/Core/PowerPC/JitCommon/ConstantPropagation.h @@ -78,6 +78,7 @@ public: private: ConstantPropagationResult EvaluateAddImm(UGeckoInstruction inst) const; + ConstantPropagationResult EvaluateAddImmCarry(UGeckoInstruction inst) const; ConstantPropagationResult EvaluateRlwinmxRlwnmx(UGeckoInstruction inst, u32 shift) const; ConstantPropagationResult EvaluateBitwiseImm(UGeckoInstruction inst, u32 (*do_op)(u32, u32)) const;