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