From de21dc5fd932148184a4a9028905c54767a7c942 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Thu, 8 Jul 2021 18:38:22 +0200 Subject: [PATCH] JitArm64: Add bitset constants for caller saved registers --- Source/Core/Common/Arm64Emitter.h | 2 ++ .../PowerPC/JitArm64/JitArm64_RegCache.cpp | 23 +++++-------------- .../Core/PowerPC/JitArm64/JitArm64_RegCache.h | 4 ++-- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/Source/Core/Common/Arm64Emitter.h b/Source/Core/Common/Arm64Emitter.h index a5a4c03e4e..b2d6fda34d 100644 --- a/Source/Core/Common/Arm64Emitter.h +++ b/Source/Core/Common/Arm64Emitter.h @@ -1146,6 +1146,8 @@ public: bool TryEORI2R(ARM64Reg Rd, ARM64Reg Rn, u64 imm); // ABI related + static constexpr BitSet32 CALLER_SAVED_GPRS = BitSet32(0x4007FFFF); + static constexpr BitSet32 CALLER_SAVED_FPRS = BitSet32(0xFFFF00FF); void ABI_PushRegisters(BitSet32 registers); void ABI_PopRegisters(BitSet32 registers, BitSet32 ignore_mask = BitSet32(0)); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp index 98242769b4..45249d92ed 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp @@ -149,15 +149,9 @@ void Arm64GPRCache::Start(PPCAnalyst::BlockRegStats& stats) { } -bool Arm64GPRCache::IsCalleeSaved(ARM64Reg reg) const +bool Arm64GPRCache::IsCallerSaved(ARM64Reg reg) const { - static constexpr auto callee_regs = { - ARM64Reg::X28, ARM64Reg::X27, ARM64Reg::X26, ARM64Reg::X25, - ARM64Reg::X24, ARM64Reg::X23, ARM64Reg::X22, ARM64Reg::X21, - ARM64Reg::X20, ARM64Reg::X19, ARM64Reg::INVALID_REG, - }; - - return std::find(callee_regs.begin(), callee_regs.end(), EncodeRegTo64(reg)) != callee_regs.end(); + return ARM64XEmitter::CALLER_SAVED_GPRS[DecodeReg(reg)]; } const OpArg& Arm64GPRCache::GetGuestGPROpArg(size_t preg) const @@ -416,7 +410,7 @@ BitSet32 Arm64GPRCache::GetCallerSavedUsed() const BitSet32 registers(0); for (const auto& it : m_host_registers) { - if (it.IsLocked() && !IsCalleeSaved(it.GetReg())) + if (it.IsLocked() && IsCallerSaved(it.GetReg())) registers[DecodeReg(it.GetReg())] = true; } return registers; @@ -716,14 +710,9 @@ void Arm64FPRCache::FlushByHost(ARM64Reg host_reg, ARM64Reg tmp_reg) } } -bool Arm64FPRCache::IsCalleeSaved(ARM64Reg reg) const +bool Arm64FPRCache::IsCallerSaved(ARM64Reg reg) const { - static constexpr auto callee_regs = { - ARM64Reg::Q8, ARM64Reg::Q9, ARM64Reg::Q10, ARM64Reg::Q11, ARM64Reg::Q12, - ARM64Reg::Q13, ARM64Reg::Q14, ARM64Reg::Q15, ARM64Reg::INVALID_REG, - }; - - return std::find(callee_regs.begin(), callee_regs.end(), reg) != callee_regs.end(); + return ARM64XEmitter::CALLER_SAVED_FPRS[DecodeReg(reg)]; } bool Arm64FPRCache::IsTopHalfUsed(ARM64Reg reg) const @@ -841,7 +830,7 @@ BitSet32 Arm64FPRCache::GetCallerSavedUsed() const BitSet32 registers(0); for (const auto& it : m_host_registers) { - if (it.IsLocked() && (!IsCalleeSaved(it.GetReg()) || IsTopHalfUsed(it.GetReg()))) + if (it.IsLocked() && (IsCallerSaved(it.GetReg()) || IsTopHalfUsed(it.GetReg()))) registers[DecodeReg(it.GetReg())] = true; } return registers; diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.h b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.h index 9be43a3a6e..2ecbcbbffa 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.h +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.h @@ -291,7 +291,7 @@ protected: void FlushRegister(size_t index, bool maintain_state, Arm64Gen::ARM64Reg tmp_reg) override; private: - bool IsCalleeSaved(Arm64Gen::ARM64Reg reg) const; + bool IsCallerSaved(Arm64Gen::ARM64Reg reg) const; struct GuestRegInfo { @@ -350,7 +350,7 @@ protected: void FlushRegister(size_t preg, bool maintain_state, Arm64Gen::ARM64Reg tmp_reg) override; private: - bool IsCalleeSaved(Arm64Gen::ARM64Reg reg) const; + bool IsCallerSaved(Arm64Gen::ARM64Reg reg) const; bool IsTopHalfUsed(Arm64Gen::ARM64Reg reg) const; void FlushRegisters(BitSet32 regs, bool maintain_state, Arm64Gen::ARM64Reg tmp_reg);