diff --git a/src/core/hle/kernel/k_priority_queue.h b/src/core/hle/kernel/k_priority_queue.h index 99347b5aef..0ef6bcc32c 100644 --- a/src/core/hle/kernel/k_priority_queue.h +++ b/src/core/hle/kernel/k_priority_queue.h @@ -12,7 +12,6 @@ #include #include -#include "common/alignment.h" #include "common/assert.h" #include "common/common_types.h" #include "common/concepts.h" @@ -197,12 +196,7 @@ public: constexpr Member* GetFront(s32 core) const { ASSERT(IsValidCore(core)); - const s32 priority = s32([](auto const& e) { - for (size_t i = 0; i < e.size(); ++i) - if (e[i]) - return i; - return e.size(); - }(m_available_priorities[core])); + const s32 priority = s32((~m_available_priorities[core]).count()); if (priority <= LowestPriority) { return m_queues[priority].GetFront(core); } else { @@ -221,22 +215,19 @@ public: } } - template - constexpr size_t GetNextSet(std::bitset const& bit, size_t n) const { - for (size_t i = n + 1; i < bit.size(); i++) - if (bit[i]) - return i; - return bit.size(); - } - constexpr Member* GetNext(s32 core, const Member* member) const { ASSERT(IsValidCore(core)); Member* next = member->GetPriorityQueueEntry(core).GetNext(); if (next == nullptr) { - s32 priority = s32(GetNextSet(m_available_priorities[core], member->GetPriority())); - if (priority <= LowestPriority) - next = m_queues[priority].GetFront(core); + s32 priority = member->GetPriority() + 1; + do { + if (m_available_priorities[core][priority]) { + next = m_queues[priority].GetFront(core); + break; + } + ++priority; + } while (priority <= LowestPriority && priority < s32(m_available_priorities[core].size())); } return next; }