[ARM] slwx/srwx/srawx implementations.
This commit is contained in:
parent
81d7986202
commit
e56071f2be
|
@ -219,6 +219,7 @@ void JitArm::arith(UGeckoInstruction inst)
|
||||||
case 31: // addcx, addx, subfx
|
case 31: // addcx, addx, subfx
|
||||||
switch(inst.SUBOP10)
|
switch(inst.SUBOP10)
|
||||||
{
|
{
|
||||||
|
case 24: // slwx
|
||||||
case 28: // andx
|
case 28: // andx
|
||||||
case 60: // andcx
|
case 60: // andcx
|
||||||
case 124: // norx
|
case 124: // norx
|
||||||
|
@ -227,6 +228,8 @@ void JitArm::arith(UGeckoInstruction inst)
|
||||||
case 412: // orcx
|
case 412: // orcx
|
||||||
case 444: // orx
|
case 444: // orx
|
||||||
case 476: // nandx
|
case 476: // nandx
|
||||||
|
case 536: // srwx
|
||||||
|
case 792: // srawx
|
||||||
if (gpr.IsImm(s))
|
if (gpr.IsImm(s))
|
||||||
{
|
{
|
||||||
isImm[0] = true;
|
isImm[0] = true;
|
||||||
|
@ -239,6 +242,7 @@ void JitArm::arith(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
Rc = inst.Rc;
|
Rc = inst.Rc;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10: // addcx
|
case 10: // addcx
|
||||||
carry = true;
|
carry = true;
|
||||||
case 40: // subfx
|
case 40: // subfx
|
||||||
|
@ -302,6 +306,10 @@ void JitArm::arith(UGeckoInstruction inst)
|
||||||
case 31: // addcx, addx, subfx
|
case 31: // addcx, addx, subfx
|
||||||
switch(inst.SUBOP10)
|
switch(inst.SUBOP10)
|
||||||
{
|
{
|
||||||
|
case 24:
|
||||||
|
gpr.SetImmediate(a, Imm[0] << Imm[1]);
|
||||||
|
dest = a;
|
||||||
|
break;
|
||||||
case 28:
|
case 28:
|
||||||
gpr.SetImmediate(a, And(Imm[0], Imm[1]));
|
gpr.SetImmediate(a, And(Imm[0], Imm[1]));
|
||||||
dest = a;
|
dest = a;
|
||||||
|
@ -340,6 +348,14 @@ void JitArm::arith(UGeckoInstruction inst)
|
||||||
gpr.SetImmediate(a, ~And(Imm[1], Imm[0]));
|
gpr.SetImmediate(a, ~And(Imm[1], Imm[0]));
|
||||||
dest = a;
|
dest = a;
|
||||||
break;
|
break;
|
||||||
|
case 536:
|
||||||
|
gpr.SetImmediate(a, Imm[0] >> Imm[1]);
|
||||||
|
dest = a;
|
||||||
|
break;
|
||||||
|
case 792:
|
||||||
|
gpr.SetImmediate(a, ((s32)Imm[0]) >> Imm[1]);
|
||||||
|
dest = a;
|
||||||
|
break;
|
||||||
case 10: // addcx
|
case 10: // addcx
|
||||||
case 266:
|
case 266:
|
||||||
case 778: // both addx
|
case 778: // both addx
|
||||||
|
@ -428,6 +444,12 @@ void JitArm::arith(UGeckoInstruction inst)
|
||||||
case 31:
|
case 31:
|
||||||
switch(inst.SUBOP10)
|
switch(inst.SUBOP10)
|
||||||
{
|
{
|
||||||
|
case 24:
|
||||||
|
RA = gpr.R(a);
|
||||||
|
RS = gpr.R(s);
|
||||||
|
RB = gpr.R(b);
|
||||||
|
LSLS(RA, RS, RB);
|
||||||
|
break;
|
||||||
case 28:
|
case 28:
|
||||||
RA = gpr.R(a);
|
RA = gpr.R(a);
|
||||||
RS = gpr.R(s);
|
RS = gpr.R(s);
|
||||||
|
@ -496,7 +518,18 @@ void JitArm::arith(UGeckoInstruction inst)
|
||||||
AND(RA, RS, RB);
|
AND(RA, RS, RB);
|
||||||
MVNS(RA, RA);
|
MVNS(RA, RA);
|
||||||
break;
|
break;
|
||||||
|
case 536:
|
||||||
|
RA = gpr.R(a);
|
||||||
|
RS = gpr.R(s);
|
||||||
|
RB = gpr.R(b);
|
||||||
|
LSRS(RA, RS, RB);
|
||||||
|
break;
|
||||||
|
case 792:
|
||||||
|
RA = gpr.R(a);
|
||||||
|
RS = gpr.R(s);
|
||||||
|
RB = gpr.R(b);
|
||||||
|
ASRS(RA, RS, RB);
|
||||||
|
break;
|
||||||
case 10: // addcx
|
case 10: // addcx
|
||||||
case 266:
|
case 266:
|
||||||
case 778: // both addx
|
case 778: // both addx
|
||||||
|
|
|
@ -207,10 +207,10 @@ static GekkoOPTemplate table31[] =
|
||||||
{26, &JitArm::cntlzwx}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
{26, &JitArm::cntlzwx}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
||||||
{922, &JitArm::extshx}, //"extshx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
{922, &JitArm::extshx}, //"extshx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
||||||
{954, &JitArm::extsbx}, //"extsbx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
{954, &JitArm::extsbx}, //"extsbx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
||||||
{536, &JitArm::Default}, //"srwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},
|
{536, &JitArm::arith}, //"srwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},
|
||||||
{792, &JitArm::Default}, //"srawx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},
|
{792, &JitArm::arith}, //"srawx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},
|
||||||
{824, &JitArm::srawix}, //"srawix", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},
|
{824, &JitArm::srawix}, //"srawix", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},
|
||||||
{24, &JitArm::Default}, //"slwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},
|
{24, &JitArm::arith}, //"slwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},
|
||||||
|
|
||||||
{54, &JitArm::dcbst}, //"dcbst", OPTYPE_DCACHE, 0, 4}},
|
{54, &JitArm::dcbst}, //"dcbst", OPTYPE_DCACHE, 0, 4}},
|
||||||
{86, &JitArm::Default}, //"dcbf", OPTYPE_DCACHE, 0, 4}},
|
{86, &JitArm::Default}, //"dcbf", OPTYPE_DCACHE, 0, 4}},
|
||||||
|
|
Loading…
Reference in New Issue