source: trunk/lib_ir/AgnerTestP/PMCTest/timingtest.h @ 4221

Last change on this file since 4221 was 4221, checked in by linmengl, 5 years ago

initial checkin of Agner Fog's performance script

File size: 2.8 KB
Line 
1/***************************  timingtest.h  ****************************
2* Author:        Agner Fog
3* Date created:  2014-04-15
4* Last modified: 2014-04-15
5* Project:       define functions for timing purposes etc.
6* Description:
7*
8******************************************************************************/
9
10#pragma once
11#include <stdint.h>
12
13#if defined(__WINDOWS__) || defined(_WIN32) || defined(_WIN64)
14// System-specific definitions for Windows
15
16#if 1    // if intrin.h has __cpuid, __rdtsc and __readpmc
17
18#include <intrin.h>
19
20static inline void cpuid_ (int32_t output[4], int32_t functionnumber) { 
21    __cpuid(output, functionnumber);
22}
23
24// serialize CPU by cpuid function 0
25static inline void serialize () {
26    int dummy[4];
27    cpuid_(dummy, 0);
28    // Prevent the compiler from optimizing away the whole Serialize function:
29    volatile int DontSkip = dummy[0];
30}
31
32// read time stamp counter
33static inline int64_t readtsc() {
34    return __rdtsc();
35}
36
37// read performance monitor counter
38static inline int64_t readpmc(int32_t nPerfCtr) {
39    return __readpmc(nPerfCtr);
40}
41
42
43#else // intrin.h missing. use inline assembly
44
45// inline MASM syntax
46
47static inline void cpuid_ (int32_t output[4], int32_t functionnumber) { 
48    __asm {
49        mov eax, functionnumber;
50        cpuid;
51        mov esi, output;
52        mov [esi],    eax;
53        mov [esi+4],  ebx;
54        mov [esi+8],  ecx;
55        mov [esi+12], edx;
56    }
57}
58
59static inline void serialize () {
60    __asm {
61        xor eax, eax;
62        cpuid;
63    }
64}
65
66// get time stamp counter
67#pragma warning(disable:4035)
68static inline uint64_t readtsc() {
69    // read performance monitor counter number nPerfCtr
70    __asm {
71        rdtsc
72    }
73}
74
75static inline uint64_t readpmc(int32_t nPerfCtr) {
76    // read performance monitor counter number nPerfCtr
77    __asm {
78        mov ecx, nPerfCtr
79            rdpmc
80    }
81}
82#pragma warning(default:4035)
83
84#endif
85
86
87#elif defined(__unix__) || defined(__linux__)
88// System-specific definitions for Linux
89
90#include <cpuid.h>
91
92static inline void cpuid_ (int32_t output[4], int32_t functionnumber) { 
93    __get_cpuid(functionnumber, (uint32_t*)output, (uint32_t*)(output+1), (uint32_t*)(output+2), (uint32_t*)(output+3));
94}
95
96static inline void serialize () {
97    __asm __volatile__ ("cpuid" : : "a"(0) : "ebx", "ecx", "edx" );  // serialize
98}
99
100// read time stamp counter
101static inline uint64_t readtsc() {
102    uint32_t lo, hi;
103    __asm __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi) : : );
104    return lo | (uint64_t)hi << 32;
105}
106
107// read performance monitor counter
108static inline uint64_t readpmc(int32_t n) {
109    uint32_t lo, hi;
110    __asm __volatile__ ("rdpmc" : "=a"(lo), "=d"(hi) : "c"(n) : );
111    return lo | (uint64_t)hi << 32;
112}
113
114
115#else  // not Windows or Unix
116
117#error Unknown platform
118
119#endif
Note: See TracBrowser for help on using the repository browser.