summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core')
-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);