Add the 64-bit CPU cycle count utility function

Change-Id: Ie87245bbdf5735bc9729199eeb07899d81dbf267
This commit is contained in:
Yi Luo 2016-04-21 15:59:05 -07:00
parent b816eea5ef
commit b547a2f38c

View File

@ -216,6 +216,11 @@ x86_simd_caps(void) {
unsigned __int64 __rdtsc(void); unsigned __int64 __rdtsc(void);
#pragma intrinsic(__rdtsc) #pragma intrinsic(__rdtsc)
#endif #endif
// Note:
// 32-bit CPU cycle counter is light-weighted for most function performance
// measurement. For large function (CPU time > a couple of seconds), 64-bit
// counter should be used.
// 32-bit CPU cycle counter
static INLINE unsigned int static INLINE unsigned int
x86_readtsc(void) { x86_readtsc(void) {
#if defined(__GNUC__) && __GNUC__ #if defined(__GNUC__) && __GNUC__
@ -234,7 +239,25 @@ x86_readtsc(void) {
#endif #endif
#endif #endif
} }
// 64-bit CPU cycle counter
static INLINE uint64_t
x86_readtsc64(void) {
#if defined(__GNUC__) && __GNUC__
uint32_t hi, lo;
__asm__ __volatile__("rdtsc" : "=a"(lo), "=d"(hi));
return ((uint64_t)hi << 32) | lo;
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
uint_t hi, lo;
asm volatile("rdtsc\n\t" : "=a"(lo), "=d"(hi));
return ((uint64_t)hi << 32) | lo;
#else
#if ARCH_X86_64
return (uint64_t)__rdtsc();
#else
__asm rdtsc;
#endif
#endif
}
#if defined(__GNUC__) && __GNUC__ #if defined(__GNUC__) && __GNUC__
#define x86_pause_hint()\ #define x86_pause_hint()\