//===-- 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 "cast.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 #include "src/__support/macros/properties/cpu_features.h" #include "src/__support/macros/properties/types.h" 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) { … } #if defined(LIBC_TYPES_HAS_FLOAT16) && \ !defined(LIBC_TARGET_CPU_HAS_FAST_FLOAT16_OPS) template <> LIBC_INLINE float16 round_result_slightly_down(float16 value_rn) { … } template <> LIBC_INLINE float16 round_result_slightly_up(float16 value_rn) { … } #endif } // namespace fputil } // namespace LIBC_NAMESPACE_DECL #endif // LLVM_LIBC_SRC___SUPPORT_FPUTIL_EXCEPT_VALUE_UTILS_H