Annotation of embedaddon/sqlite3/src/hwtime.h, revision 1.1

1.1     ! misho       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: 
        !            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: 
        !            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_) */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>