diff options
| author | Markus Wick <markus@selfnet.de> | 2015-07-27 20:52:37 +0200 |
|---|---|---|
| committer | Markus Wick <markus@selfnet.de> | 2015-07-27 20:52:37 +0200 |
| commit | 9ca177354aebf31701bbceec9c8dcff96f25e6e5 (patch) | |
| tree | 45c6549dbda0e465b395224a82cd1990035e51a6 /Source | |
| parent | 558abae760b187788a50f41a7fb77cb3dd4e387e (diff) | |
| parent | 7e8cfff3c0217f63ae120f20131bb1c5ac6aa258 (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.cpp | 19 |
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); |
