X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2FAPInt.h;h=56cd3ccf84e3ebd3b8d0058f6f5f13bf83ff4fdf;hb=670031666cf4dea0d122a0df2ec1d18822c225e4;hp=a309d7f99548f88697c5b269051728de94d19649;hpb=a2769a33c94f021a609a462b28ebea069eba6f74;p=oota-llvm.git diff --git a/include/llvm/ADT/APInt.h b/include/llvm/ADT/APInt.h index a309d7f9954..56cd3ccf84e 100644 --- a/include/llvm/ADT/APInt.h +++ b/include/llvm/ADT/APInt.h @@ -18,6 +18,7 @@ #include "llvm/Support/DataTypes.h" #include "llvm/Support/MathExtras.h" #include +#include #include #include @@ -81,7 +82,8 @@ class APInt { /// This enum is used to hold the constants we needed for APInt. enum { /// Bits in a word - APINT_BITS_PER_WORD = static_cast(sizeof(uint64_t)) * 8, + APINT_BITS_PER_WORD = static_cast(sizeof(uint64_t)) * + CHAR_BIT, /// Byte size of a word APINT_WORD_SIZE = static_cast(sizeof(uint64_t)) }; @@ -998,6 +1000,14 @@ public: /// @returns the number of words to hold the integer value of this APInt. /// @brief Get the number of words. unsigned getNumWords() const { + return getNumWords(BitWidth); + } + + /// Here one word's bitwidth equals to that of uint64_t. + /// @returns the number of words to hold the integer value with a + /// given bit width. + /// @brief Get the number of words. + static unsigned getNumWords(unsigned BitWidth) { return (BitWidth + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD; } @@ -1247,6 +1257,18 @@ public: /// @returns the multiplicative inverse for a given modulo. APInt multiplicativeInverse(const APInt& modulo) const; + /// @} + /// @name Support for division by constant + /// @{ + + /// Calculate the magic number for signed division by a constant. + struct ms; + ms magic() const; + + /// Calculate the magic number for unsigned division by a constant. + struct mu; + mu magicu() const; + /// @} /// @name Building-block Operations for APInt and APFloat /// @{ @@ -1378,6 +1400,19 @@ public: /// @} }; +/// Magic data for optimising signed division by a constant. +struct APInt::ms { + APInt m; ///< magic number + unsigned s; ///< shift amount +}; + +/// Magic data for optimising unsigned division by a constant. +struct APInt::mu { + APInt m; ///< magic number + bool a; ///< add indicator + unsigned s; ///< shift amount +}; + inline bool operator==(uint64_t V1, const APInt& V2) { return V2 == V1; } @@ -1391,6 +1426,8 @@ inline raw_ostream &operator<<(raw_ostream &OS, const APInt &I) { return OS; } +std::ostream &operator<<(std::ostream &o, const APInt &I); + namespace APIntOps { /// @brief Determine the smaller of two APInts considered to be signed.