|
retro_perf_tick_t cpu_features_get_perf_counter(void) |
|
{ |
|
retro_perf_tick_t time_ticks = 0; |
|
#if defined(_WIN32) |
|
long tv_sec, tv_usec; |
|
#if defined(_MSC_VER) && _MSC_VER <= 1200 |
|
static const unsigned __int64 epoch = 11644473600000000; |
|
#else |
|
static const unsigned __int64 epoch = 11644473600000000ULL; |
|
#endif |
|
FILETIME file_time; |
|
SYSTEMTIME system_time; |
|
ULARGE_INTEGER ularge; |
|
|
|
GetSystemTime(&system_time); |
|
SystemTimeToFileTime(&system_time, &file_time); |
|
ularge.LowPart = file_time.dwLowDateTime; |
|
ularge.HighPart = file_time.dwHighDateTime; |
|
|
|
tv_sec = (long)((ularge.QuadPart - epoch) / 10000000L); |
|
tv_usec = (long)(system_time.wMilliseconds * 1000); |
|
time_ticks = (1000000 * tv_sec + tv_usec); |
|
#elif defined(GEKKO) |
|
time_ticks = gettime(); |
|
#elif !defined(__MACH__) && !defined(__FreeBSD__) && (defined(_XBOX360) || defined(__powerpc__) || defined(__ppc__) || defined(__POWERPC__) || defined(__PSL1GHT__) || defined(__PPC64__) || defined(__powerpc64__)) |
|
time_ticks = __mftb(); |
|
#elif (defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK > 0) || defined(__QNX__) || defined(ANDROID) |
|
struct timespec tv; |
|
if (ra_clock_gettime(CLOCK_MONOTONIC, &tv) == 0) |
|
time_ticks = (retro_perf_tick_t)tv.tv_sec * 1000000000 + |
|
(retro_perf_tick_t)tv.tv_nsec; |
|
|
|
#elif defined(__GNUC__) && defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_X64) || defined(_M_AMD64) |
|
__asm__ volatile ("rdtsc" : "=A" (time_ticks)); |
|
#elif defined(__GNUC__) && defined(__x86_64__) || defined(_M_IX86) |
|
unsigned a, d; |
|
__asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); |
|
time_ticks = (retro_perf_tick_t)a | ((retro_perf_tick_t)d << 32); |
|
#elif defined(__ARM_ARCH_6__) |
|
__asm__ volatile( "mrc p15, 0, %0, c9, c13, 0" : "=r"(time_ticks) ); |
|
#elif defined(__aarch64__) |
|
__asm__ volatile( "mrs %0, cntvct_el0" : "=r"(time_ticks) ); |
|
#elif defined(PSP) || defined(VITA) |
|
time_ticks = sceKernelGetSystemTimeWide(); |
|
#elif defined(ORBIS) |
|
sceRtcGetCurrentTick((SceRtcTick*)&time_ticks); |
|
#elif defined(PS2) |
|
time_ticks = ps2_clock(); |
|
#elif defined(_3DS) |
|
time_ticks = svcGetSystemTick(); |
|
#elif defined(WIIU) |
|
time_ticks = OSGetSystemTime(); |
|
#elif defined(HAVE_LIBNX) |
|
time_ticks = armGetSystemTick(); |
|
#elif defined(EMSCRIPTEN) |
|
time_ticks = emscripten_get_now() * 1000; |
|
#endif |
|
|
|
return time_ticks; |
|
} |
Looks like there is no case of macOS here:
libretro-common/features/features_cpu.c
Lines 155 to 214 in 668749a
x86 and arm64 will use arch-specific cases, but for powerpc there is nothing, since macOS is excluded here:
libretro-common/features/features_cpu.c
Lines 179 to 180 in 668749a