summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorMarkus Wick <markus@selfnet.de>2015-07-27 20:52:37 +0200
committerMarkus Wick <markus@selfnet.de>2015-07-27 20:52:37 +0200
commit9ca177354aebf31701bbceec9c8dcff96f25e6e5 (patch)
tree45c6549dbda0e465b395224a82cd1990035e51a6 /Source
parent558abae760b187788a50f41a7fb77cb3dd4e387e (diff)
parent7e8cfff3c0217f63ae120f20131bb1c5ac6aa258 (diff)
Merge pull request #2781 from aserna3/master
[AARCH64] Optimized addx()
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index 542b636b30..99782a03f0 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -282,6 +282,25 @@ void JitArm64::addx(UGeckoInstruction inst)
if (inst.Rc)
ComputeRC(gpr.GetImm(d), 0);
}
+ else if (gpr.IsImm(a) || gpr.IsImm(b))
+ {
+ int imm_reg = gpr.IsImm(a) ? a : b;
+ int in_reg = gpr.IsImm(a) ? b : a;
+ gpr.BindToRegister(d, d == in_reg);
+ if (gpr.GetImm(imm_reg) < 4096)
+ {
+ ADD(gpr.R(d), gpr.R(in_reg), gpr.GetImm(imm_reg));
+ }
+ else
+ {
+ ARM64Reg WA = gpr.GetReg();
+ MOVI2R(WA, gpr.GetImm(imm_reg));
+ ADD(gpr.R(d), gpr.R(in_reg), WA);
+ gpr.Unlock(WA);
+ }
+ if (inst.Rc)
+ ComputeRC(gpr.R(d), 0);
+ }
else
{
gpr.BindToRegister(d, d == a || d == b);