diff options
| author | JosJuice <josjuice@gmail.com> | 2025-09-16 20:16:42 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-16 20:16:42 +0200 |
| commit | 770c74cc952f958205afc63c5380ef7919dcabc2 (patch) | |
| tree | 00abf0b9bcfbdf661c09171eaf21ec31d6c5240f /Source/Core | |
| parent | ae3be169e1dea1f736fad1e0edaa84a1b64a09c8 (diff) | |
| parent | 6a92a90bce95641bf676a8214d80d2224b65ba83 (diff) | |
Merge pull request #13852 from Sintendo/jitarm64-subfcx
JitArm64_Integer: subfcx optimizations
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index 86027d425a..087a4cd907 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -1445,6 +1445,41 @@ void JitArm64::subfcx(UGeckoInstruction inst) if (inst.Rc) ComputeRC0(gpr.GetImm(d)); } + else if (gpr.IsImm(a, 0)) + { + if (d != b) + { + gpr.BindToRegister(d, false); + MOV(gpr.R(d), gpr.R(b)); + } + ComputeCarry(true); + if (inst.Rc) + ComputeRC0(gpr.R(d)); + } + else if (gpr.IsImm(a) && ((gpr.GetImm(a) & 0xFFF) == gpr.GetImm(a))) + { + gpr.BindToRegister(d, d == b); + CARRY_IF_NEEDED(SUB, SUBS, gpr.R(d), gpr.R(b), gpr.GetImm(a)); + ComputeCarry(); + if (inst.Rc) + ComputeRC0(gpr.R(d)); + } + else if (gpr.IsImm(a) && ((gpr.GetImm(a) & 0xFFF000) == gpr.GetImm(a))) + { + gpr.BindToRegister(d, d == b); + CARRY_IF_NEEDED(SUB, SUBS, gpr.R(d), gpr.R(b), gpr.GetImm(a) >> 12, true); + ComputeCarry(); + if (inst.Rc) + ComputeRC0(gpr.R(d)); + } + else if (gpr.IsImm(b, 0)) + { + gpr.BindToRegister(d, d == a); + CARRY_IF_NEEDED(NEG, NEGS, gpr.R(d), gpr.R(a)); + ComputeCarry(); + if (inst.Rc) + ComputeRC0(gpr.R(d)); + } else { gpr.BindToRegister(d, d == a || d == b); |
