aboutsummaryrefslogtreecommitdiff
path: root/Client/ThirdParty/fpm/benchmarks/arithmetic.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-12-01 13:34:22 +0800
committerchai <chaifix@163.com>2021-12-01 13:34:22 +0800
commit09abf1b529b4226f585ecfbb20866715b901755b (patch)
tree16929f2a6bee3ad4667bdd006cfcc1e683ab7210 /Client/ThirdParty/fpm/benchmarks/arithmetic.cpp
parent84d961f754c905b37420f4d1b3fee8f4e523e58a (diff)
+fpm
Diffstat (limited to 'Client/ThirdParty/fpm/benchmarks/arithmetic.cpp')
-rw-r--r--Client/ThirdParty/fpm/benchmarks/arithmetic.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/Client/ThirdParty/fpm/benchmarks/arithmetic.cpp b/Client/ThirdParty/fpm/benchmarks/arithmetic.cpp
new file mode 100644
index 0000000..b2053cf
--- /dev/null
+++ b/Client/ThirdParty/fpm/benchmarks/arithmetic.cpp
@@ -0,0 +1,58 @@
+#include <benchmark/benchmark.h>
+#include <fpm/fixed.hpp>
+#include <cnl/fixed_point.h>
+
+#include <fixmath.h>
+
+#define BENCHMARK_TEMPLATE1_CAPTURE(func, test_case_name, a, ...) \
+ BENCHMARK_PRIVATE_DECLARE(func) = \
+ (::benchmark::internal::RegisterBenchmarkInternal( \
+ new ::benchmark::internal::FunctionBenchmark( \
+ #func "<" #a ">/" #test_case_name, \
+ [](::benchmark::State& st) { func<a>(st, __VA_ARGS__); })))
+
+// Constants for our arithmetic operands.
+// Stored as volatile to force the compiler to read them and
+// not optimize the entire expression into a constant.
+static volatile int16_t s_x = 1543;
+static volatile int16_t s_y = 2552;
+
+template <typename TValue>
+static void arithmetic(benchmark::State& state, TValue (*func)(TValue, TValue))
+{
+ for (auto _ : state)
+ {
+ TValue x{ static_cast<TValue>(static_cast<int16_t>(s_x)) }, y{ static_cast<TValue>(static_cast<int16_t>(s_y)) };
+ benchmark::DoNotOptimize(func(x, y));
+ }
+}
+
+#define FUNC(TYPE, OP) \
+ [](TYPE x, TYPE y) -> TYPE { return x OP y; }
+
+using CnlFixed16 = cnl::fixed_point<std::int32_t, -16>;
+
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, float, FUNC(float, +));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, float, FUNC(float, -));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, float, FUNC(float, *));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, float, FUNC(float, /));
+
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, double, FUNC(double, +));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, double, FUNC(double, -));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, double, FUNC(double, *));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, double, FUNC(double, /));
+
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, fpm::fixed_16_16, FUNC(fpm::fixed_16_16, +));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, fpm::fixed_16_16, FUNC(fpm::fixed_16_16, -));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, fpm::fixed_16_16, FUNC(fpm::fixed_16_16, *));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, fpm::fixed_16_16, FUNC(fpm::fixed_16_16, /));
+
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, Fix16, FUNC(Fix16, +));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, Fix16, FUNC(Fix16, -));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, Fix16, FUNC(Fix16, *));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, Fix16, FUNC(Fix16, /));
+
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, add, CnlFixed16, FUNC(CnlFixed16, +));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, sub, CnlFixed16, FUNC(CnlFixed16, -));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, mul, CnlFixed16, FUNC(CnlFixed16, *));
+BENCHMARK_TEMPLATE1_CAPTURE(arithmetic, div, CnlFixed16, FUNC(CnlFixed16, /));