17 #undef RDTSC_AVAILABLE
21 #if defined(_MSC_VER) && !defined(RDTSC_AVAILABLE) && !defined(WINCE)
27 #define RDTSC_AVAILABLE
31 #if defined (__WATCOMC__) && !defined(RDTSC_AVAILABLE)
33 # pragma aux ottd_rdtsc = 0x0F 0x31 value [edx eax] parm nomemory modify exact [edx eax] nomemory;
34 # define RDTSC_AVAILABLE
38 #if (defined(__i386__) || defined(__x86_64__)) && !defined(__DJGPP__) && !defined(RDTSC_AVAILABLE)
42 __asm__ __volatile__ (
"rdtsc" :
"=a" (low),
"=d" (high));
43 return ((uint64)high << 32) | low;
45 # define RDTSC_AVAILABLE
49 #if (defined(__POWERPC__) || defined(__powerpc__)) && !defined(RDTSC_AVAILABLE)
52 uint32 high = 0, high2 = 0, low;
63 :
"=r" (high),
"=r" (low),
"=r" (high2)
64 :
"0" (high),
"2" (high2)
66 return ((uint64)high << 32) | low;
68 # define RDTSC_AVAILABLE
73 #if !defined(RDTSC_AVAILABLE)
75 # if !defined(_MSC_VER)
76 #warning "(non-fatal) No support for rdtsc(), you won't be able to profile with TIC/TOC"
98 #elif defined(__x86_64__) || defined(__i386)
101 #if defined(__i386) && defined(__PIC__)
108 __asm__ __volatile__ (
109 "xchgl %%ebx, %1 \n\t"
111 "xchgl %%ebx, %1 \n\t"
112 :
"=a" (info[0]),
"=r" (info[1]),
"=c" (info[2]),
"=d" (info[3])
119 __asm__ __volatile__ (
121 :
"=a" (info[0]),
"=b" (info[1]),
"=c" (info[2]),
"=d" (info[3])
129 info[0] = info[1] = info[2] = info[3] = 0;
135 int cpu_info[4] = {-1};
137 uint max_info_type = cpu_info[0];
138 if (max_info_type < type)
return false;
141 return HasBit(cpu_info[index], bit);