PowerPC: Add functions to read/write the full timebase value

Allows us to get rid of a silly pointer cast and deduplicate some code
from the front-end when it comes to reading the value.
This commit is contained in:
Lioncash
2018-06-19 13:06:37 -04:00
parent 18c3e0302f
commit 562d2a700b
6 changed files with 20 additions and 18 deletions

View File

@@ -156,7 +156,7 @@ u32 GetFakeDecrementer()
void TimeBaseSet()
{
CoreTiming::SetFakeTBStartTicks(CoreTiming::GetTicks());
CoreTiming::SetFakeTBStartValue(*((u64*)&TL));
CoreTiming::SetFakeTBStartValue(PowerPC::ReadFullTimeBaseValue());
}
u64 GetFakeTimeBase()

View File

@@ -4,8 +4,6 @@
#include "Core/PowerPC/Interpreter/Interpreter.h"
#include <cstring>
#include "Common/Assert.h"
#include "Common/CommonTypes.h"
#include "Common/FPURoundMode.h"
@@ -253,12 +251,8 @@ void Interpreter::mfspr(UGeckoInstruction inst)
case SPR_TL:
case SPR_TU:
{
// works since we are little endian and TL comes first :)
const u64 time_base = SystemTimers::GetFakeTimeBase();
std::memcpy(&TL, &time_base, sizeof(u64));
}
break;
PowerPC::WriteFullTimeBaseValue(SystemTimers::GetFakeTimeBase());
break;
case SPR_WPAR:
{

View File

@@ -349,6 +349,18 @@ void RunLoop()
Host_UpdateDisasmDialog();
}
u64 ReadFullTimeBaseValue()
{
u64 value;
std::memcpy(&value, &TL, sizeof(value));
return value;
}
void WriteFullTimeBaseValue(u64 value)
{
std::memcpy(&TL, &value, sizeof(value));
}
void UpdatePerformanceMonitor(u32 cycles, u32 num_load_stores, u32 num_fp_inst)
{
switch (MMCR0.PMC1SELECT)

View File

@@ -178,6 +178,9 @@ void RunLoop();
u32 CompactCR();
void ExpandCR(u32 cr);
u64 ReadFullTimeBaseValue();
void WriteFullTimeBaseValue(u64 value);
void UpdatePerformanceMonitor(u32 cycles, u32 num_load_stores, u32 num_fp_inst);
// Easy register access macros.