summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2026-07-05 17:29:57 +0200
committerGitHub <noreply@github.com>2026-07-05 17:29:57 +0200
commit146f2be4369beadfa3e523eafc3046a4fba40873 (patch)
tree5e2eac537da777246a344da04ee0f4f375b4ed4c
parent60c76068128f1b77910cf0e04c69e0c2c1bbab70 (diff)
parent21c26052989f6f8c29c6670c40f35df84638d12b (diff)
Merge pull request #14516 from Sintendo/jitarm64-subfzex
JitArm64: Minor subfzex optimizations
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index e82db40756..d60a499594 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -1326,6 +1326,22 @@ void JitArm64::subfzex(UGeckoInstruction inst)
gpr.SetImmediate(d, imm + carry);
ComputeCarry(Interpreter::Helper_Carry(imm, carry));
}
+ else if (gpr.IsImm(a, 0) && js.carryFlag == CarryFlag::InHostCarry)
+ {
+ gpr.BindToRegister(d, false);
+ // RD = ~0 + carry = -1 + carry = carry ? 0 : -1
+ // Note that CSETM sets the destination to -1 if the condition is true,
+ // and 0 otherwise. Hence, the condition must be carry clear.
+ CSETM(gpr.R(d), CC_CC);
+ // Carry remains unchanged.
+ }
+ else if (gpr.IsImm(a, 0xFFFFFFFF) && js.carryFlag == CarryFlag::InHostCarry)
+ {
+ gpr.BindToRegister(d, false);
+ // RD = ~(-1) + carry = 0 + carry = carry ? 1 : 0
+ CSET(gpr.R(d), CC_CS);
+ ComputeCarry(false);
+ }
else
{
gpr.BindToRegister(d, d == a);