diff options
Diffstat (limited to 'Ryujinx.Cpu/Jit/MemoryManager.cs')
-rw-r--r-- | Ryujinx.Cpu/Jit/MemoryManager.cs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/Ryujinx.Cpu/Jit/MemoryManager.cs b/Ryujinx.Cpu/Jit/MemoryManager.cs index 86c69431..21c50d51 100644 --- a/Ryujinx.Cpu/Jit/MemoryManager.cs +++ b/Ryujinx.Cpu/Jit/MemoryManager.cs @@ -180,6 +180,37 @@ namespace Ryujinx.Cpu.Jit WriteImpl(va, data); } + /// <inheritdoc/> + public bool WriteWithRedundancyCheck(ulong va, ReadOnlySpan<byte> data) + { + if (data.Length == 0) + { + return false; + } + + SignalMemoryTracking(va, (ulong)data.Length, false); + + if (IsContiguousAndMapped(va, data.Length)) + { + var target = _backingMemory.GetSpan(GetPhysicalAddressInternal(va), data.Length); + + bool changed = !data.SequenceEqual(target); + + if (changed) + { + data.CopyTo(target); + } + + return changed; + } + else + { + WriteImpl(va, data); + + return true; + } + } + /// <summary> /// Writes data to CPU mapped memory. /// </summary> |