#ifndef COSMOPOLITAN_LIBC_BENCH_H_
#define COSMOPOLITAN_LIBC_BENCH_H_
#include "libc/nexgen32e/bench.h"
COSMOPOLITAN_C_START_

/**
 * @fileoverview Microbenchmarking Toolz.
 */

#define BENCHLOOPER(START, STOP, N, EXPR) \
  ({                                      \
    long Iter = 1;                        \
    long Toto = (N);                      \
    uint64_t Time1 = START();             \
    asm volatile("" ::: "memory");        \
    for (; Iter < Toto; ++Iter) {         \
      asm volatile("" ::: "memory");      \
      EXPR;                               \
      asm volatile("" ::: "memory");      \
    }                                     \
    asm volatile("" ::: "memory");        \
    uint64_t Time2 = STOP();              \
    (double)(long)(Time2 - Time1) / Iter; \
  })

#ifndef BENCHLOOP
/* TODO(jart): DELETE */
#define BENCHLOOP(START, STOP, N, INIT, EXPR)                        \
  ({                                                                 \
    double Average;                                                  \
    uint64_t Time1, Time2;                                           \
    unsigned long Iter, Count;                                       \
    for (Average = 1, Iter = 1, Count = (N); Iter < Count; ++Iter) { \
      INIT;                                                          \
      Time1 = START();                                               \
      asm volatile("" ::: "memory");                                 \
      EXPR;                                                          \
      asm volatile("" ::: "memory");                                 \
      Time2 = STOP();                                                \
      Average += 1. / Iter * ((int)(Time2 - Time1) - Average);       \
    }                                                                \
    Average;                                                         \
  })
#endif /* BENCHLOOP */

COSMOPOLITAN_C_END_
#endif /* COSMOPOLITAN_LIBC_BENCH_H_ */