Jit_Integer: mullwx

This commit is contained in:
MerryMage
2018-10-15 21:01:00 +01:00
parent 02deaab6ee
commit 24aadd933e

View File

@ -1063,42 +1063,46 @@ void Jit64::mullwx(UGeckoInstruction inst)
JITDISABLE(bJITIntegerOff); JITDISABLE(bJITIntegerOff);
int a = inst.RA, b = inst.RB, d = inst.RD; int a = inst.RA, b = inst.RB, d = inst.RD;
if (gpr.R(a).IsImm() && gpr.R(b).IsImm()) if (gpr.IsImm(a, b))
{ {
s32 i = gpr.R(a).SImm32(), j = gpr.R(b).SImm32(); s32 i = gpr.SImm32(a), j = gpr.SImm32(b);
gpr.SetImmediate32(d, i * j); gpr.SetImmediate32(d, i * j);
if (inst.OE) if (inst.OE)
GenerateConstantOverflow((s64)i * (s64)j); GenerateConstantOverflow((s64)i * (s64)j);
} }
else if (gpr.IsImm(a) || gpr.IsImm(b))
{
u32 imm = gpr.IsImm(a) ? gpr.Imm32(a) : gpr.Imm32(b);
int src = gpr.IsImm(a) ? b : a;
MultiplyImmediate(imm, src, d, inst.OE);
if (inst.OE)
GenerateOverflow();
}
else else
{ {
gpr.Lock(a, b, d); RCOpArg Ra = gpr.Use(a, RCMode::Read);
gpr.BindToRegister(d, (d == a || d == b), true); RCOpArg Rb = gpr.Use(b, RCMode::Read);
/*if (gpr.R(a).IsImm() || gpr.R(b).IsImm()) RCX64Reg Rd = gpr.Bind(d, RCMode::Write);
RegCache::Realize(Ra, Rb, Rd);
if (d == a)
{ {
u32 imm = gpr.R(a).IsImm() ? gpr.R(a).Imm32() : gpr.R(b).Imm32(); IMUL(32, Rd, Rb);
int src = gpr.R(a).IsImm() ? b : a;
MultiplyImmediate(imm, src, d, inst.OE);
}
else*/ if (d == a)
{
IMUL(32, gpr.RX(d), gpr.R(b));
} }
else if (d == b) else if (d == b)
{ {
IMUL(32, gpr.RX(d), gpr.R(a)); IMUL(32, Rd, Ra);
} }
else else
{ {
MOV(32, gpr.R(d), gpr.R(b)); MOV(32, Rd, Rb);
IMUL(32, gpr.RX(d), gpr.R(a)); IMUL(32, Rd, Ra);
} }
if (inst.OE) if (inst.OE)
GenerateOverflow(); GenerateOverflow();
} }
if (inst.Rc) if (inst.Rc)
ComputeRC(gpr.R(d)); ComputeRC(d);
gpr.UnlockAll();
} }
void Jit64::mulhwXx(UGeckoInstruction inst) void Jit64::mulhwXx(UGeckoInstruction inst)