xref: /aosp_15_r20/external/abseil-cpp/absl/numeric/int128_benchmark.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include <algorithm>
16*9356374aSAndroid Build Coastguard Worker #include <cstdint>
17*9356374aSAndroid Build Coastguard Worker #include <limits>
18*9356374aSAndroid Build Coastguard Worker #include <random>
19*9356374aSAndroid Build Coastguard Worker #include <vector>
20*9356374aSAndroid Build Coastguard Worker 
21*9356374aSAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
22*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
23*9356374aSAndroid Build Coastguard Worker #include "absl/numeric/int128.h"
24*9356374aSAndroid Build Coastguard Worker 
25*9356374aSAndroid Build Coastguard Worker namespace {
26*9356374aSAndroid Build Coastguard Worker 
27*9356374aSAndroid Build Coastguard Worker constexpr size_t kSampleSize = 1000000;
28*9356374aSAndroid Build Coastguard Worker 
MakeRandomEngine()29*9356374aSAndroid Build Coastguard Worker std::mt19937 MakeRandomEngine() {
30*9356374aSAndroid Build Coastguard Worker   std::random_device r;
31*9356374aSAndroid Build Coastguard Worker   std::seed_seq seed({r(), r(), r(), r(), r(), r(), r(), r()});
32*9356374aSAndroid Build Coastguard Worker   return std::mt19937(seed);
33*9356374aSAndroid Build Coastguard Worker }
34*9356374aSAndroid Build Coastguard Worker 
35*9356374aSAndroid Build Coastguard Worker template <typename T,
36*9356374aSAndroid Build Coastguard Worker           typename H = typename std::conditional<
37*9356374aSAndroid Build Coastguard Worker               std::numeric_limits<T>::is_signed, int64_t, uint64_t>::type>
GetRandomClass128SampleUniformDivisor()38*9356374aSAndroid Build Coastguard Worker std::vector<std::pair<T, T>> GetRandomClass128SampleUniformDivisor() {
39*9356374aSAndroid Build Coastguard Worker   std::vector<std::pair<T, T>> values;
40*9356374aSAndroid Build Coastguard Worker   std::mt19937 random = MakeRandomEngine();
41*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<H> uniform_h;
42*9356374aSAndroid Build Coastguard Worker   values.reserve(kSampleSize);
43*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kSampleSize; ++i) {
44*9356374aSAndroid Build Coastguard Worker     T a{absl::MakeUint128(uniform_h(random), uniform_h(random))};
45*9356374aSAndroid Build Coastguard Worker     T b{absl::MakeUint128(uniform_h(random), uniform_h(random))};
46*9356374aSAndroid Build Coastguard Worker     values.emplace_back(std::max(a, b), std::max(T(2), std::min(a, b)));
47*9356374aSAndroid Build Coastguard Worker   }
48*9356374aSAndroid Build Coastguard Worker   return values;
49*9356374aSAndroid Build Coastguard Worker }
50*9356374aSAndroid Build Coastguard Worker 
51*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_DivideClass128UniformDivisor(benchmark::State & state)52*9356374aSAndroid Build Coastguard Worker void BM_DivideClass128UniformDivisor(benchmark::State& state) {
53*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomClass128SampleUniformDivisor<T>();
54*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
55*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
56*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first / pair.second);
57*9356374aSAndroid Build Coastguard Worker     }
58*9356374aSAndroid Build Coastguard Worker   }
59*9356374aSAndroid Build Coastguard Worker }
60*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_DivideClass128UniformDivisor, absl::uint128);
61*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_DivideClass128UniformDivisor, absl::int128);
62*9356374aSAndroid Build Coastguard Worker 
63*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_RemainderClass128UniformDivisor(benchmark::State & state)64*9356374aSAndroid Build Coastguard Worker void BM_RemainderClass128UniformDivisor(benchmark::State& state) {
65*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomClass128SampleUniformDivisor<T>();
66*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
67*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
68*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first % pair.second);
69*9356374aSAndroid Build Coastguard Worker     }
70*9356374aSAndroid Build Coastguard Worker   }
71*9356374aSAndroid Build Coastguard Worker }
72*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_RemainderClass128UniformDivisor, absl::uint128);
73*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_RemainderClass128UniformDivisor, absl::int128);
74*9356374aSAndroid Build Coastguard Worker 
75*9356374aSAndroid Build Coastguard Worker template <typename T,
76*9356374aSAndroid Build Coastguard Worker           typename H = typename std::conditional<
77*9356374aSAndroid Build Coastguard Worker               std::numeric_limits<T>::is_signed, int64_t, uint64_t>::type>
GetRandomClass128SampleSmallDivisor()78*9356374aSAndroid Build Coastguard Worker std::vector<std::pair<T, H>> GetRandomClass128SampleSmallDivisor() {
79*9356374aSAndroid Build Coastguard Worker   std::vector<std::pair<T, H>> values;
80*9356374aSAndroid Build Coastguard Worker   std::mt19937 random = MakeRandomEngine();
81*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<H> uniform_h;
82*9356374aSAndroid Build Coastguard Worker   values.reserve(kSampleSize);
83*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kSampleSize; ++i) {
84*9356374aSAndroid Build Coastguard Worker     T a{absl::MakeUint128(uniform_h(random), uniform_h(random))};
85*9356374aSAndroid Build Coastguard Worker     H b{std::max(H{2}, uniform_h(random))};
86*9356374aSAndroid Build Coastguard Worker     values.emplace_back(std::max(a, T(b)), b);
87*9356374aSAndroid Build Coastguard Worker   }
88*9356374aSAndroid Build Coastguard Worker   return values;
89*9356374aSAndroid Build Coastguard Worker }
90*9356374aSAndroid Build Coastguard Worker 
91*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_DivideClass128SmallDivisor(benchmark::State & state)92*9356374aSAndroid Build Coastguard Worker void BM_DivideClass128SmallDivisor(benchmark::State& state) {
93*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomClass128SampleSmallDivisor<T>();
94*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
95*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
96*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first / pair.second);
97*9356374aSAndroid Build Coastguard Worker     }
98*9356374aSAndroid Build Coastguard Worker   }
99*9356374aSAndroid Build Coastguard Worker }
100*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_DivideClass128SmallDivisor, absl::uint128);
101*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_DivideClass128SmallDivisor, absl::int128);
102*9356374aSAndroid Build Coastguard Worker 
103*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_RemainderClass128SmallDivisor(benchmark::State & state)104*9356374aSAndroid Build Coastguard Worker void BM_RemainderClass128SmallDivisor(benchmark::State& state) {
105*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomClass128SampleSmallDivisor<T>();
106*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
107*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
108*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first % pair.second);
109*9356374aSAndroid Build Coastguard Worker     }
110*9356374aSAndroid Build Coastguard Worker   }
111*9356374aSAndroid Build Coastguard Worker }
112*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_RemainderClass128SmallDivisor, absl::uint128);
113*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_RemainderClass128SmallDivisor, absl::int128);
114*9356374aSAndroid Build Coastguard Worker 
GetRandomClass128Sample()115*9356374aSAndroid Build Coastguard Worker std::vector<std::pair<absl::uint128, absl::uint128>> GetRandomClass128Sample() {
116*9356374aSAndroid Build Coastguard Worker   std::vector<std::pair<absl::uint128, absl::uint128>> values;
117*9356374aSAndroid Build Coastguard Worker   std::mt19937 random = MakeRandomEngine();
118*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<uint64_t> uniform_uint64;
119*9356374aSAndroid Build Coastguard Worker   values.reserve(kSampleSize);
120*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kSampleSize; ++i) {
121*9356374aSAndroid Build Coastguard Worker     values.emplace_back(
122*9356374aSAndroid Build Coastguard Worker         absl::MakeUint128(uniform_uint64(random), uniform_uint64(random)),
123*9356374aSAndroid Build Coastguard Worker         absl::MakeUint128(uniform_uint64(random), uniform_uint64(random)));
124*9356374aSAndroid Build Coastguard Worker   }
125*9356374aSAndroid Build Coastguard Worker   return values;
126*9356374aSAndroid Build Coastguard Worker }
127*9356374aSAndroid Build Coastguard Worker 
BM_MultiplyClass128(benchmark::State & state)128*9356374aSAndroid Build Coastguard Worker void BM_MultiplyClass128(benchmark::State& state) {
129*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomClass128Sample();
130*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
131*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
132*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first * pair.second);
133*9356374aSAndroid Build Coastguard Worker     }
134*9356374aSAndroid Build Coastguard Worker   }
135*9356374aSAndroid Build Coastguard Worker }
136*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_MultiplyClass128);
137*9356374aSAndroid Build Coastguard Worker 
BM_AddClass128(benchmark::State & state)138*9356374aSAndroid Build Coastguard Worker void BM_AddClass128(benchmark::State& state) {
139*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomClass128Sample();
140*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
141*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
142*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first + pair.second);
143*9356374aSAndroid Build Coastguard Worker     }
144*9356374aSAndroid Build Coastguard Worker   }
145*9356374aSAndroid Build Coastguard Worker }
146*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_AddClass128);
147*9356374aSAndroid Build Coastguard Worker 
148*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_HAVE_INTRINSIC_INT128
149*9356374aSAndroid Build Coastguard Worker 
150*9356374aSAndroid Build Coastguard Worker // Some implementations of <random> do not support __int128 when it is
151*9356374aSAndroid Build Coastguard Worker // available, so we make our own uniform_int_distribution-like type.
152*9356374aSAndroid Build Coastguard Worker template <typename T,
153*9356374aSAndroid Build Coastguard Worker           typename H = typename std::conditional<
154*9356374aSAndroid Build Coastguard Worker               std::is_same<T, __int128>::value, int64_t, uint64_t>::type>
155*9356374aSAndroid Build Coastguard Worker class UniformIntDistribution128 {
156*9356374aSAndroid Build Coastguard Worker  public:
157*9356374aSAndroid Build Coastguard Worker   // NOLINTNEXTLINE: mimicking std::uniform_int_distribution API
operator ()(std::mt19937 & generator)158*9356374aSAndroid Build Coastguard Worker   T operator()(std::mt19937& generator) {
159*9356374aSAndroid Build Coastguard Worker     return (static_cast<T>(dist64_(generator)) << 64) | dist64_(generator);
160*9356374aSAndroid Build Coastguard Worker   }
161*9356374aSAndroid Build Coastguard Worker 
162*9356374aSAndroid Build Coastguard Worker  private:
163*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<H> dist64_;
164*9356374aSAndroid Build Coastguard Worker };
165*9356374aSAndroid Build Coastguard Worker 
166*9356374aSAndroid Build Coastguard Worker template <typename T,
167*9356374aSAndroid Build Coastguard Worker           typename H = typename std::conditional<
168*9356374aSAndroid Build Coastguard Worker               std::is_same<T, __int128>::value, int64_t, uint64_t>::type>
GetRandomIntrinsic128SampleUniformDivisor()169*9356374aSAndroid Build Coastguard Worker std::vector<std::pair<T, T>> GetRandomIntrinsic128SampleUniformDivisor() {
170*9356374aSAndroid Build Coastguard Worker   std::vector<std::pair<T, T>> values;
171*9356374aSAndroid Build Coastguard Worker   std::mt19937 random = MakeRandomEngine();
172*9356374aSAndroid Build Coastguard Worker   UniformIntDistribution128<T> uniform_128;
173*9356374aSAndroid Build Coastguard Worker   values.reserve(kSampleSize);
174*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kSampleSize; ++i) {
175*9356374aSAndroid Build Coastguard Worker     T a = uniform_128(random);
176*9356374aSAndroid Build Coastguard Worker     T b = uniform_128(random);
177*9356374aSAndroid Build Coastguard Worker     values.emplace_back(std::max(a, b),
178*9356374aSAndroid Build Coastguard Worker                         std::max(static_cast<T>(2), std::min(a, b)));
179*9356374aSAndroid Build Coastguard Worker   }
180*9356374aSAndroid Build Coastguard Worker   return values;
181*9356374aSAndroid Build Coastguard Worker }
182*9356374aSAndroid Build Coastguard Worker 
183*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_DivideIntrinsic128UniformDivisor(benchmark::State & state)184*9356374aSAndroid Build Coastguard Worker void BM_DivideIntrinsic128UniformDivisor(benchmark::State& state) {
185*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomIntrinsic128SampleUniformDivisor<T>();
186*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
187*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
188*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first / pair.second);
189*9356374aSAndroid Build Coastguard Worker     }
190*9356374aSAndroid Build Coastguard Worker   }
191*9356374aSAndroid Build Coastguard Worker }
192*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_DivideIntrinsic128UniformDivisor, unsigned __int128);
193*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_DivideIntrinsic128UniformDivisor, __int128);
194*9356374aSAndroid Build Coastguard Worker 
195*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_RemainderIntrinsic128UniformDivisor(benchmark::State & state)196*9356374aSAndroid Build Coastguard Worker void BM_RemainderIntrinsic128UniformDivisor(benchmark::State& state) {
197*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomIntrinsic128SampleUniformDivisor<T>();
198*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
199*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
200*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first % pair.second);
201*9356374aSAndroid Build Coastguard Worker     }
202*9356374aSAndroid Build Coastguard Worker   }
203*9356374aSAndroid Build Coastguard Worker }
204*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_RemainderIntrinsic128UniformDivisor, unsigned __int128);
205*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_RemainderIntrinsic128UniformDivisor, __int128);
206*9356374aSAndroid Build Coastguard Worker 
207*9356374aSAndroid Build Coastguard Worker template <typename T,
208*9356374aSAndroid Build Coastguard Worker           typename H = typename std::conditional<
209*9356374aSAndroid Build Coastguard Worker               std::is_same<T, __int128>::value, int64_t, uint64_t>::type>
GetRandomIntrinsic128SampleSmallDivisor()210*9356374aSAndroid Build Coastguard Worker std::vector<std::pair<T, H>> GetRandomIntrinsic128SampleSmallDivisor() {
211*9356374aSAndroid Build Coastguard Worker   std::vector<std::pair<T, H>> values;
212*9356374aSAndroid Build Coastguard Worker   std::mt19937 random = MakeRandomEngine();
213*9356374aSAndroid Build Coastguard Worker   UniformIntDistribution128<T> uniform_int128;
214*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<H> uniform_int64;
215*9356374aSAndroid Build Coastguard Worker   values.reserve(kSampleSize);
216*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kSampleSize; ++i) {
217*9356374aSAndroid Build Coastguard Worker     T a = uniform_int128(random);
218*9356374aSAndroid Build Coastguard Worker     H b = std::max(H{2}, uniform_int64(random));
219*9356374aSAndroid Build Coastguard Worker     values.emplace_back(std::max(a, static_cast<T>(b)), b);
220*9356374aSAndroid Build Coastguard Worker   }
221*9356374aSAndroid Build Coastguard Worker   return values;
222*9356374aSAndroid Build Coastguard Worker }
223*9356374aSAndroid Build Coastguard Worker 
224*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_DivideIntrinsic128SmallDivisor(benchmark::State & state)225*9356374aSAndroid Build Coastguard Worker void BM_DivideIntrinsic128SmallDivisor(benchmark::State& state) {
226*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomIntrinsic128SampleSmallDivisor<T>();
227*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
228*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
229*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first / pair.second);
230*9356374aSAndroid Build Coastguard Worker     }
231*9356374aSAndroid Build Coastguard Worker   }
232*9356374aSAndroid Build Coastguard Worker }
233*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_DivideIntrinsic128SmallDivisor, unsigned __int128);
234*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_DivideIntrinsic128SmallDivisor, __int128);
235*9356374aSAndroid Build Coastguard Worker 
236*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_RemainderIntrinsic128SmallDivisor(benchmark::State & state)237*9356374aSAndroid Build Coastguard Worker void BM_RemainderIntrinsic128SmallDivisor(benchmark::State& state) {
238*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomIntrinsic128SampleSmallDivisor<T>();
239*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
240*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
241*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first % pair.second);
242*9356374aSAndroid Build Coastguard Worker     }
243*9356374aSAndroid Build Coastguard Worker   }
244*9356374aSAndroid Build Coastguard Worker }
245*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_RemainderIntrinsic128SmallDivisor, unsigned __int128);
246*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_RemainderIntrinsic128SmallDivisor, __int128);
247*9356374aSAndroid Build Coastguard Worker 
248*9356374aSAndroid Build Coastguard Worker std::vector<std::pair<unsigned __int128, unsigned __int128>>
GetRandomIntrinsic128Sample()249*9356374aSAndroid Build Coastguard Worker       GetRandomIntrinsic128Sample() {
250*9356374aSAndroid Build Coastguard Worker   std::vector<std::pair<unsigned __int128, unsigned __int128>> values;
251*9356374aSAndroid Build Coastguard Worker   std::mt19937 random = MakeRandomEngine();
252*9356374aSAndroid Build Coastguard Worker   UniformIntDistribution128<unsigned __int128> uniform_uint128;
253*9356374aSAndroid Build Coastguard Worker   values.reserve(kSampleSize);
254*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kSampleSize; ++i) {
255*9356374aSAndroid Build Coastguard Worker     values.emplace_back(uniform_uint128(random), uniform_uint128(random));
256*9356374aSAndroid Build Coastguard Worker   }
257*9356374aSAndroid Build Coastguard Worker   return values;
258*9356374aSAndroid Build Coastguard Worker }
259*9356374aSAndroid Build Coastguard Worker 
BM_MultiplyIntrinsic128(benchmark::State & state)260*9356374aSAndroid Build Coastguard Worker void BM_MultiplyIntrinsic128(benchmark::State& state) {
261*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomIntrinsic128Sample();
262*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
263*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
264*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first * pair.second);
265*9356374aSAndroid Build Coastguard Worker     }
266*9356374aSAndroid Build Coastguard Worker   }
267*9356374aSAndroid Build Coastguard Worker }
268*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_MultiplyIntrinsic128);
269*9356374aSAndroid Build Coastguard Worker 
BM_AddIntrinsic128(benchmark::State & state)270*9356374aSAndroid Build Coastguard Worker void BM_AddIntrinsic128(benchmark::State& state) {
271*9356374aSAndroid Build Coastguard Worker   auto values = GetRandomIntrinsic128Sample();
272*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(values.size())) {
273*9356374aSAndroid Build Coastguard Worker     for (const auto& pair : values) {
274*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(pair.first + pair.second);
275*9356374aSAndroid Build Coastguard Worker     }
276*9356374aSAndroid Build Coastguard Worker   }
277*9356374aSAndroid Build Coastguard Worker }
278*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_AddIntrinsic128);
279*9356374aSAndroid Build Coastguard Worker 
280*9356374aSAndroid Build Coastguard Worker #endif  // ABSL_HAVE_INTRINSIC_INT128
281*9356374aSAndroid Build Coastguard Worker 
282*9356374aSAndroid Build Coastguard Worker }  // namespace
283