JitArm64: Optimize Arm64GPRCache::FlushRegisters/FlushCRRegisters

This way, the number of loop iterations is equal to the number of set
bits in the bitset rather than the number of bits in the bitset,
which is a good improvement because usually very few bits are set.
This commit is contained in:
JosJuice 2023-11-05 12:19:41 +01:00
parent 2ea95f5835
commit 6a9f565ac4
1 changed files with 28 additions and 34 deletions

View File

@ -241,9 +241,7 @@ void Arm64GPRCache::FlushRegister(size_t index, bool maintain_state, ARM64Reg tm
void Arm64GPRCache::FlushRegisters(BitSet32 regs, bool maintain_state, ARM64Reg tmp_reg) void Arm64GPRCache::FlushRegisters(BitSet32 regs, bool maintain_state, ARM64Reg tmp_reg)
{ {
for (size_t i = 0; i < GUEST_GPR_COUNT; ++i) for (int i : regs)
{
if (regs[i])
{ {
ASSERT_MSG(DYNA_REC, m_guest_registers[GUEST_GPR_OFFSET + i].GetType() != RegType::Discarded, ASSERT_MSG(DYNA_REC, m_guest_registers[GUEST_GPR_OFFSET + i].GetType() != RegType::Discarded,
"Attempted to flush discarded register"); "Attempted to flush discarded register");
@ -278,13 +276,10 @@ void Arm64GPRCache::FlushRegisters(BitSet32 regs, bool maintain_state, ARM64Reg
FlushRegister(GUEST_GPR_OFFSET + i, maintain_state, tmp_reg); FlushRegister(GUEST_GPR_OFFSET + i, maintain_state, tmp_reg);
} }
} }
}
void Arm64GPRCache::FlushCRRegisters(BitSet8 regs, bool maintain_state, ARM64Reg tmp_reg) void Arm64GPRCache::FlushCRRegisters(BitSet8 regs, bool maintain_state, ARM64Reg tmp_reg)
{ {
for (size_t i = 0; i < GUEST_CR_COUNT; ++i) for (int i : regs)
{
if (regs[i])
{ {
ASSERT_MSG(DYNA_REC, m_guest_registers[GUEST_CR_OFFSET + i].GetType() != RegType::Discarded, ASSERT_MSG(DYNA_REC, m_guest_registers[GUEST_CR_OFFSET + i].GetType() != RegType::Discarded,
"Attempted to flush discarded register"); "Attempted to flush discarded register");
@ -292,7 +287,6 @@ void Arm64GPRCache::FlushCRRegisters(BitSet8 regs, bool maintain_state, ARM64Reg
FlushRegister(GUEST_CR_OFFSET + i, maintain_state, tmp_reg); FlushRegister(GUEST_CR_OFFSET + i, maintain_state, tmp_reg);
} }
} }
}
void Arm64GPRCache::Flush(FlushMode mode, ARM64Reg tmp_reg) void Arm64GPRCache::Flush(FlushMode mode, ARM64Reg tmp_reg)
{ {