summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorMarkus Wick <degasus@users.noreply.github.com>2021-06-17 16:15:57 +0200
committerGitHub <noreply@github.com>2021-06-17 16:15:57 +0200
commit503c62ec00f53fac6995b255ce189e3e0127f233 (patch)
tree0d71d7637abf0d2bfa13db4d88a3f7791184fa96 /Source/Core
parentb530d9b8c242a0c87e3744b87c7e4e7e25544ebb (diff)
parentfac842021c24379e13a0407483e7c67b2607566c (diff)
Merge pull request #9819 from JosJuice/jitarm64-sbc
JitArm64: Use SBC/SBCS for emulating subfex
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp17
1 files changed, 7 insertions, 10 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index 568a3e0eeb..c92eeb9f84 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -994,7 +994,6 @@ void JitArm64::subfex(UGeckoInstruction inst)
}
else
{
- ARM64Reg WA = js.carryFlag != CarryFlag::ConstantTrue ? gpr.GetReg() : ARM64Reg::INVALID_REG;
gpr.BindToRegister(d, d == a || d == b);
switch (js.carryFlag)
@@ -1002,18 +1001,15 @@ void JitArm64::subfex(UGeckoInstruction inst)
case CarryFlag::InPPCState:
{
// upload the carry state
+ ARM64Reg WA = gpr.GetReg();
LDRB(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(xer_ca));
CMP(WA, 1);
+ gpr.Unlock(WA);
[[fallthrough]];
}
case CarryFlag::InHostCarry:
{
- if (gpr.IsImm(a))
- MOVI2R(WA, u32(~gpr.GetImm(a)));
- else
- MVN(WA, gpr.R(a));
-
- CARRY_IF_NEEDED(ADC, ADCS, gpr.R(d), WA, gpr.R(b));
+ CARRY_IF_NEEDED(SBC, SBCS, gpr.R(d), gpr.R(b), gpr.R(a));
ComputeCarry();
break;
}
@@ -1025,19 +1021,20 @@ void JitArm64::subfex(UGeckoInstruction inst)
}
case CarryFlag::ConstantFalse:
{
+ ARM64Reg WA = gpr.GetReg();
+
if (gpr.IsImm(a))
MOVI2R(WA, u32(~gpr.GetImm(a)));
else
MVN(WA, gpr.R(a));
CARRY_IF_NEEDED(ADD, ADDS, gpr.R(d), WA, gpr.R(b));
+
+ gpr.Unlock(WA);
ComputeCarry();
break;
}
}
-
- if (WA != ARM64Reg::INVALID_REG)
- gpr.Unlock(WA);
}
if (inst.Rc)