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(gpr.GetImm(a)); s64 B = static_cast(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)