JitArm64: Implement srawx.
This commit is contained in:
parent
41563c55cd
commit
a8b1347ea9
|
@ -85,6 +85,7 @@ public:
|
||||||
void addcx(UGeckoInstruction inst);
|
void addcx(UGeckoInstruction inst);
|
||||||
void slwx(UGeckoInstruction inst);
|
void slwx(UGeckoInstruction inst);
|
||||||
void srwx(UGeckoInstruction inst);
|
void srwx(UGeckoInstruction inst);
|
||||||
|
void srawx(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);
|
||||||
|
|
|
@ -1104,6 +1104,92 @@ void JitArm64::srwx(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JitArm64::srawx(UGeckoInstruction inst)
|
||||||
|
{
|
||||||
|
INSTRUCTION_START
|
||||||
|
JITDISABLE(bJITIntegerOff);
|
||||||
|
|
||||||
|
int a = inst.RA, b = inst.RB, s = inst.RS;
|
||||||
|
|
||||||
|
if (gpr.IsImm(b) && gpr.IsImm(s))
|
||||||
|
{
|
||||||
|
s32 i = gpr.GetImm(s), amount = gpr.GetImm(b);
|
||||||
|
if (amount & 0x20)
|
||||||
|
{
|
||||||
|
gpr.SetImmediate(a, i & 0x80000000 ? 0xFFFFFFFF : 0);
|
||||||
|
ComputeCarry(i & 0x80000000 ? true : false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
amount &= 0x1F;
|
||||||
|
gpr.SetImmediate(a, i >> amount);
|
||||||
|
ComputeCarry(amount != 0 && i < 0 && (i << (32 - amount)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(gpr.GetImm(a), 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (gpr.IsImm(b) && (gpr.GetImm(b) & 0x20) == 0 && !js.op->wantsCA)
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(a, a == s);
|
||||||
|
ASR(gpr.R(a), gpr.R(a), gpr.GetImm(b) & 0x1F);
|
||||||
|
}
|
||||||
|
else if (!js.op->wantsCA)
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(a, a == b || a == s);
|
||||||
|
|
||||||
|
ARM64Reg WA = gpr.GetReg();
|
||||||
|
|
||||||
|
LSL(EncodeRegTo64(WA), EncodeRegTo64(gpr.R(s)), 32);
|
||||||
|
ASRV(EncodeRegTo64(WA), EncodeRegTo64(WA), EncodeRegTo64(gpr.R(b)));
|
||||||
|
LSR(EncodeRegTo64(gpr.R(a)), EncodeRegTo64(WA), 32);
|
||||||
|
|
||||||
|
gpr.Unlock(WA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gpr.BindToRegister(a, a == b || a == s);
|
||||||
|
ARM64Reg WA = gpr.GetReg();
|
||||||
|
ARM64Reg WB = gpr.GetReg();
|
||||||
|
ARM64Reg WC = gpr.GetReg();
|
||||||
|
|
||||||
|
ANDI2R(WA, gpr.R(b), 32);
|
||||||
|
FixupBranch bit_is_not_zero = TBNZ(gpr.R(b), 5);
|
||||||
|
|
||||||
|
ANDSI2R(WC, gpr.R(b), 31);
|
||||||
|
MOV(WB, gpr.R(s));
|
||||||
|
FixupBranch is_zero = B(CC_EQ);
|
||||||
|
|
||||||
|
ASRV(WB, gpr.R(s), WC);
|
||||||
|
FixupBranch bit_is_zero = TBZ(gpr.R(s), 31);
|
||||||
|
|
||||||
|
MOVI2R(WA, 32);
|
||||||
|
SUB(WC, WA, WC);
|
||||||
|
LSL(WC, gpr.R(s), WC);
|
||||||
|
CMP(WC, 0);
|
||||||
|
CSET(WA, CC_NEQ);
|
||||||
|
FixupBranch end = B();
|
||||||
|
|
||||||
|
SetJumpTarget(bit_is_not_zero);
|
||||||
|
CMP(gpr.R(s), 0);
|
||||||
|
CSET(WA, CC_LT);
|
||||||
|
CSINV(WB, WZR, WZR, CC_GE);
|
||||||
|
|
||||||
|
SetJumpTarget(is_zero);
|
||||||
|
SetJumpTarget(bit_is_zero);
|
||||||
|
SetJumpTarget(end);
|
||||||
|
|
||||||
|
MOV(gpr.R(a), WB);
|
||||||
|
STRB(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(xer_ca));
|
||||||
|
|
||||||
|
gpr.Unlock(WA, WB, WC);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inst.Rc)
|
||||||
|
ComputeRC(gpr.R(a), 0);
|
||||||
|
}
|
||||||
|
|
||||||
void JitArm64::rlwimix(UGeckoInstruction inst)
|
void JitArm64::rlwimix(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
|
|
|
@ -209,23 +209,23 @@ static GekkoOPTemplate table31[] = {
|
||||||
{200, &JitArm64::FallBackToInterpreter}, // subfzex
|
{200, &JitArm64::FallBackToInterpreter}, // subfzex
|
||||||
{712, &JitArm64::FallBackToInterpreter}, // subfzeox
|
{712, &JitArm64::FallBackToInterpreter}, // subfzeox
|
||||||
|
|
||||||
{28, &JitArm64::boolX}, // andx
|
{28, &JitArm64::boolX}, // andx
|
||||||
{60, &JitArm64::boolX}, // andcx
|
{60, &JitArm64::boolX}, // andcx
|
||||||
{444, &JitArm64::boolX}, // orx
|
{444, &JitArm64::boolX}, // orx
|
||||||
{124, &JitArm64::boolX}, // norx
|
{124, &JitArm64::boolX}, // norx
|
||||||
{316, &JitArm64::boolX}, // xorx
|
{316, &JitArm64::boolX}, // xorx
|
||||||
{412, &JitArm64::boolX}, // orcx
|
{412, &JitArm64::boolX}, // orcx
|
||||||
{476, &JitArm64::boolX}, // nandx
|
{476, &JitArm64::boolX}, // nandx
|
||||||
{284, &JitArm64::boolX}, // eqvx
|
{284, &JitArm64::boolX}, // eqvx
|
||||||
{0, &JitArm64::cmp}, // cmp
|
{0, &JitArm64::cmp}, // cmp
|
||||||
{32, &JitArm64::cmpl}, // cmpl
|
{32, &JitArm64::cmpl}, // cmpl
|
||||||
{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::srwx}, // srwx
|
{536, &JitArm64::srwx}, // srwx
|
||||||
{792, &JitArm64::FallBackToInterpreter}, // srawx
|
{792, &JitArm64::srawx}, // srawx
|
||||||
{824, &JitArm64::srawix}, // srawix
|
{824, &JitArm64::srawix}, // srawix
|
||||||
{24, &JitArm64::slwx}, // slwx
|
{24, &JitArm64::slwx}, // slwx
|
||||||
|
|
||||||
{54, &JitArm64::dcbx}, // dcbst
|
{54, &JitArm64::dcbx}, // dcbst
|
||||||
{86, &JitArm64::dcbx}, // dcbf
|
{86, &JitArm64::dcbx}, // dcbf
|
||||||
|
|
Loading…
Reference in New Issue