| //===-- Common operations on floating point numbers -------------*- 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_UTILS_FPUTIL_FLOAT_OPERATIONS_H |
| #define LLVM_LIBC_UTILS_FPUTIL_FLOAT_OPERATIONS_H |
| |
| #include "BitPatterns.h" |
| #include "FloatProperties.h" |
| |
| #include "utils/CPP/TypeTraits.h" |
| |
| namespace __llvm_libc { |
| namespace fputil { |
| |
| // Return the bits of a float value. |
| template <typename T, |
| cpp::EnableIfType<cpp::IsFloatingPointType<T>::Value, int> = 0> |
| static inline typename FloatProperties<T>::BitsType valueAsBits(T x) { |
| using BitsType = typename FloatProperties<T>::BitsType; |
| return *reinterpret_cast<BitsType *>(&x); |
| } |
| |
| // Return the float value from bits. |
| template <typename BitsType, |
| cpp::EnableIfType< |
| cpp::IsFloatingPointType<FloatTypeT<BitsType>>::Value, int> = 0> |
| static inline FloatTypeT<BitsType> valueFromBits(BitsType bits) { |
| return *reinterpret_cast<FloatTypeT<BitsType> *>(&bits); |
| } |
| |
| // Return the bits of abs(x). |
| template <typename T, |
| cpp::EnableIfType<cpp::IsFloatingPointType<T>::Value, int> = 0> |
| static inline typename FloatProperties<T>::BitsType absBits(T x) { |
| return valueAsBits(x) & (~FloatProperties<T>::signMask); |
| } |
| |
| template <typename BitsType> |
| static inline int getExponentFromBits(BitsType bits) { |
| using FPType = typename FloatType<BitsType>::Type; |
| using Properties = FloatProperties<FPType>; |
| bits &= Properties::exponentMask; |
| int e = (bits >> Properties::mantissaWidth); // Shift out the mantissa. |
| e -= Properties::exponentOffset; // Zero adjust. |
| return e; |
| } |
| |
| // Return the zero adjusted exponent value of x. |
| template <typename T, |
| cpp::EnableIfType<cpp::IsFloatingPointType<T>::Value, int> = 0> |
| static inline int getExponent(T x) { |
| return getExponentFromBits(valueAsBits(x)); |
| } |
| |
| } // namespace fputil |
| } // namespace __llvm_libc |
| |
| #endif // LLVM_LIBC_UTILS_FPUTIL_FLOAT_OPERATIONS_H |