diff options
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp | 16 |
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); |
