Changes to update Tomato RAF.
[tomato.git] / release / src / router / dnscrypt / src / libnacl / cpucycles / x86estimate.c
blobcd8e1c4b139164a5bcdc40b0905f652cd54ae980
1 #include <time.h>
2 #include <sys/time.h>
3 #include <sys/types.h>
4 #include <sys/param.h>
5 #include <sys/sysctl.h>
7 long long cpucycles_x86estimate(void)
9 long long result;
10 asm volatile(".byte 15;.byte 49" : "=A" (result));
11 return result;
14 static long long microseconds(void)
16 struct timeval t;
17 gettimeofday(&t,(struct timezone *) 0);
18 return t.tv_sec * (long long) 1000000 + t.tv_usec;
21 static double guessfreq(void)
23 long long tb0; long long us0;
24 long long tb1; long long us1;
26 tb0 = cpucycles_x86estimate();
27 us0 = microseconds();
28 do {
29 tb1 = cpucycles_x86estimate();
30 us1 = microseconds();
31 } while (us1 - us0 < 10000 || tb1 - tb0 < 1000);
32 if (tb1 <= tb0) return 0;
33 tb1 -= tb0;
34 us1 -= us0;
35 return ((double) tb1) / (0.000001 * (double) us1);
38 static double cpufrequency = 0;
40 static void init(void)
42 double guess1;
43 double guess2;
44 int loop;
46 for (loop = 0;loop < 100;++loop) {
47 guess1 = guessfreq();
48 guess2 = guessfreq();
49 if (guess1 > 1.01 * guess2) continue;
50 if (guess2 > 1.01 * guess1) continue;
51 cpufrequency = 0.5 * (guess1 + guess2);
52 break;
56 long long cpucycles_x86estimate_persecond(void)
58 if (!cpufrequency) init();
59 return cpufrequency;