mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 13:31:27 +12:00
get_system_time(): Add fast TSC-based path
This commit is contained in:
parent
a9a454faf7
commit
2e8029a45b
1 changed files with 25 additions and 0 deletions
|
@ -7,6 +7,7 @@
|
||||||
#include "Emu/Cell/timers.hpp"
|
#include "Emu/Cell/timers.hpp"
|
||||||
|
|
||||||
#include "util/asm.hpp"
|
#include "util/asm.hpp"
|
||||||
|
#include "util/sysinfo.hpp"
|
||||||
|
|
||||||
static u64 timebase_offset;
|
static u64 timebase_offset;
|
||||||
static u64 systemtime_offset;
|
static u64 systemtime_offset;
|
||||||
|
@ -146,6 +147,18 @@ u64 convert_to_timebased_time(u64 time)
|
||||||
|
|
||||||
u64 get_timebased_time()
|
u64 get_timebased_time()
|
||||||
{
|
{
|
||||||
|
if (u64 freq = utils::get_tsc_freq())
|
||||||
|
{
|
||||||
|
const u64 tsc = utils::get_tsc();
|
||||||
|
|
||||||
|
#if is_u128_emulated
|
||||||
|
const u64 result = static_cast<u64>(u128_from_mul(tsc, g_timebase_freq) / freq) * g_cfg.core.clocks_scale / 100u;
|
||||||
|
#else
|
||||||
|
const u64 result = (tsc / freq * g_timebase_freq + tsc % freq * g_timebase_freq / freq) * g_cfg.core.clocks_scale / 100u;
|
||||||
|
#endif
|
||||||
|
return result - timebase_offset;
|
||||||
|
}
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -194,6 +207,18 @@ void initialize_timebased_time(u64 timebased_init, bool reset)
|
||||||
// Returns some relative time in microseconds, don't change this fact
|
// Returns some relative time in microseconds, don't change this fact
|
||||||
u64 get_system_time()
|
u64 get_system_time()
|
||||||
{
|
{
|
||||||
|
if (u64 freq = utils::get_tsc_freq())
|
||||||
|
{
|
||||||
|
const u64 tsc = utils::get_tsc();
|
||||||
|
|
||||||
|
#if is_u128_emulated
|
||||||
|
const u64 result = static_cast<u64>(u128_from_mul(tsc, 1000000ull) / freq) * g_cfg.core.clocks_scale / 100u;
|
||||||
|
#else
|
||||||
|
const u64 result = (tsc / freq * 1000000ull + tsc % freq * 1000000ull / freq) * g_cfg.core.clocks_scale / 100u;
|
||||||
|
#endif
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue