mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-10 14:39:01 +01:00
JIT: unify subfcx and addcx code
Again, shorter and should make future optimizations easier.
This commit is contained in:
parent
5d80145dc0
commit
a6c9515b00
@ -139,7 +139,7 @@ public:
|
|||||||
void DynaRunTable63(UGeckoInstruction _inst);
|
void DynaRunTable63(UGeckoInstruction _inst);
|
||||||
|
|
||||||
void addx(UGeckoInstruction inst);
|
void addx(UGeckoInstruction inst);
|
||||||
void addcx(UGeckoInstruction inst);
|
void arithcx(UGeckoInstruction inst);
|
||||||
void mulli(UGeckoInstruction inst);
|
void mulli(UGeckoInstruction inst);
|
||||||
void mulhwXx(UGeckoInstruction inst);
|
void mulhwXx(UGeckoInstruction inst);
|
||||||
void mullwx(UGeckoInstruction inst);
|
void mullwx(UGeckoInstruction inst);
|
||||||
@ -215,7 +215,6 @@ public:
|
|||||||
void dcbz(UGeckoInstruction inst);
|
void dcbz(UGeckoInstruction inst);
|
||||||
|
|
||||||
void subfic(UGeckoInstruction inst);
|
void subfic(UGeckoInstruction inst);
|
||||||
void subfcx(UGeckoInstruction inst);
|
|
||||||
void subfx(UGeckoInstruction inst);
|
void subfx(UGeckoInstruction inst);
|
||||||
|
|
||||||
void twx(UGeckoInstruction inst);
|
void twx(UGeckoInstruction inst);
|
||||||
|
@ -294,8 +294,8 @@ static GekkoOPTemplate table31_2[] =
|
|||||||
{
|
{
|
||||||
{266, &Jit64::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
{266, &Jit64::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
||||||
{778, &Jit64::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
{778, &Jit64::addx}, //"addx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
||||||
{10, &Jit64::addcx}, //"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
{10, &Jit64::arithcx}, //"addcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
||||||
{522, &Jit64::addcx}, //"addcox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
{522, &Jit64::arithcx}, //"addcox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
||||||
{138, &Jit64::arithXex}, //"addex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
{138, &Jit64::arithXex}, //"addex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
||||||
{650, &Jit64::arithXex}, //"addeox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
{650, &Jit64::arithXex}, //"addeox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
||||||
{234, &Jit64::arithXex}, //"addmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
{234, &Jit64::arithXex}, //"addmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
||||||
@ -311,8 +311,8 @@ static GekkoOPTemplate table31_2[] =
|
|||||||
{104, &Jit64::negx}, //"negx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
{104, &Jit64::negx}, //"negx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
||||||
{40, &Jit64::subfx}, //"subfx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
{40, &Jit64::subfx}, //"subfx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
||||||
{552, &Jit64::subfx}, //"subox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
{552, &Jit64::subfx}, //"subox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
||||||
{8, &Jit64::subfcx}, //"subfcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
{8, &Jit64::arithcx}, //"subfcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
||||||
{520, &Jit64::subfcx}, //"subfcox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
{520, &Jit64::arithcx}, //"subfcox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
||||||
{136, &Jit64::arithXex}, //"subfex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
{136, &Jit64::arithXex}, //"subfex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
||||||
{232, &Jit64::arithXex}, //"subfmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
{232, &Jit64::arithXex}, //"subfmex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
||||||
{200, &Jit64::arithXex}, //"subfzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
{200, &Jit64::arithXex}, //"subfzex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
||||||
|
@ -750,36 +750,7 @@ void Jit64::subfic(UGeckoInstruction inst)
|
|||||||
// This instruction has no RC flag
|
// This instruction has no RC flag
|
||||||
}
|
}
|
||||||
|
|
||||||
void Jit64::subfcx(UGeckoInstruction inst)
|
|
||||||
{
|
|
||||||
INSTRUCTION_START;
|
|
||||||
JITDISABLE(bJITIntegerOff);
|
|
||||||
int a = inst.RA, b = inst.RB, d = inst.RD;
|
|
||||||
gpr.Lock(a, b, d);
|
|
||||||
gpr.BindToRegister(d, (d == a || d == b), true);
|
|
||||||
|
|
||||||
JitClearCAOV(inst.OE);
|
|
||||||
if (d == b)
|
|
||||||
{
|
|
||||||
SUB(32, gpr.R(d), gpr.R(a));
|
|
||||||
}
|
|
||||||
else if (d == a)
|
|
||||||
{
|
|
||||||
MOV(32, R(RSCRATCH), gpr.R(a));
|
|
||||||
MOV(32, gpr.R(d), gpr.R(b));
|
|
||||||
SUB(32, gpr.R(d), R(RSCRATCH));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MOV(32, gpr.R(d), gpr.R(b));
|
|
||||||
SUB(32, gpr.R(d), gpr.R(a));
|
|
||||||
}
|
|
||||||
if (inst.Rc)
|
|
||||||
ComputeRC(gpr.R(d));
|
|
||||||
FinalizeCarryOverflow(inst.OE, true);
|
|
||||||
|
|
||||||
gpr.UnlockAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Jit64::subfx(UGeckoInstruction inst)
|
void Jit64::subfx(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
@ -1285,36 +1256,44 @@ void Jit64::arithXex(UGeckoInstruction inst)
|
|||||||
gpr.UnlockAll();
|
gpr.UnlockAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Jit64::addcx(UGeckoInstruction inst)
|
void Jit64::arithcx(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
JITDISABLE(bJITIntegerOff);
|
JITDISABLE(bJITIntegerOff);
|
||||||
|
bool add = !!(inst.SUBOP10 & 2); // add or sub
|
||||||
int a = inst.RA, b = inst.RB, d = inst.RD;
|
int a = inst.RA, b = inst.RB, d = inst.RD;
|
||||||
|
gpr.Lock(a, b, d);
|
||||||
|
gpr.BindToRegister(d, d == a || d == b, true);
|
||||||
|
JitClearCAOV(inst.OE);
|
||||||
|
|
||||||
if ((d == a) || (d == b))
|
if (d == a && d != b)
|
||||||
{
|
{
|
||||||
int operand = ((d == a) ? b : a);
|
if (add)
|
||||||
gpr.Lock(a, b, d);
|
{
|
||||||
gpr.BindToRegister(d, true);
|
ADD(32, gpr.R(d), gpr.R(b));
|
||||||
JitClearCAOV(inst.OE);
|
}
|
||||||
ADD(32, gpr.R(d), gpr.R(operand));
|
else
|
||||||
FinalizeCarryOverflow(inst.OE);
|
{
|
||||||
if (inst.Rc)
|
// special case, because sub isn't reversible
|
||||||
ComputeRC(gpr.R(d));
|
MOV(32, R(RSCRATCH), gpr.R(a));
|
||||||
gpr.UnlockAll();
|
MOV(32, gpr.R(d), gpr.R(b));
|
||||||
|
SUB(32, gpr.R(d), R(RSCRATCH));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gpr.Lock(a, b, d);
|
if (d != b)
|
||||||
gpr.BindToRegister(d, false);
|
MOV(32, gpr.R(d), gpr.R(b));
|
||||||
JitClearCAOV(inst.OE);
|
if (add)
|
||||||
MOV(32, gpr.R(d), gpr.R(a));
|
ADD(32, gpr.R(d), gpr.R(a));
|
||||||
ADD(32, gpr.R(d), gpr.R(b));
|
else
|
||||||
FinalizeCarryOverflow(inst.OE);
|
SUB(32, gpr.R(d), gpr.R(a));
|
||||||
if (inst.Rc)
|
|
||||||
ComputeRC(gpr.R(d));
|
|
||||||
gpr.UnlockAll();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FinalizeCarryOverflow(inst.OE, !add);
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(gpr.R(d));
|
||||||
|
gpr.UnlockAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Jit64::rlwinmx(UGeckoInstruction inst)
|
void Jit64::rlwinmx(UGeckoInstruction inst)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user