15 #include "absl/base/internal/unscaledcycleclock.h"
17 #if ABSL_USE_UNSCALED_CYCLECLOCK
23 #if defined(__powerpc__) || defined(__ppc__)
25 #include <sys/platform/ppc.h>
26 #elif defined(__FreeBSD__)
29 #include <sys/types.h>
30 #include <sys/sysctl.h>
33 #include "absl/base/call_once.h"
37 #include "absl/base/internal/sysinfo.h"
41 namespace base_internal {
47 __asm__
volatile(
"rdtsc" :
"=A"(
ret));
51 double UnscaledCycleClock::Frequency() {
55 #elif defined(__x86_64__)
57 double UnscaledCycleClock::Frequency() {
61 #elif defined(__powerpc__) || defined(__ppc__)
65 return __ppc_get_timebase();
69 asm volatile(
"mfspr %0, 268" :
"=r"(tbr));
78 "cmpw %[tmp],%[hi32]\n"
80 : [ hi32 ]
"=r"(tbu), [ lo32 ]
"=r"(tbl), [
tmp ]
"=r"(
tmp));
81 return (
static_cast<int64_t>(tbu) << 32) | tbl;
86 double UnscaledCycleClock::Frequency() {
88 return __ppc_get_timebase_freq();
92 return static_cast<double>(512000000);
93 #elif defined(__FreeBSD__)
94 static once_flag init_timebase_frequency_once;
95 static double timebase_frequency = 0.0;
97 size_t length =
sizeof(timebase_frequency);
98 sysctlbyname(
"kern.timecounter.tc.timebase.frequency", &timebase_frequency,
101 return timebase_frequency;
103 #error Must implement UnscaledCycleClock::Frequency()
107 #elif defined(__aarch64__)
115 asm volatile(
"mrs %0, cntvct_el0" :
"=r"(virtual_timer_value));
116 return virtual_timer_value;
119 double UnscaledCycleClock::Frequency() {
121 asm volatile(
"mrs %0, cntfrq_el0" :
"=r"(aarch64_timer_frequency));
122 return aarch64_timer_frequency;
125 #elif defined(__riscv)
129 asm volatile(
"rdcycle %0" :
"=r"(virtual_timer_value));
130 return virtual_timer_value;
133 double UnscaledCycleClock::Frequency() {
137 #elif defined(_M_IX86) || defined(_M_X64)
139 #pragma intrinsic(__rdtsc)
143 double UnscaledCycleClock::Frequency() {
153 #endif // ABSL_USE_UNSCALED_CYCLECLOCK