commit
6d25c469cf
|
@ -90,6 +90,7 @@ public:
|
||||||
void cmpi(UGeckoInstruction inst);
|
void cmpi(UGeckoInstruction inst);
|
||||||
void cmpli(UGeckoInstruction inst);
|
void cmpli(UGeckoInstruction inst);
|
||||||
void rlwinmx(UGeckoInstruction inst);
|
void rlwinmx(UGeckoInstruction inst);
|
||||||
|
void rlwnmx(UGeckoInstruction inst);
|
||||||
void srawix(UGeckoInstruction inst);
|
void srawix(UGeckoInstruction inst);
|
||||||
void mullwx(UGeckoInstruction inst);
|
void mullwx(UGeckoInstruction inst);
|
||||||
void addic(UGeckoInstruction inst);
|
void addic(UGeckoInstruction inst);
|
||||||
|
|
|
@ -533,6 +533,43 @@ void JitArm64::rlwinmx(UGeckoInstruction inst)
|
||||||
ComputeRC(gpr.R(a), 0);
|
ComputeRC(gpr.R(a), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JitArm64::rlwnmx(UGeckoInstruction inst)
|
||||||
|
{
|
||||||
|
INSTRUCTION_START
|
||||||
|
JITDISABLE(bJITIntegerOff);
|
||||||
|
u32 a = inst.RA, b = inst.RB, s = inst.RS;
|
||||||
|
u32 mask = Helper_Mask(inst.MB, inst.ME);
|
||||||
|
|
||||||
|
if (gpr.IsImm(b) && gpr.IsImm(s))
|
||||||
|
{
|
||||||
|
gpr.SetImmediate(a, _rotl(gpr.GetImm(s), gpr.GetImm(b) & 0x1F) & mask);
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(gpr.GetImm(a), 0);
|
||||||
|
}
|
||||||
|
else if (gpr.IsImm(b))
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(a, a == s);
|
||||||
|
ARM64Reg WA = gpr.GetReg();
|
||||||
|
ArithOption Shift(gpr.R(s), ST_ROR, 32 - (gpr.GetImm(b) & 0x1f));
|
||||||
|
MOVI2R(WA, mask);
|
||||||
|
AND(gpr.R(a), WA, gpr.R(s), Shift);
|
||||||
|
gpr.Unlock(WA);
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(gpr.R(a), 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(a, a == s || a == b);
|
||||||
|
ARM64Reg WA = gpr.GetReg();
|
||||||
|
NEG(WA, gpr.R(b));
|
||||||
|
RORV(gpr.R(a), gpr.R(s), WA);
|
||||||
|
ANDI2R(gpr.R(a), gpr.R(a), mask, WA);
|
||||||
|
gpr.Unlock(WA);
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(gpr.R(a), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JitArm64::srawix(UGeckoInstruction inst)
|
void JitArm64::srawix(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
|
|
|
@ -54,7 +54,7 @@ static GekkoOPTemplate primarytable[] =
|
||||||
|
|
||||||
{20, &JitArm64::rlwimix}, // rlwimix
|
{20, &JitArm64::rlwimix}, // rlwimix
|
||||||
{21, &JitArm64::rlwinmx}, // rlwinmx
|
{21, &JitArm64::rlwinmx}, // rlwinmx
|
||||||
{23, &JitArm64::FallBackToInterpreter}, // rlwnmx
|
{23, &JitArm64::rlwnmx}, // rlwnmx
|
||||||
|
|
||||||
{24, &JitArm64::arith_imm}, // ori
|
{24, &JitArm64::arith_imm}, // ori
|
||||||
{25, &JitArm64::arith_imm}, // oris
|
{25, &JitArm64::arith_imm}, // oris
|
||||||
|
|
Loading…
Reference in New Issue