1 /* 2 ** 2008 May 27 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ****************************************************************************** 12 ** 13 ** This file contains inline asm code for retrieving "high-performance" 14 ** counters for x86 and x86_64 class CPUs. 15 */ 16 #ifndef SQLITE_HWTIME_H 17 #define SQLITE_HWTIME_H 18 19 /* 20 ** The following routine only works on pentium-class (or newer) processors. 21 ** It uses the RDTSC opcode to read the cycle count value out of the 22 ** processor and returns that value. This can be used for high-res 23 ** profiling. 24 */ 25 #if !defined(__STRICT_ANSI__) && \ 26 (defined(__GNUC__) || defined(_MSC_VER)) && \ 27 (defined(i386) || defined(__i386__) || defined(_M_IX86)) 28 29 #if defined(__GNUC__) 30 sqlite3Hwtime(void)31 __inline__ sqlite_uint64 sqlite3Hwtime(void){ 32 unsigned int lo, hi; 33 __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); 34 return (sqlite_uint64)hi << 32 | lo; 35 } 36 37 #elif defined(_MSC_VER) 38 sqlite3Hwtime(void)39 __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ 40 __asm { 41 rdtsc 42 ret ; return value at EDX:EAX 43 } 44 } 45 46 #endif 47 48 #elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) 49 50 __inline__ sqlite_uint64 sqlite3Hwtime(void){ 51 unsigned long val; 52 __asm__ __volatile__ ("rdtsc" : "=A" (val)); 53 return val; 54 } 55 56 #elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) 57 58 __inline__ sqlite_uint64 sqlite3Hwtime(void){ 59 unsigned long long retval; 60 unsigned long junk; 61 __asm__ __volatile__ ("\n\ 62 1: mftbu %1\n\ 63 mftb %L0\n\ 64 mftbu %0\n\ 65 cmpw %0,%1\n\ 66 bne 1b" 67 : "=r" (retval), "=r" (junk)); 68 return retval; 69 } 70 71 #else 72 73 /* 74 ** asm() is needed for hardware timing support. Without asm(), 75 ** disable the sqlite3Hwtime() routine. 76 ** 77 ** sqlite3Hwtime() is only used for some obscure debugging 78 ** and analysis configurations, not in any deliverable, so this 79 ** should not be a great loss. 80 */ 81 sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } 82 83 #endif 84 85 #endif /* !defined(SQLITE_HWTIME_H) */ 86