File: doMeasurement.h

package info (click to toggle)
aspectc%2B%2B 1.0pre4~svn.20090918-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 117,308 kB
  • ctags: 410,601
  • sloc: cpp: 1,883,007; ansic: 17,279; sh: 2,190; makefile: 1,088
file content (44 lines) | stat: -rw-r--r-- 1,173 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#ifndef DOMEASUREMENT_H
#define DOMEASUREMENT_H



typedef unsigned long long int cycle_t;
extern void *frameAddress;
extern void *stackBeforeAction; 
    
    cycle_t doMeasurement(AC::Action &action) {
        /* pseudocode:
        cycle_t start, current;    
        RDTSC(start);
        SAVESTACK(stackBeforeAction);
        action.trigger();
        RDTSC(current);
        return current - start;
        */

        cycle_t result;
        AC::Action *a = &action;
            
        __asm__ volatile (              
            "mov    %2, %%ecx\n"  // push argument (action == this) on the stack
	    "push   %%ecx\n" 
            "movl    %%esp, %0 \n"
	    "cpuid  \n"
            "rdtsc  \n"
            "mov    %%eax, %%esi\n"	   
	    "cpuid  \n"
	    "call   *%%edi \n"
	    "cpuid \n"
            "rdtsc \n"
            "sub    %%esi,%%eax\n" // current - start
	    "xorl   %%edx, %%edx\n"
            "pop    %%ecx\n"
              
            : "=m" (stackBeforeAction), "=A"(result) 
            : "m" ( a ), "D" (a->_wrapper)
            : "%ebx", "%ecx", "%esi" // add "%ecx" in case of problems
         );
        return result;
    }  
#endif