Rework benchmarks to run in M-mode
[riscv-tests.git] / benchmarks / common / util.h
index 1f0c73cd44a0c29f24b6f03a241456d57430ba72..c35bf7cde831b39354e7da5791737694840adb54 100644 (file)
@@ -1,3 +1,5 @@
+// See LICENSE for license details.
+
 #ifndef __UTIL_H
 #define __UTIL_H
 
 // 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 <stdio.h>
 static void setStats(int enable) {}
@@ -35,6 +33,12 @@ static void setStats(int enable) {}
 extern void setStats(int enable);
 #endif
 
+#include <stdint.h>
+
+extern int have_vec;
+
+#define static_assert(cond) switch(0) { case 0: case !!(long)(cond): ; }
+
 static void printArray(const char name[], int n, const int arr[])
 {
 #if HOST_DEBUG
@@ -57,7 +61,7 @@ static void printDoubleArray(const char name[], int n, const double arr[])
 #endif
 }
 
-static int verify(int n, const int test[], const int verify[])
+static int verify(int n, const volatile int* test, const int* verify)
 {
   int i;
   // Unrolled for faster verification
@@ -73,7 +77,7 @@ static int verify(int n, const int test[], const int verify[])
   return 0;
 }
 
-static int verifyDouble(int n, const double test[], const double verify[])
+static int verifyDouble(int n, const volatile double* test, const double* verify)
 {
   int i;
   // Unrolled for faster verification
@@ -89,11 +93,7 @@ static int verifyDouble(int n, const 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 +113,25 @@ 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);
+}
+
 #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