15 #undef RDTSC_AVAILABLE
19 #if defined(_MSC_VER) && !defined(RDTSC_AVAILABLE)
25 return __rdpmccntr64();
26 #elif defined(_M_ARM64)
27 return _ReadStatusReg(ARM64_PMCCNTR_EL0);
32 #define RDTSC_AVAILABLE
36 #if defined (__WATCOMC__) && !defined(RDTSC_AVAILABLE)
38 # pragma aux ottd_rdtsc = 0x0F 0x31 value [edx eax] parm nomemory modify exact [edx eax] nomemory;
39 # define RDTSC_AVAILABLE
43 #if (defined(__i386__) || defined(__x86_64__)) && !defined(RDTSC_AVAILABLE)
47 __asm__ __volatile__ (
"rdtsc" :
"=a" (low),
"=d" (high));
48 return ((uint64)high << 32) | low;
50 # define RDTSC_AVAILABLE
54 #if (defined(__POWERPC__) || defined(__powerpc__)) && !defined(RDTSC_AVAILABLE)
57 uint32 high = 0, high2 = 0, low;
68 :
"=r" (high),
"=r" (low),
"=r" (high2)
69 :
"0" (high),
"2" (high2)
71 return ((uint64)high << 32) | low;
73 # define RDTSC_AVAILABLE
76 #if defined(__EMSCRIPTEN__) && !defined(RDTSC_AVAILABLE)
79 # define RDTSC_AVAILABLE
84 #if !defined(RDTSC_AVAILABLE)
85 #warning "(non-fatal) No support for rdtsc(), you won't be able to profile with TIC/TOC"
101 #if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
106 #elif defined(__x86_64__) || defined(__i386)
109 #if defined(__i386) && defined(__PIC__)
116 __asm__ __volatile__ (
117 "xchgl %%ebx, %1 \n\t"
119 "xchgl %%ebx, %1 \n\t"
120 :
"=a" (info[0]),
"=r" (info[1]),
"=c" (info[2]),
"=d" (info[3])
127 __asm__ __volatile__ (
129 :
"=a" (info[0]),
"=b" (info[1]),
"=c" (info[2]),
"=d" (info[3])
137 info[0] = info[1] = info[2] = info[3] = 0;
143 int cpu_info[4] = {-1};
145 uint max_info_type = cpu_info[0];
146 if (max_info_type < type)
return false;
149 return HasBit(cpu_info[index], bit);