From f8ca5cdf56a4bdde612f420dc137199d58b49db8 Mon Sep 17 00:00:00 2001 From: Eladash <18193363+elad335@users.noreply.github.com> Date: Mon, 27 Nov 2023 15:33:04 +0200 Subject: [PATCH] vm: Minor optimization for memory serialization --- rpcs3/Emu/Memory/vm.cpp | 25 +++++++++++++++++++------ rpcs3/util/serialization.hpp | 4 ++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 69e9d0b871..f76a68ae18 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -1617,14 +1617,14 @@ namespace vm const v128 _5 = _1 | _2; const v128 _6 = _3 | _4; const v128 _7 = _5 | _6; - return _7 == v128{}; + return gv_testz(_7); } static void serialize_memory_bytes(utils::serial& ar, u8* ptr, usz size) { ensure((size % 4096) == 0); - for (; size; ptr += 128 * 8) + for (usz iter_count = 0; size; iter_count++, ptr += 128 * 8) { const usz process_size = std::min(size, 128 * 8); size -= process_size; @@ -1633,12 +1633,20 @@ namespace vm if (ar.is_writing()) { - for (usz i = 0; i < process_size; i += 128) + for (usz i = 0; i < process_size; i += 128 * 2) { - if (!check_cache_line_zero(ptr + i)) + const u64 sample64_1 = read_from_ptr(ptr, i); + const u64 sample64_2 = read_from_ptr(ptr, i + 128); + + // Speed up testing in scenarios where it is likely non-zero data + if (sample64_1 && sample64_2) { - bitmap |= 1u << (i / 128); + bitmap |= 3u << (i / 128); + continue; } + + bitmap |= (check_cache_line_zero(ptr + i + 0) ? 0 : 1) << (i / 128); + bitmap |= (check_cache_line_zero(ptr + i + 128) ? 0 : 2) << (i / 128); } } @@ -1665,8 +1673,13 @@ namespace vm i += block_count * 128; } - ar.breathe(); + if (iter_count % 256 == 0) + { + ar.breathe(); + } } + + ar.breathe(); } void block_t::save(utils::serial& ar, std::map& shared) diff --git a/rpcs3/util/serialization.hpp b/rpcs3/util/serialization.hpp index 71cbac4ca7..e8ecff8c75 100644 --- a/rpcs3/util/serialization.hpp +++ b/rpcs3/util/serialization.hpp @@ -453,9 +453,9 @@ namespace utils // Execute only if past memory is known to not going be reused void breathe(bool forced = false) { - if (!forced && (!m_file_handler || (data.size() < 0x20'0000 && pos >= data_offset))) + if (!forced && (!m_file_handler || (data.size() < 0x100'0000 && pos >= data_offset))) { - // Let's not do anything if less than 32MB + // Let's not do anything if less than 16MB return; }