summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2025-09-16 20:16:42 +0200
committerGitHub <noreply@github.com>2025-09-16 20:16:42 +0200
commit770c74cc952f958205afc63c5380ef7919dcabc2 (patch)
tree00abf0b9bcfbdf661c09171eaf21ec31d6c5240f /Source/Core
parentae3be169e1dea1f736fad1e0edaa84a1b64a09c8 (diff)
parent6a92a90bce95641bf676a8214d80d2224b65ba83 (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.cpp35
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);