summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2021-06-28 13:53:44 +0200
committerGitHub <noreply@github.com>2021-06-28 13:53:44 +0200
commit2ef2eee2e088c3b87429809fa81b71a75cddbb18 (patch)
tree3eadb74374a0499f05d8d7f7227ef5514b9ac1bb /Source
parent156f625106fe364c8d9323d4dfb11d04ac678dae (diff)
parent6a51c1564f14680c8e30dcfeeb986d8b1534d449 (diff)
Merge pull request #9464 from Sintendo/jit64addxreloaded
Jit64: addx revisited
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp82
1 files changed, 43 insertions, 39 deletions
diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
index 1f6371e2c2..469ffd5e09 100644
--- a/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
+++ b/Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp
@@ -1665,6 +1665,47 @@ void Jit64::addx(UGeckoInstruction inst)
if (inst.OE)
GenerateConstantOverflow((s64)i + (s64)j);
}
+ else if (gpr.IsImm(a) || gpr.IsImm(b))
+ {
+ auto [i, j] = gpr.IsImm(a) ? std::pair(a, b) : std::pair(b, a);
+
+ s32 imm = gpr.SImm32(i);
+ RCOpArg Rj = gpr.Use(j, RCMode::Read);
+ RCX64Reg Rd = gpr.Bind(d, RCMode::Write);
+ RegCache::Realize(Rj, Rd);
+
+ if (imm == 0)
+ {
+ if (d != j)
+ MOV(32, Rd, Rj);
+ if (inst.OE)
+ GenerateConstantOverflow(false);
+ }
+ else if (d == j)
+ {
+ ADD(32, Rd, Imm32(imm));
+ if (inst.OE)
+ GenerateOverflow();
+ }
+ else if (Rj.IsSimpleReg() && !inst.OE)
+ {
+ LEA(32, Rd, MDisp(Rj.GetSimpleReg(), imm));
+ }
+ else if (imm >= -128 && imm <= 127)
+ {
+ MOV(32, Rd, Rj);
+ ADD(32, Rd, Imm32(imm));
+ if (inst.OE)
+ GenerateOverflow();
+ }
+ else
+ {
+ MOV(32, Rd, Imm32(imm));
+ ADD(32, Rd, Rj);
+ if (inst.OE)
+ GenerateOverflow();
+ }
+ }
else
{
RCOpArg Ra = gpr.Use(a, RCMode::Read);
@@ -1672,52 +1713,15 @@ void Jit64::addx(UGeckoInstruction inst)
RCX64Reg Rd = gpr.Bind(d, RCMode::Write);
RegCache::Realize(Ra, Rb, Rd);
- if ((d == a) || (d == b))
+ if (d == a || d == b)
{
RCOpArg& Rnotd = (d == a) ? Rb : Ra;
- if (!Rnotd.IsZero() || inst.OE)
- {
- ADD(32, Rd, Rnotd);
- }
+ ADD(32, Rd, Rnotd);
}
else if (Ra.IsSimpleReg() && Rb.IsSimpleReg() && !inst.OE)
{
LEA(32, Rd, MRegSum(Ra.GetSimpleReg(), Rb.GetSimpleReg()));
}
- else if ((Ra.IsSimpleReg() || Rb.IsSimpleReg()) && (Ra.IsImm() || Rb.IsImm()) && !inst.OE)
- {
- RCOpArg& Rimm = Ra.IsImm() ? Ra : Rb;
- RCOpArg& Rreg = Ra.IsImm() ? Rb : Ra;
-
- if (Rimm.IsZero())
- {
- MOV(32, Rd, Rreg);
- }
- else
- {
- LEA(32, Rd, MDisp(Rreg.GetSimpleReg(), Rimm.SImm32()));
- }
- }
- else if (Ra.IsImm() || Rb.IsImm())
- {
- RCOpArg& Rimm = Ra.IsImm() ? Ra : Rb;
- RCOpArg& Rother = Ra.IsImm() ? Rb : Ra;
-
- s32 imm = Rimm.SImm32();
- if (imm >= -128 && imm <= 127)
- {
- MOV(32, Rd, Rother);
- if (imm != 0 || inst.OE)
- {
- ADD(32, Rd, Rimm);
- }
- }
- else
- {
- MOV(32, Rd, Rimm);
- ADD(32, Rd, Rother);
- }
- }
else
{
MOV(32, Rd, Ra);