36 #ifndef ABSL_BASE_INTERNAL_UNSCALEDCYCLECLOCK_H_
37 #define ABSL_BASE_INTERNAL_UNSCALEDCYCLECLOCK_H_
41 #if defined(__APPLE__)
42 #include <TargetConditionals.h>
45 #include "absl/base/port.h"
48 #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \
49 defined(__powerpc__) || defined(__ppc__) || defined(__riscv) || \
50 defined(_M_IX86) || (defined(_M_X64) && !defined(_M_ARM64EC))
51 #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1
53 #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 0
62 #if defined(__native_client__) || (defined(__APPLE__)) || \
63 (defined(__ANDROID__) && defined(__aarch64__))
64 #define ABSL_USE_UNSCALED_CYCLECLOCK_DEFAULT 0
66 #define ABSL_USE_UNSCALED_CYCLECLOCK_DEFAULT 1
72 #if !defined(ABSL_USE_UNSCALED_CYCLECLOCK)
73 #define ABSL_USE_UNSCALED_CYCLECLOCK \
74 (ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION && \
75 ABSL_USE_UNSCALED_CYCLECLOCK_DEFAULT)
78 #if ABSL_USE_UNSCALED_CYCLECLOCK
82 #if (defined(__i386__) || defined(__x86_64__) || defined(__riscv) || \
83 defined(_M_IX86) || defined(_M_X64))
84 #define ABSL_INTERNAL_UNSCALED_CYCLECLOCK_FREQUENCY_IS_CPU_FREQUENCY
89 namespace time_internal {
90 class UnscaledCycleClockWrapperForGetCurrentTime;
93 namespace base_internal {
95 class UnscaledCycleClockWrapperForInitializeFrequency;
97 class UnscaledCycleClock {
99 UnscaledCycleClock() =
delete;
109 static double Frequency();
112 friend class base_internal::CycleClock;
113 friend class time_internal::UnscaledCycleClockWrapperForGetCurrentTime;
114 friend class base_internal::UnscaledCycleClockWrapperForInitializeFrequency;
117 #if defined(__x86_64__)
121 __asm__
volatile(
"rdtsc" :
"=a"(low),
"=d"(high));
122 return (high << 32) | low;
131 #endif // ABSL_USE_UNSCALED_CYCLECLOCK
133 #endif // ABSL_BASE_INTERNAL_UNSCALEDCYCLECLOCK_H_