#include #include #include #include typedef unsigned int uint32_t; typedef unsigned long long uint64_t; static inline uint64_t x86_get_timer(void) { uint32_t hi, lo; __asm__ volatile ( "rdtsc\n" "mov %1, %%eax\n" "mov %0, %%edx\n" :"=r"(hi), "=r"(lo) : :"%eax", "%edx" ); return (((unsigned long long)hi) | (lo & 0xffffffff)); } #define TO_USEC(x) ((((uint64_t)x.tv_sec) * 1e+06) + x.tv_usec) int main(int argc, char **argv) { uint32_t i; uint64_t start, stop; #ifdef CHECK_GTD struct timeval st, en; uint64_t st1, en1; #endif /* CHECK_GTD */ #ifdef CHECK_GTD gettimeofday(&st, NULL); #endif /* CHECK_GTD */ start = x86_get_timer(); printf("start=%lld\n", start); #if 1 __asm__ volatile ( "mov $0xaea44080, %0\n" "1: sub $1, %0\n" "jnz 1b\n" : :"r"(i) ); #else while(--i); #endif stop = x86_get_timer(); #ifdef CHECK_GTD gettimeofday(&en, NULL); st1 = TO_USEC(st); en1 = TO_USEC(en); #endif /* CHECK_GTD */ printf("stop=%lld start=%lld diff=%lld time=%g secs\n", stop, start, (stop - start), (((double)(stop - start)) * 3.4129e-10)); #ifdef CHECK_GTD printf("end=%lld start=%lld diff=%g secs\n", en1, st1, (((double)(en1 - st1)) * 1e-06)); #endif /* CHECK_GTD */ return 0; }