source: tags/parabix-0.39/Profiling/i386_timer.c @ 4027

Last change on this file since 4027 was 4, checked in by cameron, 12 years ago

Initial import of parabix-0.36

File size: 759 bytes
Line 
1#define cycle_counter_units "cyc"
2
3__inline__ unsigned long long int read_cycle_counter () {
4  unsigned long long int ts;
5#ifdef SERIALIZE_RDTSC
6  asm volatile("cpuid\n\t"
7               "rdtsc\n" :
8               "=A" (ts) :
9               : "cc");
10#endif
11#ifndef SERIALIZE_RDTSC
12  asm volatile("rdtsc\n" : 
13               "=A" (ts));
14#endif
15  return(ts);
16}
17
18
19inline int binary_order_of_magnitude(unsigned long long int ts) {
20  int msb;
21  asm volatile("bsr 4(%[ts]), %[msb]\n\t"
22               "jz 1f\n\t"
23               "add $32, %[msb]\n\t"
24               "jmp 2f\n"
25               "1:\n\t"
26               "bsr (%[ts]), %[msb]\n"
27               "2:\n"
28               : [msb] "=r"(msb)
29               : [ts] "r"(&ts)
30               : "cc");
31  return msb;
32}
Note: See TracBrowser for help on using the repository browser.