#define _LARGEFILE64_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <pthread.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/resource.h>
#include <fcntl.h>
#include <unistd.h>
#include "malloc.h"
#include "mtrace.h"
#if UINTPTR_MAX == 0xffffffffffffffff
#define ticks_t int64_t
/* Setting quick_run to 1 allows the simulator to model
only the allocation and deallocation accounting via
atomic_rss. The actual allocations are skipped. This
mode is useful to verify the workload file. */
#define quick_run 0
static __inline__ ticks_t rdtsc_s(void)
{
unsigned a, d;
asm volatile("cpuid" ::: "%rax", "%rbx", "%rcx", "%rdx");
asm volatile("rdtscp" : "=a" (a), "=d" (d));
return ((unsigned long long)a) | (((unsigned long long)d) << 32);
}
static __inline__ ticks_t rdtsc_e(void)
{
unsigned a, d;
asm volatile("rdtscp" : "=a" (a), "=d" (d));
asm volatile("cpuid" ::: "%rax", "%rbx", "%rcx", "%rdx");
return ((unsigned long long)a) | (((unsigned long long)d) << 32);
}
#else
#define ticks_t int32_t
static __inline__ ticks_t rdtsc_s(void)
{
unsigned a, d;
asm volatile("cpuid" ::: "%ax", "%bx", "%cx", "%dx");
asm volatile("rdtsc" : "=a" (a), "=d" (d));
return ((unsigned long)a) | (((unsigned long)d) << 16);
}
static __inline__ ticks_t rdtsc_e(void)
{
unsigned a, d;
asm volatile("rdtscp" : "=a" (a), "=d" (d));
asm volatile("cpuid" ::: "%ax", "%bx", "%cx", "%dx");
return ((unsigned long)a) | (((unsigned long)d) << 16);
}
#endif
static ticks_t diff_timeval (struct timeval e, struct timeval s)
{
ticks_t usec;
if (e.tv_usec < s.tv_usec)
usec = (e.tv_usec + 1000000 - s.tv_usec)