aboutsummaryrefslogtreecommitdiff
path: root/external/glim/TscTimer.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'external/glim/TscTimer.hpp')
-rw-r--r--external/glim/TscTimer.hpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/external/glim/TscTimer.hpp b/external/glim/TscTimer.hpp
new file mode 100644
index 000000000..ce22c7cb1
--- /dev/null
+++ b/external/glim/TscTimer.hpp
@@ -0,0 +1,32 @@
+#ifndef _TSC_TIMER_H
+#define _TSC_TIMER_H
+
+namespace glim {
+
+extern "C" { // http://en.wikipedia.org/wiki/Rdtsc
+#if (defined(__GNUC__) || defined(__ICC)) && defined(__i386__)
+ static __inline__ unsigned long long rdTsc(void) {
+ unsigned long long ret;
+ __asm__ __volatile__("rdtsc": "=A" (ret));
+ return ret;
+ }
+#elif (defined(__GNUC__) || defined(__ICC) || defined(__SUNPRO_C)) && defined(__x86_64__)
+ static __inline__ unsigned long long rdTsc(void) {
+ unsigned a, d;
+ asm volatile("rdtsc" : "=a" (a), "=d" (d));
+ return ((unsigned long long)a) | (((unsigned long long)d) << 32);
+ }
+#endif
+}
+
+//! CPU cycles timer. Fast, not safe.
+//! cf. http://en.wikipedia.org/wiki/Rdtsc
+struct TscTimer {
+ int64_t start;
+ TscTimer (): start (rdTsc()) {}
+ int64_t operator()() const {return rdTsc() - start;}
+};
+
+}
+
+#endif // _TSC_TIMER_H