summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2022-11-04 23:13:09 +0100
committerGitHub <noreply@github.com>2022-11-04 23:13:09 +0100
commit8b4e315fb7e001501735fe41f1fa46d0cede4733 (patch)
tree8a4284394a0ee1810efb19ce15d1c7b84aa8bc14 /Source/Core
parentc2e6d85ba7477c34cd3e65e3c45bad8f9d322c7b (diff)
parentd0de68c41bb7d1676ae99cf750cb1bbabb7317a1 (diff)
Merge pull request #11242 from Sintendo/arm64cmp
JitArm64: Optimize cmp
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Common/Arm64Emitter.h33
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp47
2 files changed, 48 insertions, 32 deletions
diff --git a/Source/Core/Common/Arm64Emitter.h b/Source/Core/Common/Arm64Emitter.h
index caf997a29d..19d63a8dae 100644
--- a/Source/Core/Common/Arm64Emitter.h
+++ b/Source/Core/Common/Arm64Emitter.h
@@ -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 @@ private:
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 @@ public:
}
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;
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
index 2fc1524809..f315efb976 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp
@@ -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)