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__)
27 #include <sys/sysctl.h>
28 #include <sys/types.h>
32 #include "absl/base/internal/sysinfo.h"
36 namespace base_internal {
42 __asm__
volatile(
"rdtsc" :
"=A"(
ret));
46 double UnscaledCycleClock::Frequency() {
50 #elif defined(__x86_64__)
54 __asm__
volatile(
"rdtsc" :
"=a"(low),
"=d"(high));
55 return (high << 32) | low;
58 double UnscaledCycleClock::Frequency() {
62 #elif defined(__powerpc__) || defined(__ppc__)
66 return __ppc_get_timebase();
70 asm volatile(
"mfspr %0, 268" :
"=r"(tbr));
79 "cmpw %[tmp],%[hi32]\n"
81 : [ hi32 ]
"=r"(tbu), [ lo32 ]
"=r"(tbl), [
tmp ]
"=r"(
tmp));
82 return (
static_cast<int64_t>(tbu) << 32) | tbl;
87 double UnscaledCycleClock::Frequency() {
89 return __ppc_get_timebase_freq();
90 #elif defined(__FreeBSD__)
91 static once_flag init_timebase_frequency_once;
92 static double timebase_frequency = 0.0;
94 size_t length =
sizeof(timebase_frequency);
95 sysctlbyname(
"kern.timecounter.tc.timebase.frequency", &timebase_frequency,
98 return timebase_frequency;
100 #error Must implement UnscaledCycleClock::Frequency()
104 #elif defined(__aarch64__)
112 asm volatile(
"mrs %0, cntvct_el0" :
"=r"(virtual_timer_value));
113 return virtual_timer_value;
116 double UnscaledCycleClock::Frequency() {
118 asm volatile(
"mrs %0, cntfrq_el0" :
"=r"(aarch64_timer_frequency));
119 return aarch64_timer_frequency;
122 #elif defined(_M_IX86) || defined(_M_X64)
124 #pragma intrinsic(__rdtsc)
128 double UnscaledCycleClock::Frequency() {
138 #endif // ABSL_USE_UNSCALED_CYCLECLOCK