Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 336 → Rev 335

/shark/trunk/oslib/ll/i386/advtimer.h
39,7 → 39,11
__asm__ __volatile__("xorl %%eax,%%eax\n\t" \
"cpuid\n\t" \
"rdtsc\n\t" \
: "=a" (low), "=d" (high) \
"movl %%eax,%%esi\n\t" \
"movl %%edx,%%edi\n\t" \
"xorl %%eax,%%eax\n\t" \
"cpuid" \
: "=S" (low), "=D" (high) \
:: "ebx", "ecx")
 
#define rdtscll(val) \
46,6 → 50,12
__asm__ __volatile__("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" \
: "=A" (val) \
:: "ebx","ecx")
 
58,7 → 68,7
#ifdef __O4000__
#define ll_read_timespec ll_read_timespec_4000
#else
#define ll_read_timespec ll_read_timespec_8000
#define ll_read_timespec ll_read_timespec_slow
#endif
#endif
#endif
74,7 → 84,8
return;
}
__asm__("rdtsc\n\t"
__asm__("xchgl %%eax,%%edx\n\t"
"rdtsc\n\t"
"subl (%%edi),%%eax\n\t"
"sbbl 4(%%edi),%%edx\n\t"
"divl %%ebx\n\t"
98,13 → 109,12
return;
}
__asm__("rdtsc\n\t"
__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"
"shrdl $1,%%edx,%%eax\n\t"
"shrl %%edx\n\t"
"divl %%ecx\n\t"
: "=a" (tspec->tv_nsec), "=b" (tspec->tv_sec)
124,14 → 134,14
return;
}
__asm__("rdtsc\n\t"
__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"
"shrdl $2,%%edx,%%eax\n\t"
"shrl $2,%%edx\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)
140,30 → 150,39
}
 
//Low level time read function
extern __inline__ void ll_read_timespec_8000(struct timespec *tspec)
extern __inline__ void ll_read_timespec_slow(struct timespec *tspec)
{
extern unsigned int clk_opt_0,clk_opt_5;
extern unsigned int clk_per_msec;
extern unsigned long long *ptr_init_tsc;
 
if (clk_opt_0 == 0) {
if (clk_per_msec == 0) {
NULL_TIMESPEC(tspec);
return;
}
 
__asm__("rdtsc\n\t"
__asm__("xchgl %%eax,%%edx\n\t"
"rdtsc\n\t"
"subl (%%edi),%%eax\n\t"
"sbbl 4(%%edi),%%edx\n\t"
"shrdl $1,%%edx,%%eax\n\t"
"shrl %%edx\n\t"
"divl %%ebx\n\t"
"movl %%eax,%%ebx\n\t"
"xorl %%eax,%%eax\n\t"
"shrdl $2,%%edx,%%eax\n\t"
"shrl $2,%%edx\n\t"
"divl %%ecx\n\t"
: "=b" (tspec->tv_sec), "=a" (tspec->tv_nsec)
: "D" (ptr_init_tsc), "b" (clk_opt_0), "c" (clk_opt_5)
: "edx");
"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"
"movl %%ecx,%%eax\n\t"
"movl %%edx,%%ecx\n\t"
"mull %%edi\n\t"
"addl %%ecx,%%eax\n\t"
"adcl $0,%%edx\n\t"
"divl %%ebx\n\t"
"movl %%eax,%%ecx\n\t"
"movl %%esi,%%eax\n\t"
"divl %%ebx\n\t"
"movl %%ecx,%%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");
}