/*
Copyright 2011, Spyros Blanas.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/**
* CHANGELOG
* - changed `unsigned long long' declerations to uint64_t and added include
* for . May 2012, Cagri.
*
*/
#ifndef RDTSC_H
#define RDTSC_H
#include
#include
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(__i386__) && !defined(__x86_64__) && !defined(__sparc__)
#warning No supported architecture found -- timers will return junk.
#endif
static __inline__ uint64_t curtick() {
uint64_t tick;
#if defined(__i386__)
unsigned long lo, hi;
__asm__ __volatile__ (".byte 0x0f, 0x31" : "=a" (lo), "=d" (hi));
tick = (uint64_t) hi << 32 | lo;
#elif defined(__x86_64__)
unsigned long lo, hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
tick = (uint64_t) hi << 32 | lo;
#elif defined(__sparc__)
__asm__ __volatile__ ("rd %%tick, %0" : "=r" (tick));
#endif
return tick;
}
static __inline__ void startTimer(uint64_t* t) {
*t = curtick();
}
static __inline__ void stopTimer(uint64_t* t) {
*t = curtick() - *t;
}
static __inline__ double diff_usec(struct timeval * start, struct timeval * end) {
return (((*end).tv_sec*1000000L + (*end).tv_usec)
- ((*start).tv_sec*1000000L+(*start).tv_usec));
}
#ifdef __cplusplus
}
#endif
#endif