[AArch64] Implement cntlzwx.
This commit is contained in:
parent
76d2f331f0
commit
75590a99cb
|
@ -81,6 +81,7 @@ public:
|
|||
void arith_imm(UGeckoInstruction inst);
|
||||
void boolX(UGeckoInstruction inst);
|
||||
void extsXx(UGeckoInstruction inst);
|
||||
void cntlzwx(UGeckoInstruction inst);
|
||||
|
||||
// System Registers
|
||||
void mtmsr(UGeckoInstruction inst);
|
||||
|
|
|
@ -243,3 +243,30 @@ void JitArm64::extsXx(UGeckoInstruction inst)
|
|||
if (inst.Rc)
|
||||
ComputeRC(a);
|
||||
}
|
||||
|
||||
void JitArm64::cntlzwx(UGeckoInstruction inst)
|
||||
{
|
||||
INSTRUCTION_START
|
||||
JITDISABLE(bJITIntegerOff);
|
||||
int a = inst.RA;
|
||||
int s = inst.RS;
|
||||
|
||||
if (gpr.IsImm(s))
|
||||
{
|
||||
u32 mask = 0x80000000;
|
||||
u32 i = 0;
|
||||
for (; i < 32; i++, mask >>= 1)
|
||||
{
|
||||
if ((u32)gpr.GetImm(s) & mask)
|
||||
break;
|
||||
}
|
||||
gpr.SetImmediate(a, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
CLZ(gpr.R(a), gpr.R(s));
|
||||
}
|
||||
|
||||
if (inst.Rc)
|
||||
ComputeRC(a);
|
||||
}
|
||||
|
|
|
@ -191,7 +191,7 @@ static GekkoOPTemplate table31[] =
|
|||
{284, &JitArm64::boolX}, //"eqvx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_SB | FL_RC_BIT}},
|
||||
{0, &JitArm64::FallBackToInterpreter}, //"cmp", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}},
|
||||
{32, &JitArm64::FallBackToInterpreter}, //"cmpl", OPTYPE_INTEGER, FL_IN_AB | FL_SET_CRn}},
|
||||
{26, &JitArm64::FallBackToInterpreter}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
||||
{26, &JitArm64::cntlzwx}, //"cntlzwx",OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
||||
{922, &JitArm64::extsXx}, //"extshx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
||||
{954, &JitArm64::extsXx}, //"extsbx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_S | FL_RC_BIT}},
|
||||
{536, &JitArm64::FallBackToInterpreter}, //"srwx", OPTYPE_INTEGER, FL_OUT_A | FL_IN_B | FL_IN_S | FL_RC_BIT}},
|
||||
|
|
Loading…
Reference in New Issue