Merge pull request #8 from riscv/sqrt-171
[riscv-tests.git] / benchmarks / common / util.h
index 082489bf80975eb391b738792c12bcea2ecf8b31..2fcc89dffa18848ee03086243e0074d1150acac4 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
@@ -89,11 +93,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 +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 = -rdcycle(), _i = -rdinstret(); \
+    code; \
+    _c += rdcycle(), _i += rdinstret(); \
+    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