-rw-r--r-- 1070 djbsort-20180710/cpucycles/cortex_vct/cpucycles.c
/* cpucycles/cortex_vct.c version 20180222 D. J. Bernstein Romain Dolbeau Public domain. */ #define SCALE 1 #include <time.h> #include <unistd.h> #include <sys/time.h> #include <stdlib.h> #include "cpucycles.h" static inline unsigned long long aarch64_timer_get_cntfrq(void) { unsigned long long val; asm volatile("mrs %0, CNTFRQ_EL0" : "=r" (val)); return val; } #define V8FREQ 1 long long cpucycles(void) { long long Rt; asm volatile("mrs %0, CNTVCT_EL0" : "=r" (Rt)); return Rt * V8FREQ; } long long cpucycles_persecond(void) { struct timeval t0,t1; long long c0,c1; unsigned long long f; long long r; double d0,d1; gettimeofday(&t0,(struct timezone *) 0); c0 = cpucycles(); sleep(1); gettimeofday(&t1,(struct timezone *) 0); c1 = cpucycles(); d0 = (double) t0.tv_sec; d0 += ((double) t0.tv_usec) / 1000000.0; d1 = (double) t1.tv_sec; d1 += ((double) t1.tv_usec) / 1000000.0; r = (c1-c0)/(d1-d0); f = aarch64_timer_get_cntfrq(); if (llabs(f-r) < 100) return f; /* something is wrong here, fixme ? */ return r; }