Small perf improvements

This commit is contained in:
SimoneN64
2023-06-08 22:32:15 +02:00
parent 25376f06af
commit cf47648f92
2 changed files with 15 additions and 25 deletions

View File

@@ -254,7 +254,7 @@ u64 Mem::Read64(n64::Registers &regs, u32 paddr) {
void Mem::Write8(Registers& regs, u32 paddr, u32 val) { void Mem::Write8(Registers& regs, u32 paddr, u32 val) {
const auto page = paddr >> 12; const auto page = paddr >> 12;
auto offset = paddr & 0xFFF; const auto offset = paddr & 0xFFF;
const auto pointer = writePages[page]; const auto pointer = writePages[page];
SI& si = mmio.si; 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) { void Mem::Write16(Registers& regs, u32 paddr, u32 val) {
const auto page = paddr >> 12; const auto page = paddr >> 12;
auto offset = paddr & 0xFFF; const auto offset = paddr & 0xFFF;
const auto pointer = writePages[page]; const auto pointer = writePages[page];
SI& si = mmio.si; 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) { void Mem::Write32(Registers& regs, u32 paddr, u32 val) {
const auto page = paddr >> 12; const auto page = paddr >> 12;
auto offset = paddr & 0xFFF; const auto offset = paddr & 0xFFF;
const auto pointer = writePages[page]; const auto pointer = writePages[page];
SI& si = mmio.si; 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) { void Mem::Write64(Registers& regs, u32 paddr, u64 val) {
const auto page = paddr >> 12; const auto page = paddr >> 12;
auto offset = paddr & 0xFFF; const auto offset = paddr & 0xFFF;
const auto pointer = writePages[page]; const auto pointer = writePages[page];
SI& si = mmio.si; SI& si = mmio.si;

View File

@@ -7,36 +7,26 @@
namespace Util { namespace Util {
template<typename T> template<typename T>
FORCE_INLINE T ReadAccess(u8 *data, u32 index) { FORCE_INLINE T ReadAccess(u8 *data, u32 index) {
if constexpr (sizeof(T) == 1) { // if constexpr (sizeof(T) == 8) {
return data[index]; u32 hi = *reinterpret_cast<u32*>(&data[index + 0]);
} else if constexpr (sizeof(T) == 2 || sizeof(T) == 4) { u32 lo = *reinterpret_cast<u32*>(&data[index + 4]);
T result = 0;
memcpy(&result, &data[index], sizeof(T));
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; T result = ((T)hi << 32) | (T)lo;
return result; return result;
} else {
return *reinterpret_cast<T*>(&data[index]);
} }
} }
template<typename T> template<typename T>
FORCE_INLINE void WriteAccess(u8 *data, u32 index, T val) { FORCE_INLINE void WriteAccess(u8 *data, u32 index, T val) {
if constexpr (sizeof(T) == 1) { if constexpr (sizeof(T) == 8) {
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);
u32 hi = val >> 32; u32 hi = val >> 32;
u32 lo = val; u32 lo = val;
memcpy(&data[index + 0], &hi, sizeof(u32));
memcpy(&data[index + 4], &lo, sizeof(u32)); *reinterpret_cast<u32*>(&data[index + 0]) = hi;
*reinterpret_cast<u32*>(&data[index + 4]) = lo;
} else {
*reinterpret_cast<T*>(&data[index]) = val;
} }
} }