diff options
Diffstat (limited to '3dc/win95/PENTIME.H')
| -rw-r--r-- | 3dc/win95/PENTIME.H | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/3dc/win95/PENTIME.H b/3dc/win95/PENTIME.H new file mode 100644 index 0000000..8c66961 --- /dev/null +++ b/3dc/win95/PENTIME.H @@ -0,0 +1,64 @@ +/* pentime.h */ +extern unsigned long int rdtsc_lo(void); +extern unsigned long int rdtsc_hi(void); +extern unsigned long int rdtsc_mid(void); + +#define ProfileStart() \ +{ \ + int time = rdtsc_lo(); +#define ProfileStop(x) \ + textprint("%s %d\n",x,rdtsc_lo()-time); \ +} + +#pragma aux rdtsc_lo = \ + "db 0fh, 31h" \ + value [eax] \ + modify [edx]; + +#pragma aux rdtsc_hi = \ + "db 0fh, 31h" \ + value [edx] \ + modify [eax]; + +#pragma aux rdtsc_mid = \ + "db 0fh, 31h" \ + "shr eax, 10h" \ + "shl edx, 10h" \ + "add eax, edx" \ + value [eax] \ + modify [edx]; + +/* Test to see if we have a Pentium or not. Note that this test is reliable + * enough for a tools project (where we can put in an overide switch) but not + * for a released product. + */ +extern unsigned char Pentium(void); +#pragma aux Pentium = \ + "pushfd" \ + "pop eax" \ + "or eax, 00200000h" \ + "push eax" \ + "popfd" \ + "pushfd" \ + "pop eax" \ + "mov ecx, eax" \ + "and eax, 00200000h" \ + "cmp eax, 0" \ + "je not_Pentium" \ + "mov eax, ecx" \ + "and eax, 0ffdfffffh" \ + "push eax" \ + "popfd" \ + "pushfd" \ + "pop eax" \ + "and eax, 00200000h" \ + "cmp eax, 0" \ + "jne not_Pentium" \ + "is_Pentium: mov al, 1" \ + "jmp finish" \ + "not_Pentium: mov al, 0" \ + "finish: nop" \ + value [al] \ + modify [eax ecx] + + |
