59,98 → 59,8 |
: "=A" (val) \ |
:: "ebx","ecx") |
|
#ifdef __O1000__ |
#define ll_read_timespec ll_read_timespec_1000 |
#else |
#ifdef __02000__ |
#define ll_read_timespec ll_read_timespec_2000 |
#else |
#ifdef __O4000__ |
#define ll_read_timespec ll_read_timespec_4000 |
#else |
#define ll_read_timespec ll_read_timespec_slow |
#endif |
#endif |
#endif |
|
//Low level time read function: Optimized for CPU < 1 GHz |
extern __inline__ void ll_read_timespec_1000(struct timespec *tspec) |
{ |
extern unsigned int clk_opt_1,clk_opt_2; |
extern unsigned long long *ptr_init_tsc; |
|
if (clk_opt_1 == 0) { |
NULL_TIMESPEC(tspec); |
return; |
} |
|
__asm__("xchgl %%eax,%%edx\n\t" |
"rdtsc\n\t" |
"subl (%%edi),%%eax\n\t" |
"sbbl 4(%%edi),%%edx\n\t" |
"divl %%ebx\n\t" |
"movl %%eax,%%ebx\n\t" |
"xorl %%eax,%%eax\n\t" |
"divl %%ecx\n\t" |
: "=a" (tspec->tv_nsec), "=b" (tspec->tv_sec) |
: "D" (ptr_init_tsc) , "b" (clk_opt_1), "c" (clk_opt_2) |
: "edx" ); |
|
} |
|
//Low level time read function: Optimized for CPU < 2 GHz |
extern __inline__ void ll_read_timespec_2000(struct timespec *tspec) |
{ |
extern unsigned int clk_opt_1,clk_opt_3; |
extern unsigned long long *ptr_init_tsc; |
|
if (clk_opt_1 == 0) { |
NULL_TIMESPEC(tspec); |
return; |
} |
|
__asm__("xchgl %%eax,%%edx\n\t" |
"rdtsc\n\t" |
"subl (%%edi),%%eax\n\t" |
"sbbl 4(%%edi),%%edx\n\t" |
"divl %%ebx\n\t" |
"movl %%eax,%%ebx\n\t" |
"shrl %%edx\n\t" |
"divl %%ecx\n\t" |
: "=a" (tspec->tv_nsec), "=b" (tspec->tv_sec) |
: "D" (ptr_init_tsc) , "b" (clk_opt_1), "c" (clk_opt_3) |
: "edx" ); |
|
} |
|
//Low level time read function: Optimized for CPU < 4 GHz |
extern __inline__ void ll_read_timespec_4000(struct timespec *tspec) |
{ |
extern unsigned int clk_opt_1,clk_opt_4; |
extern unsigned long long *ptr_init_tsc; |
|
if (clk_opt_1 == 0) { |
NULL_TIMESPEC(tspec); |
return; |
} |
|
__asm__("xchgl %%eax,%%edx\n\t" |
"rdtsc\n\t" |
"subl (%%edi),%%eax\n\t" |
"sbbl 4(%%edi),%%edx\n\t" |
"divl %%ebx\n\t" |
"movl %%eax,%%ebx\n\t" |
"shrl %%edx\n\t" |
"shrl %%edx\n\t" |
"divl %%ecx\n\t" |
: "=a" (tspec->tv_nsec), "=b" (tspec->tv_sec) |
: "D" (ptr_init_tsc) , "b" (clk_opt_1), "c" (clk_opt_4) |
: "edx" ); |
|
} |
|
//Low level time read function |
extern __inline__ void ll_read_timespec_slow(struct timespec *tspec) |
extern __inline__ void ll_read_timespec(struct timespec *tspec) |
{ |
extern unsigned int clk_per_msec; |
extern unsigned long long *ptr_init_nsec; |
161,14 → 71,22 |
return; |
} |
|
__asm__("xchgl %%eax,%%edx\n\t" |
__asm__("xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
"rdtsc\n\t" |
"pushl %%eax\n\t" |
"pushl %%edx\n\t" |
"xorl %%eax,%%eax\n\t" |
"cpuid\n\t" |
"popl %%edx\n\t" |
"popl %%eax\n\t" |
"movl %4,%%ebx\n\t" |
"subl (%%edi),%%eax\n\t" |
"sbbl 4(%%edi),%%edx\n\t" |
"movl %%edx,%%ecx\n\t" |
"movl $1000000,%%edi\n\t" |
"mull %%edi\n\t" |
"movl %%eax,%%esi\n\t" |
"pushl %%eax\n\t" |
"movl %%ecx,%%eax\n\t" |
"movl %%edx,%%ecx\n\t" |
"mull %%edi\n\t" |
176,14 → 94,16 |
"adcl $0,%%edx\n\t" |
"divl %%ebx\n\t" |
"movl %%eax,%%ecx\n\t" |
"movl %%esi,%%eax\n\t" |
"popl %%eax\n\t" |
"divl %%ebx\n\t" |
"movl %%ecx,%%edx\n\t" |
"addl (%%esi),%%eax\n\t" |
"adcl 4(%%esi),%%edx\n\t" |
"movl $1000000000,%%edi\n\t" |
"divl %%edi\n\t" |
: "=a" (tspec->tv_sec), "=d" (tspec->tv_nsec) |
: "D" (ptr_init_tsc), "b" (clk_per_msec) |
: "ecx", "esi"); |
: "D" (ptr_init_tsc), "S" (ptr_init_nsec), "m" (clk_per_msec) |
: "ebx", "ecx"); |
|
} |
|