X-Git-Url: https://git.libre-soc.org/?p=riscv-tests.git;a=blobdiff_plain;f=benchmarks%2Fcommon%2Futil.h;h=081cfd634526d875bcde36eb0c0ce61346677a1a;hp=082489bf80975eb391b738792c12bcea2ecf8b31;hb=HEAD;hpb=e00aaf2a45352f1f52c5c3694fa7f5aaba66d9a7 diff --git a/benchmarks/common/util.h b/benchmarks/common/util.h index 082489b..081cfd6 100644 --- a/benchmarks/common/util.h +++ b/benchmarks/common/util.h @@ -1,61 +1,13 @@ +// See LICENSE for license details. + #ifndef __UTIL_H #define __UTIL_H -//-------------------------------------------------------------------------- -// Macros - -// Set HOST_DEBUG to 1 if you are going to compile this for a host -// machine (ie Athena/Linux) for debug purposes and set HOST_DEBUG -// to 0 if you are compiling with the smips-gcc toolchain. - -#ifndef HOST_DEBUG -#define HOST_DEBUG 0 -#endif - -// Set PREALLOCATE to 1 if you want to preallocate the benchmark -// function before starting stats. If you have instruction/data -// caches and you don't want to count the overhead of misses, then -// you will need to use preallocation. - -#ifndef PREALLOCATE -#define PREALLOCATE 0 -#endif - -// Set SET_STATS to 1 if you want to carve out the piece that actually -// does the computation. - -#ifndef SET_STATS -#define SET_STATS 0 -#endif - -#if HOST_DEBUG -#include -static void setStats(int enable) {} -#else extern void setStats(int enable); -#endif -static void printArray(const char name[], int n, const int arr[]) -{ -#if HOST_DEBUG - int i; - printf( " %10s :", name ); - for ( i = 0; i < n; i++ ) - printf( " %3d ", arr[i] ); - printf( "\n" ); -#endif -} +#include -static void printDoubleArray(const char name[], int n, const double arr[]) -{ -#if HOST_DEBUG - int i; - printf( " %10s :", name ); - for ( i = 0; i < n; i++ ) - printf( " %g ", arr[i] ); - printf( "\n" ); -#endif -} +#define static_assert(cond) switch(0) { case 0: case !!(long)(cond): ; } static int verify(int n, const volatile int* test, const int* verify) { @@ -89,11 +41,7 @@ static int verifyDouble(int n, const volatile double* test, const double* verify return 0; } -#ifndef ncores -#define ncores 1 -#endif - -static void __attribute__((noinline)) barrier() +static void __attribute__((noinline)) barrier(int ncores) { static volatile int sense; static volatile int count; @@ -113,8 +61,30 @@ static void __attribute__((noinline)) barrier() __sync_synchronize(); } +static uint64_t lfsr(uint64_t x) +{ + uint64_t bit = (x ^ (x >> 1)) & 1; + return (x >> 1) | (bit << 62); +} + +static uintptr_t insn_len(uintptr_t pc) +{ + return (*(unsigned short*)pc & 3) ? 4 : 2; +} + #ifdef __riscv #include "encoding.h" #endif +#define stringify_1(s) #s +#define stringify(s) stringify_1(s) +#define stats(code, iter) do { \ + unsigned long _c = -read_csr(mcycle), _i = -read_csr(minstret); \ + code; \ + _c += read_csr(mcycle), _i += read_csr(minstret); \ + if (cid == 0) \ + printf("\n%s: %ld cycles, %ld.%ld cycles/iter, %ld.%ld CPI\n", \ + stringify(code), _c, _c/iter, 10*_c/iter%10, _c/_i, 10*_c/_i%10); \ + } while(0) + #endif //__UTIL_H