SPU/Debugger: Use bitset for breakpoints

This commit is contained in:
Eladash 2024-04-12 16:06:56 +03:00 committed by Elad Ashkenazi
parent 7dc4ccc87d
commit 12bfc7d56a
4 changed files with 19 additions and 5 deletions

View File

@ -1839,7 +1839,10 @@ void spu_thread::cpu_work()
if (has_active_local_bps)
{
if (local_breakpoints[pc / 4])
const u32 pos_at = pc / 4;
const u32 pos_bit = 1u << (pos_at % 8);
if (local_breakpoints[pos_at] & pos_bit)
{
// Ignore repeatations until a different instruction is issued
if (pc != current_bp_pc)

View File

@ -816,7 +816,7 @@ public:
atomic_t<spu_debugger_mode> debugger_mode{};
// PC-based breakpoint list
std::array<atomic_t<bool>, SPU_LS_SIZE / 4> local_breakpoints{};
std::array<atomic_t<u8>, SPU_LS_SIZE / 4 / 8> local_breakpoints{};
atomic_t<bool> has_active_local_bps = false;
u32 current_bp_pc = umax;
bool stop_flag_removal_protection = false;

View File

@ -125,8 +125,10 @@ void breakpoint_list::HandleBreakpointRequest(u32 loc, bool only_add)
const auto spu = static_cast<spu_thread*>(m_cpu);
auto& list = spu->local_breakpoints;
const u32 pos_at = loc / 4;
const u32 pos_bit = 1u << (pos_at % 8);
if (list[loc / 4].test_and_invert())
if (list[pos_at / 8].fetch_xor(pos_bit) & pos_bit)
{
if (std::none_of(list.begin(), list.end(), [](auto& val){ return val.load(); }))
{

View File

@ -142,8 +142,17 @@ void debugger_list::ShowAddress(u32 addr, bool select_addr, bool direct)
{
switch (m_cpu ? m_cpu->id_type() : 0)
{
case 1: return m_ppu_breakpoint_handler->HasBreakpoint(pc);
case 2: return (*spu_bps_list)[pc / 4].load();
case 1:
{
return m_ppu_breakpoint_handler->HasBreakpoint(pc);
}
case 2:
{
const u32 pos_at = pc / 4;
const u32 pos_bit = 1u << (pos_at % 8);
return !!((*spu_bps_list)[pos_at] & pos_bit);
}
default: return false;
}
};