diff --git a/src/backend/core/Mem.cpp b/src/backend/core/Mem.cpp index 56700b55..d797f253 100644 --- a/src/backend/core/Mem.cpp +++ b/src/backend/core/Mem.cpp @@ -254,7 +254,7 @@ u64 Mem::Read64(n64::Registers ®s, u32 paddr) { void Mem::Write8(Registers& regs, u32 paddr, u32 val) { const auto page = paddr >> 12; - auto offset = paddr & 0xFFF; + const auto offset = paddr & 0xFFF; const auto pointer = writePages[page]; SI& si = mmio.si; @@ -305,7 +305,7 @@ void Mem::Write8(Registers& regs, u32 paddr, u32 val) { void Mem::Write16(Registers& regs, u32 paddr, u32 val) { const auto page = paddr >> 12; - auto offset = paddr & 0xFFF; + const auto offset = paddr & 0xFFF; const auto pointer = writePages[page]; SI& si = mmio.si; @@ -354,7 +354,7 @@ void Mem::Write16(Registers& regs, u32 paddr, u32 val) { void Mem::Write32(Registers& regs, u32 paddr, u32 val) { const auto page = paddr >> 12; - auto offset = paddr & 0xFFF; + const auto offset = paddr & 0xFFF; const auto pointer = writePages[page]; SI& si = mmio.si; @@ -401,7 +401,7 @@ void Mem::Write32(Registers& regs, u32 paddr, u32 val) { void Mem::Write64(Registers& regs, u32 paddr, u64 val) { const auto page = paddr >> 12; - auto offset = paddr & 0xFFF; + const auto offset = paddr & 0xFFF; const auto pointer = writePages[page]; SI& si = mmio.si; diff --git a/src/utils/MemoryHelpers.hpp b/src/utils/MemoryHelpers.hpp index 69c8a000..83c6bfe5 100644 --- a/src/utils/MemoryHelpers.hpp +++ b/src/utils/MemoryHelpers.hpp @@ -7,36 +7,26 @@ namespace Util { template FORCE_INLINE T ReadAccess(u8 *data, u32 index) { - if constexpr (sizeof(T) == 1) { // - return data[index]; - } else if constexpr (sizeof(T) == 2 || sizeof(T) == 4) { - T result = 0; - memcpy(&result, &data[index], sizeof(T)); + if constexpr (sizeof(T) == 8) { + u32 hi = *reinterpret_cast(&data[index + 0]); + u32 lo = *reinterpret_cast(&data[index + 4]); + T result = ((T)hi << 32) | (T)lo; return result; } else { - static_assert(sizeof(T) == 8); - u32 hi = 0; - u32 lo = 0; - memcpy(&hi, &data[index + 0], sizeof(u32)); - memcpy(&lo, &data[index + 4], sizeof(u32)); - T result = ((T) hi << 32) | (T) lo; - return result; + return *reinterpret_cast(&data[index]); } } template FORCE_INLINE void WriteAccess(u8 *data, u32 index, T val) { - if constexpr (sizeof(T) == 1) { - data[index] = val; - return; - } else if constexpr (sizeof(T) == 2 || sizeof(T) == 4) { - memcpy(&data[index], &val, sizeof(T)); - } else { - static_assert(sizeof(T) == 8); + if constexpr (sizeof(T) == 8) { u32 hi = val >> 32; u32 lo = val; - memcpy(&data[index + 0], &hi, sizeof(u32)); - memcpy(&data[index + 4], &lo, sizeof(u32)); + + *reinterpret_cast(&data[index + 0]) = hi; + *reinterpret_cast(&data[index + 4]) = lo; + } else { + *reinterpret_cast(&data[index]) = val; } }