Skip to content

Commit

Permalink
Pull commit ZDoom/gzdoom@eeb67bc from GZDoom: Use RDTSC equivalent on…
Browse files Browse the repository at this point in the history
… AARCH64.
  • Loading branch information
madame-rachelle committed Mar 25, 2022
1 parent 26179c5 commit 16c81f0
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 6 deletions.
12 changes: 7 additions & 5 deletions source/common/engine/stats.h
Expand Up @@ -76,8 +76,9 @@ inline uint64_t rdtsc()
while (upper != temp);
return (static_cast<unsigned long long>(upper) << 32) | lower;
#elif defined __aarch64__
// TODO: Implement and test on ARM64
return 0;
uint64_t vct;
asm volatile("mrs %0, cntvct_el0":"=r"(vct));
return vct;
#elif defined __i386__
if (CPU.bRDTSC)
{
Expand Down Expand Up @@ -186,14 +187,15 @@ inline uint64_t rdtsc()
unsigned int lower, upper, temp;
do
{
asm volatile ("mftbu %0 \n mftb %1 \n mftbu %2 \n"
asm volatile ("mftbu %0 \n mftb %1 \n mftbu %2 \n"
: "=r"(upper), "=r"(lower), "=r"(temp));
}
while (upper != temp);
return (static_cast<unsigned long long>(upper) << 32) | lower;
#elif defined __aarch64__
// TODO: Implement and test on ARM64
return 0;
uint64_t vct;
asm volatile("mrs %0, cntvct_el0":"=r"(vct));
return vct;
#elif defined __i386__ // i386
if (CPU.bRDTSC)
{
Expand Down
10 changes: 9 additions & 1 deletion source/common/platform/posix/sdl/i_system.cpp
Expand Up @@ -144,7 +144,15 @@ void CalculateCPUSpeed()
{
PerfAvailable = false;
PerfToMillisec = PerfToSec = 0.;
#ifdef __linux__
#ifdef __aarch64__
// [MK] on aarch64 rather than having to calculate cpu speed, there is
// already an independent frequency for the perf timer
uint64_t frq;
asm volatile("mrs %0, cntfrq_el0":"=r"(frq));
PerfAvailable = true;
PerfToSec = 1./frq;
PerfToMillisec = PerfToSec*1000.;
#elif defined(__linux__)
// [MK] read from perf values if we can
struct perf_event_attr pe;
memset(&pe,0,sizeof(struct perf_event_attr));
Expand Down

0 comments on commit 16c81f0

Please sign in to comment.