Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 329 → Rev 330

/shark/trunk/oslib/ll/i386/pit.h
178,11 → 178,11
};
 
#define ADDPITSPEC(n, t) ((t)->units += (n), \
(t)->gigas += (t)->units / 1432809, \
(t)->units %= 1432809)
(t)->gigas += (t)->units / 1423249, \
(t)->units %= 1423249)
#define NULLPITSPEC(t) (t)->units = 0, (t)->gigas = 0
#define PITSPEC2USEC(t) ((((t)->units * 1000) / 1197) \
+ (((t)->gigas * 1000) * 1197))
#define PITSPEC2USEC(t) ((((t)->units * 1000) / 1193) \
+ (((t)->gigas * 1000) * 1193))
#define CPPITSPEC(a, b) (b)->units = (a)->units, (b)->gigas = (a)->gigas
 
#endif /* __PIT_H__ */
/shark/trunk/oslib/ll/i386/advtimer.h
59,8 → 59,98
: "=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(struct timespec *tspec)
extern __inline__ void ll_read_timespec_slow(struct timespec *tspec)
{
extern unsigned int clk_per_msec;
extern unsigned long long *ptr_init_nsec;
71,22 → 161,14
return;
}
__asm__("xorl %%eax,%%eax\n\t"
"cpuid\n\t"
__asm__("xchgl %%eax,%%edx\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"
"pushl %%eax\n\t"
"movl %%eax,%%esi\n\t"
"movl %%ecx,%%eax\n\t"
"movl %%edx,%%ecx\n\t"
"mull %%edi\n\t"
94,16 → 176,14
"adcl $0,%%edx\n\t"
"divl %%ebx\n\t"
"movl %%eax,%%ecx\n\t"
"popl %%eax\n\t"
"movl %%esi,%%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), "S" (ptr_init_nsec), "m" (clk_per_msec)
: "ebx", "ecx");
: "D" (ptr_init_tsc), "b" (clk_per_msec)
: "ecx", "esi");
}
 
/shark/trunk/oslib/ll/sys/ll/time.h
139,9 → 139,9
(b)->tv_sec += (b)->tv_nsec / 1000000000, \
(b)->tv_nsec %= 1000000000)*/
#define PITSPEC2TIMESPEC(a,b) \
((b)->tv_nsec = (((DWORD)((a)->units) * 1000) / 1197), \
(b)->tv_nsec += (((a)->gigas * 1197) % 1000) * 1000, \
(b)->tv_sec = ((a)->gigas * 1197) / 1000 , \
((b)->tv_nsec = (((DWORD)((a)->units) * 1000) / 1193), \
(b)->tv_nsec += (((a)->gigas * 1193) % 1000) * 1000, \
(b)->tv_sec = ((a)->gigas * 1193) / 1000 , \
(b)->tv_sec += (b)->tv_nsec / 1000000, \
(b)->tv_nsec %= 1000000, \
(b)->tv_nsec *= 1000)