#ifndef TIMEDEFS_H
#define TIMEDEFS_H

#define STAMP ({unsigned res; __asm__ __volatile__ ("rdtsc" : "=a"(res) : : "edx"); res;})
#define CACHE_WARM_ITER 10
#define M 100
#define N 100
#define MAX_ITER 2000

#define DO(x) do { \
int i,j; \
for (i = 0; i < M; i++) { \
unsigned c2, c1;\
for(j=0;j<CACHE_WARM_ITER;j++) {x;}\
c1 = STAMP;\
for (j = 1; j <= N; j++) { x; }\
c1 = STAMP - c1;\
median_next(c1);\
} } while (0)

unsigned values[MAX_ITER];
int num_values = 0;

int comp(const void *x, const void *y) { return *(unsigned *)x - *(unsigned *)y; }

void median_next(unsigned x) { values[num_values++] = x; }

unsigned median_get(void) {
    	unsigned res;
    	qsort(values, num_values, sizeof(unsigned), comp);
    	res = values[num_values/2];
    	num_values = 0;
    	return res;
	}
#endif


