|
1 // |
|
2 // gettsc.inl |
|
3 // |
|
4 // gives access to the Pentium's (secret) cycle counter |
|
5 // |
|
6 // This software was written by Leonard Janke (janke@unixg.ubc.ca) |
|
7 // in 1996-7 and is entered, by him, into the public domain. |
|
8 |
|
9 #if defined(__WATCOMC__) |
|
10 void GetTSC(unsigned long&); |
|
11 #pragma aux GetTSC = 0x0f 0x31 "mov [edi], eax" parm [edi] modify [edx eax]; |
|
12 #elif defined(__GNUC__) |
|
13 inline |
|
14 void GetTSC(unsigned long& tsc) |
|
15 { |
|
16 asm volatile(".byte 15, 49\n\t" |
|
17 : "=eax" (tsc) |
|
18 : |
|
19 : "%edx", "%eax"); |
|
20 } |
|
21 #elif defined(_MSC_VER) |
|
22 inline |
|
23 void GetTSC(unsigned long& tsc) |
|
24 { |
|
25 unsigned long a; |
|
26 __asm _emit 0fh |
|
27 __asm _emit 31h |
|
28 __asm mov a, eax; |
|
29 tsc=a; |
|
30 } |
|
31 #endif |
|
32 |
|
33 #include <stdio.h> |
|
34 #include <stdlib.h> |
|
35 #include <openssl/des.h> |
|
36 |
|
37 void main(int argc,char *argv[]) |
|
38 { |
|
39 des_key_schedule key; |
|
40 unsigned long s1,s2,e1,e2; |
|
41 unsigned long data[2]; |
|
42 int i,j; |
|
43 |
|
44 for (j=0; j<6; j++) |
|
45 { |
|
46 for (i=0; i<1000; i++) /**/ |
|
47 { |
|
48 des_encrypt1(&data[0],key,1); |
|
49 GetTSC(s1); |
|
50 des_encrypt1(&data[0],key,1); |
|
51 des_encrypt1(&data[0],key,1); |
|
52 des_encrypt1(&data[0],key,1); |
|
53 GetTSC(e1); |
|
54 GetTSC(s2); |
|
55 des_encrypt1(&data[0],key,1); |
|
56 des_encrypt1(&data[0],key,1); |
|
57 des_encrypt1(&data[0],key,1); |
|
58 des_encrypt1(&data[0],key,1); |
|
59 GetTSC(e2); |
|
60 des_encrypt1(&data[0],key,1); |
|
61 } |
|
62 |
|
63 printf("des %d %d (%d)\n", |
|
64 e1-s1,e2-s2,((e2-s2)-(e1-s1))); |
|
65 } |
|
66 } |
|
67 |