From ad013d59f400a80c320ceb712ed0da7e95d7f7e3 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 11 Nov 2020 23:59:09 +0300 Subject: [PATCH] atomic.cpp: don't load actual memory on empty mask It's not an optimization. It just allows some tricks safely. --- rpcs3/util/atomic.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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); }