/** (c) Nullsoft, Inc. C O N F I D E N T I A L ** Filename: ** Project: ** Description: ** Author: ** Created: **/ #include "main.h" #include "timing.h" #ifdef TIMING #ifndef __alpha static struct { unsigned int st_time[2]; unsigned int cycles; unsigned int calls; } timingInfo[64]; static int timingEnters; static void rdtsc(unsigned int t[2]) { __asm { mov esi, t _emit 0xf _emit 0x31 mov [esi], eax mov [esi+4], edx } } void _timingInit() { memset(timingInfo,0,sizeof(timingInfo)); } void _timingEnter(int which) { // if (!timingEnters++) __asm cli rdtsc(timingInfo[which].st_time); } void _timingLeave(int which) { unsigned int t[2]; rdtsc(t); // if (!--timingEnters) __asm sti if (t[1]==timingInfo[which].st_time[1]) { timingInfo[which].cycles += t[0]-timingInfo[which].st_time[0]; } else { timingInfo[which].cycles += t[0]+(0xffffffff-timingInfo[which].st_time[0]); } timingInfo[which].calls++; } void _timingPrint() { int x; FILE *fp = fopen("C:\\timings.txt","a+t"); for (x = 0; x < sizeof(timingInfo)/sizeof(timingInfo[0]); x ++) { if (timingInfo[x].calls) fprintf(fp,"%d: %d calls, %d clocks/call\n",x,timingInfo[x].calls,timingInfo[x].cycles/timingInfo[x].calls); } _timingInit(); fclose(fp); } #endif #endif