From 9f6ef3a2f3e743e66663d270c49ef0c8ab0638ab Mon Sep 17 00:00:00 2001 From: kobalicek Date: Fri, 30 May 2025 15:30:14 +0200 Subject: [PATCH] Simplified unavailable register handing in RAPass (Compiler) --- src/asmjit/arm/a64rapass.cpp | 1 - src/asmjit/core/radefs_p.h | 4 ++++ src/asmjit/core/rapass.cpp | 1 - src/asmjit/core/rapass_p.h | 10 ++++------ src/asmjit/x86/x86rapass.cpp | 1 - 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/asmjit/arm/a64rapass.cpp b/src/asmjit/arm/a64rapass.cpp index 67b9442..e73f535 100644 --- a/src/asmjit/arm/a64rapass.cpp +++ b/src/asmjit/arm/a64rapass.cpp @@ -646,7 +646,6 @@ void ARMRAPass::onInit() noexcept { _physRegCount.set(RegGroup::kExtraVirt3, 0); _buildPhysIndex(); - _availableRegCount = _physRegCount; _availableRegs[RegGroup::kGp] = Support::lsbMask(_physRegCount.get(RegGroup::kGp)); _availableRegs[RegGroup::kVec] = Support::lsbMask(_physRegCount.get(RegGroup::kVec)); _availableRegs[RegGroup::kMask] = Support::lsbMask(_physRegCount.get(RegGroup::kMask)); diff --git a/src/asmjit/core/radefs_p.h b/src/asmjit/core/radefs_p.h index 243f045..effcfb8 100644 --- a/src/asmjit/core/radefs_p.h +++ b/src/asmjit/core/radefs_p.h @@ -314,6 +314,10 @@ struct RARegMask { _masks[group] = _masks[group] & ~mask; } + inline void clear(const RegMasks& masks) noexcept { + _masks.combine(masks); + } + //! \} }; diff --git a/src/asmjit/core/rapass.cpp b/src/asmjit/core/rapass.cpp index 573fcb1..794eeb6 100644 --- a/src/asmjit/core/rapass.cpp +++ b/src/asmjit/core/rapass.cpp @@ -77,7 +77,6 @@ static void BaseRAPass_reset(BaseRAPass* self, FuncDetail* funcDetail) noexcept self->_scratchRegIndexes.fill(BaseReg::kIdBad); self->_availableRegs.reset(); - self->_availableRegCount.reset(); self->_clobberedRegs.reset(); self->_workRegs.reset(); diff --git a/src/asmjit/core/rapass_p.h b/src/asmjit/core/rapass_p.h index b79b9c8..1cf19f9 100644 --- a/src/asmjit/core/rapass_p.h +++ b/src/asmjit/core/rapass_p.h @@ -883,8 +883,6 @@ public: //! Registers available for allocation. RARegMask _availableRegs = RARegMask(); - //! Count of physical registers per group. - RARegCount _availableRegCount = RARegCount(); //! Registers clobbered by the function. RARegMask _clobberedRegs = RARegMask(); @@ -990,7 +988,10 @@ public: inline void makeUnavailable(RegGroup group, uint32_t regId) noexcept { _availableRegs[group] &= ~Support::bitMask(regId); - _availableRegCount[group]--; + } + + inline void makeUnavailable(const RARegMask::RegMasks& regs) noexcept { + _availableRegs.clear(regs); } //! Runs the register allocator for the given `func`. @@ -1231,9 +1232,6 @@ public: [[nodiscard]] ASMJIT_INLINE_NODEBUG uint32_t registerSize() const noexcept { return _sp.size(); } - [[nodiscard]] - ASMJIT_INLINE_NODEBUG uint32_t availableRegCount(RegGroup group) const noexcept { return _availableRegCount[group]; } - [[nodiscard]] ASMJIT_INLINE_NODEBUG RAWorkReg* workRegById(uint32_t workId) const noexcept { return _workRegs[workId]; } diff --git a/src/asmjit/x86/x86rapass.cpp b/src/asmjit/x86/x86rapass.cpp index d233b86..b8d438b 100644 --- a/src/asmjit/x86/x86rapass.cpp +++ b/src/asmjit/x86/x86rapass.cpp @@ -1291,7 +1291,6 @@ void X86RAPass::onInit() noexcept { _physRegCount.set(RegGroup::kX86_MM, 8); _buildPhysIndex(); - _availableRegCount = _physRegCount; _availableRegs[RegGroup::kGp] = Support::lsbMask(_physRegCount.get(RegGroup::kGp)); _availableRegs[RegGroup::kVec] = Support::lsbMask(_physRegCount.get(RegGroup::kVec)); _availableRegs[RegGroup::kX86_K] = Support::lsbMask(_physRegCount.get(RegGroup::kX86_K)) ^ 1u;