Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

137 lines
3.7 KiB

/* *************************************************************************
** INTEL Corporation Proprietary Information
**
** This listing is supplied under the terms of a license
** agreement with INTEL Corporation and may not be copied
** nor disclosed except in accordance with the terms of
** that agreement.
**
** Copyright (c) 1995 Intel Corporation.
** All Rights Reserved.
**
** *************************************************************************
*/
/*
* ctiming.h
*
* DESCRIPTION:
* Common timing functions.
*
* I extracted this code from meantime.h in HQV's decode directory.
*/
// $Header: S:\h26x\src\common\ctiming.h_v 1.2 26 Dec 1995 17:43:06 DBRUCKS $
// $Log: S:\h26x\src\common\ctiming.h_v $
;//
;// Rev 1.2 26 Dec 1995 17:43:06 DBRUCKS
;// changed bTimerIsOn to bTimerIsActive
;//
;// Rev 1.1 26 Dec 1995 12:40:54 DBRUCKS
;// added higher level macros to simplify use
;//
;// Rev 1.0 20 Dec 1995 15:06:14 DBRUCKS
;// Initial revision.
#ifndef __CTIMING_H__
#define __CTIMING_H__
/* The following timing overhead numbers were generated by Tom Walsh
* based on static variables for startlow, starthigh, and elapsed.
*
* When timing sections of code with low clock numbers be careful to
* minimize the timing overhead. Store the sub totals to a stack variable
* instead of to the instance via a pointer indirection and offset.
*/
#define P5TIMING_OVERHEAD 13
#define P6TIMING_OVERHEAD 33
/* Low Level Macros
*/
#define __RDTSC__ __asm { __asm __emit 0Fh __asm __emit 31h }
#define STARTCLOCK(startlow,starthigh) { \
__asm { \
__asm __RDTSC__ \
__asm mov startlow, eax \
__asm mov starthigh, edx \
} \
}
#define STOPCLOCKP5(startlow,starthigh,elapsed) { \
__asm { \
__asm __RDTSC__ \
__asm sub eax, startlow \
__asm sbb edx, starthigh \
__asm sub eax, P5TIMING_OVERHEAD \
__asm sbb edx, 0 \
__asm mov elapsed,eax \
} \
}
#define STOPCLOCKP6(startlow,starthigh,elapsed) { \
__asm { \
__asm __RDTSC__ \
__asm sub eax, startlow \
__asm sbb edx, starthigh \
__asm sub eax, P6TIMING_OVERHEAD \
__asm sbb edx, 0 \
__asm mov elapsed,eax \
} \
}
/* High Level Macros
*
* Call TIMER_START and TIMER_STOP in the main function that you wish to time.
* TIMER_BEFORE and TIMER_AFTER should be used inside of that main function.
* Fo example:
*
* TIMER_START
* TIMER_BEFORE
* TIMER_AFTER_P5
* TIMER_BEFORE
* TIMER_AFTER_P5
* TIMER_STOP
*
* Variable Definitions
* U32 uStartLow; // temporary set in TIMER_START
* U32 uStartHigh; // temporary set in TIMER_START
* U32 uElapsed; // temporary used in TIMER_AFTER_*
* U32 uBefore; // temporary used in TIMER_BEFORE and TIMER_AFTER_*
* U32 uResult; // result variable
* int bTimerIsActive // boolean - true if timing this frame
*
* WARNING: TIMER_AFTER_P5 and TIMER_AFTER_P6 add to the result variable.
*/
#define TIMER_START(bTimerIsActive,uStartLow,uStartHigh) \
{ \
bTimerIsActive = 1; \
STARTCLOCK(uStartLow,uStartHigh); \
}
#define TIMER_BEFORE(bTimerIsActive,uStartLow,uStartHigh,uBefore) \
{ \
if (bTimerIsActive) \
{ \
STOPCLOCKP5(uStartLow,uStartHigh,uBefore); \
} \
}
#define TIMER_AFTER_P5(bTimerIsActive,uStartLow,uStartHigh,uBefore,uElapsed,uResult) \
{ \
if (bTimerIsActive) \
{ \
STOPCLOCKP5(uStartLow,uStartHigh,uElapsed); \
uResult += uElapsed - uBefore; \
} \
}
#define TIMER_STOP(bTimerIsActive,uStartLow,uStartHigh,uResult) \
{ \
if (bTimerIsActive) \
{ \
STOPCLOCKP5(uStartLow,uStartHigh,uResult); \
} \
}
#endif /* __CTIMING_H__ */