8 static long myround(double u
)
11 while (result
+ 0.5 < u
) result
+= 1;
12 while (result
- 0.5 > u
) result
-= 1;
16 static long long microseconds(void)
19 gettimeofday(&t
,(struct timezone
*) 0);
20 return t
.tv_sec
* (long long) 1000000 + t
.tv_usec
;
23 static long long timebase(void)
25 unsigned long long result
;
26 result
= -spu_read_decrementer();
27 return 0xffffffff & result
;
30 static double cpufrequency
= 0;
31 static long tbcycles
= 0;
33 static double guesstbcycles(void)
35 long long tb0
; long long us0
;
36 long long tb1
; long long us1
;
43 } while (us1
- us0
< 10000 || tb1
- tb0
< 1000);
44 if (tb1
<= tb0
) return 0;
47 return (cpufrequency
* 0.000001 * (double) us1
) / (double) tb1
;
50 static void init(void)
56 spu_write_decrementer(0xffffffff);
58 cpufrequency
= 3192000000.0;
60 for (loop
= 0;loop
< 100;++loop
) {
61 guess1
= guesstbcycles();
62 guess2
= guesstbcycles();
63 tbcycles
= myround(guess1
);
64 if (guess1
- tbcycles
> 0.1) continue;
65 if (tbcycles
- guess1
> 0.1) continue;
66 if (guess2
- tbcycles
> 0.1) continue;
67 if (tbcycles
- guess2
> 0.1) continue;
73 long long cpucycles_celllinux(void)
75 if (!tbcycles
) init();
76 return timebase() * tbcycles
;
79 long long cpucycles_celllinux_persecond(void)
81 if (!tbcycles
) init();