summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2025-12-01 19:58:38 +0100
committerGitHub <noreply@github.com>2025-12-01 19:58:38 +0100
commit582d5cfe963e9ef1f321dac6eba22483b2de436d (patch)
treeeae57fe79bd112619e2869304e184e272fff66dc
parentf842af8b0316b578eefdad3b47ae88b62c58de24 (diff)
parent0c024de5911ad29e8a88663a45c1447de6eadaa3 (diff)
Merge pull request #14188 from JosJuice/jit64-flush-carry
Jit64: Flush carry flag in FallBackToInterpreter
-rw-r--r--Source/Core/Core/PowerPC/Jit64/Jit.cpp1
-rw-r--r--Source/Core/Core/PowerPC/Jit64/Jit.h1
-rw-r--r--Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp19
3 files changed, 21 insertions, 0 deletions
diff --git a/Source/Core/Core/PowerPC/Jit64/Jit.cpp b/Source/Core/Core/PowerPC/Jit64/Jit.cpp
index 6cee5b971e..1cdaf8c55a 100644
--- a/Source/Core/Core/PowerPC/Jit64/Jit.cpp
+++ b/Source/Core/Core/PowerPC/Jit64/Jit.cpp
@@ -351,6 +351,7 @@ void Jit64::Shutdown()
void Jit64::FallBackToInterpreter(UGeckoInstruction inst)
{
+ FlushCarry();
gpr.Flush(BitSet32(0xFFFFFFFF), RegCache::IgnoreDiscardedRegisters::Yes);
fpr.Flush(BitSet32(0xFFFFFFFF), RegCache::IgnoreDiscardedRegisters::Yes);
diff --git a/Source/Core/Core/PowerPC/Jit64/Jit.h b/Source/Core/Core/PowerPC/Jit64/Jit.h
index 8b96fda107..ad5db1fa10 100644
--- a/Source/Core/Core/PowerPC/Jit64/Jit.h
+++ b/Source/Core/Core/PowerPC/Jit64/Jit.h
@@ -124,6 +124,7 @@ public:
void FinalizeCarryOverflow(bool oe, bool inv = false);
void FinalizeCarry(Gen::CCFlags cond);
void FinalizeCarry(bool ca);
+ void FlushCarry();
void ComputeRC(preg_t preg, bool needs_test = true, bool needs_sext = true);
void FinalizeImmediateRC(s32 value);
diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
index 03bf2fc786..8ce73201f0 100644
--- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
+++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
@@ -137,6 +137,25 @@ void Jit64::FinalizeCarryOverflow(bool oe, bool inv)
FinalizeCarry(inv ? CC_NC : CC_C);
}
+void Jit64::FlushCarry()
+{
+ switch (js.carryFlag)
+ {
+ case CarryFlag::InPPCState:
+ break;
+ case CarryFlag::InHostCarry:
+ JitSetCAIf(CC_C);
+ UnlockFlags();
+ break;
+ case CarryFlag::InHostCarryInverted:
+ JitSetCAIf(CC_NC);
+ UnlockFlags();
+ break;
+ }
+
+ js.carryFlag = CarryFlag::InPPCState;
+}
+
// Be careful; only set needs_test to false if we can be absolutely sure flags don't need
// to be recalculated and haven't been clobbered. Keep in mind not all instructions set
// sufficient flags -- for example, the flags from SHL/SHR are *not* sufficient for LT/GT