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 class CPUs. 15 */ 16 #ifndef _HWTIME_H_ 17 #define _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(__GNUC__) || defined(_MSC_VER)) && \ 26 (defined(i386) || defined(__i386__) || defined(_M_IX86)) 27 28 #if defined(__GNUC__) 29 sqlite3Hwtime(void)30 __inline__ sqlite_uint64 sqlite3Hwtime(void){ 31 unsigned int lo, hi; 32 __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); 33 return (sqlite_uint64)hi << 32 | lo; 34 } 35 36 #elif defined(_MSC_VER) 37 sqlite3Hwtime(void)38 __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ 39 __asm { 40 rdtsc 41 ret ; return value at EDX:EAX 42 } 43 } 44 45 #endif 46 47 #elif (defined(__GNUC__) && defined(__x86_64__)) 48 49 __inline__ sqlite_uint64 sqlite3Hwtime(void){ 50 unsigned long val; 51 __asm__ __volatile__ ("rdtsc" : "=A" (val)); 52 return val; 53 } 54 55 #elif (defined(__GNUC__) && defined(__ppc__)) 56 57 __inline__ sqlite_uint64 sqlite3Hwtime(void){ 58 unsigned long long retval; 59 unsigned long junk; 60 __asm__ __volatile__ ("\n\ 61 1: mftbu %1\n\ 62 mftb %L0\n\ 63 mftbu %0\n\ 64 cmpw %0,%1\n\ 65 bne 1b" 66 : "=r" (retval), "=r" (junk)); 67 return retval; 68 } 69 70 #else 71 72 #error Need implementation of sqlite3Hwtime() for your platform. 73 74 /* 75 ** To compile without implementing sqlite3Hwtime() for your platform, 76 ** you can remove the above #error and use the following 77 ** stub function. You will lose timing support for many 78 ** of the debugging and testing utilities, but it should at 79 ** least compile and run. 80 */ 81 sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } 82 83 #endif 84 85 #endif /* !defined(_HWTIME_H_) */ 86