diff options
Diffstat (limited to 'include/llvm/Support/MathExtras.h')
-rw-r--r-- | include/llvm/Support/MathExtras.h | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/include/llvm/Support/MathExtras.h b/include/llvm/Support/MathExtras.h index b59f21b4998e..249139e824b5 100644 --- a/include/llvm/Support/MathExtras.h +++ b/include/llvm/Support/MathExtras.h @@ -1,9 +1,8 @@ //===-- llvm/Support/MathExtras.h - Useful math functions -------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -52,14 +51,14 @@ enum ZeroBehavior { namespace detail { template <typename T, std::size_t SizeOfT> struct TrailingZerosCounter { - static std::size_t count(T Val, ZeroBehavior) { + static unsigned count(T Val, ZeroBehavior) { if (!Val) return std::numeric_limits<T>::digits; if (Val & 0x1) return 0; // Bisection method. - std::size_t ZeroBits = 0; + unsigned ZeroBits = 0; T Shift = std::numeric_limits<T>::digits >> 1; T Mask = std::numeric_limits<T>::max() >> Shift; while (Shift) { @@ -76,7 +75,7 @@ template <typename T, std::size_t SizeOfT> struct TrailingZerosCounter { #if __GNUC__ >= 4 || defined(_MSC_VER) template <typename T> struct TrailingZerosCounter<T, 4> { - static std::size_t count(T Val, ZeroBehavior ZB) { + static unsigned count(T Val, ZeroBehavior ZB) { if (ZB != ZB_Undefined && Val == 0) return 32; @@ -92,7 +91,7 @@ template <typename T> struct TrailingZerosCounter<T, 4> { #if !defined(_MSC_VER) || defined(_M_X64) template <typename T> struct TrailingZerosCounter<T, 8> { - static std::size_t count(T Val, ZeroBehavior ZB) { + static unsigned count(T Val, ZeroBehavior ZB) { if (ZB != ZB_Undefined && Val == 0) return 64; @@ -117,7 +116,7 @@ template <typename T> struct TrailingZerosCounter<T, 8> { /// \param ZB the behavior on an input of 0. Only ZB_Width and ZB_Undefined are /// valid arguments. template <typename T> -std::size_t countTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) { +unsigned countTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) { static_assert(std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed, "Only unsigned integral types are allowed."); @@ -126,12 +125,12 @@ std::size_t countTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) { namespace detail { template <typename T, std::size_t SizeOfT> struct LeadingZerosCounter { - static std::size_t count(T Val, ZeroBehavior) { + static unsigned count(T Val, ZeroBehavior) { if (!Val) return std::numeric_limits<T>::digits; // Bisection method. - std::size_t ZeroBits = 0; + unsigned ZeroBits = 0; for (T Shift = std::numeric_limits<T>::digits >> 1; Shift; Shift >>= 1) { T Tmp = Val >> Shift; if (Tmp) @@ -145,7 +144,7 @@ template <typename T, std::size_t SizeOfT> struct LeadingZerosCounter { #if __GNUC__ >= 4 || defined(_MSC_VER) template <typename T> struct LeadingZerosCounter<T, 4> { - static std::size_t count(T Val, ZeroBehavior ZB) { + static unsigned count(T Val, ZeroBehavior ZB) { if (ZB != ZB_Undefined && Val == 0) return 32; @@ -161,7 +160,7 @@ template <typename T> struct LeadingZerosCounter<T, 4> { #if !defined(_MSC_VER) || defined(_M_X64) template <typename T> struct LeadingZerosCounter<T, 8> { - static std::size_t count(T Val, ZeroBehavior ZB) { + static unsigned count(T Val, ZeroBehavior ZB) { if (ZB != ZB_Undefined && Val == 0) return 64; @@ -186,7 +185,7 @@ template <typename T> struct LeadingZerosCounter<T, 8> { /// \param ZB the behavior on an input of 0. Only ZB_Width and ZB_Undefined are /// valid arguments. template <typename T> -std::size_t countLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) { +unsigned countLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) { static_assert(std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed, "Only unsigned integral types are allowed."); @@ -459,7 +458,7 @@ inline uint64_t ByteSwap_64(uint64_t Value) { /// \param ZB the behavior on an input of all ones. Only ZB_Width and /// ZB_Undefined are valid arguments. template <typename T> -std::size_t countLeadingOnes(T Value, ZeroBehavior ZB = ZB_Width) { +unsigned countLeadingOnes(T Value, ZeroBehavior ZB = ZB_Width) { static_assert(std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed, "Only unsigned integral types are allowed."); @@ -475,7 +474,7 @@ std::size_t countLeadingOnes(T Value, ZeroBehavior ZB = ZB_Width) { /// \param ZB the behavior on an input of all ones. Only ZB_Width and /// ZB_Undefined are valid arguments. template <typename T> -std::size_t countTrailingOnes(T Value, ZeroBehavior ZB = ZB_Width) { +unsigned countTrailingOnes(T Value, ZeroBehavior ZB = ZB_Width) { static_assert(std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed, "Only unsigned integral types are allowed."); @@ -560,15 +559,20 @@ inline unsigned Log2_64_Ceil(uint64_t Value) { } /// Return the greatest common divisor of the values using Euclid's algorithm. -inline uint64_t GreatestCommonDivisor64(uint64_t A, uint64_t B) { +template <typename T> +inline T greatestCommonDivisor(T A, T B) { while (B) { - uint64_t T = B; + T Tmp = B; B = A % B; - A = T; + A = Tmp; } return A; } +inline uint64_t GreatestCommonDivisor64(uint64_t A, uint64_t B) { + return greatestCommonDivisor<uint64_t>(A, B); +} + /// This function takes a 64-bit integer and returns the bit equivalent double. inline double BitsToDouble(uint64_t Bits) { double D; |