From 47894560afcb4c981be3c86e24a10a7059dde1c6 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 1 Sep 2024 15:45:23 +0200 Subject: [PATCH] JitArm64: Pass index to more Arm64GPRCache functions This refactorization is needed for upcoming commits. --- .../PowerPC/JitArm64/JitArm64_RegCache.cpp | 19 +++++++---------- .../Core/PowerPC/JitArm64/JitArm64_RegCache.h | 21 ++++++++++++------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp index 465d0257af..0d69d47854 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp @@ -137,12 +137,6 @@ void Arm64RegCache::DiscardRegister(size_t preg) UnlockRegister(host_reg); } -// GPR Cache -constexpr size_t GUEST_GPR_COUNT = 32; -constexpr size_t GUEST_CR_COUNT = 8; -constexpr size_t GUEST_GPR_OFFSET = 0; -constexpr size_t GUEST_CR_OFFSET = GUEST_GPR_COUNT; - Arm64GPRCache::Arm64GPRCache() : Arm64RegCache(GUEST_GPR_COUNT + GUEST_CR_COUNT) { } @@ -270,8 +264,8 @@ void Arm64GPRCache::FlushRegisters(BitSet32 regs, FlushMode mode, ARM64Reg tmp_r const size_t ppc_offset = GetGuestByIndex(i).ppc_offset; if (ppc_offset <= 252) { - ARM64Reg RX1 = reg1_zero ? ARM64Reg::WZR : R(GetGuestByIndex(i)); - ARM64Reg RX2 = reg2_zero ? ARM64Reg::WZR : R(GetGuestByIndex(i + 1)); + ARM64Reg RX1 = reg1_zero ? ARM64Reg::WZR : BindForRead(i); + ARM64Reg RX2 = reg2_zero ? ARM64Reg::WZR : BindForRead(i + 1); m_emit->STP(IndexType::Signed, RX1, RX2, PPC_REG, u32(ppc_offset)); if (flush_all) { @@ -332,8 +326,9 @@ void Arm64GPRCache::Flush(FlushMode mode, ARM64Reg tmp_reg, FlushCRRegisters(BitSet8(0xFF), mode, tmp_reg, ignore_discarded_registers); } -ARM64Reg Arm64GPRCache::R(const GuestRegInfo& guest_reg) +ARM64Reg Arm64GPRCache::BindForRead(size_t index) { + GuestRegInfo guest_reg = GetGuestByIndex(index); OpArg& reg = guest_reg.reg; size_t bitsize = guest_reg.bitsize; @@ -375,8 +370,9 @@ ARM64Reg Arm64GPRCache::R(const GuestRegInfo& guest_reg) return ARM64Reg::INVALID_REG; } -void Arm64GPRCache::SetImmediate(const GuestRegInfo& guest_reg, u32 imm, bool dirty) +void Arm64GPRCache::SetImmediateInternal(size_t index, u32 imm, bool dirty) { + GuestRegInfo guest_reg = GetGuestByIndex(index); OpArg& reg = guest_reg.reg; if (reg.GetType() == RegType::Register) UnlockRegister(EncodeRegTo32(reg.GetReg())); @@ -384,8 +380,9 @@ void Arm64GPRCache::SetImmediate(const GuestRegInfo& guest_reg, u32 imm, bool di reg.SetDirty(dirty); } -void Arm64GPRCache::BindToRegister(const GuestRegInfo& guest_reg, bool will_read, bool will_write) +void Arm64GPRCache::BindForWrite(size_t index, bool will_read, bool will_write) { + GuestRegInfo guest_reg = GetGuestByIndex(index); OpArg& reg = guest_reg.reg; const size_t bitsize = guest_reg.bitsize; diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.h b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.h index b98e170531..ed33f6a149 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.h +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.h @@ -328,15 +328,15 @@ public: // Returns a guest GPR inside of a host register. // Will dump an immediate to the host register as well. - Arm64Gen::ARM64Reg R(size_t preg) { return R(GetGuestGPR(preg)); } + Arm64Gen::ARM64Reg R(size_t preg) { return BindForRead(GUEST_GPR_OFFSET + preg); } // Returns a guest CR inside of a host register. - Arm64Gen::ARM64Reg CR(size_t preg) { return R(GetGuestCR(preg)); } + Arm64Gen::ARM64Reg CR(size_t preg) { return BindForRead(GUEST_CR_OFFSET + preg); } // Set a register to an immediate. Only valid for guest GPRs. void SetImmediate(size_t preg, u32 imm, bool dirty = true) { - SetImmediate(GetGuestGPR(preg), imm, dirty); + SetImmediateInternal(GUEST_GPR_OFFSET + preg, imm, dirty); } // Returns if a register is set as an immediate. Only valid for guest GPRs. @@ -374,14 +374,14 @@ public: // flushed. Just remember to call this function again with will_write = true after the Flush call. void BindToRegister(size_t preg, bool will_read, bool will_write = true) { - BindToRegister(GetGuestGPR(preg), will_read, will_write); + BindForWrite(GUEST_GPR_OFFSET + preg, will_read, will_write); } // Binds a guest CR to a host register, optionally loading its value. // The description of BindToRegister above applies to this function as well. void BindCRToRegister(size_t preg, bool will_read, bool will_write = true) { - BindToRegister(GetGuestCR(preg), will_read, will_write); + BindForWrite(GUEST_CR_OFFSET + preg, will_read, will_write); } BitSet32 GetCallerSavedUsed() const override; @@ -426,14 +426,19 @@ private: GuestRegInfo GetGuestCR(size_t preg); GuestRegInfo GetGuestByIndex(size_t index); - Arm64Gen::ARM64Reg R(const GuestRegInfo& guest_reg); - void SetImmediate(const GuestRegInfo& guest_reg, u32 imm, bool dirty); - void BindToRegister(const GuestRegInfo& guest_reg, bool will_read, bool will_write = true); + Arm64Gen::ARM64Reg BindForRead(size_t index); + void SetImmediateInternal(size_t index, u32 imm, bool dirty); + void BindForWrite(size_t index, bool will_read, bool will_write = true); void FlushRegisters(BitSet32 regs, FlushMode mode, Arm64Gen::ARM64Reg tmp_reg, IgnoreDiscardedRegisters ignore_discarded_registers); void FlushCRRegisters(BitSet8 regs, FlushMode mode, Arm64Gen::ARM64Reg tmp_reg, IgnoreDiscardedRegisters ignore_discarded_registers); + + static constexpr size_t GUEST_GPR_COUNT = 32; + static constexpr size_t GUEST_CR_COUNT = 8; + static constexpr size_t GUEST_GPR_OFFSET = 0; + static constexpr size_t GUEST_CR_OFFSET = GUEST_GPR_COUNT; }; class Arm64FPRCache : public Arm64RegCache