Skip to content
Permalink
Browse files
Merge pull request #11242 from Sintendo/arm64cmp
JitArm64: Optimize cmp
  • Loading branch information
AdmiralCurtiss committed Nov 4, 2022
2 parents c2e6d85 + d0de68c commit 8b4e315
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 32 deletions.
@@ -309,6 +309,18 @@ enum class ShiftType
ROR = 3,
};

enum class ExtendSpecifier
{
UXTB = 0x0,
UXTH = 0x1,
UXTW = 0x2, /* Also LSL on 32bit width */
UXTX = 0x3, /* Also LSL on 64bit width */
SXTB = 0x4,
SXTH = 0x5,
SXTW = 0x6,
SXTX = 0x7,
};

enum class IndexType
{
Unsigned,
@@ -405,18 +417,6 @@ class ArithOption
Width64Bit,
};

enum class ExtendSpecifier
{
UXTB = 0x0,
UXTH = 0x1,
UXTW = 0x2, /* Also LSL on 32bit width */
UXTX = 0x3, /* Also LSL on 64bit width */
SXTB = 0x4,
SXTH = 0x5,
SXTW = 0x6,
SXTX = 0x7,
};

enum class TypeSpecifier
{
ExtendedReg,
@@ -463,6 +463,15 @@ class ArithOption
}
m_shifttype = ShiftType::LSL;
}
ArithOption(ARM64Reg Rd, ExtendSpecifier extend_type, u32 shift = 0)
{
m_destReg = Rd;
m_width = Is64Bit(Rd) ? WidthSpecifier::Width64Bit : WidthSpecifier::Width32Bit;
m_extend = extend_type;
m_type = TypeSpecifier::ExtendedReg;
m_shifttype = ShiftType::LSL;
m_shift = shift;
}
ArithOption(ARM64Reg Rd, ShiftType shift_type, u32 shift)
{
m_destReg = Rd;
@@ -578,25 +578,29 @@ void JitArm64::cmp(UGeckoInstruction inst)
s64 A = static_cast<s32>(gpr.GetImm(a));
s64 B = static_cast<s32>(gpr.GetImm(b));
MOVI2R(CR, A - B);
return;
}

if (gpr.IsImm(b) && !gpr.GetImm(b))
else if (gpr.IsImm(a) && !gpr.GetImm(a))
{
NEG(EncodeRegTo32(CR), gpr.R(b));
SXTW(CR, EncodeRegTo32(CR));
}
else if (gpr.IsImm(a) && gpr.GetImm(a) == 0xFFFFFFFF)
{
MVN(EncodeRegTo32(CR), gpr.R(b));
SXTW(CR, EncodeRegTo32(CR));
}
else if (gpr.IsImm(b) && !gpr.GetImm(b))
{
SXTW(CR, gpr.R(a));
return;
}
else
{
ARM64Reg RA = gpr.R(a);
ARM64Reg RB = gpr.R(b);

ARM64Reg WA = gpr.GetReg();
ARM64Reg XA = EncodeRegTo64(WA);
ARM64Reg RA = gpr.R(a);
ARM64Reg RB = gpr.R(b);

SXTW(XA, RA);
SXTW(CR, RB);
SUB(CR, XA, CR);

gpr.Unlock(WA);
SXTW(CR, RA);
SUB(CR, CR, RB, ArithOption(RB, ExtendSpecifier::SXTW));
}
}

void JitArm64::cmpl(UGeckoInstruction inst)
@@ -615,16 +619,19 @@ void JitArm64::cmpl(UGeckoInstruction inst)
u64 A = gpr.GetImm(a);
u64 B = gpr.GetImm(b);
MOVI2R(CR, A - B);
return;
}

if (gpr.IsImm(b) && !gpr.GetImm(b))
else if (gpr.IsImm(a) && !gpr.GetImm(a))
{
NEG(CR, EncodeRegTo64(gpr.R(b)));
}
else if (gpr.IsImm(b) && !gpr.GetImm(b))
{
MOV(EncodeRegTo32(CR), gpr.R(a));
return;
}

SUB(gpr.CR(crf), EncodeRegTo64(gpr.R(a)), EncodeRegTo64(gpr.R(b)));
else
{
SUB(CR, EncodeRegTo64(gpr.R(a)), EncodeRegTo64(gpr.R(b)));
}
}

void JitArm64::cmpi(UGeckoInstruction inst)

0 comments on commit 8b4e315

Please sign in to comment.