| #include "benchmark/benchmark.h" |
| #include "src/__support/FPUtil/FPBits.h" |
| #include "src/__support/math/rsqrtf16.h" |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| namespace { |
| |
| using FPBits = LIBC_NAMESPACE::fputil::FPBits<float16>; |
| |
| constexpr uint16_t INPUTS[] = { |
| // Subnormals. |
| 0x0001, |
| 0x0002, |
| 0x0004, |
| 0x0008, |
| 0x0010, |
| 0x0020, |
| 0x0040, |
| 0x0080, |
| 0x0100, |
| 0x0200, |
| 0x03ff, |
| // Normals spread across all exponent ranges. |
| 0x0400, |
| 0x0401, |
| 0x047f, |
| 0x0555, |
| 0x07ff, |
| 0x0800, |
| 0x0c00, |
| 0x1000, |
| 0x1400, |
| 0x1800, |
| 0x1c00, |
| 0x2000, |
| 0x2400, |
| 0x2800, |
| 0x2c00, |
| 0x3000, |
| 0x3400, |
| 0x3800, |
| 0x3c00, |
| 0x3c01, |
| 0x3d55, |
| 0x3fff, |
| 0x4000, |
| 0x4400, |
| 0x4800, |
| 0x4c00, |
| 0x5000, |
| 0x5400, |
| 0x5800, |
| 0x5c00, |
| 0x6000, |
| 0x6400, |
| 0x6800, |
| 0x6c00, |
| 0x7000, |
| 0x7400, |
| 0x7800, |
| 0x7bff, |
| }; |
| |
| constexpr size_t INPUT_COUNT = sizeof(INPUTS) / sizeof(INPUTS[0]); |
| |
| float16 get_input(uint16_t bits) { return FPBits(bits).get_val(); } |
| |
| float16 rsqrtf16_integer_finite(float16 x) { |
| FPBits xbits(x); |
| return LIBC_NAMESPACE::math::rsqrtf16_internal::rsqrtf16_no_float( |
| xbits.uintval() & 0x7fff); |
| } |
| |
| void BM_Rsqrtf16HostFpu(benchmark::State &state) { |
| for (auto _ : state) { |
| for (uint16_t bits : INPUTS) |
| benchmark::DoNotOptimize(LIBC_NAMESPACE::math::rsqrtf16(get_input(bits))); |
| } |
| state.SetItemsProcessed(state.iterations() * INPUT_COUNT); |
| } |
| |
| void BM_Rsqrtf16IntegerFallbackFiniteWrapper(benchmark::State &state) { |
| for (auto _ : state) { |
| for (uint16_t bits : INPUTS) |
| benchmark::DoNotOptimize(rsqrtf16_integer_finite(get_input(bits))); |
| } |
| state.SetItemsProcessed(state.iterations() * INPUT_COUNT); |
| } |
| |
| void BM_Rsqrtf16IntegerFallback(benchmark::State &state) { |
| for (auto _ : state) { |
| for (uint16_t bits : INPUTS) |
| benchmark::DoNotOptimize( |
| LIBC_NAMESPACE::math::rsqrtf16_internal::rsqrtf16_no_float(bits)); |
| } |
| state.SetItemsProcessed(state.iterations() * INPUT_COUNT); |
| } |
| |
| } // namespace |
| |
| BENCHMARK(BM_Rsqrtf16HostFpu); |
| BENCHMARK(BM_Rsqrtf16IntegerFallbackFiniteWrapper); |
| BENCHMARK(BM_Rsqrtf16IntegerFallback); |