1 /*
2 * Benchmark support functions.
3 *
4 * Copyright (c) 2020, Arm Limited.
5 * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
6 */
7
8 #include <stdint.h>
9 #include <time.h>
10
11 /* Fast and accurate timer returning nanoseconds. */
12 static inline uint64_t
clock_get_ns(void)13 clock_get_ns (void)
14 {
15 struct timespec ts;
16 clock_gettime (CLOCK_MONOTONIC, &ts);
17 return ts.tv_sec * (uint64_t) 1000000000 + ts.tv_nsec;
18 }
19
20 /* Fast 32-bit random number generator. Passing a non-zero seed
21 value resets the internal state. */
22 static inline uint32_t
rand32(uint32_t seed)23 rand32 (uint32_t seed)
24 {
25 static uint64_t state = 0xb707be451df0bb19ULL;
26 if (seed != 0)
27 state = seed;
28 uint32_t res = state >> 32;
29 state = state * 6364136223846793005ULL + 1;
30 return res;
31 }
32
33 /* Macros to run a benchmark BENCH using string function FN. */
34 #define RUN(BENCH, FN) BENCH(#FN, FN)
35
36 #if __aarch64__
37 # define RUNA64(BENCH, FN) BENCH(#FN, FN)
38 #else
39 # define RUNA64(BENCH, FN)
40 #endif
41
42 #if __ARM_FEATURE_SVE
43 # define RUNSVE(BENCH, FN) BENCH(#FN, FN)
44 #else
45 # define RUNSVE(BENCH, FN)
46 #endif
47
48 #if WANT_MOPS
49 # define RUNMOPS(BENCH, FN) BENCH(#FN, FN)
50 #else
51 # define RUNMOPS(BENCH, FN)
52 #endif
53
54 #if __arm__
55 # define RUNA32(BENCH, FN) BENCH(#FN, FN)
56 #else
57 # define RUNA32(BENCH, FN)
58 #endif
59
60 #if __arm__ && __ARM_ARCH >= 6 && __ARM_ARCH_ISA_THUMB == 2
61 # define RUNT32(BENCH, FN) BENCH(#FN, FN)
62 #else
63 # define RUNT32(BENCH, FN)
64 #endif
65