1 #include <benchmark/benchmark.h>
2 
3 #include <fxdiv.h>
4 
fxdiv_divide_uint32_t(benchmark::State & state)5 static void fxdiv_divide_uint32_t(benchmark::State& state) {
6 	const fxdiv_divisor_uint32_t divisor = fxdiv_init_uint32_t(UINT32_C(65537));
7 	uint32_t x = 0;
8 	while (state.KeepRunning()) {
9 		const fxdiv_result_uint32_t result = fxdiv_divide_uint32_t(x++, divisor);
10 		benchmark::DoNotOptimize(result);
11 	}
12 }
13 BENCHMARK(fxdiv_divide_uint32_t);
14 
fxdiv_divide_uint64_t(benchmark::State & state)15 static void fxdiv_divide_uint64_t(benchmark::State& state) {
16 	const fxdiv_divisor_uint64_t divisor = fxdiv_init_uint64_t(UINT64_C(4294967311));
17 	uint64_t x = 0;
18 	while (state.KeepRunning()) {
19 		const fxdiv_result_uint64_t result = fxdiv_divide_uint64_t(x++, divisor);
20 		benchmark::DoNotOptimize(result);
21 	}
22 }
23 BENCHMARK(fxdiv_divide_uint64_t);
24 
native_divide_uint32_t(benchmark::State & state)25 static void native_divide_uint32_t(benchmark::State& state) {
26 	uint32_t divisor = UINT32_C(65537);
27 	benchmark::DoNotOptimize(&divisor);
28 	uint32_t x = 0;
29 	while (state.KeepRunning()) {
30 		const uint32_t quotient = x / divisor;
31 		const uint32_t remainder = x++ % divisor;
32 		benchmark::DoNotOptimize(quotient);
33 		benchmark::DoNotOptimize(remainder);
34 	}
35 }
36 BENCHMARK(native_divide_uint32_t);
37 
native_divide_uint64_t(benchmark::State & state)38 static void native_divide_uint64_t(benchmark::State& state) {
39 	uint64_t divisor = UINT64_C(4294967311);
40 	benchmark::DoNotOptimize(&divisor);
41 	uint64_t x = 0;
42 	while (state.KeepRunning()) {
43 		const uint64_t quotient = x / divisor;
44 		const uint64_t remainder = x++ % divisor;
45 		benchmark::DoNotOptimize(quotient);
46 		benchmark::DoNotOptimize(remainder);
47 	}
48 }
49 BENCHMARK(native_divide_uint64_t);
50 
51 BENCHMARK_MAIN();
52