xref: /llvm-project/libc/test/src/math/performance_testing/max_min_funcs_perf.cpp (revision 1ace91f925ad87c3e5eb836ad58fdffe60c4aea6)
1 //===-- Performance test for maximum and minimum functions ----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "BinaryOpSingleOutputPerf.h"
10 #include "src/math/fmaxf.h"
11 #include "src/math/fmaxf16.h"
12 #include "src/math/fmaximum_numf.h"
13 #include "src/math/fmaximum_numf16.h"
14 #include "src/math/fmaximumf.h"
15 #include "src/math/fmaximumf16.h"
16 #include "src/math/fminf.h"
17 #include "src/math/fminf16.h"
18 #include "src/math/fminimum_numf.h"
19 #include "src/math/fminimum_numf16.h"
20 #include "src/math/fminimumf.h"
21 #include "src/math/fminimumf16.h"
22 
23 #include <math.h>
24 
25 static constexpr size_t FLOAT16_ROUNDS = 20'000;
26 static constexpr size_t FLOAT_ROUNDS = 40;
27 
28 // LLVM libc might be the only libc implementation with support for float16 math
29 // functions currently. We can't compare our float16 functions against the
30 // system libc, so we compare them against this placeholder function.
31 float16 placeholder_binaryf16(float16 x, float16 y) { return x; }
32 
33 // The system libc might not provide the fmaximum* and fminimum* C23 math
34 // functions either.
35 float placeholder_binaryf(float x, float y) { return x; }
36 
37 int main() {
38   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float16, float16, LIBC_NAMESPACE::fmaxf16,
39                                   placeholder_binaryf16, FLOAT16_ROUNDS,
40                                   "fmaxf16_perf.log")
41   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float16, float16, LIBC_NAMESPACE::fminf16,
42                                   placeholder_binaryf16, FLOAT16_ROUNDS,
43                                   "fminf16_perf.log")
44   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float16, float16, LIBC_NAMESPACE::fmaximumf16,
45                                   placeholder_binaryf16, FLOAT16_ROUNDS,
46                                   "fmaximumf16_perf.log")
47   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float16, float16, LIBC_NAMESPACE::fminimumf16,
48                                   placeholder_binaryf16, FLOAT16_ROUNDS,
49                                   "fminimumf16_perf.log")
50   BINARY_OP_SINGLE_OUTPUT_PERF_EX(
51       float16, float16, LIBC_NAMESPACE::fmaximum_numf16, placeholder_binaryf16,
52       FLOAT16_ROUNDS, "fmaximum_numf16_perf.log")
53   BINARY_OP_SINGLE_OUTPUT_PERF_EX(
54       float16, float16, LIBC_NAMESPACE::fminimum_numf16, placeholder_binaryf16,
55       FLOAT16_ROUNDS, "fminimum_numf16_perf.log")
56 
57   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float, float, LIBC_NAMESPACE::fmaxf, ::fmaxf,
58                                   FLOAT_ROUNDS, "fmaxf_perf.log")
59   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float, float, LIBC_NAMESPACE::fminf, ::fminf,
60                                   FLOAT_ROUNDS, "fminf_perf.log")
61   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float, float, LIBC_NAMESPACE::fmaximumf,
62                                   placeholder_binaryf, FLOAT_ROUNDS,
63                                   "fmaximumf_perf.log")
64   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float, float, LIBC_NAMESPACE::fminimumf,
65                                   placeholder_binaryf, FLOAT_ROUNDS,
66                                   "fminimumf_perf.log")
67   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float, float, LIBC_NAMESPACE::fmaximum_numf,
68                                   placeholder_binaryf, FLOAT_ROUNDS,
69                                   "fmaximum_numf_perf.log")
70   BINARY_OP_SINGLE_OUTPUT_PERF_EX(float, float, LIBC_NAMESPACE::fminimum_numf,
71                                   placeholder_binaryf, FLOAT_ROUNDS,
72                                   "fminimum_numf_perf.log")
73 
74   return 0;
75 }
76