modernc.org/cc@v1.0.1/v2/testdata/_sqlite/src/hwtime.h (about)

     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 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(__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(SQLITE_HWTIME_H) */