diff options
Diffstat (limited to 'erts/emulator/asmjit/core/raassignment_p.h')
-rw-r--r-- | erts/emulator/asmjit/core/raassignment_p.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/erts/emulator/asmjit/core/raassignment_p.h b/erts/emulator/asmjit/core/raassignment_p.h index 22a97e2b36..5418329311 100644 --- a/erts/emulator/asmjit/core/raassignment_p.h +++ b/erts/emulator/asmjit/core/raassignment_p.h @@ -82,6 +82,12 @@ public: size_t size = sizeOf(count); memcpy(this, other, size); } + + inline void unassign(RegGroup group, uint32_t physId, uint32_t indexInWorkIds) noexcept { + assigned.clear(group, Support::bitMask(physId)); + dirty.clear(group, Support::bitMask(physId)); + workIds[indexInWorkIds] = kWorkNone; + } }; struct WorkToPhysMap { @@ -304,6 +310,28 @@ public: _physToWorkIds.swap(other._physToWorkIds); } + inline void assignWorkIdsFromPhysIds() noexcept { + memset(_workToPhysMap, uint8_t(BaseReg::kIdBad), WorkToPhysMap::sizeOf(_layout.workCount)); + + for (RegGroup group : RegGroupVirtValues{}) { + uint32_t physBaseIndex = _layout.physIndex[group]; + Support::BitWordIterator<RegMask> it(_physToWorkMap->assigned[group]); + + while (it.hasNext()) { + uint32_t physId = it.next(); + uint32_t workId = _physToWorkMap->workIds[physBaseIndex + physId]; + + ASMJIT_ASSERT(workId != kWorkNone); + _workToPhysMap->physIds[workId] = uint8_t(physId); + } + } + } + + inline void copyFrom(const PhysToWorkMap* physToWorkMap) noexcept { + memcpy(_physToWorkMap, physToWorkMap, PhysToWorkMap::sizeOf(_layout.physTotal)); + assignWorkIdsFromPhysIds(); + } + inline void copyFrom(const PhysToWorkMap* physToWorkMap, const WorkToPhysMap* workToPhysMap) noexcept { memcpy(_physToWorkMap, physToWorkMap, PhysToWorkMap::sizeOf(_layout.physTotal)); memcpy(_workToPhysMap, workToPhysMap, WorkToPhysMap::sizeOf(_layout.workCount)); |