Implement the getHighBitsSet and getLowBitsSet functions.
authorReid Spencer <rspencer@reidspencer.com>
Sat, 24 Mar 2007 23:05:35 +0000 (23:05 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Sat, 24 Mar 2007 23:05:35 +0000 (23:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35308 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/APInt.h

index 90564ef3f8b17b88adff64fcadb1202effea3787..31fac9608f833c98a6e56a20a9f7bb34f28a3c28 100644 (file)
@@ -346,13 +346,27 @@ public:
   /// @param numBits the bitwidth of the result
   /// @param hiBitsSet the number of high-order bits set in the result.
   /// @brief Get a value with high bits set
-  static APInt getHighBitsSet(uint32_t numBits, uint32_t hiBitsSet);
+  static APInt getHighBitsSet(uint32_t numBits, uint32_t hiBitsSet) {
+    assert(hiBitsSet <= numBits && "Too many bits to set!");
+    uint32_t mvBits = numBits - hiBitsSet;
+    // For small values, return quickly
+    if (numBits <= APINT_BITS_PER_WORD)
+      return APInt(numBits, ((1ULL << hiBitsSet) - 1) << mvBits);
+    APInt Result(numBits, 1);
+    return (APInt(numBits, 1).shl(hiBitsSet) - APInt(numBits, 1)).shl(mvBits);
+  }
 
   /// Constructs an APInt value that has the bottom loBitsSet bits set.
   /// @param numBits the bitwidth of the result
   /// @param loBitsSet the number of low-order bits set in the result.
   /// @brief Get a value with low bits set
-  static APInt getLowBitsSet(uint32_t numBits, uint32_t loBitsSet);
+  static APInt getLowBitsSet(uint32_t numBits, uint32_t loBitsSet) {
+    assert(loBitsSet <= numBits && "Too many bits to set!");
+    // For small values, return quickly
+    if (numBits <= APINT_BITS_PER_WORD)
+      return APInt(numBits, (1ULL << loBitsSet) - 1ULL);
+    return APInt(numBits, 1).shl(loBitsSet) - APInt(numBits, 1);
+  }
 
   /// The hash value is computed as the sum of the words and the bit width.
   /// @returns A hash value computed from the sum of the APInt words.