|
|
1.1 root 1: #include <stdlib.h>
2: #include "client.h"
3:
4: #if id386
5:
6: static unsigned long bias;
7: static unsigned long *histogram;
8: static unsigned long start, range;
9: static unsigned long bias;
10:
11: __declspec( naked ) void x86_TimerStart( void )
12: {
13: __asm _emit 0fh
14: __asm _emit 31h
15: __asm mov start, eax
16: __asm ret
17: }
18:
19: __declspec( naked ) void x86_TimerStop( void )
20: {
21: __asm push edi
22: __asm mov edi, histogram
23: __asm _emit 0fh
24: __asm _emit 31h
25: __asm sub eax, start
26: __asm sub eax, bias
27: __asm js discard
28: __asm cmp eax, range
29: __asm jge discard
30: __asm lea edi, [edi + eax*4]
31: __asm inc dword ptr [edi]
32: discard:
33: __asm pop edi
34: __asm ret
35: }
36:
37: #pragma warning( disable: 4035 )
38: static __declspec( naked ) unsigned long x86_TimerStopBias( void )
39: {
40: __asm push edi
41: __asm mov edi, histogram
42: __asm _emit 0fh
43: __asm _emit 31h
44: __asm sub eax, start
45: __asm pop edi
46: __asm ret
47: }
48: #pragma warning( default:4035 )
49:
50: void x86_TimerInit( unsigned long smallest, unsigned length )
51: {
52: int i;
53: unsigned long biastable[100];
54:
55: range = length;
56: bias = 10000;
57:
58: for ( i = 0; i < 100; i++ )
59: {
60: x86_TimerStart();
61: biastable[i] = x86_TimerStopBias();
62:
63: if ( bias > biastable[i] )
64: bias = biastable[i];
65: }
66:
67: bias += smallest;
68: histogram = Z_Malloc( range * sizeof( unsigned long ) );
69: }
70:
71: unsigned long *x86_TimerGetHistogram( void )
72: {
73: return histogram;
74: }
75:
76: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.