aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2025-09-27 01:21:14 +0200
committercrueter <crueter@eden-emu.dev>2025-09-27 01:21:14 +0200
commit020ad29a8c929d18d551ea7cb62d3db7d8460f8f (patch)
tree939479fe79c6b327d629b73367202e74c6be2fad /src
parent4982dcfaa54ef236e1a3e0a753c8d5e80407a881 (diff)
[common] replace Common::BitSet with std::bitset (#2576)
Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2576 Reviewed-by: crueter <crueter@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src')
-rw-r--r--src/common/CMakeLists.txt1
-rw-r--r--src/common/bit_set.h86
-rw-r--r--src/core/hle/kernel/k_priority_queue.h29
3 files changed, 18 insertions, 98 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index 7759ea6a21..96ea429e5a 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -32,7 +32,6 @@ add_library(
atomic_ops.h
bit_cast.h
bit_field.h
- bit_set.h
bit_util.h
bounded_threadsafe_queue.h
cityhash.cpp
diff --git a/src/common/bit_set.h b/src/common/bit_set.h
deleted file mode 100644
index 74754504be..0000000000
--- a/src/common/bit_set.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include <array>
-#include <bit>
-
-#include "common/alignment.h"
-#include "common/bit_util.h"
-#include "common/common_types.h"
-
-namespace Common {
-
-namespace impl {
-
-template <typename Storage, size_t N>
-class BitSet {
-
-public:
- constexpr BitSet() = default;
-
- constexpr void SetBit(size_t i) {
- this->words[i / FlagsPerWord] |= GetBitMask(i % FlagsPerWord);
- }
-
- constexpr void ClearBit(size_t i) {
- this->words[i / FlagsPerWord] &= ~GetBitMask(i % FlagsPerWord);
- }
-
- constexpr size_t CountLeadingZero() const {
- for (size_t i = 0; i < NumWords; i++) {
- if (this->words[i]) {
- return FlagsPerWord * i + CountLeadingZeroImpl(this->words[i]);
- }
- }
- return FlagsPerWord * NumWords;
- }
-
- constexpr size_t GetNextSet(size_t n) const {
- for (size_t i = (n + 1) / FlagsPerWord; i < NumWords; i++) {
- Storage word = this->words[i];
- if (!IsAligned(n + 1, FlagsPerWord)) {
- word &= GetBitMask(n % FlagsPerWord) - 1;
- }
- if (word) {
- return FlagsPerWord * i + CountLeadingZeroImpl(word);
- }
- }
- return FlagsPerWord * NumWords;
- }
-
-private:
- static_assert(std::is_unsigned_v<Storage>);
- static_assert(sizeof(Storage) <= sizeof(u64));
-
- static constexpr size_t FlagsPerWord = BitSize<Storage>();
- static constexpr size_t NumWords = AlignUp(N, FlagsPerWord) / FlagsPerWord;
-
- static constexpr auto CountLeadingZeroImpl(Storage word) {
- return std::countl_zero(static_cast<unsigned long long>(word)) -
- (BitSize<unsigned long long>() - FlagsPerWord);
- }
-
- static constexpr Storage GetBitMask(size_t bit) {
- return Storage(1) << (FlagsPerWord - 1 - bit);
- }
-
- std::array<Storage, NumWords> words{};
-};
-
-} // namespace impl
-
-template <size_t N>
-using BitSet8 = impl::BitSet<u8, N>;
-
-template <size_t N>
-using BitSet16 = impl::BitSet<u16, N>;
-
-template <size_t N>
-using BitSet32 = impl::BitSet<u32, N>;
-
-template <size_t N>
-using BitSet64 = impl::BitSet<u64, N>;
-
-} // namespace Common
diff --git a/src/core/hle/kernel/k_priority_queue.h b/src/core/hle/kernel/k_priority_queue.h
index 26677ec65c..0ef6bcc32c 100644
--- a/src/core/hle/kernel/k_priority_queue.h
+++ b/src/core/hle/kernel/k_priority_queue.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -5,10 +8,11 @@
#include <array>
#include <bit>
+#include <bitset>
#include <concepts>
+#include <cstddef>
#include "common/assert.h"
-#include "common/bit_set.h"
#include "common/common_types.h"
#include "common/concepts.h"
@@ -159,7 +163,7 @@ public:
}
if (m_queues[priority].PushBack(core, member)) {
- m_available_priorities[core].SetBit(priority);
+ m_available_priorities[core].set(std::size_t(priority));
}
}
@@ -172,7 +176,7 @@ public:
}
if (m_queues[priority].PushFront(core, member)) {
- m_available_priorities[core].SetBit(priority);
+ m_available_priorities[core].set(std::size_t(priority));
}
}
@@ -185,14 +189,14 @@ public:
}
if (m_queues[priority].Remove(core, member)) {
- m_available_priorities[core].ClearBit(priority);
+ m_available_priorities[core].reset(std::size_t(priority));
}
}
constexpr Member* GetFront(s32 core) const {
ASSERT(IsValidCore(core));
- const s32 priority = static_cast<s32>(m_available_priorities[core].CountLeadingZero());
+ const s32 priority = s32((~m_available_priorities[core]).count());
if (priority <= LowestPriority) {
return m_queues[priority].GetFront(core);
} else {
@@ -216,11 +220,14 @@ public:
Member* next = member->GetPriorityQueueEntry(core).GetNext();
if (next == nullptr) {
- const s32 priority = static_cast<s32>(
- m_available_priorities[core].GetNextSet(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;
}
@@ -250,7 +257,7 @@ public:
private:
std::array<KPerCoreQueue, NumPriority> m_queues{};
- std::array<Common::BitSet64<NumPriority>, NumCores> m_available_priorities{};
+ std::array<std::bitset<NumPriority>, NumCores> m_available_priorities{};
};
private: