1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===-- llvm/Support/MathExtras.h - Useful math functions -------*- C++ -*-===//
263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman//
3b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//                     The LLVM Compiler Infrastructure
4b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman//
8b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//===----------------------------------------------------------------------===//
954ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner//
1054ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner// This file contains some functions that are useful for math stuff.
1154ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner//
1254ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner//===----------------------------------------------------------------------===//
13cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
14551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef LLVM_SUPPORT_MATHEXTRAS_H
15551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LLVM_SUPPORT_MATHEXTRAS_H
16cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
17a0cfb8f21baf94fb8c40ff90bfc043de1ef700ecMichael J. Spencer#include "llvm/Support/Compiler.h"
181f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/SwapByteOrder.h"
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <cassert>
2036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#include <cstring>
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <type_traits>
22cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
23c8b909ae499e5b0d7e38ba5c54c35e98c936300bMichael J. Spencer#ifdef _MSC_VER
24eb3602472026dc029beb45ccbe09bc84162ba949Aaron Ballman#include <intrin.h>
25c8b909ae499e5b0d7e38ba5c54c35e98c936300bMichael J. Spencer#endif
26c8b909ae499e5b0d7e38ba5c54c35e98c936300bMichael J. Spencer
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
2836fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// \brief The behavior an operation has on an input of 0.
2936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencerenum ZeroBehavior {
3036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  /// \brief The returned value is undefined.
3136fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  ZB_Undefined,
3236fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  /// \brief The returned value is numeric_limits<T>::max()
3336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  ZB_Max,
3436fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  /// \brief The returned value is numeric_limits<T>::digits
3536fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  ZB_Width
3636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer};
3736fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
38ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesnamespace detail {
39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T, std::size_t SizeOfT> struct TrailingZerosCounter {
40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static std::size_t count(T Val, ZeroBehavior) {
41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (!Val)
42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return std::numeric_limits<T>::digits;
43ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (Val & 0x1)
44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return 0;
45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
46ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // Bisection method.
47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    std::size_t ZeroBits = 0;
48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    T Shift = std::numeric_limits<T>::digits >> 1;
49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    T Mask = std::numeric_limits<T>::max() >> Shift;
50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    while (Shift) {
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if ((Val & Mask) == 0) {
52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        Val >>= Shift;
53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        ZeroBits |= Shift;
54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      }
55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      Shift >>= 1;
56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      Mask >>= Shift;
5736fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer    }
58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return ZeroBits;
5936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  }
60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
6136fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
6236fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#if __GNUC__ >= 4 || _MSC_VER
63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T> struct TrailingZerosCounter<T, 4> {
64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static std::size_t count(T Val, ZeroBehavior ZB) {
65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (ZB != ZB_Undefined && Val == 0)
66ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return 32;
6736fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#if __has_builtin(__builtin_ctz) || LLVM_GNUC_PREREQ(4, 0, 0)
69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return __builtin_ctz(Val);
7036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#elif _MSC_VER
71ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    unsigned long Index;
72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    _BitScanForward(&Index, Val);
73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return Index;
7436fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#endif
75ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
7736fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
78a0cfb8f21baf94fb8c40ff90bfc043de1ef700ecMichael J. Spencer#if !defined(_MSC_VER) || defined(_M_X64)
79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T> struct TrailingZerosCounter<T, 8> {
80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static std::size_t count(T Val, ZeroBehavior ZB) {
81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (ZB != ZB_Undefined && Val == 0)
82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return 64;
8336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
8437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#if __has_builtin(__builtin_ctzll) || LLVM_GNUC_PREREQ(4, 0, 0)
85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return __builtin_ctzll(Val);
8636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#elif _MSC_VER
87ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    unsigned long Index;
88ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    _BitScanForward64(&Index, Val);
89ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return Index;
9036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#endif
91ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
9336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#endif
94a0cfb8f21baf94fb8c40ff90bfc043de1ef700ecMichael J. Spencer#endif
95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} // namespace detail
9636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Count number of 0's from the least significant bit to the most
9836fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///   stopping at the first 1.
9936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///
10036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// Only unsigned integral types are allowed.
10136fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///
10236fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// \param ZB the behavior on an input of 0. Only ZB_Width and ZB_Undefined are
10336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///   valid arguments.
10436fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencertemplate <typename T>
105ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstd::size_t countTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
106ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static_assert(std::numeric_limits<T>::is_integer &&
107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    !std::numeric_limits<T>::is_signed,
108ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                "Only unsigned integral types are allowed.");
109ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return detail::TrailingZerosCounter<T, sizeof(T)>::count(Val, ZB);
110ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
111ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
112ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesnamespace detail {
113ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T, std::size_t SizeOfT> struct LeadingZerosCounter {
114ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static std::size_t count(T Val, ZeroBehavior) {
115ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (!Val)
116ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return std::numeric_limits<T>::digits;
117ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
118ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // Bisection method.
119ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    std::size_t ZeroBits = 0;
120ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    for (T Shift = std::numeric_limits<T>::digits >> 1; Shift; Shift >>= 1) {
121ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      T Tmp = Val >> Shift;
122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if (Tmp)
123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        Val = Tmp;
124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      else
125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        ZeroBits |= Shift;
126ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return ZeroBits;
12836fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  }
129ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
13036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
13136fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#if __GNUC__ >= 4 || _MSC_VER
132ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T> struct LeadingZerosCounter<T, 4> {
133ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static std::size_t count(T Val, ZeroBehavior ZB) {
134ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (ZB != ZB_Undefined && Val == 0)
135ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return 32;
13636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
13737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#if __has_builtin(__builtin_clz) || LLVM_GNUC_PREREQ(4, 0, 0)
138ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return __builtin_clz(Val);
13936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#elif _MSC_VER
140ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    unsigned long Index;
141ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    _BitScanReverse(&Index, Val);
142ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return Index ^ 31;
14336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#endif
144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
14636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
147a0cfb8f21baf94fb8c40ff90bfc043de1ef700ecMichael J. Spencer#if !defined(_MSC_VER) || defined(_M_X64)
148ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T> struct LeadingZerosCounter<T, 8> {
149ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static std::size_t count(T Val, ZeroBehavior ZB) {
150ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (ZB != ZB_Undefined && Val == 0)
151ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return 64;
15236fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
15337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#if __has_builtin(__builtin_clzll) || LLVM_GNUC_PREREQ(4, 0, 0)
154ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return __builtin_clzll(Val);
15536fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#elif _MSC_VER
156ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    unsigned long Index;
157ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    _BitScanReverse64(&Index, Val);
158ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return Index ^ 63;
15936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#endif
160ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
161ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
16236fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#endif
163a0cfb8f21baf94fb8c40ff90bfc043de1ef700ecMichael J. Spencer#endif
164ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} // namespace detail
165ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
166ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Count number of 0's from the most significant bit to the least
167ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///   stopping at the first 1.
168ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
169ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Only unsigned integral types are allowed.
170ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
171ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \param ZB the behavior on an input of 0. Only ZB_Width and ZB_Undefined are
172ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///   valid arguments.
173ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T>
174ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstd::size_t countLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
175ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static_assert(std::numeric_limits<T>::is_integer &&
176ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    !std::numeric_limits<T>::is_signed,
177ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                "Only unsigned integral types are allowed.");
178ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return detail::LeadingZerosCounter<T, sizeof(T)>::count(Val, ZB);
179ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
18036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
18136fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// \brief Get the index of the first set bit starting from the least
18236fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///   significant bit.
18336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///
18436fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// Only unsigned integral types are allowed.
18536fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///
18636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// \param ZB the behavior on an input of 0. Only ZB_Max and ZB_Undefined are
18736fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///   valid arguments.
188ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T> T findFirstSet(T Val, ZeroBehavior ZB = ZB_Max) {
18936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  if (ZB == ZB_Max && Val == 0)
19036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer    return std::numeric_limits<T>::max();
19136fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
19236fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  return countTrailingZeros(Val, ZB_Undefined);
19336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer}
19436fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
19536fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// \brief Get the index of the last set bit starting from the least
19636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///   significant bit.
19736fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///
19836fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// Only unsigned integral types are allowed.
19936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///
20036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// \param ZB the behavior on an input of 0. Only ZB_Max and ZB_Undefined are
20136fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///   valid arguments.
202ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T> T findLastSet(T Val, ZeroBehavior ZB = ZB_Max) {
20336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  if (ZB == ZB_Max && Val == 0)
20436fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer    return std::numeric_limits<T>::max();
20536fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
20636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  // Use ^ instead of - because both gcc and llvm can remove the associated ^
20736fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  // in the __builtin_clz intrinsic on x86.
20836fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  return countLeadingZeros(Val, ZB_Undefined) ^
20936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer         (std::numeric_limits<T>::digits - 1);
21036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer}
21136fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
21236fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// \brief Macro compressed bit reversal table for 256 bits.
21336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer///
21436fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// http://graphics.stanford.edu/~seander/bithacks.html#BitReverseTable
21536fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencerstatic const unsigned char BitReverseTable256[256] = {
21636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#define R2(n) n, n + 2 * 64, n + 1 * 64, n + 3 * 64
21736fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#define R4(n) R2(n), R2(n + 2 * 16), R2(n + 1 * 16), R2(n + 3 * 16)
21836fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer#define R6(n) R4(n), R4(n + 2 * 4), R4(n + 1 * 4), R4(n + 3 * 4)
21936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  R6(0), R6(2), R6(1), R6(3)
220c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#undef R2
221c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#undef R4
222c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#undef R6
22336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer};
22436fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer
22536fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer/// \brief Reverse the bits in \p Val.
22636fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencertemplate <typename T>
22736fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. SpencerT reverseBits(T Val) {
22836fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  unsigned char in[sizeof(Val)];
22936fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  unsigned char out[sizeof(Val)];
23036fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  std::memcpy(in, &Val, sizeof(Val));
23136fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  for (unsigned i = 0; i < sizeof(Val); ++i)
23236fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer    out[(sizeof(Val) - i) - 1] = BitReverseTable256[in[i]];
23336fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  std::memcpy(&Val, out, sizeof(Val));
23436fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer  return Val;
23536fe3f2b5651882b12e24b49dc7818ebb1a5d79fMichael J. Spencer}
236d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
237fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman// NOTE: The following support functions use the _32/_64 extensions instead of
23889bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner// type overloading so that signed and unsigned integers can be used without
23989bfcd34cbd2f4c6bb2cafff0a5c2bff147fae11Chris Lattner// ambiguity.
24088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
24149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Hi_32 - This function returns the high 32 bits of a 64 bit value.
242c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t Hi_32(uint64_t Value) {
243c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<uint32_t>(Value >> 32);
24488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
24588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
24649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Lo_32 - This function returns the low 32 bits of a 64 bit value.
247c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t Lo_32(uint64_t Value) {
248c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Cohen  return static_cast<uint32_t>(Value);
24988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
25088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
251c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines/// Make_64 - This functions makes a 64-bit integer from a high / low pair of
252c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines///           32-bit integers.
253c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesinline uint64_t Make_64(uint32_t High, uint32_t Low) {
254c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  return ((uint64_t)High << 32) | (uint64_t)Low;
255c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
256c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
25734247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer/// isInt - Checks if an integer fits into the given bit width.
258d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesentemplate<unsigned N>
259d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Oleseninline bool isInt(int64_t x) {
260d4c00c0f558193b492aed9ab6aacf84bf1d3fb4eJakob Stoklund Olesen  return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1)));
261d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen}
26234247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer// Template specializations to get better code for common cases.
26334247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
26434247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isInt<8>(int64_t x) {
26534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<int8_t>(x) == x;
26634247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
26734247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
26834247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isInt<16>(int64_t x) {
26934247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<int16_t>(x) == x;
27034247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
27134247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
27234247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isInt<32>(int64_t x) {
27334247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<int32_t>(x) == x;
27434247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
275d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen
276b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// isShiftedInt<N,S> - Checks if a signed integer is an N bit number shifted
277b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum///                     left by S.
278b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumtemplate<unsigned N, unsigned S>
279b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicuminline bool isShiftedInt(int64_t x) {
280b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return isInt<N+S>(x) && (x % (1<<S) == 0);
281b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
282b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
28334247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer/// isUInt - Checks if an unsigned integer fits into the given bit width.
284d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesentemplate<unsigned N>
28534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt(uint64_t x) {
28666f1f30725eb20760069823ec015234cce6b887cReid Kleckner  return N >= 64 || x < (UINT64_C(1)<<(N));
287d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen}
28834247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer// Template specializations to get better code for common cases.
28934247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
29034247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt<8>(uint64_t x) {
29134247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<uint8_t>(x) == x;
29234247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
29334247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
29434247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt<16>(uint64_t x) {
29534247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<uint16_t>(x) == x;
29634247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
29734247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramertemplate<>
29834247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramerinline bool isUInt<32>(uint64_t x) {
29934247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer  return static_cast<uint32_t>(x) == x;
30034247a0f356edf45ae3ad9ce04e1f90a77c6dba7Benjamin Kramer}
301d6eb635d1a1317fc3d218056ec77ec242c2413cbJakob Stoklund Olesen
302b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum/// isShiftedUInt<N,S> - Checks if a unsigned integer is an N bit number shifted
303b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum///                     left by S.
304b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumtemplate<unsigned N, unsigned S>
305b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicuminline bool isShiftedUInt(uint64_t x) {
306b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  return isUInt<N+S>(x) && (x % (1<<S) == 0);
307b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum}
308b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
3095005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman/// isUIntN - Checks if an unsigned integer fits into the given (dynamic)
3105005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman/// bit width.
3115005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohmaninline bool isUIntN(unsigned N, uint64_t x) {
3125005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman  return x == (x & (~0ULL >> (64 - N)));
3135005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman}
3145005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman
315c42a7754bb6249c33c509e6fa6e8b3c9344e72d8Rafael Espindola/// isIntN - Checks if an signed integer fits into the given (dynamic)
316b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola/// bit width.
317b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindolainline bool isIntN(unsigned N, int64_t x) {
318b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola  return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1)));
319b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola}
320b35d56c2fe39064a33d0e4e7faf5464b6d8a7352Rafael Espindola
3212c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar/// isMask_32 - This function returns true if the argument is a non-empty
3222c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar/// sequence of ones starting at the least significant bit with the remainder
3232c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar/// zero (32 bit version).  Ex. isMask_32(0x0000FFFFU) == true.
32418a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isMask_32(uint32_t Value) {
32588c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && ((Value + 1) & Value) == 0;
32688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
32788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
3282c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar/// isMask_64 - This function returns true if the argument is a non-empty
3292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar/// sequence of ones starting at the least significant bit with the remainder
3302c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar/// zero (64 bit version).
33118a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isMask_64(uint64_t Value) {
33288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && ((Value + 1) & Value) == 0;
33388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
33488c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
335fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// isShiftedMask_32 - This function returns true if the argument contains a
3362c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar/// non-empty sequence of ones with the remainder zero (32 bit version.)
33749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. isShiftedMask_32(0x0000FF00U) == true.
33818a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isShiftedMask_32(uint32_t Value) {
3392c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  return Value && isMask_32((Value - 1) | Value);
34088c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
34188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
342fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// isShiftedMask_64 - This function returns true if the argument contains a
3432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar/// non-empty sequence of ones with the remainder zero (64 bit version.)
34418a4c74136a9919dc3235d03c0e060f32d01f3b0Chris Lattnerinline bool isShiftedMask_64(uint64_t Value) {
3452c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  return Value && isMask_64((Value - 1) | Value);
34688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
34788c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
348fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// isPowerOf2_32 - This function returns true if the argument is a power of
34949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// two > 0. Ex. isPowerOf2_32(0x00100000U) == true (32 bit edition.)
350c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline bool isPowerOf2_32(uint32_t Value) {
35188c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner  return Value && !(Value & (Value - 1));
35288c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
35388c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
35449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// isPowerOf2_64 - This function returns true if the argument is a power of two
35549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// > 0 (64 bit edition.)
35688c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattnerinline bool isPowerOf2_64(uint64_t Value) {
35719b7e0e0cabfa6dfc559c64e3d6ed053832c4047Reid Spencer  return Value && !(Value & (Value - int64_t(1L)));
35888c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner}
35988c606eb0cc5415ed367c24e073f7bb478501d34Chris Lattner
36049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_16 - This function returns a byte-swapped representation of the
36149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 16-bit argument, Value.
362c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint16_t ByteSwap_16(uint16_t Value) {
3633afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner  return sys::SwapByteOrder_16(Value);
3646fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
3656fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
36649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_32 - This function returns a byte-swapped representation of the
36749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 32-bit argument, Value.
368c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline uint32_t ByteSwap_32(uint32_t Value) {
3693afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner  return sys::SwapByteOrder_32(Value);
3706fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
3716fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
37249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// ByteSwap_64 - This function returns a byte-swapped representation of the
37349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// 64-bit argument, Value.
3746fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begemaninline uint64_t ByteSwap_64(uint64_t Value) {
3753afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner  return sys::SwapByteOrder_64(Value);
3766fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman}
3776fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman
378ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Count the number of ones from the most significant bit to the first
379ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// zero bit.
380ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
381ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Ex. CountLeadingOnes(0xFF0FFF00) == 8.
382ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Only unsigned integral types are allowed.
383ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
384ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \param ZB the behavior on an input of all ones. Only ZB_Width and
385ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// ZB_Undefined are valid arguments.
386ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T>
387ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstd::size_t countLeadingOnes(T Value, ZeroBehavior ZB = ZB_Width) {
388ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static_assert(std::numeric_limits<T>::is_integer &&
389ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    !std::numeric_limits<T>::is_signed,
390ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                "Only unsigned integral types are allowed.");
391ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return countLeadingZeros(~Value, ZB);
392ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman}
393ca2a0e1062545651efd20dca1f647b864ede4a39Dan Gohman
394ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Count the number of ones from the least significant bit to the first
395ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// zero bit.
396ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
397ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Ex. countTrailingOnes(0x00FF00FF) == 8.
398ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Only unsigned integral types are allowed.
399ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
400ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \param ZB the behavior on an input of all ones. Only ZB_Width and
401ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// ZB_Undefined are valid arguments.
402ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T>
403ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstd::size_t countTrailingOnes(T Value, ZeroBehavior ZB = ZB_Width) {
404ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static_assert(std::numeric_limits<T>::is_integer &&
405ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    !std::numeric_limits<T>::is_signed,
406ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                "Only unsigned integral types are allowed.");
407ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return countTrailingZeros(~Value, ZB);
408ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
409ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
410ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesnamespace detail {
411ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T, std::size_t SizeOfT> struct PopulationCounter {
412ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static unsigned count(T Value) {
413ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // Generic version, forward to 32 bits.
414ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    static_assert(SizeOfT <= 4, "Not implemented!");
4152a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#if __GNUC__ >= 4
416ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return __builtin_popcount(Value);
4172a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#else
418ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    uint32_t v = Value;
419ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    v = v - ((v >> 1) & 0x55555555);
420ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
421ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
4222a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#endif
423ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
424ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
42516d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
426ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T> struct PopulationCounter<T, 8> {
427ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static unsigned count(T Value) {
4282a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#if __GNUC__ >= 4
429ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return __builtin_popcountll(Value);
4302a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#else
431ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    uint64_t v = Value;
432ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    v = v - ((v >> 1) & 0x5555555555555555ULL);
433ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    v = (v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL);
434ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
435ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return unsigned((uint64_t)(v * 0x0101010101010101ULL) >> 56);
4362a934cb6072bb0840b39e899e02ad9dea95b18dcOwen Anderson#endif
437ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
438ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
439ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} // namespace detail
440ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
441ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief Count the number of set bits in a value.
442ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Ex. countPopulation(0xF000F000) = 8
443ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Returns 0 if the word is zero.
444ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinestemplate <typename T>
445ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesinline unsigned countPopulation(T Value) {
446ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  static_assert(std::numeric_limits<T>::is_integer &&
447ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    !std::numeric_limits<T>::is_signed,
448ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                "Only unsigned integral types are allowed.");
449ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return detail::PopulationCounter<T, sizeof(T)>::count(Value);
45016d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
45116d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman
452fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// Log2_32 - This function returns the floor log base 2 of the specified value,
45349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// -1 if the value is zero. (32 bit edition.)
45449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. Log2_32(32) == 5, Log2_32(1) == 0, Log2_32(0) == -1, Log2_32(6) == 2
455c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned Log2_32(uint32_t Value) {
456c6af2432c802d241c8fffbe0371c023e6c58844eMichael J. Spencer  return 31 - countLeadingZeros(Value);
45716d6ea526482e733fe3bc63929e94c9e88b6708dNate Begeman}
45854ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner
459fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman/// Log2_64 - This function returns the floor log base 2 of the specified value,
46049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// -1 if the value is zero. (64 bit edition.)
4612be12faabb3ce2d2d3979c73ac65d466fdea5ec5Chris Lattnerinline unsigned Log2_64(uint64_t Value) {
462c6af2432c802d241c8fffbe0371c023e6c58844eMichael J. Spencer  return 63 - countLeadingZeros(Value);
463cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner}
464cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
46549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Log2_32_Ceil - This function returns the ceil log base 2 of the specified
46649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// value, 32 if the value is zero. (32 bit edition).
46749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// Ex. Log2_32_Ceil(32) == 5, Log2_32_Ceil(1) == 0, Log2_32_Ceil(6) == 3
468c3c395cf5e401328836e81c18cb70eef1b9ea5acJeff Coheninline unsigned Log2_32_Ceil(uint32_t Value) {
469c6af2432c802d241c8fffbe0371c023e6c58844eMichael J. Spencer  return 32 - countLeadingZeros(Value - 1);
4700683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner}
4710683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner
47255b42513e1548554bfacc72d48ec3483c73fddf9Dan Gohman/// Log2_64_Ceil - This function returns the ceil log base 2 of the specified
47355b42513e1548554bfacc72d48ec3483c73fddf9Dan Gohman/// value, 64 if the value is zero. (64 bit edition.)
4740683c8cad920d241d44b126972d5cdd164dcc213Chris Lattnerinline unsigned Log2_64_Ceil(uint64_t Value) {
475c6af2432c802d241c8fffbe0371c023e6c58844eMichael J. Spencer  return 64 - countLeadingZeros(Value - 1);
4760683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner}
4770683c8cad920d241d44b126972d5cdd164dcc213Chris Lattner
47849e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// GreatestCommonDivisor64 - Return the greatest common divisor of the two
47949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// values using Euclid's algorithm.
48049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattnerinline uint64_t GreatestCommonDivisor64(uint64_t A, uint64_t B) {
48149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  while (B) {
48249e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    uint64_t T = B;
48349e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    B = A % B;
48449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner    A = T;
48549e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  }
48649e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner  return A;
48749e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner}
488fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
48949e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// BitsToDouble - This function takes a 64-bit integer and returns the bit
49049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent double.
49159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskeyinline double BitsToDouble(uint64_t Bits) {
49259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
49359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    uint64_t L;
49459b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    double D;
49559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
49659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.L = Bits;
49759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.D;
49859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
49959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
50049e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// BitsToFloat - This function takes a 32-bit integer and returns the bit
50149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// equivalent float.
502104338913500d007996056ad092e195009883a84Jim Laskeyinline float BitsToFloat(uint32_t Bits) {
50359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
504104338913500d007996056ad092e195009883a84Jim Laskey    uint32_t I;
50559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    float F;
50659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
50759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.I = Bits;
50859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.F;
50959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
51059b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
51149e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// DoubleToBits - This function takes a double and returns the bit
512541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// equivalent 64-bit integer.  Note that copying doubles around
513541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// changes the bits of NaNs on some hosts, notably x86, so this
514541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// routine cannot be used if these bits are needed.
51559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskeyinline uint64_t DoubleToBits(double Double) {
51659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
51759b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    uint64_t L;
51859b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    double D;
51959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
52059b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.D = Double;
52159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.L;
52259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
52359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
52449e6a9bc94a115d674502009b396c1a22fb1b1a1Chris Lattner/// FloatToBits - This function takes a float and returns the bit
525541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// equivalent 32-bit integer.  Note that copying floats around
526541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// changes the bits of NaNs on some hosts, notably x86, so this
527541ed9fd02ea48d2739f4a9dd681ba2d5da26886Dale Johannesen/// routine cannot be used if these bits are needed.
528104338913500d007996056ad092e195009883a84Jim Laskeyinline uint32_t FloatToBits(float Float) {
52959b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  union {
530104338913500d007996056ad092e195009883a84Jim Laskey    uint32_t I;
53159b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey    float F;
53259b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  } T;
53359b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  T.F = Float;
53459b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey  return T.I;
53559b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey}
53659b8fcfa5f736dff4a08ebcac032935b6fd92f34Jim Laskey
537fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands/// MinAlign - A and B are either alignments or offsets.  Return the minimum
538fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands/// alignment that may be assumed after adding the two together.
539305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline uint64_t MinAlign(uint64_t A, uint64_t B) {
540fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands  // The largest power of 2 that divides both A and B.
541b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  //
542b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  // Replace "-Value" by "1+~Value" in the following commented code to avoid
543b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  // MSVC warning C4146
544b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  //    return (A | B) & -(A | B);
545b3508821533854b1879e7d6a83824b4ba84ce633Aaron Ballman  return (A | B) & (1 + ~(A | B));
546fd617d0143a158bc1c996445262d409280e7b0ccDuncan Sands}
547d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson
54837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// \brief Aligns \c Addr to \c Alignment bytes, rounding up.
54936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
55036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Alignment should be a power of two.  This method rounds up, so
55137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// alignAddr(7, 4) == 8 and alignAddr(8, 4) == 8.
55237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesinline uintptr_t alignAddr(void *Addr, size_t Alignment) {
55336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  assert(Alignment && isPowerOf2_64((uint64_t)Alignment) &&
55436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines         "Alignment is not a power of two!");
55536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
55637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  assert((uintptr_t)Addr + Alignment - 1 >= (uintptr_t)Addr);
55737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
55837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return (((uintptr_t)Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1));
55937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
56037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
56137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// \brief Returns the necessary adjustment for aligning \c Ptr to \c Alignment
56237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// bytes, rounding up.
56337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesinline size_t alignmentAdjustment(void *Ptr, size_t Alignment) {
56437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return alignAddr(Ptr, Alignment) - (uintptr_t)Ptr;
56536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
56636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
567d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson/// NextPowerOf2 - Returns the next power of two (in 64-bits)
568d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson/// that is strictly greater than A.  Returns zero on overflow.
569305b515c2787f47adecbe120e4b4bef55c5e5525Chandler Carruthinline uint64_t NextPowerOf2(uint64_t A) {
570d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 1);
571d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 2);
572d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 4);
573d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 8);
574d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 16);
575d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  A |= (A >> 32);
576d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson  return A + 1;
577d98a45d29a6047bd47d3a3cd83c13ac0dac851fbOwen Anderson}
578e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar
57936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Returns the power of two which is less than or equal to the given value.
58036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Essentially, it is a floor operation across the domain of powers of two.
58136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline uint64_t PowerOf2Floor(uint64_t A) {
58236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!A) return 0;
58336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return 1ull << (63 - countLeadingZeros(A, ZB_Undefined));
58436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
58536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5862d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// Returns the next integer (mod 2**64) that is greater than or equal to
5872d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// \p Value and is a multiple of \p Align. \p Align must be non-zero.
588e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar///
589e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar/// Examples:
5902d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// \code
5912d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko///   RoundUpToAlignment(5, 8) = 8
5922d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko///   RoundUpToAlignment(17, 8) = 24
5932d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko///   RoundUpToAlignment(~0LL, 8) = 0
59437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines///   RoundUpToAlignment(321, 255) = 510
5952d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// \endcode
596e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbarinline uint64_t RoundUpToAlignment(uint64_t Value, uint64_t Align) {
59737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return (Value + Align - 1) / Align * Align;
598e2a8dfefe5740377dbc323a84337c45d37410ea8Daniel Dunbar}
599fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
6002d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// Returns the offset to the next integer (mod 2**64) that is greater than
6012d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// or equal to \p Value and is a multiple of \p Align. \p Align must be
6022d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko/// non-zero.
603eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbarinline uint64_t OffsetToAlignment(uint64_t Value, uint64_t Align) {
604eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar  return RoundUpToAlignment(Value, Align) - Value;
605eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar}
606eccf22528f8b4c21cdbd2f620cbe39dbb38ea6e1Daniel Dunbar
607b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// SignExtend32 - Sign extend B-bit number x to 32-bit int.
608b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// Usage int32_t r = SignExtend32<5>(x);
609adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesentemplate <unsigned B> inline int32_t SignExtend32(uint32_t x) {
610adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesen  return int32_t(x << (32 - B)) >> (32 - B);
611b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
612b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
6131144af3c9b4da48cd581156e05b24261c8de366aRichard Smith/// \brief Sign extend number in the bottom B bits of X to a 32-bit int.
6141144af3c9b4da48cd581156e05b24261c8de366aRichard Smith/// Requires 0 < B <= 32.
6151144af3c9b4da48cd581156e05b24261c8de366aRichard Smithinline int32_t SignExtend32(uint32_t X, unsigned B) {
6161144af3c9b4da48cd581156e05b24261c8de366aRichard Smith  return int32_t(X << (32 - B)) >> (32 - B);
6171144af3c9b4da48cd581156e05b24261c8de366aRichard Smith}
6181144af3c9b4da48cd581156e05b24261c8de366aRichard Smith
619b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// SignExtend64 - Sign extend B-bit number x to 64-bit int.
620b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen/// Usage int64_t r = SignExtend64<5>(x);
621adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesentemplate <unsigned B> inline int64_t SignExtend64(uint64_t x) {
622adc6e06ff0c5950abda86574c2da1fc6b863b75cJakob Stoklund Olesen  return int64_t(x << (64 - B)) >> (64 - B);
623b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen}
624b68a3ee82a8a34f7bae1d68d76f574e76a5535efJohnny Chen
6251144af3c9b4da48cd581156e05b24261c8de366aRichard Smith/// \brief Sign extend number in the bottom B bits of X to a 64-bit int.
6261144af3c9b4da48cd581156e05b24261c8de366aRichard Smith/// Requires 0 < B <= 64.
6271144af3c9b4da48cd581156e05b24261c8de366aRichard Smithinline int64_t SignExtend64(uint64_t X, unsigned B) {
6281144af3c9b4da48cd581156e05b24261c8de366aRichard Smith  return int64_t(X << (64 - B)) >> (64 - B);
6291144af3c9b4da48cd581156e05b24261c8de366aRichard Smith}
6301144af3c9b4da48cd581156e05b24261c8de366aRichard Smith
63137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesextern const float huge_valf;
632d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
633d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
63454ea60c69e69b8e5a464a1d7688ceec5c68bacd5Chris Lattner#endif
635