Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2013 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 17 | #include <fenv.h> |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 18 | #include <math.h> |
| 19 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 20 | #include <benchmark/benchmark.h> |
Anders Lewis | a7b0f88 | 2017-07-24 20:01:13 -0700 | [diff] [blame] | 21 | #include "util.h" |
Christopher Ferris | df4942c | 2015-02-17 19:58:53 -0800 | [diff] [blame] | 22 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 23 | static const double values[] = { 1234.0, nan(""), HUGE_VAL, 0.0 }; |
| 24 | static const char* names[] = { "1234.0", "nan", "HUGE_VAL", "0.0" }; |
| 25 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 26 | static void SetLabel(benchmark::State& state) { |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 27 | state.SetLabel(names[state.range(0)]); |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 28 | } |
Christopher Ferris | df4942c | 2015-02-17 19:58:53 -0800 | [diff] [blame] | 29 | |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 30 | // Avoid optimization. |
Dan Albert | 055a59c | 2014-09-25 15:43:48 -0700 | [diff] [blame] | 31 | volatile double d; |
| 32 | volatile double v; |
Adhemerval Zanella | 357f6c1 | 2018-06-05 09:28:40 -0300 | [diff] [blame] | 33 | volatile float f; |
| 34 | |
| 35 | static float zero = 0.0f; |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 36 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 37 | static void BM_math_sqrt(benchmark::State& state) { |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 38 | d = 0.0; |
| 39 | v = 2.0; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 40 | while (state.KeepRunning()) { |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 41 | d += sqrt(v); |
| 42 | } |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 43 | } |
Anders Lewis | a7b0f88 | 2017-07-24 20:01:13 -0700 | [diff] [blame] | 44 | BIONIC_BENCHMARK(BM_math_sqrt); |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 45 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 46 | static void BM_math_log10(benchmark::State& state) { |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 47 | d = 0.0; |
| 48 | v = 1234.0; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 49 | while (state.KeepRunning()) { |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 50 | d += log10(v); |
| 51 | } |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 52 | } |
Anders Lewis | a7b0f88 | 2017-07-24 20:01:13 -0700 | [diff] [blame] | 53 | BIONIC_BENCHMARK(BM_math_log10); |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 54 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 55 | static void BM_math_logb(benchmark::State& state) { |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 56 | d = 0.0; |
| 57 | v = 1234.0; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 58 | while (state.KeepRunning()) { |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 59 | d += logb(v); |
| 60 | } |
Elliott Hughes | 9edb3e0 | 2013-02-06 15:47:09 -0800 | [diff] [blame] | 61 | } |
Anders Lewis | a7b0f88 | 2017-07-24 20:01:13 -0700 | [diff] [blame] | 62 | BIONIC_BENCHMARK(BM_math_logb); |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 63 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 64 | static void BM_math_isfinite_macro(benchmark::State& state) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 65 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 66 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 67 | while (state.KeepRunning()) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 68 | d += isfinite(v); |
| 69 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 70 | SetLabel(state); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 71 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 72 | BIONIC_BENCHMARK_WITH_ARG(BM_math_isfinite_macro, "MATH_COMMON"); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 73 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 74 | static void BM_math_isfinite(benchmark::State& state) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 75 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 76 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 77 | while (state.KeepRunning()) { |
Elliott Hughes | 5c6a7bf | 2017-10-19 13:56:28 -0700 | [diff] [blame] | 78 | d += isfinite(v); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 79 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 80 | SetLabel(state); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 81 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 82 | BIONIC_BENCHMARK_WITH_ARG(BM_math_isfinite, "MATH_COMMON"); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 83 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 84 | static void BM_math_isinf_macro(benchmark::State& state) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 85 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 86 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 87 | while (state.KeepRunning()) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 88 | d += isinf(v); |
| 89 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 90 | SetLabel(state); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 91 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 92 | BIONIC_BENCHMARK_WITH_ARG(BM_math_isinf_macro, "MATH_COMMON"); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 93 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 94 | static void BM_math_isinf(benchmark::State& state) { |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 95 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 96 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 97 | while (state.KeepRunning()) { |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 98 | d += (isinf)(v); |
| 99 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 100 | SetLabel(state); |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 101 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 102 | BIONIC_BENCHMARK_WITH_ARG(BM_math_isinf, "MATH_COMMON"); |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 103 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 104 | static void BM_math_isnan_macro(benchmark::State& state) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 105 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 106 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 107 | while (state.KeepRunning()) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 108 | d += isnan(v); |
| 109 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 110 | SetLabel(state); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 111 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 112 | BIONIC_BENCHMARK_WITH_ARG(BM_math_isnan_macro, "MATH_COMMON"); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 113 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 114 | static void BM_math_isnan(benchmark::State& state) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 115 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 116 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 117 | while (state.KeepRunning()) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 118 | d += (isnan)(v); |
| 119 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 120 | SetLabel(state); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 121 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 122 | BIONIC_BENCHMARK_WITH_ARG(BM_math_isnan, "MATH_COMMON"); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 123 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 124 | static void BM_math_isnormal_macro(benchmark::State& state) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 125 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 126 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 127 | while (state.KeepRunning()) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 128 | d += isnormal(v); |
| 129 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 130 | SetLabel(state); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 131 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 132 | BIONIC_BENCHMARK_WITH_ARG(BM_math_isnormal_macro, "MATH_COMMON"); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 133 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 134 | static void BM_math_isnormal(benchmark::State& state) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 135 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 136 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 137 | while (state.KeepRunning()) { |
Elliott Hughes | 5c6a7bf | 2017-10-19 13:56:28 -0700 | [diff] [blame] | 138 | d += isnormal(v); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 139 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 140 | SetLabel(state); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 141 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 142 | BIONIC_BENCHMARK_WITH_ARG(BM_math_isnormal, "MATH_COMMON"); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 143 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 144 | static void BM_math_sin_fast(benchmark::State& state) { |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 145 | d = 1.0; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 146 | while (state.KeepRunning()) { |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 147 | d += sin(d); |
| 148 | } |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 149 | } |
Anders Lewis | a7b0f88 | 2017-07-24 20:01:13 -0700 | [diff] [blame] | 150 | BIONIC_BENCHMARK(BM_math_sin_fast); |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 151 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 152 | static void BM_math_sin_feupdateenv(benchmark::State& state) { |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 153 | d = 1.0; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 154 | while (state.KeepRunning()) { |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 155 | fenv_t __libc_save_rm; |
| 156 | feholdexcept(&__libc_save_rm); |
| 157 | fesetround(FE_TONEAREST); |
| 158 | d += sin(d); |
| 159 | feupdateenv(&__libc_save_rm); |
| 160 | } |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 161 | } |
Anders Lewis | a7b0f88 | 2017-07-24 20:01:13 -0700 | [diff] [blame] | 162 | BIONIC_BENCHMARK(BM_math_sin_feupdateenv); |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 163 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 164 | static void BM_math_sin_fesetenv(benchmark::State& state) { |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 165 | d = 1.0; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 166 | while (state.KeepRunning()) { |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 167 | fenv_t __libc_save_rm; |
| 168 | feholdexcept(&__libc_save_rm); |
| 169 | fesetround(FE_TONEAREST); |
| 170 | d += sin(d); |
| 171 | fesetenv(&__libc_save_rm); |
| 172 | } |
Serban Constantinescu | a147a1d | 2014-06-08 16:55:22 +0100 | [diff] [blame] | 173 | } |
Anders Lewis | a7b0f88 | 2017-07-24 20:01:13 -0700 | [diff] [blame] | 174 | BIONIC_BENCHMARK(BM_math_sin_fesetenv); |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 175 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 176 | static void BM_math_fpclassify(benchmark::State& state) { |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 177 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 178 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 179 | while (state.KeepRunning()) { |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 180 | d += fpclassify(v); |
| 181 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 182 | SetLabel(state); |
Elliott Hughes | 02c78a3 | 2014-04-11 17:02:20 -0700 | [diff] [blame] | 183 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 184 | BIONIC_BENCHMARK_WITH_ARG(BM_math_fpclassify, "MATH_COMMON"); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 185 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 186 | static void BM_math_signbit_macro(benchmark::State& state) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 187 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 188 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 189 | while (state.KeepRunning()) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 190 | d += signbit(v); |
| 191 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 192 | SetLabel(state); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 193 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 194 | BIONIC_BENCHMARK_WITH_ARG(BM_math_signbit_macro, "MATH_COMMON"); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 195 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 196 | static void BM_math_signbit(benchmark::State& state) { |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 197 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 198 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 199 | while (state.KeepRunning()) { |
Elliott Hughes | 5c6a7bf | 2017-10-19 13:56:28 -0700 | [diff] [blame] | 200 | d += signbit(v); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 201 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 202 | SetLabel(state); |
Elliott Hughes | b662280 | 2015-08-14 14:04:30 -0700 | [diff] [blame] | 203 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 204 | BIONIC_BENCHMARK_WITH_ARG(BM_math_signbit, "MATH_COMMON"); |
Elliott Hughes | f9f4a43 | 2015-08-24 22:57:08 +0000 | [diff] [blame] | 205 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 206 | static void BM_math_fabs_macro(benchmark::State& state) { |
Elliott Hughes | f9f4a43 | 2015-08-24 22:57:08 +0000 | [diff] [blame] | 207 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 208 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 209 | while (state.KeepRunning()) { |
Elliott Hughes | f9f4a43 | 2015-08-24 22:57:08 +0000 | [diff] [blame] | 210 | d += fabs(v); |
| 211 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 212 | SetLabel(state); |
Elliott Hughes | f9f4a43 | 2015-08-24 22:57:08 +0000 | [diff] [blame] | 213 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 214 | BIONIC_BENCHMARK_WITH_ARG(BM_math_fabs_macro, "MATH_COMMON"); |
Elliott Hughes | f9f4a43 | 2015-08-24 22:57:08 +0000 | [diff] [blame] | 215 | |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 216 | static void BM_math_fabs(benchmark::State& state) { |
Elliott Hughes | f9f4a43 | 2015-08-24 22:57:08 +0000 | [diff] [blame] | 217 | d = 0.0; |
Martijn Coenen | be763d8 | 2016-11-14 14:16:08 +0100 | [diff] [blame] | 218 | v = values[state.range(0)]; |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 219 | while (state.KeepRunning()) { |
Elliott Hughes | f9f4a43 | 2015-08-24 22:57:08 +0000 | [diff] [blame] | 220 | d += (fabs)(v); |
| 221 | } |
Elliott Hughes | 281e06b | 2016-02-17 10:23:52 -0800 | [diff] [blame] | 222 | SetLabel(state); |
Elliott Hughes | f9f4a43 | 2015-08-24 22:57:08 +0000 | [diff] [blame] | 223 | } |
Christopher Ferris | 858e336 | 2017-11-30 08:53:15 -0800 | [diff] [blame] | 224 | BIONIC_BENCHMARK_WITH_ARG(BM_math_fabs, "MATH_COMMON"); |
Elliott Hughes | e332f65 | 2018-05-08 15:07:43 -0700 | [diff] [blame] | 225 | |
| 226 | static void BM_math_sincos(benchmark::State& state) { |
| 227 | d = 1.0; |
| 228 | while (state.KeepRunning()) { |
| 229 | double s, c; |
| 230 | sincos(d, &s, &c); |
| 231 | d += s + c; |
| 232 | } |
| 233 | } |
| 234 | BIONIC_BENCHMARK(BM_math_sincos); |
Adhemerval Zanella | 357f6c1 | 2018-06-05 09:28:40 -0300 | [diff] [blame] | 235 | |
| 236 | #include "expf_input.cpp" |
| 237 | |
| 238 | static void BM_math_expf_speccpu2017(benchmark::State& state) { |
| 239 | f = 0.0; |
| 240 | auto cin = expf_input.cbegin(); |
| 241 | for (auto _ : state) { |
| 242 | f = expf(*cin); |
| 243 | if (++cin == expf_input.cend()) |
| 244 | cin = expf_input.cbegin(); |
| 245 | } |
| 246 | } |
| 247 | BIONIC_BENCHMARK(BM_math_expf_speccpu2017); |
| 248 | |
| 249 | static void BM_math_expf_speccpu2017_latency(benchmark::State& state) { |
| 250 | f = 0.0; |
| 251 | auto cin = expf_input.cbegin(); |
| 252 | for (auto _ : state) { |
| 253 | f = expf(f * zero + *cin); |
| 254 | if (++cin == expf_input.cend()) |
| 255 | cin = expf_input.cbegin(); |
| 256 | } |
| 257 | } |
| 258 | BIONIC_BENCHMARK(BM_math_expf_speccpu2017_latency); |
| 259 | |
| 260 | static void BM_math_exp2f_speccpu2017(benchmark::State& state) { |
| 261 | f = 0.0; |
| 262 | auto cin = expf_input.cbegin(); |
| 263 | for (auto _ : state) { |
| 264 | f = exp2f(*cin); |
| 265 | if (++cin == expf_input.cend()) |
| 266 | cin = expf_input.cbegin(); |
| 267 | } |
| 268 | } |
| 269 | BIONIC_BENCHMARK(BM_math_exp2f_speccpu2017); |
| 270 | |
| 271 | static void BM_math_exp2f_speccpu2017_latency(benchmark::State& state) { |
| 272 | f = 0.0; |
| 273 | auto cin = expf_input.cbegin(); |
| 274 | for (auto _ : state) { |
| 275 | f = exp2f(f * zero + *cin); |
| 276 | if (++cin == expf_input.cend()) |
| 277 | cin = expf_input.cbegin(); |
| 278 | } |
| 279 | } |
| 280 | BIONIC_BENCHMARK(BM_math_exp2f_speccpu2017_latency); |
Adhemerval Zanella | 872c8b5 | 2018-06-05 13:57:03 -0300 | [diff] [blame] | 281 | |
| 282 | #include "powf_input.cpp" |
| 283 | |
| 284 | static void BM_math_powf_speccpu2006(benchmark::State& state) { |
| 285 | f = 0.0; |
| 286 | auto cin = powf_input.cbegin(); |
| 287 | for (auto _ : state) { |
| 288 | f = powf(cin->first, cin->second); |
| 289 | if (++cin == powf_input.cend()) |
| 290 | cin = powf_input.cbegin(); |
| 291 | } |
| 292 | } |
| 293 | BIONIC_BENCHMARK(BM_math_powf_speccpu2006); |
| 294 | |
| 295 | static void BM_math_powf_speccpu2017_latency(benchmark::State& state) { |
| 296 | f = 0.0; |
| 297 | auto cin = powf_input.cbegin(); |
| 298 | for (auto _ : state) { |
| 299 | f = powf(f * zero + cin->first, cin->second); |
| 300 | if (++cin == powf_input.cend()) |
| 301 | cin = powf_input.cbegin(); |
| 302 | } |
| 303 | } |
| 304 | BIONIC_BENCHMARK(BM_math_powf_speccpu2017_latency); |
Adhemerval Zanella | ff5a353 | 2018-06-05 15:47:06 -0300 | [diff] [blame] | 305 | |
| 306 | #include "logf_input.cpp" |
| 307 | |
| 308 | static void BM_math_logf_speccpu2017(benchmark::State& state) { |
| 309 | f = 0.0; |
| 310 | auto cin = logf_input.cbegin(); |
| 311 | for (auto _ : state) { |
| 312 | f = logf(*cin); |
| 313 | if (++cin == logf_input.cend()) |
| 314 | cin = logf_input.cbegin(); |
| 315 | } |
| 316 | } |
| 317 | BIONIC_BENCHMARK(BM_math_logf_speccpu2017); |
| 318 | |
| 319 | static void BM_math_logf_speccpu2017_latency(benchmark::State& state) { |
| 320 | f = 0.0; |
| 321 | auto cin = logf_input.cbegin(); |
| 322 | for (auto _ : state) { |
| 323 | f = logf(f * zero + *cin); |
| 324 | if (++cin == logf_input.cend()) |
| 325 | cin = logf_input.cbegin(); |
| 326 | } |
| 327 | } |
| 328 | BIONIC_BENCHMARK(BM_math_logf_speccpu2017_latency); |
| 329 | |
| 330 | static void BM_math_log2f_speccpu2017(benchmark::State& state) { |
| 331 | f = 0.0; |
| 332 | auto cin = logf_input.cbegin(); |
| 333 | for (auto _ : state) { |
| 334 | f = log2f(*cin); |
| 335 | if (++cin == logf_input.cend()) |
| 336 | cin = logf_input.cbegin(); |
| 337 | } |
| 338 | } |
| 339 | BIONIC_BENCHMARK(BM_math_log2f_speccpu2017); |
| 340 | |
| 341 | static void BM_math_log2f_speccpu2017_latency(benchmark::State& state) { |
| 342 | f = 0.0; |
| 343 | auto cin = logf_input.cbegin(); |
| 344 | for (auto _ : state) { |
| 345 | f = log2f(f * zero + *cin); |
| 346 | if (++cin == logf_input.cend()) |
| 347 | cin = logf_input.cbegin(); |
| 348 | } |
| 349 | } |
| 350 | BIONIC_BENCHMARK(BM_math_log2f_speccpu2017_latency); |
Adhemerval Zanella | 7871ca1 | 2018-06-08 11:18:32 -0300 | [diff] [blame^] | 351 | |
| 352 | // Four ranges of values are checked: |
| 353 | // * 0.0 <= x < 0.1 |
| 354 | // * 0.1 <= x < 0.7 |
| 355 | // * 0.7 <= x < 3.1 |
| 356 | // * -3.1 <= x < 3.1 |
| 357 | // * 3.3 <= x < 33.3 |
| 358 | // * 100.0 <= x < 1000.0 |
| 359 | // * 1e6 <= x < 1e32 |
| 360 | // * 1e32 < x < FLT_MAX |
| 361 | |
| 362 | #include "sincosf_input.cpp" |
| 363 | |
| 364 | static void BM_math_sinf(benchmark::State& state) { |
| 365 | auto range = sincosf_input[state.range(0)]; |
| 366 | auto cin = range.values.cbegin(); |
| 367 | f = 0.0; |
| 368 | for (auto _ : state) { |
| 369 | f = sinf(*cin); |
| 370 | if (++cin == range.values.cend()) |
| 371 | cin = range.values.cbegin(); |
| 372 | } |
| 373 | state.SetLabel(range.label); |
| 374 | } |
| 375 | BIONIC_BENCHMARK_WITH_ARG(BM_math_sinf, "MATH_SINCOS_COMMON"); |
| 376 | |
| 377 | static void BM_math_sinf_latency(benchmark::State& state) { |
| 378 | auto range = sincosf_input[state.range(0)]; |
| 379 | auto cin = range.values.cbegin(); |
| 380 | f = 0.0; |
| 381 | for (auto _ : state) { |
| 382 | f = sinf(f * zero + *cin); |
| 383 | if (++cin == range.values.cend()) |
| 384 | cin = range.values.cbegin(); |
| 385 | } |
| 386 | state.SetLabel(range.label); |
| 387 | } |
| 388 | BIONIC_BENCHMARK_WITH_ARG(BM_math_sinf_latency, "MATH_SINCOS_COMMON"); |
| 389 | |
| 390 | static void BM_math_cosf(benchmark::State& state) { |
| 391 | auto range = sincosf_input[state.range(0)]; |
| 392 | auto cin = range.values.cbegin(); |
| 393 | f = 0.0; |
| 394 | for (auto _ : state) { |
| 395 | f = cosf(*cin); |
| 396 | if (++cin == range.values.cend()) |
| 397 | cin = range.values.cbegin(); |
| 398 | } |
| 399 | state.SetLabel(range.label); |
| 400 | } |
| 401 | BIONIC_BENCHMARK_WITH_ARG(BM_math_cosf, "MATH_SINCOS_COMMON"); |
| 402 | |
| 403 | static void BM_math_cosf_latency(benchmark::State& state) { |
| 404 | auto range = sincosf_input[state.range(0)]; |
| 405 | auto cin = range.values.cbegin(); |
| 406 | f = 0.0; |
| 407 | for (auto _ : state) { |
| 408 | f = cosf(f * zero + *cin); |
| 409 | if (++cin == range.values.cend()) |
| 410 | cin = range.values.cbegin(); |
| 411 | } |
| 412 | state.SetLabel(range.label); |
| 413 | } |
| 414 | BIONIC_BENCHMARK_WITH_ARG(BM_math_cosf_latency, "MATH_SINCOS_COMMON"); |
| 415 | |
| 416 | static void BM_math_sincosf(benchmark::State& state) { |
| 417 | auto range = sincosf_input[state.range(0)]; |
| 418 | auto cin = range.values.cbegin(); |
| 419 | f = 0.0; |
| 420 | for (auto _ : state) { |
| 421 | float s, c; |
| 422 | sincosf(*cin, &s, &c); |
| 423 | f += s; |
| 424 | if (++cin == range.values.cend()) |
| 425 | cin = range.values.cbegin(); |
| 426 | } |
| 427 | state.SetLabel(range.label); |
| 428 | } |
| 429 | BIONIC_BENCHMARK_WITH_ARG(BM_math_sincosf, "MATH_SINCOS_COMMON"); |
| 430 | |
| 431 | static void BM_math_sincosf_latency(benchmark::State& state) { |
| 432 | auto range = sincosf_input[state.range(0)]; |
| 433 | auto cin = range.values.cbegin(); |
| 434 | f = 0.0; |
| 435 | for (auto _ : state) { |
| 436 | float s, c; |
| 437 | sincosf(f * zero + *cin, &s, &c); |
| 438 | f += s; |
| 439 | if (++cin == range.values.cend()) |
| 440 | cin = range.values.cbegin(); |
| 441 | } |
| 442 | state.SetLabel(range.label); |
| 443 | } |
| 444 | BIONIC_BENCHMARK_WITH_ARG(BM_math_sincosf_latency, "MATH_SINCOS_COMMON"); |