//===-- Common header for helpers to set exceptional values -----*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_LIBC_SRC___SUPPORT_FPUTIL_EXCEPT_VALUE_UTILS_H #define LLVM_LIBC_SRC___SUPPORT_FPUTIL_EXCEPT_VALUE_UTILS_H #include "FEnvImpl.h" #include "FPBits.h" #include "rounding_mode.h" #include "src/__support/CPP/optional.h" #include "src/__support/macros/config.h" #include "src/__support/macros/optimization.h" // LIBC_UNLIKELY namespace LIBC_NAMESPACE_DECL { namespace fputil { // This file contains utility functions and classes to manage exceptional values // when there are many of them. // // Example usage: // // Define list of exceptional inputs and outputs: // static constexpr int N = ...; // Number of exceptional values. // static constexpr fputil::ExceptValues<StorageType, N> Excepts { // <list of input bits, output bits and offsets> // }; // // Check for exceptional inputs: // if (auto r = Excepts.lookup(x_bits); LIBC_UNLIKELY(r.has_value())) // return r.value(); template <typename T, size_t N> struct ExceptValues { … }; // Helper functions to set results for exceptional cases. template <typename T> LIBC_INLINE T round_result_slightly_down(T value_rn) { … } template <typename T> LIBC_INLINE T round_result_slightly_up(T value_rn) { … } } // namespace fputil } // namespace LIBC_NAMESPACE_DECL #endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_EXCEPT_VALUE_UTILS_H