diff --git a/rpcs3/util/atomic.cpp b/rpcs3/util/atomic.cpp index f6117f0c0f..d61d061e1d 100644 --- a/rpcs3/util/atomic.cpp +++ b/rpcs3/util/atomic.cpp @@ -66,8 +66,10 @@ ptr_cmp(const void* data, u32 _size, __m128i old128, __m128i mask128, atomic_wai u64 old_value = _mm_cvtsi128_si64(old128); u64 mask = _mm_cvtsi128_si64(mask128) & (UINT64_MAX >> ((64 - size * 8) & 63)); - switch (size) + // Don't load memory on empty mask + switch (mask ? size : 0) { + case 0: break; case 1: new_value = reinterpret_cast*>(data)->load(); break; case 2: new_value = reinterpret_cast*>(data)->load(); break; case 4: new_value = reinterpret_cast*>(data)->load(); break; @@ -169,10 +171,16 @@ ptr_cmp(const void* data, u32 _size, __m128i old128, __m128i mask128, atomic_wai } else if (size == 16 && (flag == op::eq || flag == (op::eq | op_flag::inverse))) { - u128 new_value = atomic_storage::load(*reinterpret_cast(data)); + u128 new_value = 0; u128 old_value = std::bit_cast(old128); u128 mask = std::bit_cast(mask128); + // Don't load memory on empty mask + if (mask) [[likely]] + { + new_value = atomic_storage::load(*reinterpret_cast(data)); + } + // TODO result = !((old_value ^ new_value) & mask); }