diff options
| author | Markus Wick <degasus@users.noreply.github.com> | 2021-06-17 16:15:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-17 16:15:57 +0200 |
| commit | 503c62ec00f53fac6995b255ce189e3e0127f233 (patch) | |
| tree | 0d71d7637abf0d2bfa13db4d88a3f7791184fa96 /Source/Core | |
| parent | b530d9b8c242a0c87e3744b87c7e4e7e25544ebb (diff) | |
| parent | fac842021c24379e13a0407483e7c67b2607566c (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.cpp | 17 |
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) |
