diff --git a/rpcs3/Emu/Memory/Memory.cpp b/rpcs3/Emu/Memory/Memory.cpp index c4d30012f2..e1d9383578 100644 --- a/rpcs3/Emu/Memory/Memory.cpp +++ b/rpcs3/Emu/Memory/Memory.cpp @@ -90,32 +90,17 @@ bool MemoryBlock::IsMyAddress(const u64 addr) return mem && addr >= GetStartAddr() && addr < GetEndAddr(); } -__forceinline const u8 MemoryBlock::FastRead8(const u64 addr) const +template +__forceinline const T MemoryBlock::FastRead(const u64 addr) const { - return *GetMem(addr); -} - -__forceinline const u16 MemoryBlock::FastRead16(const u64 addr) const -{ - volatile const u16 data = *(u16*)GetMem(addr); + volatile const T data = *(const T *)GetMem(addr); return re(data); } -__forceinline const u32 MemoryBlock::FastRead32(const u64 addr) const +template <> +__forceinline const u128 MemoryBlock::FastRead(const u64 addr) const { - volatile const u32 data = *(u32*)GetMem(addr); - return re(data); -} - -__forceinline const u64 MemoryBlock::FastRead64(const u64 addr) const -{ - volatile const u64 data = *(u64*)GetMem(addr); - return re(data); -} - -__forceinline const u128 MemoryBlock::FastRead128(const u64 addr) -{ - volatile const u128 data = *(u128*)GetMem(addr); + volatile const u128 data = *(const u128 *)GetMem(addr); u128 ret; ret.lo = re(data.hi); ret.hi = re(data.lo); @@ -131,7 +116,7 @@ bool MemoryBlock::Read8(const u64 addr, u8* value) } //*value = std::atomic_load((volatile std::atomic*)GetMem(FixAddr(addr))); - *value = FastRead8(FixAddr(addr)); + *value = FastRead(FixAddr(addr)); return true; } @@ -144,7 +129,7 @@ bool MemoryBlock::Read16(const u64 addr, u16* value) } //se_t::func(*value, std::atomic_load((volatile std::atomic*)GetMem(FixAddr(addr)))); - *value = FastRead16(FixAddr(addr)); + *value = FastRead(FixAddr(addr)); return true; } @@ -157,7 +142,7 @@ bool MemoryBlock::Read32(const u64 addr, u32* value) } //se_t::func(*value, std::atomic_load((volatile std::atomic*)GetMem(FixAddr(addr)))); - *value = FastRead32(FixAddr(addr)); + *value = FastRead(FixAddr(addr)); return true; } @@ -170,7 +155,7 @@ bool MemoryBlock::Read64(const u64 addr, u64* value) } //se_t::func(*value, std::atomic_load((volatile std::atomic*)GetMem(FixAddr(addr)))); - *value = FastRead64(FixAddr(addr)); + *value = FastRead(FixAddr(addr)); return true; } @@ -185,31 +170,18 @@ bool MemoryBlock::Read128(const u64 addr, u128* value) //u64 f_addr = FixAddr(addr); //se_t::func(value->lo, std::atomic_load((volatile std::atomic*)GetMem(f_addr))); //se_t::func(value->hi, std::atomic_load((volatile std::atomic*)GetMem(f_addr + 8))); - *value = FastRead128(FixAddr(addr)); + *value = FastRead(FixAddr(addr)); return true; } -__forceinline void MemoryBlock::FastWrite8(const u64 addr, const u8 value) +template +__forceinline void MemoryBlock::FastWrite(const u64 addr, const T value) { - *GetMem(addr) = value; + *(T *)GetMem(addr) = re(value); } -__forceinline void MemoryBlock::FastWrite16(const u64 addr, const u16 value) -{ - *(u16*)GetMem(addr) = re(value); -} - -__forceinline void MemoryBlock::FastWrite32(const u64 addr, const u32 value) -{ - *(u32*)GetMem(addr) = re(value); -} - -__forceinline void MemoryBlock::FastWrite64(const u64 addr, const u64 value) -{ - *(u64*)GetMem(addr) = re(value); -} - -__forceinline void MemoryBlock::FastWrite128(const u64 addr, const u128 value) +template <> +__forceinline void MemoryBlock::FastWrite(const u64 addr, const u128 value) { u128 res; res.lo = re(value.hi); @@ -222,7 +194,7 @@ bool MemoryBlock::Write8(const u64 addr, const u8 value) if(!IsMyAddress(addr) || IsLocked(addr)) return false; //std::atomic_store((std::atomic*)GetMem(FixAddr(addr)), value); - FastWrite8(FixAddr(addr), value); + FastWrite(FixAddr(addr), value); return true; } @@ -233,7 +205,7 @@ bool MemoryBlock::Write16(const u64 addr, const u16 value) //u16 re_value; //se_t::func(re_value, value); //std::atomic_store((std::atomic*)GetMem(FixAddr(addr)), re_value); - FastWrite16(FixAddr(addr), value); + FastWrite(FixAddr(addr), value); return true; } @@ -244,7 +216,7 @@ bool MemoryBlock::Write32(const u64 addr, const u32 value) //u32 re_value; //se_t::func(re_value, value); //std::atomic_store((std::atomic*)GetMem(FixAddr(addr)), re_value); - FastWrite32(FixAddr(addr), value); + FastWrite(FixAddr(addr), value); return true; } @@ -255,7 +227,7 @@ bool MemoryBlock::Write64(const u64 addr, const u64 value) //u64 re_value; //se_t::func(re_value, value); //std::atomic_store((std::atomic*)GetMem(FixAddr(addr)), re_value); - FastWrite64(FixAddr(addr), value); + FastWrite(FixAddr(addr), value); return true; } @@ -269,7 +241,7 @@ bool MemoryBlock::Write128(const u64 addr, const u128 value) //std::atomic_store((std::atomic*)GetMem(f_addr), re_value); //se_t::func(re_value, value.hi); //std::atomic_store((std::atomic*)GetMem(f_addr + 8), re_value); - FastWrite128(FixAddr(addr), value); + FastWrite(FixAddr(addr), value); return true; } diff --git a/rpcs3/Emu/Memory/MemoryBlock.h b/rpcs3/Emu/Memory/MemoryBlock.h index 4451cb76e9..16c00ae925 100644 --- a/rpcs3/Emu/Memory/MemoryBlock.h +++ b/rpcs3/Emu/Memory/MemoryBlock.h @@ -105,11 +105,8 @@ public: virtual bool IsMyAddress(const u64 addr); virtual bool IsLocked(const u64 addr) { return false; } - __forceinline const u8 FastRead8(const u64 addr) const; - __forceinline const u16 FastRead16(const u64 addr) const; - __forceinline const u32 FastRead32(const u64 addr) const; - __forceinline const u64 FastRead64(const u64 addr) const; - __forceinline const u128 FastRead128(const u64 addr); + template + __forceinline const T FastRead(const u64 addr) const; virtual bool Read8(const u64 addr, u8* value); virtual bool Read16(const u64 addr, u16* value); @@ -117,11 +114,8 @@ public: virtual bool Read64(const u64 addr, u64* value); virtual bool Read128(const u64 addr, u128* value); - __forceinline void FastWrite8(const u64 addr, const u8 value); - __forceinline void FastWrite16(const u64 addr, const u16 value); - __forceinline void FastWrite32(const u64 addr, const u32 value); - __forceinline void FastWrite64(const u64 addr, const u64 value); - __forceinline void FastWrite128(const u64 addr, const u128 value); + template + __forceinline void FastWrite(const u64 addr, const T value); virtual bool Write8(const u64 addr, const u8 value); virtual bool Write16(const u64 addr, const u16 value);