mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-03 11:32:43 +01:00
JitArm64: Pass index to more Arm64GPRCache functions
This refactorization is needed for upcoming commits.
This commit is contained in:
parent
81adcfadca
commit
47894560af
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user