summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorMarkus Wick <degasus@users.noreply.github.com>2021-03-18 08:43:51 +0100
committerGitHub <noreply@github.com>2021-03-18 08:43:51 +0100
commitbc4d0b3ef8e58e1ab7a9ae6b47b228ec2d299635 (patch)
tree6d12232210cc84ee20fa16545206d7ca427c97c7 /Source/Core
parenta45a0a2066ed28b224f70e363ca9c636e7567982 (diff)
parent621b5b8e1a698b25d91d9c38bb203458958f686c (diff)
Merge pull request #9586 from JosJuice/jitarm64-srawx
JitArm64: Optimize general case of srawx
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp50
1 files changed, 8 insertions, 42 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index db56cc1a6a..495d072db2 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -1456,13 +1456,12 @@ void JitArm64::srawx(UGeckoInstruction inst)
}
CSET(WA, CC_NEQ);
-
ComputeCarry(WA);
gpr.Unlock(WA);
}
}
- else if (!js.op->wantsCA)
+ else
{
gpr.BindToRegister(a, a == b || a == s);
@@ -1472,47 +1471,14 @@ void JitArm64::srawx(UGeckoInstruction inst)
ASRV(EncodeRegTo64(WA), EncodeRegTo64(WA), EncodeRegTo64(gpr.R(b)));
LSR(EncodeRegTo64(gpr.R(a)), EncodeRegTo64(WA), 32);
- gpr.Unlock(WA);
- }
- else
- {
- gpr.BindToRegister(a, a == b || a == s);
- ARM64Reg WA = gpr.GetReg();
- ARM64Reg WB = gpr.GetReg();
- ARM64Reg WC = gpr.GetReg();
- ARM64Reg RB = gpr.R(b);
- ARM64Reg RS = gpr.R(s);
-
- ANDI2R(WA, RB, 32);
- FixupBranch bit_is_not_zero = TBNZ(RB, 5);
-
- ANDSI2R(WC, RB, 31);
- MOV(WB, RS);
- FixupBranch is_zero = B(CC_EQ);
-
- ASRV(WB, RS, WC);
- FixupBranch bit_is_zero = TBZ(RS, 31);
-
- MOVI2R(WA, 32);
- SUB(WC, WA, WC);
- LSLV(WC, RS, WC);
- CMP(WC, 0);
- CSET(WA, CC_NEQ);
- FixupBranch end = B();
-
- SetJumpTarget(bit_is_not_zero);
- CMP(RS, 0);
- CSET(WA, CC_LT);
- CSINV(WB, ARM64Reg::WZR, ARM64Reg::WZR, CC_GE);
-
- SetJumpTarget(is_zero);
- SetJumpTarget(bit_is_zero);
- SetJumpTarget(end);
-
- MOV(gpr.R(a), WB);
- ComputeCarry(WA);
+ if (js.op->wantsCA)
+ {
+ TST(gpr.R(a), WA);
+ CSET(WA, CC_NEQ);
+ ComputeCarry(WA);
+ }
- gpr.Unlock(WA, WB, WC);
+ gpr.Unlock(WA);
}
if (inst.Rc)