APInt.h revision fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8
102760ed19ae02feca0cc536c035cdf08d222a8f3Ted Kremenek//===-- llvm/ADT/APInt.h - For Arbitrary Precision Integer -----*- C++ -*--===//
2d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//
3d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//                     The LLVM Compiler Infrastructure
4d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//
8d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//===----------------------------------------------------------------------===//
9d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//
10d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng// This file implements a class to represent arbitrary precision integral
117ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer// constant values and operations on them.
12d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//
13d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//===----------------------------------------------------------------------===//
14d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
15d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng#ifndef LLVM_APINT_H
16d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng#define LLVM_APINT_H
17d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
1898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner#include "llvm/Support/MathExtras.h"
1958a0d64fae7ace05b27dad94fd427991d853619bLauro Ramos Venancio#include <cassert>
20de551f91d8816632a76a065084caab9fab6aacffDan Gohman#include <climits>
21cbd56db62b7fa5a685bdca2eddefe9d04a1295f8Nick Lewycky#include <cstring>
22d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng#include <string>
23d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
24d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Shengnamespace llvm {
2573481e04da1573d10c72982cfba0716c39902502Chris Lattner  class Serializer;
2673481e04da1573d10c72982cfba0716c39902502Chris Lattner  class Deserializer;
27e420debd26300cbeb6af2722e3342132b2be1b3cTed Kremenek  class FoldingSetNodeID;
28944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner  class raw_ostream;
29689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  class StringRef;
303a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
31fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  template<typename T>
32fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  class SmallVectorImpl;
333a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
3491021d339004ff5a64c3c9614cff8966899c0c99Chris Lattner  // An unsigned host type used as a single part of a multi-part
3591021d339004ff5a64c3c9614cff8966899c0c99Chris Lattner  // bignum.
36fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  typedef uint64_t integerPart;
37fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
38b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner  const unsigned int host_char_bit = 8;
3948e8c80e1791adb7a07b8fd6e27edcdfbb756950Evan Cheng  const unsigned int integerPartWidth = host_char_bit *
4048e8c80e1791adb7a07b8fd6e27edcdfbb756950Evan Cheng    static_cast<unsigned int>(sizeof(integerPart));
41b39cdde41d3c91d1fd48a038e63b78122607bb10Chris Lattner
42d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//===----------------------------------------------------------------------===//
43d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//                              APInt Class
44d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng//===----------------------------------------------------------------------===//
45d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
46d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng/// APInt - This class represents arbitrary precision constant integral values.
473a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman/// It is a functional replacement for common case unsigned integer type like
483a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman/// "unsigned", "unsigned long" or "uint64_t", but also allows non-byte-width
49e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// integer sizes and large integer value types such as 3-bits, 15-bits, or more
503a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman/// than 64-bits of precision. APInt provides a variety of arithmetic operators
51e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// and methods to manipulate integer values of any bit-width. It supports both
52e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// the typical integer arithmetic and comparison operations as well as bitwise
53e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// manipulation.
54d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng///
55e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// The class has several invariants worth noting:
56e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///   * All bit, byte, and word positions are zero-based.
573a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman///   * Once the bit width is set, it doesn't change except by the Truncate,
58e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///     SignExtend, or ZeroExtend operations.
59e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///   * All binary operators must be on APInt instances of the same bit width.
603a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman///     Attempting to use these operators on instances with different bit
61e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///     widths will yield an assertion.
62e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///   * The value is stored canonically as an unsigned value. For operations
63e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///     where it makes a difference, there are both signed and unsigned variants
64e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///     of the operation. For example, sdiv and udiv. However, because the bit
65e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///     widths must be the same, operations such as Mul and Add produce the same
66e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///     results regardless of whether the values are interpreted as signed or
67e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///     not.
68e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///   * In general, the class tries to follow the style of computation that LLVM
69e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer///     uses in its IR. This simplifies its use for LLVM.
707406dcdc2981ae864a22ba34f96d1db5e3a4cf87Zhou Sheng///
71e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// @brief Class for arbitrary precision integers.
72d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Shengclass APInt {
739981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  unsigned BitWidth;      ///< The number of bits in this APInt.
74d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
75d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// This union is used to store the integer value. When the
767ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// integer bit-width <= 64, it uses VAL, otherwise it uses pVal.
77d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  union {
78d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    uint64_t VAL;    ///< Used to store the <= 64 bits integer value.
79d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    uint64_t *pVal;  ///< Used to store the >64 bits integer value.
80d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  };
81d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
827ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This enum is used to hold the constants we needed for APInt.
83d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  enum {
8448e8c80e1791adb7a07b8fd6e27edcdfbb756950Evan Cheng    /// Bits in a word
85de551f91d8816632a76a065084caab9fab6aacffDan Gohman    APINT_BITS_PER_WORD = static_cast<unsigned int>(sizeof(uint64_t)) *
86de551f91d8816632a76a065084caab9fab6aacffDan Gohman                          CHAR_BIT,
8748e8c80e1791adb7a07b8fd6e27edcdfbb756950Evan Cheng    /// Byte size of a word
8848e8c80e1791adb7a07b8fd6e27edcdfbb756950Evan Cheng    APINT_WORD_SIZE = static_cast<unsigned int>(sizeof(uint64_t))
89d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  };
90d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
917ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This constructor is used only internally for speed of construction of
927ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// temporaries. It is unsafe for general use so it is not public.
937ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Fast internal constructor
949981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  APInt(uint64_t* val, unsigned bits) : BitWidth(bits), pVal(val) { }
9520b1f5db1e93d28debc6449dcd56da6ca7aa6b67Reid Spencer
96d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @returns true if the number of bits <= 64, false otherwise.
97d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @brief Determine if this APInt just has one word to store value.
983a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  bool isSingleWord() const {
993a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return BitWidth <= APINT_BITS_PER_WORD;
100e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  }
101d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
102d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @returns the word position for the specified bit position.
1037ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Determine which word a bit is in.
1049981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  static unsigned whichWord(unsigned bitPosition) {
1053a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return bitPosition / APINT_BITS_PER_WORD;
106e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  }
107d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
1083a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @returns the bit position in a word for the specified bit position
1097ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// in the APInt.
1107ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Determine which bit in a word a bit is in.
1119981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  static unsigned whichBit(unsigned bitPosition) {
1123a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return bitPosition % APINT_BITS_PER_WORD;
113e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  }
114d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
1153a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// This method generates and returns a uint64_t (word) mask for a single
1163a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// bit at a specific bit position. This is used to mask the bit in the
1177ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// corresponding word.
1187ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns a uint64_t with only bit at "whichBit(bitPosition)" set
1197ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Get a single bit mask.
1209981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  static uint64_t maskBit(unsigned bitPosition) {
1213a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return 1ULL << whichBit(bitPosition);
122e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  }
123d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
1247ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This method is used internally to clear the to "N" bits in the high order
1253a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// word that are not used by the APInt. This is needed after the most
1263a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// significant word is assigned a value to ensure that those bits are
1277ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// zero'd out.
1287ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Clear unused high order bits
129c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman  APInt& clearUnusedBits() {
130c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer    // Compute how many bits are used in the final word
1319981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner    unsigned wordBits = BitWidth % APINT_BITS_PER_WORD;
132c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer    if (wordBits == 0)
133c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer      // If all bits are used, we want to leave the value alone. This also
134cd2ad1df5d2e0600200c81bc214e0b65ff699c5fDan Gohman      // avoids the undefined behavior of >> when the shift is the same size as
135c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer      // the word size (64).
136c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer      return *this;
137c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer
1388eab8a2798fe74c98703bdeac64661beea0b4dbcDuncan Sands    // Mask out the high bits.
139c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer    uint64_t mask = ~uint64_t(0ULL) >> (APINT_BITS_PER_WORD - wordBits);
140d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    if (isSingleWord())
141c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer      VAL &= mask;
142d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    else
143c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer      pVal[getNumWords() - 1] &= mask;
144c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer    return *this;
145d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  }
146d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
147d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @returns the corresponding word for the specified bit position.
148d03d012ad97fad9f91b107d206dadad4c34bebefReid Spencer  /// @brief Get the word corresponding to a bit position
1499981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  uint64_t getWord(unsigned bitPosition) const {
1503a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return isSingleWord() ? VAL : pVal[whichWord(bitPosition)];
151e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  }
152d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
1531e7ad3993d8700488895fa372ecad55443f53485John McCall  /// Converts a string into a number.  The string must be non-empty
1541e7ad3993d8700488895fa372ecad55443f53485John McCall  /// and well-formed as a number of the given base. The bit-width
1551e7ad3993d8700488895fa372ecad55443f53485John McCall  /// must be sufficient to hold the result.
1561e7ad3993d8700488895fa372ecad55443f53485John McCall  ///
157d03d012ad97fad9f91b107d206dadad4c34bebefReid Spencer  /// This is used by the constructors that take string arguments.
1581e7ad3993d8700488895fa372ecad55443f53485John McCall  ///
1591e7ad3993d8700488895fa372ecad55443f53485John McCall  /// StringRef::getAsInteger is superficially similar but (1) does
1601e7ad3993d8700488895fa372ecad55443f53485John McCall  /// not assume that the string is well-formed and (2) grows the
1611e7ad3993d8700488895fa372ecad55443f53485John McCall  /// result to hold the input.
1621e7ad3993d8700488895fa372ecad55443f53485John McCall  ///
1631e7ad3993d8700488895fa372ecad55443f53485John McCall  /// @param radix 2, 8, 10, or 16
1647ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Convert a char array into an APInt
16538e59891ee4417a9be2f8146ce0ba3269e38ac21Benjamin Kramer  void fromString(unsigned numBits, StringRef str, uint8_t radix);
166f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng
167d03d012ad97fad9f91b107d206dadad4c34bebefReid Spencer  /// This is used by the toString method to divide by the radix. It simply
168c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer  /// provides a more convenient form of divide for internal use since KnuthDiv
169c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer  /// has specific constraints on its inputs. If those constraints are not met
170c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer  /// then it provides a simpler form of divide.
171d03d012ad97fad9f91b107d206dadad4c34bebefReid Spencer  /// @brief An internal division function for dividing APInts.
1729981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  static void divide(const APInt LHS, unsigned lhsWords,
1739981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner                     const APInt &RHS, unsigned rhsWords,
174d03d012ad97fad9f91b107d206dadad4c34bebefReid Spencer                     APInt *Quotient, APInt *Remainder);
175d03d012ad97fad9f91b107d206dadad4c34bebefReid Spencer
17698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for inline constructor
1779981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  void initSlowCase(unsigned numBits, uint64_t val, bool isSigned);
17898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
17998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for inline copy constructor
18098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  void initSlowCase(const APInt& that);
18198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
18298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for shl
1839981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  APInt shlSlowCase(unsigned shiftAmt) const;
18498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
18598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for operator&
18698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt AndSlowCase(const APInt& RHS) const;
18798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
18898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for operator|
18998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt OrSlowCase(const APInt& RHS) const;
19098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
19198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for operator^
19298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt XorSlowCase(const APInt& RHS) const;
19398f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
19498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for operator=
19598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt& AssignSlowCase(const APInt& RHS);
19698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
19798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for operator==
19898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  bool EqualSlowCase(const APInt& RHS) const;
19998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
20098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for operator==
20198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  bool EqualSlowCase(uint64_t Val) const;
20298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
20398f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for countLeadingZeros
2049981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  unsigned countLeadingZerosSlowCase() const;
20598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
20698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for countTrailingOnes
2079981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  unsigned countTrailingOnesSlowCase() const;
20898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
20998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// out-of-line slow case for countPopulation
2109981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  unsigned countPopulationSlowCase() const;
21198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
212f31c784f2774311d1f7194ac4ca86262197a8099Reid Spencerpublic:
2137ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @name Constructors
2147ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @{
2157ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// If isSigned is true then val is treated as if it were a signed value
2167ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// (i.e. as an int64_t) and the appropriate sign extension to the bit width
2177ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// will be done. Otherwise, no sign extension occurs (high order bits beyond
2187ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// the range of val are zero filled).
2197ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @param numBits the bit width of the constructed APInt
2207ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @param val the initial value of the APInt
2217ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @param isSigned how to treat signedness of val
222d03d012ad97fad9f91b107d206dadad4c34bebefReid Spencer  /// @brief Create a new APInt of numBits width, initialized as val.
2239981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  APInt(unsigned numBits, uint64_t val, bool isSigned = false)
22498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    : BitWidth(numBits), VAL(0) {
22598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    assert(BitWidth && "bitwidth too small");
22698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    if (isSingleWord())
22798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner      VAL = val;
22898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    else
22998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner      initSlowCase(numBits, val, isSigned);
23098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    clearUnusedBits();
23198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
232d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
233d03d012ad97fad9f91b107d206dadad4c34bebefReid Spencer  /// Note that numWords can be smaller or larger than the corresponding bit
234d03d012ad97fad9f91b107d206dadad4c34bebefReid Spencer  /// width but any extraneous bits will be dropped.
2357ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @param numBits the bit width of the constructed APInt
2367ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @param numWords the number of words in bigVal
2377ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @param bigVal a sequence of words to form the initial value of the APInt
2387ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Construct an APInt of numBits width, initialized as bigVal[].
2399981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  APInt(unsigned numBits, unsigned numWords, const uint64_t bigVal[]);
240d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
241689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  /// This constructor interprets the string \arg str in the given radix. The
242689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  /// interpretation stops when the first character that is not suitable for the
243689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  /// radix is encountered, or the end of the string. Acceptable radix values
244689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  /// are 2, 8, 10 and 16. It is an error for the value implied by the string to
245689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  /// require more bits than numBits.
246689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  ///
2477ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @param numBits the bit width of the constructed APInt
248689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  /// @param str the string to be interpreted
249689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  /// @param radix the radix to use for the conversion
2507ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Construct an APInt from a string representation.
25138e59891ee4417a9be2f8146ce0ba3269e38ac21Benjamin Kramer  APInt(unsigned numBits, StringRef str, uint8_t radix);
2527ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
2537ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Simply makes *this a copy of that.
2547406dcdc2981ae864a22ba34f96d1db5e3a4cf87Zhou Sheng  /// @brief Copy Constructor.
25598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt(const APInt& that)
25698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    : BitWidth(that.BitWidth), VAL(0) {
25798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    assert(BitWidth && "bitwidth too small");
2583a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    if (isSingleWord())
25998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner      VAL = that.VAL;
26098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    else
26198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner      initSlowCase(that);
26298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
263d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
2647406dcdc2981ae864a22ba34f96d1db5e3a4cf87Zhou Sheng  /// @brief Destructor.
26598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  ~APInt() {
2663a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    if (!isSingleWord())
26798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner      delete [] pVal;
26898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
26998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
2701a43e5ffe1ba9bfcb531f7c6a68ac8c49bd28dc1Ted Kremenek  /// Default constructor that creates an uninitialized APInt.  This is useful
2711a43e5ffe1ba9bfcb531f7c6a68ac8c49bd28dc1Ted Kremenek  ///  for object deserialization (pair this with the static method Read).
272586504d5ed35d5765652370c4b4e68eb21b2b34aTed Kremenek  explicit APInt() : BitWidth(1) {}
2733a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
2743a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// Profile - Used to insert APInt objects, or objects that contain APInt
275e420debd26300cbeb6af2722e3342132b2be1b3cTed Kremenek  ///  objects, into FoldingSets.
276187784996c1bdf8aafb5f8719bcbde9260465865Ted Kremenek  void Profile(FoldingSetNodeID& id) const;
2773a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
2787ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @}
2797ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @name Value Tests
2807ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @{
2817ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This tests the high bit of this APInt to determine if it is set.
2827ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns true if this APInt is negative, false otherwise
2837ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Determine sign of this APInt.
2847ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  bool isNegative() const {
2857ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return (*this)[BitWidth - 1];
2867ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
287d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
2887ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This tests the high bit of the APInt to determine if it is unset.
2897649127ec152e226d761845983ba91e69712d7daDan Gohman  /// @brief Determine if this APInt Value is non-negative (>= 0)
2907649127ec152e226d761845983ba91e69712d7daDan Gohman  bool isNonNegative() const {
2917ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return !isNegative();
2927ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
2937ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
2947649127ec152e226d761845983ba91e69712d7daDan Gohman  /// This tests if the value of this APInt is positive (> 0). Note
2957649127ec152e226d761845983ba91e69712d7daDan Gohman  /// that 0 is not a positive value.
2967649127ec152e226d761845983ba91e69712d7daDan Gohman  /// @returns true if this APInt is positive.
2977649127ec152e226d761845983ba91e69712d7daDan Gohman  /// @brief Determine if this APInt Value is positive.
298c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman  bool isStrictlyPositive() const {
299fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8Benjamin Kramer    return isNonNegative() && !!*this;
3007ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3017ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
3027ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This checks to see if the value has all bits of the APInt are set or not.
3037ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Determine if all bits are set
304c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman  bool isAllOnesValue() const {
3057ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return countPopulation() == BitWidth;
3067ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3077ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
3087ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This checks to see if the value of this APInt is the maximum unsigned
3097ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// value for the APInt's bit width.
3107ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Determine if this is the largest unsigned value.
3117ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  bool isMaxValue() const {
3127ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return countPopulation() == BitWidth;
3137ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3147ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
3157ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This checks to see if the value of this APInt is the maximum signed
3167ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// value for the APInt's bit width.
3177ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Determine if this is the largest signed value.
3187ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  bool isMaxSignedValue() const {
3197ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return BitWidth == 1 ? VAL == 0 :
3207ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer                          !isNegative() && countPopulation() == BitWidth - 1;
3217ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3227ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
3237ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This checks to see if the value of this APInt is the minimum unsigned
3247ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// value for the APInt's bit width.
3257ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Determine if this is the smallest unsigned value.
3267ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  bool isMinValue() const {
327fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8Benjamin Kramer    return !*this;
3287ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3297ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
3307ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This checks to see if the value of this APInt is the minimum signed
3317ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// value for the APInt's bit width.
3327ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Determine if this is the smallest signed value.
3337ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  bool isMinSignedValue() const {
334fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8Benjamin Kramer    return BitWidth == 1 ? VAL == 1 : isNegative() && isPowerOf2();
3357ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3367ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
337ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman  /// @brief Check if this APInt has an N-bits unsigned integer value.
3389981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  bool isIntN(unsigned N) const {
3397ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    assert(N && "N == 0 ???");
3401d93b2e1b638cee7f012e8f636eb2cc137d855ffChris Lattner    if (N >= getBitWidth())
3411d93b2e1b638cee7f012e8f636eb2cc137d855ffChris Lattner      return true;
3423a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
3431d93b2e1b638cee7f012e8f636eb2cc137d855ffChris Lattner    if (isSingleWord())
3445005e27f9714f0eaa5b8b7a5a1f6751afa163f07Dan Gohman      return isUIntN(N, VAL);
34540f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad    APInt Tmp(N, getNumWords(), pVal);
3467ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    Tmp.zext(getBitWidth());
3477ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return Tmp == (*this);
348ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman  }
3499981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner
350ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman  /// @brief Check if this APInt has an N-bits signed integer value.
351ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman  bool isSignedIntN(unsigned N) const {
352ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman    assert(N && "N == 0 ???");
353ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman    return getMinSignedBits() <= N;
3547ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
355fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8Benjamin Kramer
356fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8Benjamin Kramer  /// @returns true if the argument APInt value is a power of two > 0.
357fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8Benjamin Kramer  bool isPowerOf2() const {
358fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8Benjamin Kramer    if (isSingleWord())
359fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8Benjamin Kramer      return isPowerOf2_64(VAL);
3607ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return countPopulationSlowCase() == 1;
361febabcc02a1303a8e4d9bed76718a32f0273607aChris Lattner  }
362febabcc02a1303a8e4d9bed76718a32f0273607aChris Lattner
3633a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// isSignBit - Return true if this is the value returned by getSignBit.
36448a3e98c272d673f075c51d078140765fc267eb8Duncan Sands  bool isSignBit() const { return isMinSignedValue(); }
3653a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
366c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman  /// This converts the APInt to a boolean value as a test against zero.
367fd6d53fbad9d3f48da4910ebba12d9d2a3c24bd8Benjamin Kramer  /// @brief Boolean conversion function.
3687ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  bool getBoolValue() const {
3697ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return !!*this;
3702b4c23438838034ee2a812f3cb094a9742b272f6Chris Lattner  }
3712b4c23438838034ee2a812f3cb094a9742b272f6Chris Lattner
3722b4c23438838034ee2a812f3cb094a9742b272f6Chris Lattner  /// getLimitedValue - If this value is smaller than the specified limit,
3734bda52d6b5ffa13314fe32baa1784566f70483f9Chris Lattner  /// return it, otherwise return the limit value.  This causes the value
3744bda52d6b5ffa13314fe32baa1784566f70483f9Chris Lattner  /// to saturate to the limit.
3754bda52d6b5ffa13314fe32baa1784566f70483f9Chris Lattner  uint64_t getLimitedValue(uint64_t Limit = ~0ULL) const {
3764bda52d6b5ffa13314fe32baa1784566f70483f9Chris Lattner    return (getActiveBits() > 64 || getZExtValue() > Limit) ?
3774bda52d6b5ffa13314fe32baa1784566f70483f9Chris Lattner      Limit :  getZExtValue();
3787ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3797ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
3807ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @}
3817ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @name Value Generators
3829981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// @{
383bd7d2622a2ee828a02017dca19170b6f79ff6684Benjamin Kramer  /// @brief Gets maximum unsigned value of APInt for specific bit width.
3847ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  static APInt getMaxValue(unsigned numBits) {
3857ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return getAllOnesValue(numBits);
3867ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3879981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner
388bd7d2622a2ee828a02017dca19170b6f79ff6684Benjamin Kramer  /// @brief Gets maximum signed value of APInt for a specific bit width.
3897a874ddda037349184fbeb22838cc11a1a9bb78fJay Foad  static APInt getSignedMaxValue(unsigned numBits) {
390a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad    APInt API = getAllOnesValue(numBits);
3917ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    API.clearBit(numBits - 1);
3927ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return API;
3937ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3949981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner
3957ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Gets minimum unsigned value of APInt for a specific bit width.
3967ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  static APInt getMinValue(unsigned numBits) {
3977ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return APInt(numBits, 0);
3987ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
3999981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner
400a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad  /// @brief Gets minimum signed value of APInt for a specific bit width.
4017a874ddda037349184fbeb22838cc11a1a9bb78fJay Foad  static APInt getSignedMinValue(unsigned numBits) {
402a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad    APInt API(numBits, 0);
4037ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    API.setBit(numBits - 1);
4047ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return API;
4057ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
4067ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
4077ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// getSignBit - This is just a wrapper function of getSignedMinValue(), and
4089981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// it helps code readability when we want to get a SignBit.
4097ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Get the SignBit for a specific bit width.
4107ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  static APInt getSignBit(unsigned BitWidth) {
4117ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return getSignedMinValue(BitWidth);
4127ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
4137ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
4149981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// @returns the all-ones value for an APInt of the specified bit-width.
415bd7d2622a2ee828a02017dca19170b6f79ff6684Benjamin Kramer  /// @brief Get the all-ones value.
4167ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  static APInt getAllOnesValue(unsigned numBits) {
4177ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return APInt(numBits, -1ULL, true);
4187ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
4197ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
4209981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// @returns the '0' value for an APInt of the specified bit-width.
4217ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Get the '0' value.
4227ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  static APInt getNullValue(unsigned numBits) {
4237ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return APInt(numBits, 0);
4247ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
4257ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
4267ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Get an APInt with the same BitWidth as this APInt, just zero mask
4279981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// the low bits and right shift to the least significant bit.
428d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @returns the high "numBits" bits of this APInt.
4297ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt getHiBits(unsigned numBits) const;
4307ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
4317ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Get an APInt with the same BitWidth as this APInt, just zero mask
4329981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// the high bits.
4337ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns the low "numBits" bits of this APInt.
43416e036fa8f1d1da02deeaf9a77951f4dc711faa1Chris Lattner  APInt getLoBits(unsigned numBits) const;
43516e036fa8f1d1da02deeaf9a77951f4dc711faa1Chris Lattner
43616e036fa8f1d1da02deeaf9a77951f4dc711faa1Chris Lattner  /// Constructs an APInt value that has a contiguous range of bits set. The
43716e036fa8f1d1da02deeaf9a77951f4dc711faa1Chris Lattner  /// bits from loBit (inclusive) to hiBit (exclusive) will be set. All other
43816e036fa8f1d1da02deeaf9a77951f4dc711faa1Chris Lattner  /// bits will be zero. For example, with parameters(32, 0, 16) you would get
43916e036fa8f1d1da02deeaf9a77951f4dc711faa1Chris Lattner  /// 0x0000FFFF. If hiBit is less than loBit then the set bits "wrap". For
44016e036fa8f1d1da02deeaf9a77951f4dc711faa1Chris Lattner  /// example, with parameters (32, 28, 4), you would get 0xF000000F.
4417ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @param numBits the intended bit width of the result
442ffe3e2514a2550152267072ed7afeebb3dd3016cDan Gohman  /// @param loBit the index of the lowest bit set.
443ffe3e2514a2550152267072ed7afeebb3dd3016cDan Gohman  /// @param hiBit the index of the highest bit set.
444ffe3e2514a2550152267072ed7afeebb3dd3016cDan Gohman  /// @returns An APInt value with the requested bits set.
4453a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @brief Get a value with a block of bits set.
4467ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit) {
4477ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    assert(hiBit <= numBits && "hiBit out of range");
4485b7e659e220ed01c8d3a7335e2b52ff2f0fb2ef3Reid Spencer    assert(loBit < numBits && "loBit out of range");
4497ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (hiBit < loBit)
4507ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return getLowBitsSet(numBits, hiBit) |
4519981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner             getHighBitsSet(numBits, numBits-loBit);
452ffe3e2514a2550152267072ed7afeebb3dd3016cDan Gohman    return getLowBitsSet(numBits, hiBit-loBit).shl(loBit);
4538f969ee62c3fed26f835a37c41f7c009f99ea3bfReid Spencer  }
4548f969ee62c3fed26f835a37c41f7c009f99ea3bfReid Spencer
455ffe3e2514a2550152267072ed7afeebb3dd3016cDan Gohman  /// Constructs an APInt value that has the top hiBitsSet bits set.
456d3993d13be7b34fe8753eab9eb3d6499b7c4cd9fDan Gohman  /// @param numBits the bitwidth of the result
457ffe3e2514a2550152267072ed7afeebb3dd3016cDan Gohman  /// @param hiBitsSet the number of high-order bits set in the result.
4588f969ee62c3fed26f835a37c41f7c009f99ea3bfReid Spencer  /// @brief Get a value with high bits set
4597ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet) {
4607ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    assert(hiBitsSet <= numBits && "Too many bits to set!");
4617ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    // Handle a degenerate case, to avoid shifting by word size
4627ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (hiBitsSet == 0)
4637ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return APInt(numBits, 0);
4649981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner    unsigned shiftAmt = numBits - hiBitsSet;
4658da7d65b8350d0f47f47ab496328d9068ac6764dReid Spencer    // For small values, return quickly
466a1689ea60eafb10a617ba588fe29e09683299368Reid Spencer    if (numBits <= APINT_BITS_PER_WORD)
467a1689ea60eafb10a617ba588fe29e09683299368Reid Spencer      return APInt(numBits, ~0ULL << shiftAmt);
468a1689ea60eafb10a617ba588fe29e09683299368Reid Spencer    return getAllOnesValue(numBits).shl(shiftAmt);
4699981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  }
4708da7d65b8350d0f47f47ab496328d9068ac6764dReid Spencer
4718da7d65b8350d0f47f47ab496328d9068ac6764dReid Spencer  /// Constructs an APInt value that has the bottom loBitsSet bits set.
472ca76fc2cd3b97e4821e7d8247bc03bbbd2789ad9Reid Spencer  /// @param numBits the bitwidth of the result
473452b93e7dc2802dea3a31ea12c397d11c3c5e23bBenjamin Kramer  /// @param loBitsSet the number of low-order bits set in the result.
4748da7d65b8350d0f47f47ab496328d9068ac6764dReid Spencer  /// @brief Get a value with low bits set
4757ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet) {
4767ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    assert(loBitsSet <= numBits && "Too many bits to set!");
4777ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    // Handle a degenerate case, to avoid shifting by word size
4787ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (loBitsSet == 0)
4797ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return APInt(numBits, 0);
4809981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner    if (loBitsSet == APINT_BITS_PER_WORD)
4818da7d65b8350d0f47f47ab496328d9068ac6764dReid Spencer      return APInt(numBits, -1ULL);
482a1689ea60eafb10a617ba588fe29e09683299368Reid Spencer    // For small values, return quickly.
483a1689ea60eafb10a617ba588fe29e09683299368Reid Spencer    if (numBits < APINT_BITS_PER_WORD)
484a1689ea60eafb10a617ba588fe29e09683299368Reid Spencer      return APInt(numBits, (1ULL << loBitsSet) - 1);
485f6bef488eeab75b6c7746f9faa9731d45bb84aefReid Spencer    return getAllOnesValue(numBits).lshr(numBits - loBitsSet);
486f6bef488eeab75b6c7746f9faa9731d45bb84aefReid Spencer  }
48771f95b8531183d4a2f7c84d66d5aec17bc41b316Chris Lattner
488f6bef488eeab75b6c7746f9faa9731d45bb84aefReid Spencer  /// The hash value is computed as the sum of the words and the bit width.
489f6bef488eeab75b6c7746f9faa9731d45bb84aefReid Spencer  /// @returns A hash value computed from the sum of the APInt words.
490452b93e7dc2802dea3a31ea12c397d11c3c5e23bBenjamin Kramer  /// @brief Get a hash value based on this APInt
4918da7d65b8350d0f47f47ab496328d9068ac6764dReid Spencer  uint64_t getHashValue() const;
4927ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
4937ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This function returns a pointer to the internal storage of the APInt.
4947ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// This is useful for writing out the APInt in binary form without any
4957ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// conversions.
4967ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  const uint64_t* getRawData() const {
4977ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (isSingleWord())
4983a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman      return &VAL;
4997ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return &pVal[0];
5007ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
501c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman
5027ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @}
5037ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @name Unary Operators
5047ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @{
5057ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns a new APInt value representing *this incremented by one
5067ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Postfix increment operator.
5077ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  const APInt operator++(int) {
5087ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    APInt API(*this);
5097ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    ++(*this);
5107ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return API;
5117406dcdc2981ae864a22ba34f96d1db5e3a4cf87Zhou Sheng  }
512c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman
513f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng  /// @returns *this incremented by one
514b04973edfaffb12905f58379d632f0d7e4bb5d9bZhou Sheng  /// @brief Prefix increment operator.
515b04973edfaffb12905f58379d632f0d7e4bb5d9bZhou Sheng  APInt& operator++();
516f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng
517d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @returns a new APInt representing *this decremented by one.
5187ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Postfix decrement operator.
5197406dcdc2981ae864a22ba34f96d1db5e3a4cf87Zhou Sheng  const APInt operator--(int) {
520d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    APInt API(*this);
521d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    --(*this);
5227ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return API;
5233a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  }
524c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman
525f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng  /// @returns *this decremented by one.
526b04973edfaffb12905f58379d632f0d7e4bb5d9bZhou Sheng  /// @brief Prefix decrement operator.
527b04973edfaffb12905f58379d632f0d7e4bb5d9bZhou Sheng  APInt& operator--();
528f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng
529d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// Performs a bitwise complement operation on this APInt.
5307ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns an APInt that is the bitwise complement of *this
5313a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @brief Unary bitwise complement operator.
532d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  APInt operator~() const {
533d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    APInt Result(*this);
5343a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    Result.flipAllBits();
5357ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return Result;
5363a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  }
53798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
53898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// Negates *this using two's complement logic.
5397a874ddda037349184fbeb22838cc11a1a9bb78fJay Foad  /// @returns An APInt value representing the negation of *this.
54098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @brief Unary negation operator
54198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt operator-() const {
5427ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return APInt(BitWidth, 0) - (*this);
5437ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
5447ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
5457ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Performs logical negation operation on this APInt.
546c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman  /// @returns true if *this is zero, false otherwise.
5477ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Logical negation operator.
5487ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  bool operator!() const;
5497ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
5507ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @}
5517ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @name Assignment Operators
5523a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @{
553fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  /// @returns *this after assignment of RHS.
5547ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Copy assignment operator.
5557ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt& operator=(const APInt& RHS) {
5567ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    // If the bitwidths are the same, we can avoid mucking with memory
5577ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (isSingleWord() && RHS.isSingleWord()) {
5587ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      VAL = RHS.VAL;
5593a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman      BitWidth = RHS.BitWidth;
56098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner      return clearUnusedBits();
56198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    }
56298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
56398f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    return AssignSlowCase(RHS);
56498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
56598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
56698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// The RHS value is assigned to *this. If the significant bits in RHS exceed
56798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// the bit width, the excess bits are truncated. If the bit width is larger
56898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// than 64, the value is zero filled in the unspecified high order bits.
56998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @returns *this after assignment of RHS value.
5707ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Assignment operator.
5717ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt& operator=(uint64_t RHS);
5727ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
5737ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Performs a bitwise AND operation on this APInt and RHS. The result is
5747ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// assigned to *this.
5753a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @returns *this after ANDing with RHS.
5767ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Bitwise AND assignment operator.
5777ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt& operator&=(const APInt& RHS);
5787ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
5793a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// Performs a bitwise OR operation on this APInt and RHS. The result is
5807ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// assigned *this;
5813a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @returns *this after ORing with RHS.
582d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @brief Bitwise OR assignment operator.
583d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  APInt& operator|=(const APInt& RHS);
5843a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
5857ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Performs a bitwise OR operation on this APInt and RHS. RHS is
5867ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// logically zero-extended or truncated to match the bit-width of
5873a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// the LHS.
588d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  ///
589d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @brief Bitwise OR assignment operator.
5901e7ad3993d8700488895fa372ecad55443f53485John McCall  APInt& operator|=(uint64_t RHS) {
5911e7ad3993d8700488895fa372ecad55443f53485John McCall    if (isSingleWord()) {
5921e7ad3993d8700488895fa372ecad55443f53485John McCall      VAL |= RHS;
5931e7ad3993d8700488895fa372ecad55443f53485John McCall      clearUnusedBits();
5941e7ad3993d8700488895fa372ecad55443f53485John McCall    } else {
5951e7ad3993d8700488895fa372ecad55443f53485John McCall      pVal[0] |= RHS;
5961e7ad3993d8700488895fa372ecad55443f53485John McCall    }
5971e7ad3993d8700488895fa372ecad55443f53485John McCall    return *this;
5981e7ad3993d8700488895fa372ecad55443f53485John McCall  }
5991e7ad3993d8700488895fa372ecad55443f53485John McCall
6001e7ad3993d8700488895fa372ecad55443f53485John McCall  /// Performs a bitwise XOR operation on this APInt and RHS. The result is
6011e7ad3993d8700488895fa372ecad55443f53485John McCall  /// assigned to *this.
6021e7ad3993d8700488895fa372ecad55443f53485John McCall  /// @returns *this after XORing with RHS.
6031e7ad3993d8700488895fa372ecad55443f53485John McCall  /// @brief Bitwise XOR assignment operator.
6041e7ad3993d8700488895fa372ecad55443f53485John McCall  APInt& operator^=(const APInt& RHS);
6057ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
6067ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Multiplies this APInt by RHS and assigns the result to *this.
6077ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns *this
6083a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @brief Multiplication assignment operator.
609d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  APInt& operator*=(const APInt& RHS);
610d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
6117ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Adds RHS to *this and assigns the result to *this.
6127ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns *this
6133a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @brief Addition assignment operator.
614d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  APInt& operator+=(const APInt& RHS);
615d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
6167ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Subtracts RHS from *this and assigns the result to *this.
6177ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns *this
6183a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @brief Subtraction assignment operator.
619d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  APInt& operator-=(const APInt& RHS);
620d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
6217ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Shifts *this left by shiftAmt and assigns the result to *this.
6227ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns *this after shifting left by shiftAmt
6233a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @brief Left-shift assignment function.
624d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  APInt& operator<<=(unsigned shiftAmt) {
625d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    *this = shl(shiftAmt);
6267ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return *this;
6277ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
6287ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
6299981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// @}
6307ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @name Binary Operators
6317ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @{
6327ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Performs a bitwise AND operation on *this and RHS.
6337ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns An APInt value representing the bitwise AND of *this and RHS.
6347ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Bitwise AND operator.
6357ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt operator&(const APInt& RHS) const {
6367ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
6377ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (isSingleWord())
6387ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return APInt(getBitWidth(), VAL & RHS.VAL);
6393a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return AndSlowCase(RHS);
64098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
64198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt And(const APInt& RHS) const {
64298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    return this->operator&(RHS);
64398f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
64498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
64598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// Performs a bitwise OR operation on *this and RHS.
646da347141ecb7ce44c532cdc51b000d5ab65db79fReid Spencer  /// @returns An APInt value representing the bitwise OR of *this and RHS.
647da347141ecb7ce44c532cdc51b000d5ab65db79fReid Spencer  /// @brief Bitwise OR operator.
648da347141ecb7ce44c532cdc51b000d5ab65db79fReid Spencer  APInt operator|(const APInt& RHS) const {
649d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
6507ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (isSingleWord())
6517ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return APInt(getBitWidth(), VAL | RHS.VAL);
6523a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return OrSlowCase(RHS);
65398f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
65498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt Or(const APInt& RHS) const {
65598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    return this->operator|(RHS);
65698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
65798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
65898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// Performs a bitwise XOR operation on *this and RHS.
659da347141ecb7ce44c532cdc51b000d5ab65db79fReid Spencer  /// @returns An APInt value representing the bitwise XOR of *this and RHS.
660da347141ecb7ce44c532cdc51b000d5ab65db79fReid Spencer  /// @brief Bitwise XOR operator.
661da347141ecb7ce44c532cdc51b000d5ab65db79fReid Spencer  APInt operator^(const APInt& RHS) const {
662d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
6637ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (isSingleWord())
6647ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return APInt(BitWidth, VAL ^ RHS.VAL);
6653a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return XorSlowCase(RHS);
66698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
66798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt Xor(const APInt& RHS) const {
66898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    return this->operator^(RHS);
66998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
67098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
67198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// Multiplies this APInt by RHS and returns the result.
672da347141ecb7ce44c532cdc51b000d5ab65db79fReid Spencer  /// @brief Multiplication operator.
673da347141ecb7ce44c532cdc51b000d5ab65db79fReid Spencer  APInt operator*(const APInt& RHS) const;
674da347141ecb7ce44c532cdc51b000d5ab65db79fReid Spencer
675d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// Adds RHS to this APInt and returns the result.
6767ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Addition operator.
6773a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  APInt operator+(const APInt& RHS) const;
678d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  APInt operator+(uint64_t RHS) const {
679d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    return (*this) + APInt(BitWidth, RHS);
6807ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
6813a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
682d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// Subtracts RHS from this APInt and returns the result.
683f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer  /// @brief Subtraction operator.
684f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer  APInt operator-(const APInt& RHS) const;
685f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer  APInt operator-(uint64_t RHS) const {
686f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer    return (*this) - APInt(BitWidth, RHS);
6877ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
6883a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
689d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  APInt operator<<(unsigned Bits) const {
690f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer    return shl(Bits);
691f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer  }
692f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer
6933a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  APInt operator<<(const APInt &Bits) const {
694ef65293dc27c2d7b1ba1fc7c7ffd802e86b780ecChris Lattner    return shl(Bits);
695ef65293dc27c2d7b1ba1fc7c7ffd802e86b780ecChris Lattner  }
696ef65293dc27c2d7b1ba1fc7c7ffd802e86b780ecChris Lattner
697d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// Arithmetic right-shift this APInt by shiftAmt.
698cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// @brief Arithmetic right-shift function.
699cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  APInt ashr(unsigned shiftAmt) const;
700cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman
701cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// Logical right-shift this APInt by shiftAmt.
7027ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Logical right-shift function.
7037ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt lshr(unsigned shiftAmt) const;
7049981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner
7057ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Left-shift this APInt by shiftAmt.
7067ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Left-shift function.
7077ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt shl(unsigned shiftAmt) const {
7089981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner    assert(shiftAmt <= BitWidth && "Invalid shift amount");
7097ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (isSingleWord()) {
7107ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      if (shiftAmt == BitWidth)
7117ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer        return APInt(BitWidth, 0); // avoid undefined shift results
7129981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner      return APInt(BitWidth, VAL << shiftAmt);
71398f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    }
71498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    return shlSlowCase(shiftAmt);
71598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
71698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
71798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @brief Rotate left by rotateAmt.
71898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  APInt rotl(unsigned rotateAmt) const;
71998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
72098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @brief Rotate right by rotateAmt.
7217ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt rotr(unsigned rotateAmt) const;
72219dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer
7239981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// Arithmetic right-shift this APInt by shiftAmt.
72419dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  /// @brief Arithmetic right-shift function.
72519dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  APInt ashr(const APInt &shiftAmt) const;
7269981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner
72719dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  /// Logical right-shift this APInt by shiftAmt.
728cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// @brief Logical right-shift function.
729cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  APInt lshr(const APInt &shiftAmt) const;
730cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman
731cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// Left-shift this APInt by shiftAmt.
732cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// @brief Left-shift function.
733cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  APInt shl(const APInt &shiftAmt) const;
734cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman
735cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// @brief Rotate left by rotateAmt.
736cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  APInt rotl(const APInt &rotateAmt) const;
737cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman
738cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// @brief Rotate right by rotateAmt.
739cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  APInt rotr(const APInt &rotateAmt) const;
740cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman
741cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// Perform an unsigned divide operation on this APInt by RHS. Both this and
742cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// RHS are treated as unsigned quantities for purposes of this division.
743cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// @returns a new APInt value containing the division result
744cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  /// @brief Unsigned division operation.
745cf609575ef6e47cd5ce775af175c67a3b621120eDan Gohman  APInt udiv(const APInt &RHS) const;
7467ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
7477ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Signed divide this APInt by APInt RHS.
7487ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Signed division function for APInt.
7497ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt sdiv(const APInt &RHS) const {
750f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner    if (isNegative())
7517ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      if (RHS.isNegative())
7527ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer        return (-(*this)).udiv(-RHS);
7537ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      else
754f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner        return -((-(*this)).udiv(RHS));
7557ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    else if (RHS.isNegative())
7567ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return -(this->udiv(-RHS));
7577ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return this->udiv(RHS);
7587ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
7597ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
7607ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Perform an unsigned remainder operation on this APInt with RHS being the
7617ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// divisor. Both this and RHS are treated as unsigned quantities for purposes
7627ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// of this operation. Note that this is a true remainder operation and not
7637ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// a modulo operation because the sign follows the sign of the dividend
7647ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// which is *this.
765d3af825d29ab02f78665d5010c8439d34d65db65Reid Spencer  /// @returns a new APInt value containing the remainder result
7667ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Unsigned remainder operation.
767d3af825d29ab02f78665d5010c8439d34d65db65Reid Spencer  APInt urem(const APInt &RHS) const;
768d3af825d29ab02f78665d5010c8439d34d65db65Reid Spencer
769d3af825d29ab02f78665d5010c8439d34d65db65Reid Spencer  /// Signed remainder operation on APInt.
7707ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Function for signed remainder operation.
7717ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt srem(const APInt &RHS) const {
772f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner    if (isNegative())
7737ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      if (RHS.isNegative())
7747ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer        return -((-(*this)).urem(-RHS));
7757ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      else
776f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner        return -((-(*this)).urem(RHS));
7777ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    else if (RHS.isNegative())
7787ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return this->urem(-RHS);
77953c9520b238514a9c1b63ff02221f7467aad1337Reid Spencer    return this->urem(RHS);
7807ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
781013263f7b008e2fca293cf2720205f3f6db37dc2Reid Spencer
7827ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Sometimes it is convenient to divide two APInt values and obtain both the
783d3af825d29ab02f78665d5010c8439d34d65db65Reid Spencer  /// quotient and remainder. This function does both operations in the same
7847ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// computation making it a little more efficient. The pair of input arguments
7850b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng  /// may overlap with the pair of output arguments. It is safe to call
786d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// udivrem(X, Y, X, Y), for example.
787300c6c5167d2869d1568d783d0e3e48bf4b03a6cWojciech Matyjewicz  /// @brief Dual division/remainder interface.
788300c6c5167d2869d1568d783d0e3e48bf4b03a6cWojciech Matyjewicz  static void udivrem(const APInt &LHS, const APInt &RHS,
789300c6c5167d2869d1568d783d0e3e48bf4b03a6cWojciech Matyjewicz                      APInt &Quotient, APInt &Remainder);
790300c6c5167d2869d1568d783d0e3e48bf4b03a6cWojciech Matyjewicz
791300c6c5167d2869d1568d783d0e3e48bf4b03a6cWojciech Matyjewicz  static void sdivrem(const APInt &LHS, const APInt &RHS,
79219dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer                      APInt &Quotient, APInt &Remainder) {
7933a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    if (LHS.isNegative()) {
79419dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer      if (RHS.isNegative())
79519dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer        APInt::udivrem(-LHS, -RHS, Quotient, Remainder);
79619dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer      else
797f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner        APInt::udivrem(-LHS, RHS, Quotient, Remainder);
79819dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer      Quotient = -Quotient;
79919dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer      Remainder = -Remainder;
80019dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer    } else if (RHS.isNegative()) {
80119dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer      APInt::udivrem(LHS, -RHS, Quotient, Remainder);
80219dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer      Quotient = -Quotient;
80319dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer    } else {
80419dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer      APInt::udivrem(LHS, RHS, Quotient, Remainder);
80519dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer    }
80619dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  }
80719dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer
80819dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer
80919dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  // Operations that return overflow indicators.
81019dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  APInt sadd_ov(const APInt &RHS, bool &Overflow) const;
81119dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  APInt uadd_ov(const APInt &RHS, bool &Overflow) const;
812f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner  APInt ssub_ov(const APInt &RHS, bool &Overflow) const;
813f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner  APInt usub_ov(const APInt &RHS, bool &Overflow) const;
814f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner  APInt sdiv_ov(const APInt &RHS, bool &Overflow) const;
8150a0a585e6bfc112cb8346b17edecb76969fb5532Chris Lattner  APInt smul_ov(const APInt &RHS, bool &Overflow) const;
816eafc5cb80d58cb9447623a557be4d4f55f42fbc3Chris Lattner  APInt sshl_ov(unsigned Amt, bool &Overflow) const;
8170a0a585e6bfc112cb8346b17edecb76969fb5532Chris Lattner
818eafc5cb80d58cb9447623a557be4d4f55f42fbc3Chris Lattner  /// @returns the bit value at bitPosition
8190a0a585e6bfc112cb8346b17edecb76969fb5532Chris Lattner  /// @brief Array-indexing support.
8200a0a585e6bfc112cb8346b17edecb76969fb5532Chris Lattner  bool operator[](unsigned bitPosition) const;
82108e90f5646e61c3be0eebfa172ec73a8b56abee8Chris Lattner
82219dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  /// @}
8237ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @name Comparison Operators
824d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @{
8259981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// Compares this APInt with RHS for the validity of the equality
826d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// relationship.
8277ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Equality operator.
8287ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  bool operator==(const APInt& RHS) const {
8297ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    assert(BitWidth == RHS.BitWidth && "Comparison requires equal bit widths");
8307ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (isSingleWord())
8317ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return VAL == RHS.VAL;
8323a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return EqualSlowCase(RHS);
83398f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
83498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
83598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// Compares this APInt with a uint64_t for the validity of the equality
83698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// relationship.
83798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @returns true if *this == Val
83898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @brief Equality operator.
839d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  bool operator==(uint64_t Val) const {
8403a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    if (isSingleWord())
8417ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return VAL == Val;
8427ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return EqualSlowCase(Val);
843f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng  }
84498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
84598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// Compares this APInt with RHS for the validity of the equality
84698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// relationship.
84798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @returns true if *this == Val
84898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @brief Equality comparison.
849f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng  bool eq(const APInt &RHS) const {
8507ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return (*this) == RHS;
8517ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
8527ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
8537ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Compares this APInt with RHS for the validity of the inequality
8547ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// relationship.
8553a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @returns true if *this != Val
8567ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Inequality operator.
8577ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  bool operator!=(const APInt& RHS) const {
8587ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return !((*this) == RHS);
8597ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
8607ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
8613a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// Compares this APInt with a uint64_t for the validity of the inequality
862c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman  /// relationship.
863f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng  /// @returns true if *this != Val
864f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng  /// @brief Inequality operator.
865d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  bool operator!=(uint64_t Val) const {
8663a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman    return !((*this) == Val);
8677ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
8687ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
8693a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// Compares this APInt with RHS for the validity of the inequality
870c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman  /// relationship.
871f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng  /// @returns true if *this != Val
872f29a09d6272265e90362d5dfba201c4ed6dcf6d5Zhou Sheng  /// @brief Inequality comparison
8733a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  bool ne(const APInt &RHS) const {
8747ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return !((*this) == RHS);
8757ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
8767ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
877e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// Regards both *this and RHS as unsigned quantities and compares them for
878e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// the validity of the less-than relationship.
879e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns true if *this < RHS when both are considered unsigned.
880e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Unsigned less than comparison
881e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  bool ult(const APInt &RHS) const;
8827ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
8837ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Regards both *this as an unsigned quantity and compares it with RHS for
8847ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// the validity of the less-than relationship.
885e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns true if *this < RHS when considered unsigned.
886eafc5cb80d58cb9447623a557be4d4f55f42fbc3Chris Lattner  /// @brief Unsigned less than comparison
887e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  bool ult(uint64_t RHS) const {
888e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman    return ult(APInt(getBitWidth(), RHS));
889e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  }
890e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
891e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// Regards both *this and RHS as signed quantities and compares them for
892e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// validity of the less-than relationship.
893e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @returns true if *this < RHS when both are considered signed.
894e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @brief Signed less than comparison
895e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  bool slt(const APInt& RHS) const;
8967ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
8977ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Regards both *this as a signed quantity and compares it with RHS for
8987ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// the validity of the less-than relationship.
899e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns true if *this < RHS when considered signed.
900e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Signed less than comparison
901e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  bool slt(uint64_t RHS) const {
902e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman    return slt(APInt(getBitWidth(), RHS));
903e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  }
904e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
905e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// Regards both *this and RHS as unsigned quantities and compares them for
906e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// validity of the less-or-equal relationship.
907e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @returns true if *this <= RHS when both are considered unsigned.
908e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @brief Unsigned less or equal comparison
909e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  bool ule(const APInt& RHS) const {
9107ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return ult(RHS) || eq(RHS);
9117ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
9127ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
913e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// Regards both *this as an unsigned quantity and compares it with RHS for
914e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// the validity of the less-or-equal relationship.
915e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns true if *this <= RHS when considered unsigned.
916e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Unsigned less or equal comparison
917e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  bool ule(uint64_t RHS) const {
918e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman    return ule(APInt(getBitWidth(), RHS));
919e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  }
920e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
921e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// Regards both *this and RHS as signed quantities and compares them for
922e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// validity of the less-or-equal relationship.
923e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @returns true if *this <= RHS when both are considered signed.
924e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @brief Signed less or equal comparison
925e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  bool sle(const APInt& RHS) const {
9267ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return slt(RHS) || eq(RHS);
9277ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
9287ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
929e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// Regards both *this as a signed quantity and compares it with RHS for
930e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// the validity of the less-or-equal relationship.
931e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns true if *this <= RHS when considered signed.
932e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Signed less or equal comparison
933e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  bool sle(uint64_t RHS) const {
934e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman    return sle(APInt(getBitWidth(), RHS));
935e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  }
936e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
937e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// Regards both *this and RHS as unsigned quantities and compares them for
938e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// the validity of the greater-than relationship.
939e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @returns true if *this > RHS when both are considered unsigned.
940e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @brief Unsigned greather than comparison
941e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  bool ugt(const APInt& RHS) const {
9427ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return !ult(RHS) && !eq(RHS);
9437ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
9447ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
945e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// Regards both *this as an unsigned quantity and compares it with RHS for
946e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// the validity of the greater-than relationship.
947e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns true if *this > RHS when considered unsigned.
948e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Unsigned greater than comparison
949e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  bool ugt(uint64_t RHS) const {
950e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman    return ugt(APInt(getBitWidth(), RHS));
951e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  }
952e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
953e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// Regards both *this and RHS as signed quantities and compares them for
954e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// the validity of the greater-than relationship.
955e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @returns true if *this > RHS when both are considered signed.
956e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @brief Signed greather than comparison
957e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  bool sgt(const APInt& RHS) const {
9587ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return !slt(RHS) && !eq(RHS);
9597ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
9607ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
961e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// Regards both *this as a signed quantity and compares it with RHS for
962e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// the validity of the greater-than relationship.
963e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns true if *this > RHS when considered signed.
964e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Signed greater than comparison
965e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  bool sgt(uint64_t RHS) const {
966e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman    return sgt(APInt(getBitWidth(), RHS));
967e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  }
968e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
969e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// Regards both *this and RHS as unsigned quantities and compares them for
970e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// validity of the greater-or-equal relationship.
971e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @returns true if *this >= RHS when both are considered unsigned.
972e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @brief Unsigned greater or equal comparison
973e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  bool uge(const APInt& RHS) const {
9747ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return !ult(RHS);
9757ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
9767ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
977e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// Regards both *this as an unsigned quantity and compares it with RHS for
978e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// the validity of the greater-or-equal relationship.
979e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns true if *this >= RHS when considered unsigned.
980e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Unsigned greater or equal comparison
981e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  bool uge(uint64_t RHS) const {
982e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman    return uge(APInt(getBitWidth(), RHS));
983e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  }
984e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
985e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// Regards both *this and RHS as signed quantities and compares them for
986e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// validity of the greater-or-equal relationship.
987e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @returns true if *this >= RHS when both are considered signed.
988e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// @brief Signed greather or equal comparison
989e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  bool sge(const APInt& RHS) const {
9907ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return !slt(RHS);
9917ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
9927ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
993e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// Regards both *this as a signed quantity and compares it with RHS for
994e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// the validity of the greater-or-equal relationship.
995e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns true if *this >= RHS when considered signed.
996e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Signed greater or equal comparison
997e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  bool sge(uint64_t RHS) const {
998e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman    return sge(APInt(getBitWidth(), RHS));
999e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  }
1000e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
1001e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
1002e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
1003e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman
1004e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// This operation tests if there are any pairs of corresponding bits
1005e05678132345eb8a632362dbd320ee7d36226e67Dan Gohman  /// between this APInt and RHS that are both set.
1006f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner  bool intersects(const APInt &RHS) const {
1007f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner    return (*this & RHS) != 0;
1008f2ddc64c8701e432cc220f26c48d596cc0f30a97Chris Lattner  }
1009bd999178929c10bdeb0a2577fa02981778edaee7Dan Gohman
1010bd999178929c10bdeb0a2577fa02981778edaee7Dan Gohman  /// @}
1011bd999178929c10bdeb0a2577fa02981778edaee7Dan Gohman  /// @name Resizing Operators
1012bd999178929c10bdeb0a2577fa02981778edaee7Dan Gohman  /// @{
1013bd999178929c10bdeb0a2577fa02981778edaee7Dan Gohman  /// Truncate the APInt to a specified width. It is an error to specify a width
1014bd999178929c10bdeb0a2577fa02981778edaee7Dan Gohman  /// that is greater than or equal to the current width.
10157ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @brief Truncate to new width.
10167ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt &trunc(unsigned width);
10177ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
1018e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// This operation sign extends the APInt to a new width. If the high order
10193a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// bit is set, the fill on the left will be done with 1 bits, otherwise zero.
1020e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// It is an error to specify a width that is less than or equal to the
102140f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad  /// current width.
1022e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Sign extend to a new width.
1023e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  APInt &sext(unsigned width);
1024e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer
10253a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// This operation zero extends the APInt to a new width. The high order bits
1026e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// are filled with 0 bits.  It is an error to specify a width that is less
1027e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// than or equal to the current width.
102840f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad  /// @brief Zero extend to a new width.
1029e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  APInt &zext(unsigned width);
10305b9f2d6186317df88dbaf603bf8d0eafd6e83897Reid Spencer
10313a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// Make this APInt have the bit width given by \p width. The value is sign
1032e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// extended, truncated, or left alone to make it that width.
1033e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Sign extend or truncate to width
103440f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad  APInt &sextOrTrunc(unsigned width);
1035e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer
103668e2300ad965bf08af11ae363bb85e3badf964dcReid Spencer  /// Make this APInt have the bit width given by \p width. The value is zero
103768e2300ad965bf08af11ae363bb85e3badf964dcReid Spencer  /// extended, truncated, or left alone to make it that width.
103868e2300ad965bf08af11ae363bb85e3badf964dcReid Spencer  /// @brief Zero extend or truncate to width
103940f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad  APInt &zextOrTrunc(unsigned width);
104068e2300ad965bf08af11ae363bb85e3badf964dcReid Spencer
104168e2300ad965bf08af11ae363bb85e3badf964dcReid Spencer  /// @}
104268e2300ad965bf08af11ae363bb85e3badf964dcReid Spencer  /// @name Bit Manipulation Operators
104368e2300ad965bf08af11ae363bb85e3badf964dcReid Spencer  /// @{
104440f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad  /// @brief Set every bit to 1.
104568e2300ad965bf08af11ae363bb85e3badf964dcReid Spencer  void setAllBits() {
10467ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (isSingleWord())
10477ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      VAL = -1ULL;
10487ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    else {
1049e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer      // Set all the bits in all the words.
10507a874ddda037349184fbeb22838cc11a1a9bb78fJay Foad      for (unsigned i = 0; i < getNumWords(); ++i)
1051a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad	pVal[i] = -1ULL;
105298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    }
1053a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad    // Clear the unused ones
1054a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad    clearUnusedBits();
1055a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad  }
1056a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad
105798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// Set the given bit to 1 whose position is given as "bitPosition".
105898f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @brief Set a given bit to 1.
1059a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad  void setBit(unsigned bitPosition);
106098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
1061e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Set every bit to 0.
1062e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  void clearAllBits() {
1063e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer    if (isSingleWord())
10647a874ddda037349184fbeb22838cc11a1a9bb78fJay Foad      VAL = 0;
1065e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer    else
1066e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer      memset(pVal, 0, getNumWords() * APINT_WORD_SIZE);
10677a874ddda037349184fbeb22838cc11a1a9bb78fJay Foad  }
10683a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
106998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// Set the given bit to 0 whose position is given as "bitPosition".
10703a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @brief Set a given bit to 0.
107198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  void clearBit(unsigned bitPosition);
107298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
1073e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @brief Toggle every bit to its opposite value.
1074e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  void flipAllBits() {
1075e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer    if (isSingleWord())
10767a874ddda037349184fbeb22838cc11a1a9bb78fJay Foad      VAL ^= -1ULL;
1077e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer    else {
1078e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer      for (unsigned i = 0; i < getNumWords(); ++i)
10797a874ddda037349184fbeb22838cc11a1a9bb78fJay Foad        pVal[i] ^= -1ULL;
1080a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad    }
108198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    clearUnusedBits();
1082a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad  }
1083a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad
1084a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad  /// Toggle a given bit to its opposite value whose position is given
108598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// as "bitPosition".
1086a99793c5ea24dd3839f4925b89b1f6acfcb24604Jay Foad  /// @brief Toggles a given bit to its opposite value.
108798f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  void flipBit(unsigned bitPosition);
1088e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer
10893a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @}
1090e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @name Value Characterization Functions
1091e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @{
10927a874ddda037349184fbeb22838cc11a1a9bb78fJay Foad
1093e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// @returns the total number of bits.
10947ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  unsigned getBitWidth() const {
10957ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return BitWidth;
10967ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
10977ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
10987ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Here one word's bitwidth equals to that of uint64_t.
10999981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// @returns the number of words to hold the integer value of this APInt.
11003a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @brief Get the number of words.
11017ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  unsigned getNumWords() const {
11027ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return getNumWords(BitWidth);
11037ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
11047ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
11057ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// Here one word's bitwidth equals to that of uint64_t.
11069981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// @returns the number of words to hold the integer value with a
110717893a5fb6b3b4b9e84674dfb7692abb57410dd1Douglas Gregor  /// given bit width.
110817893a5fb6b3b4b9e84674dfb7692abb57410dd1Douglas Gregor  /// @brief Get the number of words.
110917893a5fb6b3b4b9e84674dfb7692abb57410dd1Douglas Gregor  static unsigned getNumWords(unsigned BitWidth) {
111017893a5fb6b3b4b9e84674dfb7692abb57410dd1Douglas Gregor    return (BitWidth + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD;
111117893a5fb6b3b4b9e84674dfb7692abb57410dd1Douglas Gregor  }
111217893a5fb6b3b4b9e84674dfb7692abb57410dd1Douglas Gregor
111317893a5fb6b3b4b9e84674dfb7692abb57410dd1Douglas Gregor  /// This function returns the number of active bits which is defined as the
111417893a5fb6b3b4b9e84674dfb7692abb57410dd1Douglas Gregor  /// bit width minus the number of leading zeros. This is used in several
11157ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// computations to see how "wide" the value is.
11168db6a445e679817d9972c44d2bc366732388c7b0Zhou Sheng  /// @brief Compute the number of active bits in the value
11178db6a445e679817d9972c44d2bc366732388c7b0Zhou Sheng  unsigned getActiveBits() const {
1118e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer    return BitWidth - countLeadingZeros();
1119e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  }
1120e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer
1121e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  /// This function returns the number of active words in the value of this
11229981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// APInt. This is used in conjunction with getActiveData to extract the raw
1123f31c784f2774311d1f7194ac4ca86262197a8099Reid Spencer  /// value of the APInt.
1124e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  unsigned getActiveWords() const {
1125d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    return whichWord(getActiveBits()-1) + 1;
11269d3c51923392f69b63512e59e44f72affbe6136eReid Spencer  }
11279d3c51923392f69b63512e59e44f72affbe6136eReid Spencer
11289d3c51923392f69b63512e59e44f72affbe6136eReid Spencer  /// Computes the minimum bit width for this APInt while considering it to be
11299981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// a signed (and probably negative) value. If the value is not negative,
113084b4eeccc70b39f975a82ad098413d129d38a7d3Reid Spencer  /// this function returns the same value as getActiveBits()+1. Otherwise, it
11319d3c51923392f69b63512e59e44f72affbe6136eReid Spencer  /// returns the smallest bit width that will retain the negative value. For
11329d3c51923392f69b63512e59e44f72affbe6136eReid Spencer  /// example, -1 can be written as 0b1 or 0xFFFFFFFFFF. 0b1 is shorter and so
11339d3c51923392f69b63512e59e44f72affbe6136eReid Spencer  /// for -1, this function will always return 1.
11343a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @brief Get the minimum bit size for this signed APInt
1135cdff51cabcebcd0eeb227ecf92eabbf8b1aeb77cDan Gohman  unsigned getMinSignedBits() const {
11369d3c51923392f69b63512e59e44f72affbe6136eReid Spencer    if (isNegative())
11379d3c51923392f69b63512e59e44f72affbe6136eReid Spencer      return BitWidth - countLeadingOnes() + 1;
11389d3c51923392f69b63512e59e44f72affbe6136eReid Spencer    return getActiveBits()+1;
11393a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  }
11409981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner
1141681dcd14e9d59c2070e3a298328db9aea6069480Reid Spencer  /// This method attempts to return the value of this APInt as a zero extended
1142681dcd14e9d59c2070e3a298328db9aea6069480Reid Spencer  /// uint64_t. The bitwidth must be <= 64 or the value must fit within a
1143cd3c4cac6ea3ce3bff0ce763d45c3f7a2d673178Chris Lattner  /// uint64_t. Otherwise an assertion will result.
1144681dcd14e9d59c2070e3a298328db9aea6069480Reid Spencer  /// @brief Get zero extended value
1145681dcd14e9d59c2070e3a298328db9aea6069480Reid Spencer  uint64_t getZExtValue() const {
114631a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer    if (isSingleWord())
114731a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer      return VAL;
114831a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer    assert(getActiveBits() <= 64 && "Too many bits for uint64_t");
114931a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer    return pVal[0];
1150c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman  }
1151d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
115231a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer  /// This method attempts to return the value of this APInt as a sign extended
115331a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer  /// int64_t. The bit width must be <= 64 or the value must fit within an
115431a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer  /// int64_t. Otherwise an assertion will result.
115531a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer  /// @brief Get sign extended value
115631a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer  int64_t getSExtValue() const {
115731a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer    if (isSingleWord())
115831a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer      return int64_t(VAL << (APINT_BITS_PER_WORD - BitWidth)) >>
115931a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer                     (APINT_BITS_PER_WORD - BitWidth);
116031a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer    assert(getMinSignedBits() <= 64 && "Too many bits for int64_t");
1161c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman    return int64_t(pVal[0]);
116231a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer  }
11633a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
116431a81f0190179b19dc72302dfea05cd1c2f0d22eReid Spencer  /// This method determines how many bits are required to hold the APInt
11653864cd4cab956526b99b634e15e7fd5d5441e3a7Eli Friedman  /// equivalent of the string given by \arg str.
1166946bca5bae2539ca55f8fb4700bff8b5e3f5a7ebReid Spencer  /// @brief Get bits required for string value.
1167d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  static unsigned getBitsNeeded(StringRef str, uint8_t radix);
116857ae4f5f01b6f8edf678d77ab935f3662993065dReid Spencer
116957ae4f5f01b6f8edf678d77ab935f3662993065dReid Spencer  /// countLeadingZeros - This function is an APInt version of the
1170689ad6ef3fd2e89394f1e8860dfebfe56b73c3daDaniel Dunbar  /// countLeadingZeros_{32,64} functions in MathExtras.h. It counts the number
117157ae4f5f01b6f8edf678d77ab935f3662993065dReid Spencer  /// of zeros from the most significant bit to the first one bit.
117238e59891ee4417a9be2f8146ce0ba3269e38ac21Benjamin Kramer  /// @returns BitWidth if the value is zero.
117357ae4f5f01b6f8edf678d77ab935f3662993065dReid Spencer  /// @returns the number of zeros from the most significant bit to the first
1174c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer  /// one bits.
1175c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer  unsigned countLeadingZeros() const {
1176c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer    if (isSingleWord()) {
11779e513acd3145036bd06b5e0f5bcc83a3e5c08854Chris Lattner      unsigned unusedBits = APINT_BITS_PER_WORD - BitWidth;
1178d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng      return CountLeadingZeros_64(VAL) - unusedBits;
1179d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    }
11809981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner    return countLeadingZerosSlowCase();
118198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  }
11829981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner
118398f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// countLeadingOnes - This function is an APInt version of the
118498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// countLeadingOnes_{32,64} functions in MathExtras.h. It counts the number
118598f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// of ones from the most significant bit to the first zero bit.
118698f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// @returns 0 if the high order bit is not set
1187d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @returns the number of 1 bits from the most significant to the least
118842dd77f20702d5ca1e0f3882ad74e7a02fc9589cDan Gohman  /// @brief Count the number of leading one bits.
118942dd77f20702d5ca1e0f3882ad74e7a02fc9589cDan Gohman  unsigned countLeadingOnes() const;
119042dd77f20702d5ca1e0f3882ad74e7a02fc9589cDan Gohman
1191681dcd14e9d59c2070e3a298328db9aea6069480Reid Spencer  /// countTrailingZeros - This function is an APInt version of the
1192681dcd14e9d59c2070e3a298328db9aea6069480Reid Spencer  /// countTrailingZeros_{32,64} functions in MathExtras.h. It counts
1193681dcd14e9d59c2070e3a298328db9aea6069480Reid Spencer  /// the number of zeros from the least significant bit to the first set bit.
11949981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// @returns BitWidth if the value is zero.
1195681dcd14e9d59c2070e3a298328db9aea6069480Reid Spencer  /// @returns the number of zeros from the least significant bit to the first
11969b6af8de58140566a0e6567508bf906027422e7cCameron Zwarich  /// one bit.
11979b6af8de58140566a0e6567508bf906027422e7cCameron Zwarich  /// @brief Count the number of trailing zero bits.
11989b6af8de58140566a0e6567508bf906027422e7cCameron Zwarich  unsigned countTrailingZeros() const;
11999b6af8de58140566a0e6567508bf906027422e7cCameron Zwarich
12009b6af8de58140566a0e6567508bf906027422e7cCameron Zwarich  /// countTrailingOnes - This function is an APInt version of the
12019b6af8de58140566a0e6567508bf906027422e7cCameron Zwarich  /// countTrailingOnes_{32,64} functions in MathExtras.h. It counts
12023a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// the number of ones from the least significant bit to the first zero bit.
12033a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @returns BitWidth if the value is all ones.
12049e513acd3145036bd06b5e0f5bcc83a3e5c08854Chris Lattner  /// @returns the number of ones from the least significant bit to the first
12059e513acd3145036bd06b5e0f5bcc83a3e5c08854Chris Lattner  /// zero bit.
1206d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// @brief Count the number of trailing one bits.
1207d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  unsigned countTrailingOnes() const {
1208c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer    if (isSingleWord())
12099981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner      return CountTrailingOnes_64(VAL);
1210d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    return countTrailingOnesSlowCase();
12113a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  }
12123a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
121342dd77f20702d5ca1e0f3882ad74e7a02fc9589cDan Gohman  /// countPopulation - This function is an APInt version of the
121442dd77f20702d5ca1e0f3882ad74e7a02fc9589cDan Gohman  /// countPopulation_{32,64} functions in MathExtras.h. It counts the number
121542dd77f20702d5ca1e0f3882ad74e7a02fc9589cDan Gohman  /// of 1 bits in the APInt value.
121642dd77f20702d5ca1e0f3882ad74e7a02fc9589cDan Gohman  /// @returns 0 if the value is zero.
121742dd77f20702d5ca1e0f3882ad74e7a02fc9589cDan Gohman  /// @returns the number of set bits.
12189981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// @brief Count the number of bits set.
121998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  unsigned countPopulation() const {
122098f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    if (isSingleWord())
122198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner      return CountPopulation_64(VAL);
122298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner    return countPopulationSlowCase();
122342dd77f20702d5ca1e0f3882ad74e7a02fc9589cDan Gohman  }
1224c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer
1225c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer  /// @}
12263a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// @name Conversion Functions
1227c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer  /// @{
1228d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  void print(raw_ostream &OS, bool isSigned) const;
1229c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer
12309981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// toString - Converts an APInt to a string and append it to Str.  Str is
123198f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// commonly a SmallString.
123298f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  void toString(SmallVectorImpl<char> &Str, unsigned Radix, bool Signed) const;
123398f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner
123498f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// Considers the APInt to be unsigned and converts it into a string in the
1235d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  /// radix given. The radix can be 2, 8, 10 or 16.
12367ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  void toStringUnsigned(SmallVectorImpl<char> &Str, unsigned Radix = 10) const {
12377ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    toString(Str, Radix, false);
12387ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
1239944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner
12403a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  /// Considers the APInt to be signed and converts it into a string in the
1241fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  /// radix given. The radix can be 2, 8, 10 or 16.
1242fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  void toStringSigned(SmallVectorImpl<char> &Str, unsigned Radix = 10) const {
1243fad86b003a839cef40ec8ce8408322f4913368caChris Lattner    toString(Str, Radix, true);
12447ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
12457ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
12467ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// toString - This returns the APInt as a std::string.  Note that this is an
1247fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  /// inefficient method.  It is better to pass in a SmallVector/SmallString
1248af9b6b264f2bf4315c25b286a1c24331038545e0Bill Wendling  /// to the methods above to avoid thrashing the heap for the string.
1249e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  std::string toString(unsigned Radix, bool Signed) const;
1250d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
1251df99c29e7b25771d202b969ca5dec359a62897b1Duncan Sands
12527ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns a byte-swapped representation of this APInt Value.
1253fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  APInt byteSwap() const;
1254af9b6b264f2bf4315c25b286a1c24331038545e0Bill Wendling
1255ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng  /// @brief Converts this APInt to a double value.
12563a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  double roundToDouble(bool isSigned) const;
1257fad86b003a839cef40ec8ce8408322f4913368caChris Lattner
1258fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  /// @brief Converts this unsigned APInt to a double value.
1259fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  double roundToDouble() const {
1260fad86b003a839cef40ec8ce8408322f4913368caChris Lattner    return roundToDouble(false);
12613a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman  }
1262ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng
1263ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng  /// @brief Converts this signed APInt to a double value.
1264e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  double signedRoundToDouble() const {
1265ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng    return roundToDouble(true);
1266d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng  }
126766ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer
126866ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer  /// The conversion does not do a translation from integer to double, it just
126966ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer  /// re-interprets the bits as a double. Note that it is valid to do this on
127066ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer  /// any bit width. Exactly 64 bits will be translated.
127166ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer  /// @brief Converts APInt bits to a double
127266ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer  double bitsToDouble() const {
1273ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng    union {
127466ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer      uint64_t I;
127566ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer      double D;
127666ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer    } T;
127766ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer    T.I = (isSingleWord() ? VAL : pVal[0]);
1278af8fb1984674db462bc6923ed54db0275c78b711Reid Spencer    return T.D;
1279ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  }
1280ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer
1281ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  /// The conversion does not do a translation from integer to float, it just
1282ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  /// re-interprets the bits as a float. Note that it is valid to do this on
1283ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  /// any bit width. Exactly 32 bits will be translated.
1284ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  /// @brief Converts APInt bits to a double
1285ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  float bitsToFloat() const {
1286ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer    union {
1287ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer      unsigned I;
1288ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer      float F;
1289ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer    } T;
1290ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer    T.I = unsigned((isSingleWord() ? VAL : pVal[0]));
1291ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer    return T.F;
1292ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  }
1293ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer
1294ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  /// The conversion does not do a translation from double to integer, it just
1295ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  /// re-interprets the bits of the double.
1296ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  /// @brief Converts a double to APInt bits.
1297ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  static APInt doubleToBits(double V) {
12989981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner    union {
1299ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer      uint64_t I;
1300ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer      double D;
13019981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner    } T;
1302ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer    T.D = V;
1303ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer    return APInt(sizeof T * CHAR_BIT, T.I);
1304ab2ed8ec850b6dd9b152ab936d70b7376903168aReid Spencer  }
130553ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer
1306e4d19c9eb22899c9a555395d446a9ceef3bea7ebJay Foad  /// The conversion does not do a translation from float to integer, it just
130753ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer  /// re-interprets the bits of the float.
1308e4d19c9eb22899c9a555395d446a9ceef3bea7ebJay Foad  /// @brief Converts a float to APInt bits.
130953ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer  static APInt floatToBits(float V) {
131053ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer    union {
131153ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer      unsigned I;
131253ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer      float F;
131353ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer    } T;
1314e4d19c9eb22899c9a555395d446a9ceef3bea7ebJay Foad    T.F = V;
131553ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer    return APInt(sizeof T * CHAR_BIT, T.I);
131653ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer  }
131753ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer
1318e4d19c9eb22899c9a555395d446a9ceef3bea7ebJay Foad  /// @}
131953ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer  /// @name Mathematics Operations
1320e4d19c9eb22899c9a555395d446a9ceef3bea7ebJay Foad  /// @{
132153ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer
13229981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  /// @returns the floor log base 2 of this APInt.
132353ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer  unsigned logBase2() const {
132453ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer    return BitWidth - 1 - countLeadingZeros();
132553ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer  }
1326e4d19c9eb22899c9a555395d446a9ceef3bea7ebJay Foad
132753ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer  /// @returns the ceil log base 2 of this APInt.
132853ee4f9d4083ce5106d95ab23985570a1f7413e5Reid Spencer  unsigned ceilLogBase2() const {
13297ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return BitWidth - (*this - 1).countLeadingZeros();
13307ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  }
13317ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer
13327ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// @returns the log base 2 of this APInt if its an exact power of two, -1
13337ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  /// otherwise
13349981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  int32_t exactLogBase2() const {
13357ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    if (!isPowerOf2())
13367ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer      return -1;
13377ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer    return logBase2();
1338cbc7cc63b6c7ee1008f92064388c37327c183328Dan Gohman  }
1339cbc7cc63b6c7ee1008f92064388c37327c183328Dan Gohman
1340cbc7cc63b6c7ee1008f92064388c37327c183328Dan Gohman  /// @brief Compute the square root
1341cbc7cc63b6c7ee1008f92064388c37327c183328Dan Gohman  APInt sqrt() const;
1342cbc7cc63b6c7ee1008f92064388c37327c183328Dan Gohman
134319dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  /// If *this is < 0 then return -(*this), otherwise *this;
134419dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  /// @brief Get the absolute value;
1345c9525263f6c519d987209eb39e33a73165c526d6Dan Gohman  APInt abs() const {
134619dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer    if (isNegative())
134719dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer      return -(*this);
134819dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer    return *this;
134919dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer  }
135019dc32a2d422ac0aafd047514e3e5e727796696eReid Spencer
1351af8fb1984674db462bc6923ed54db0275c78b711Reid Spencer  /// @returns the multiplicative inverse for a given modulo.
1352af8fb1984674db462bc6923ed54db0275c78b711Reid Spencer  APInt multiplicativeInverse(const APInt& modulo) const;
1353b45a221348ee8693f1bff2df7b42689497083d41Reid Spencer
1354b45a221348ee8693f1bff2df7b42689497083d41Reid Spencer  /// @}
1355b45a221348ee8693f1bff2df7b42689497083d41Reid Spencer  /// @name Support for division by constant
1356b45a221348ee8693f1bff2df7b42689497083d41Reid Spencer  /// @{
1357b45a221348ee8693f1bff2df7b42689497083d41Reid Spencer
1358b45a221348ee8693f1bff2df7b42689497083d41Reid Spencer  /// Calculate the magic number for signed division by a constant.
1359b45a221348ee8693f1bff2df7b42689497083d41Reid Spencer  struct ms;
1360b45a221348ee8693f1bff2df7b42689497083d41Reid Spencer  ms magic() const;
1361fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1362300c6c5167d2869d1568d783d0e3e48bf4b03a6cWojciech Matyjewicz  /// Calculate the magic number for unsigned division by a constant.
1363300c6c5167d2869d1568d783d0e3e48bf4b03a6cWojciech Matyjewicz  struct mu;
1364300c6c5167d2869d1568d783d0e3e48bf4b03a6cWojciech Matyjewicz  mu magicu() const;
1365fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
13664e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  /// @}
13674e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  /// @name Building-block Operations for APInt and APFloat
13684e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  /// @{
13694e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad
13704e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  // These building block operations operate on a representation of
13714e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  // arbitrary precision, two's-complement, bignum integer values.
13724e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  // They should be sufficient to implement APInt and APFloat bignum
13734e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  // requirements.  Inputs are generally a pointer to the base of an
13744e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  // array of integer parts, representing an unsigned bignum, and a
13754e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  // count of how many parts there are.
13764e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad
13774e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  /// Sets the least significant part of a bignum to the input value,
1378fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// and zeroes out higher parts.  */
1379fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcSet(integerPart *, integerPart, unsigned int);
1380fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1381fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Assign one bignum to another.
1382fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcAssign(integerPart *, const integerPart *, unsigned int);
1383fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1384fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Returns true if a bignum is zero, false otherwise.
1385fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static bool tcIsZero(const integerPart *, unsigned int);
1386fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1387fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Extract the given bit of a bignum; returns 0 or 1.  Zero-based.
1388fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static int tcExtractBit(const integerPart *, unsigned int bit);
1389fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1390fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Copy the bit vector of width srcBITS from SRC, starting at bit
1391fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// srcLSB, to DST, of dstCOUNT parts, such that the bit srcLSB
1392fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// becomes the least significant bit of DST.  All high bits above
1393fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// srcBITS in DST are zero-filled.
1394fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcExtract(integerPart *, unsigned int dstCount,
1395fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                        const integerPart *,
1396fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                        unsigned int srcBits, unsigned int srcLSB);
1397fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1398fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Set the given bit of a bignum.  Zero-based.
1399fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcSetBit(integerPart *, unsigned int bit);
1400fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
140168e53ad6cb0a9d64d256f9dcef70331cd72d795eNeil Booth  /// Clear the given bit of a bignum.  Zero-based.
140268e53ad6cb0a9d64d256f9dcef70331cd72d795eNeil Booth  static void tcClearBit(integerPart *, unsigned int bit);
140368e53ad6cb0a9d64d256f9dcef70331cd72d795eNeil Booth
140468e53ad6cb0a9d64d256f9dcef70331cd72d795eNeil Booth  /// Returns the bit number of the least or most significant set bit
1405a2769a33c94f021a609a462b28ebea069eba6f74Misha Brukman  /// of a number.  If the input number has no bits set -1U is
1406a2769a33c94f021a609a462b28ebea069eba6f74Misha Brukman  /// returned.
140768e53ad6cb0a9d64d256f9dcef70331cd72d795eNeil Booth  static unsigned int tcLSB(const integerPart *, unsigned int);
140868e53ad6cb0a9d64d256f9dcef70331cd72d795eNeil Booth  static unsigned int tcMSB(const integerPart *parts, unsigned int n);
1409fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1410fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Negate a bignum in-place.
1411fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcNegate(integerPart *, unsigned int);
1412e12b73816b50bbe2cc54b8005d86c95413b4f465John McCall
1413e12b73816b50bbe2cc54b8005d86c95413b4f465John McCall  /// DST += RHS + CARRY where CARRY is zero or one.  Returns the
1414e12b73816b50bbe2cc54b8005d86c95413b4f465John McCall  /// carry flag.
1415fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static integerPart tcAdd(integerPart *, const integerPart *,
1416fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                           integerPart carry, unsigned);
1417fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1418fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// DST -= RHS + CARRY where CARRY is zero or one.  Returns the
141998f8ccfad06c8928d899f506731987f951b2ebe4Chris Lattner  /// carry flag.
1420fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static integerPart tcSubtract(integerPart *, const integerPart *,
1421fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                                integerPart carry, unsigned);
1422fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1423fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///  DST += SRC * MULTIPLIER + PART   if add is true
1424fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///  DST  = SRC * MULTIPLIER + PART   if add is false
1425fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///
1426fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///  Requires 0 <= DSTPARTS <= SRCPARTS + 1.  If DST overlaps SRC
1427e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling  ///  they must start at the same point, i.e. DST == SRC.
1428fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///
1429fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///  If DSTPARTS == SRC_PARTS + 1 no overflow occurs and zero is
1430fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///  returned.  Otherwise DST is filled with the least significant
1431fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///  DSTPARTS parts of the result, and if all of the omitted higher
1432e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling  ///  parts were zero return zero, otherwise overflow occurred and
1433fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///  return one.
1434fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static int tcMultiplyPart(integerPart *dst, const integerPart *src,
1435fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                            integerPart multiplier, integerPart carry,
1436fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                            unsigned int srcParts, unsigned int dstParts,
1437fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                            bool add);
1438fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1439fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// DST = LHS * RHS, where DST has the same width as the operands
1440fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// and is filled with the least significant parts of the result.
1441fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Returns one if overflow occurred, otherwise zero.  DST must be
1442fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// disjoint from both operands.
1443fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static int tcMultiply(integerPart *, const integerPart *,
1444fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                        const integerPart *, unsigned);
1445fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1446e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling  /// DST = LHS * RHS, where DST has width the sum of the widths of
1447e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling  /// the operands.  No overflow occurs.  DST must be disjoint from
1448e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling  /// both operands. Returns the number of parts required to hold the
1449fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// result.
1450fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static unsigned int tcFullMultiply(integerPart *, const integerPart *,
1451fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                                     const integerPart *, unsigned, unsigned);
1452fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1453fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// If RHS is zero LHS and REMAINDER are left unchanged, return one.
1454fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Otherwise set LHS to LHS / RHS with the fractional part
1455e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling  /// discarded, set REMAINDER to the remainder, return zero.  i.e.
1456fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  ///
1457978661d05301a9bcd1222c048affef679da5ac43Neil Booth  ///  OLD_LHS = RHS * LHS + REMAINDER
1458978661d05301a9bcd1222c048affef679da5ac43Neil Booth  ///
1459978661d05301a9bcd1222c048affef679da5ac43Neil Booth  ///  SCRATCH is a bignum of the same size as the operands and result
1460978661d05301a9bcd1222c048affef679da5ac43Neil Booth  ///  for use by the routine; its contents need not be initialized
1461978661d05301a9bcd1222c048affef679da5ac43Neil Booth  ///  and are destroyed.  LHS, REMAINDER and SCRATCH must be
1462e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling  ///  distinct.
1463fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static int tcDivide(integerPart *lhs, const integerPart *rhs,
1464fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                      integerPart *remainder, integerPart *scratch,
1465fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                      unsigned int parts);
1466fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1467fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Shift a bignum left COUNT bits.  Shifted in bits are zero.
1468fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// There are no restrictions on COUNT.
1469fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcShiftLeft(integerPart *, unsigned int parts,
1470fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                          unsigned int count);
1471fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1472fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Shift a bignum right COUNT bits.  Shifted in bits are zero.
1473fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// There are no restrictions on COUNT.
1474fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcShiftRight(integerPart *, unsigned int parts,
1475e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling                           unsigned int count);
1476e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling
1477fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// The obvious AND, OR and XOR and complement operations.
1478fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcAnd(integerPart *, const integerPart *, unsigned int);
1479fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcOr(integerPart *, const integerPart *, unsigned int);
1480fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcXor(integerPart *, const integerPart *, unsigned int);
1481e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling  static void tcComplement(integerPart *, unsigned int);
1482fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1483fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Comparison (unsigned) of two bignums.
1484fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static int tcCompare(const integerPart *, const integerPart *,
1485fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                       unsigned int);
1486e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling
1487fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Increment a bignum in-place.  Return the carry flag.
1488fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static integerPart tcIncrement(integerPart *, unsigned int);
1489fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1490fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// Set the least significant BITS and clear the rest.
1491fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  static void tcSetLeastSignificantBits(integerPart *, unsigned int,
1492fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner                                        unsigned int bits);
14933a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
1494fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// @brief debug method
1495fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  void dump() const;
1496e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling
1497fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  /// @}
1498fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner};
1499fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner
1500fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner/// Magic data for optimising signed division by a constant.
1501fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattnerstruct APInt::ms {
1502fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner  APInt m;  ///< magic number
1503e85fe660e4e99d30ca9292b706b8ffe6d0367dcaBill Wendling  unsigned s;  ///< shift amount
1504fe8e14a6c99261cfe9238c35761083cb4c99cc6aChris Lattner};
15059e3d3abd937c9bb79d56d25ec0e0724c7cbba67cDale Johannesen
15069e3d3abd937c9bb79d56d25ec0e0724c7cbba67cDale Johannesen/// Magic data for optimising unsigned division by a constant.
15079e3d3abd937c9bb79d56d25ec0e0724c7cbba67cDale Johannesenstruct APInt::mu {
15087ac2f81e49442f76e3427227fb1e300ce60fceb4Reid Spencer  APInt m;     ///< magic number
1509d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  bool a;      ///< add indicator
1510d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  unsigned s;  ///< shift amount
15114e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad};
15124e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad
15134e5ea553d055512b0b8aa098e363ae17bafda957Jay Foadinline bool operator==(uint64_t V1, const APInt& V2) {
15144e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  return V2 == V1;
15154e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad}
15164e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad
15174e5ea553d055512b0b8aa098e363ae17bafda957Jay Foadinline bool operator!=(uint64_t V1, const APInt& V2) {
15184e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  return V2 != V1;
15194e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad}
15204e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad
15214e5ea553d055512b0b8aa098e363ae17bafda957Jay Foadinline raw_ostream &operator<<(raw_ostream &OS, const APInt &I) {
15224e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  I.print(OS, true);
15234e5ea553d055512b0b8aa098e363ae17bafda957Jay Foad  return OS;
15249d3c51923392f69b63512e59e44f72affbe6136eReid Spencer}
15259d3c51923392f69b63512e59e44f72affbe6136eReid Spencer
15269d3c51923392f69b63512e59e44f72affbe6136eReid Spencernamespace APIntOps {
15279d3c51923392f69b63512e59e44f72affbe6136eReid Spencer
15289d3c51923392f69b63512e59e44f72affbe6136eReid Spencer/// @brief Determine the smaller of two APInts considered to be signed.
15299d3c51923392f69b63512e59e44f72affbe6136eReid Spencerinline APInt smin(const APInt &A, const APInt &B) {
15309d3c51923392f69b63512e59e44f72affbe6136eReid Spencer  return A.slt(B) ? A : B;
15319d3c51923392f69b63512e59e44f72affbe6136eReid Spencer}
1532944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner
1533fad86b003a839cef40ec8ce8408322f4913368caChris Lattner/// @brief Determine the larger of two APInts considered to be signed.
1534fad86b003a839cef40ec8ce8408322f4913368caChris Lattnerinline APInt smax(const APInt &A, const APInt &B) {
1535fad86b003a839cef40ec8ce8408322f4913368caChris Lattner  return A.sgt(B) ? A : B;
15363a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman}
15370b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
15380b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// @brief Determine the smaller of two APInts considered to be signed.
1539f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencerinline APInt umin(const APInt &A, const APInt &B) {
1540f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer  return A.ult(B) ? A : B;
1541f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer}
1542f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer
1543f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer/// @brief Determine the larger of two APInts considered to be unsigned.
1544f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencerinline APInt umax(const APInt &A, const APInt &B) {
1545f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer  return A.ugt(B) ? A : B;
1546f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer}
1547f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer
1548f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer/// @brief Check if the specified APInt has a N-bits unsigned integer value.
1549f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencerinline bool isIntN(unsigned N, const APInt& APIVal) {
1550f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer  return APIVal.isIntN(N);
1551f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer}
1552f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer
1553f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer/// @brief Check if the specified APInt has a N-bits signed integer value.
1554f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencerinline bool isSignedIntN(unsigned N, const APInt& APIVal) {
1555f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer  return APIVal.isSignedIntN(N);
1556f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer}
1557f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer
1558f2253449e24712e96f7bdb7b54c20ddca8d6bb51Reid Spencer/// @returns true if the argument APInt value is a sequence of ones
1559ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman/// starting at the least significant bit with the remainder zero.
15609981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattnerinline bool isMask(unsigned numBits, const APInt& APIVal) {
1561e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer  return numBits <= APIVal.getBitWidth() &&
1562d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng    APIVal == APInt::getLowBitsSet(APIVal.getBitWidth(), numBits);
1563d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng}
1564ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman
15659981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner/// @returns true if the argument APInt value contains a sequence of ones
1566ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman/// with the remainder zero.
1567ec646cfd07f1354364e0899561aabffef5b702fdDan Gohmaninline bool isShiftedMask(unsigned numBits, const APInt& APIVal) {
1568ec646cfd07f1354364e0899561aabffef5b702fdDan Gohman  return isMask(numBits, (APIVal - APInt(numBits,1)) | APIVal);
1569d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng}
1570d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
15719981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner/// @returns a byte-swapped representation of the specified APInt Value.
15728eab8a2798fe74c98703bdeac64661beea0b4dbcDuncan Sandsinline APInt byteSwap(const APInt& APIVal) {
15738eab8a2798fe74c98703bdeac64661beea0b4dbcDuncan Sands  return APIVal.byteSwap();
1574d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng}
1575d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
1576d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng/// @returns the floor log base 2 of the specified APInt value.
1577d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Shenginline unsigned logBase2(const APInt& APIVal) {
15789981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  return APIVal.logBase2();
1579e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer}
1580d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
1581d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng/// GreatestCommonDivisor - This function returns the greatest common
1582d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng/// divisor of the two APInt values using Euclid's algorithm.
1583e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// @returns the greatest common divisor of Val1 and Val2
1584e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// @brief Compute GCD of two APInt values.
1585ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou ShengAPInt GreatestCommonDivisor(const APInt& Val1, const APInt& Val2);
1586d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng
1587d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng/// Treats the APInt as an unsigned value for conversion purposes.
15889981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner/// @brief Converts the given APInt to a double value.
15893a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukmaninline double RoundAPIntToDouble(const APInt& APIVal) {
1590d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng  return APIVal.roundToDouble();
1591d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng}
1592c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer
1593300c6c5167d2869d1568d783d0e3e48bf4b03a6cWojciech Matyjewicz/// Treats the APInt as a signed value for conversion purposes.
1594c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer/// @brief Converts the given APInt to a double value.
1595c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencerinline double RoundSignedAPIntToDouble(const APInt& APIVal) {
1596c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer  return APIVal.signedRoundToDouble();
1597d0f285e212c47ac71af842bb39ea5364f1e556b4Zhou Sheng}
159866ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer
159966ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer/// @brief Converts the given APInt to a float vlalue.
160066ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencerinline float RoundAPIntToFloat(const APInt& APIVal) {
160166ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer  return float(RoundAPIntToDouble(APIVal));
160266ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer}
160366ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer
160466ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer/// Treast the APInt as a signed value for conversion purposes.
1605d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng/// @brief Converts the given APInt to a float value.
160666ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencerinline float RoundSignedAPIntToFloat(const APInt& APIVal) {
160766ed1099ff3591c61e008198bb5a30862e778fc0Reid Spencer  return float(APIVal.signedRoundToDouble());
1608d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng}
1609d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng
1610d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng/// RoundDoubleToAPInt - This function convert a double value to an APInt value.
1611e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// @brief Converts the given double value into a APInt.
1612e81d2dad2c54014d36c73573307db5852c5caf8eReid SpencerAPInt RoundDoubleToAPInt(double Double, unsigned width);
1613d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng
1614d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng/// RoundFloatToAPInt - Converts a float value into an APInt value.
161552f32d55665ef02e6ebe4518b0a1e2e2a4df0beaReid Spencer/// @brief Converts a float value into a APInt.
161652f32d55665ef02e6ebe4518b0a1e2e2a4df0beaReid Spencerinline APInt RoundFloatToAPInt(float Float, unsigned width) {
161752f32d55665ef02e6ebe4518b0a1e2e2a4df0beaReid Spencer  return RoundDoubleToAPInt(double(Float), width);
161852f32d55665ef02e6ebe4518b0a1e2e2a4df0beaReid Spencer}
161952f32d55665ef02e6ebe4518b0a1e2e2a4df0beaReid Spencer
162052f32d55665ef02e6ebe4518b0a1e2e2a4df0beaReid Spencer/// Arithmetic right-shift the APInt by shiftAmt.
1621c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer/// @brief Arithmetic right-shift function.
1622d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Shenginline APInt ashr(const APInt& LHS, unsigned shiftAmt) {
16239981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner  return LHS.ashr(shiftAmt);
1624d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng}
1625c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer
1626c68c2243dcb716bc117f41aa543ca8a41046df41Reid Spencer/// Logical right-shift the APInt by shiftAmt.
16279981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner/// @brief Logical right-shift function.
162852f32d55665ef02e6ebe4518b0a1e2e2a4df0beaReid Spencerinline APInt lshr(const APInt& LHS, unsigned shiftAmt) {
1629d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng  return LHS.lshr(shiftAmt);
1630d93f00c35dbd1ea415bb2b39435253aef9428d71Zhou Sheng}
16310b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
16320b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// Left-shift the APInt by shiftAmt.
16339981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner/// @brief Left-shift function.
1634e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencerinline APInt shl(const APInt& LHS, unsigned shiftAmt) {
1635ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng  return LHS.shl(shiftAmt);
16360b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng}
16370b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
16380b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// Signed divide APInt LHS by APInt RHS.
16399981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner/// @brief Signed division function for APInt.
1640e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencerinline APInt sdiv(const APInt& LHS, const APInt& RHS) {
1641ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng  return LHS.sdiv(RHS);
16420b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng}
16430b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
16440b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// Unsigned divide APInt LHS by APInt RHS.
16459981b1f15681a2a09c9953cf6773a3b839ead4e7Chris Lattner/// @brief Unsigned division function for APInt.
1646e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencerinline APInt udiv(const APInt& LHS, const APInt& RHS) {
1647ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng  return LHS.udiv(RHS);
16480b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng}
16490b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
16500b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// Signed remainder operation on APInt.
1651e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// @brief Function for signed remainder operation.
1652e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencerinline APInt srem(const APInt& LHS, const APInt& RHS) {
16530b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng  return LHS.srem(RHS);
16540b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng}
16550b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
16560b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// Unsigned remainder operation on APInt.
1657e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// @brief Function for unsigned remainder operation.
1658e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencerinline APInt urem(const APInt& LHS, const APInt& RHS) {
1659ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng  return LHS.urem(RHS);
16600b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng}
16610b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
16620b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// Performs multiplication on APInt values.
1663e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// @brief Function for multiplication operation.
1664e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencerinline APInt mul(const APInt& LHS, const APInt& RHS) {
16650b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng  return LHS * RHS;
16660b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng}
16670b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
16680b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// Performs addition on APInt values.
1669e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// @brief Function for addition operation.
1670e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencerinline APInt add(const APInt& LHS, const APInt& RHS) {
1671ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng  return LHS + RHS;
16720b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng}
16730b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
16740b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// Performs subtraction on APInt values.
1675e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// @brief Function for subtraction operation.
16760b706b18bd0a7760d971727460a1f26bff8289b0Zhou Shenginline APInt sub(const APInt& LHS, const APInt& RHS) {
16770b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng  return LHS - RHS;
16780b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng}
16790b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
16800b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// Performs bitwise AND operation on APInt LHS and
1681e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// APInt RHS.
16820b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// @brief Bitwise AND function for APInt.
16830b706b18bd0a7760d971727460a1f26bff8289b0Zhou Shenginline APInt And(const APInt& LHS, const APInt& RHS) {
16840b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng  return LHS & RHS;
16850b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng}
16860b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng
1687e81d2dad2c54014d36c73573307db5852c5caf8eReid Spencer/// Performs bitwise OR operation on APInt LHS and APInt RHS.
16880b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng/// @brief Bitwise OR function for APInt.
16890b706b18bd0a7760d971727460a1f26bff8289b0Zhou Shenginline APInt Or(const APInt& LHS, const APInt& RHS) {
16900b706b18bd0a7760d971727460a1f26bff8289b0Zhou Sheng  return LHS | RHS;
16913a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman}
1692ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng
1693ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng/// Performs bitwise XOR operation on APInt.
1694ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng/// @brief Bitwise XOR function for APInt.
1695ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Shenginline APInt Xor(const APInt& LHS, const APInt& RHS) {
1696ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng  return LHS ^ RHS;
1697ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng}
1698ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng
16993a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman/// Performs a bitwise complement operation on APInt.
1700ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng/// @brief Bitwise complement function.
1701ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Shenginline APInt Not(const APInt& APIVal) {
1702ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng  return ~APIVal;
1703ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng}
1704ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng
1705ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng} // End of APIntOps namespace
1706ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng
1707ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng} // End of llvm namespace
17083a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman
1709ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng#endif
1710ff4304f8243f55e2e5c63bc95517cd38ff9295e1Zhou Sheng