JitArm64: Implement srwx
This commit is contained in:
parent
4722a69fd0
commit
7320d519b4
|
@ -98,6 +98,7 @@ public:
|
||||||
void subfx(UGeckoInstruction inst);
|
void subfx(UGeckoInstruction inst);
|
||||||
void addcx(UGeckoInstruction inst);
|
void addcx(UGeckoInstruction inst);
|
||||||
void slwx(UGeckoInstruction inst);
|
void slwx(UGeckoInstruction inst);
|
||||||
|
void srwx(UGeckoInstruction inst);
|
||||||
void rlwimix(UGeckoInstruction inst);
|
void rlwimix(UGeckoInstruction inst);
|
||||||
void subfex(UGeckoInstruction inst);
|
void subfex(UGeckoInstruction inst);
|
||||||
void subfcx(UGeckoInstruction inst);
|
void subfcx(UGeckoInstruction inst);
|
||||||
|
|
|
@ -1011,6 +1011,52 @@ void JitArm64::slwx(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JitArm64::srwx(UGeckoInstruction inst)
|
||||||
|
{
|
||||||
|
INSTRUCTION_START
|
||||||
|
JITDISABLE(bJITIntegerOff);
|
||||||
|
|
||||||
|
int a = inst.RA, b = inst.RB, s = inst.RS;
|
||||||
|
|
||||||
|
if (gpr.IsImm(b) && gpr.IsImm(s))
|
||||||
|
{
|
||||||
|
u32 i = gpr.GetImm(s), amount = gpr.GetImm(b);
|
||||||
|
gpr.SetImmediate(a, (amount & 0x20) ? 0 : i >> (amount & 0x1F));
|
||||||
|
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(gpr.GetImm(a), 0);
|
||||||
|
}
|
||||||
|
else if (gpr.IsImm(b))
|
||||||
|
{
|
||||||
|
u32 amount = gpr.GetImm(b);
|
||||||
|
if (amount & 0x20)
|
||||||
|
{
|
||||||
|
gpr.SetImmediate(a, 0);
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(0, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(a, a == s);
|
||||||
|
LSR(gpr.R(a), gpr.R(s), amount & 0x1F);
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(gpr.R(a), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(a, a == b || a == s);
|
||||||
|
|
||||||
|
// wipe upper bits. TODO: get rid of it, but then no instruction is allowed to emit some higher bits.
|
||||||
|
MOV(gpr.R(s), gpr.R(s));
|
||||||
|
|
||||||
|
LSRV(EncodeRegTo64(gpr.R(a)), EncodeRegTo64(gpr.R(s)), EncodeRegTo64(gpr.R(b)));
|
||||||
|
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(gpr.R(a), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JitArm64::rlwimix(UGeckoInstruction inst)
|
void JitArm64::rlwimix(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
|
|
|
@ -214,7 +214,7 @@ static GekkoOPTemplate table31[] =
|
||||||
{26, &JitArm64::cntlzwx}, // cntlzwx
|
{26, &JitArm64::cntlzwx}, // cntlzwx
|
||||||
{922, &JitArm64::extsXx}, // extshx
|
{922, &JitArm64::extsXx}, // extshx
|
||||||
{954, &JitArm64::extsXx}, // extsbx
|
{954, &JitArm64::extsXx}, // extsbx
|
||||||
{536, &JitArm64::FallBackToInterpreter}, // srwx
|
{536, &JitArm64::srwx}, // srwx
|
||||||
{792, &JitArm64::FallBackToInterpreter}, // srawx
|
{792, &JitArm64::FallBackToInterpreter}, // srawx
|
||||||
{824, &JitArm64::srawix}, // srawix
|
{824, &JitArm64::srawix}, // srawix
|
||||||
{24, &JitArm64::slwx}, // slwx
|
{24, &JitArm64::slwx}, // slwx
|
||||||
|
|
Loading…
Reference in New Issue