diff options
-rw-r--r-- | llvm/include/llvm/ADT/APInt.h | 22 | ||||
-rw-r--r-- | llvm/unittests/ADT/APIntTest.cpp | 21 |
2 files changed, 43 insertions, 0 deletions
diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h index af81d0bf418..8656ef2cdf4 100644 --- a/llvm/include/llvm/ADT/APInt.h +++ b/llvm/include/llvm/ADT/APInt.h @@ -510,6 +510,23 @@ public: return Res; } + /// \brief Get a value with upper bits starting at loBit set. + /// + /// Constructs an APInt value that has a contiguous range of bits set. The + /// bits from loBit (inclusive) to numBits (exclusive) will be set. All other + /// bits will be zero. For example, with parameters(32, 12) you would get + /// 0xFFFFF000. + /// + /// \param numBits the intended bit width of the result + /// \param loBit the index of the lowest bit to set. + /// + /// \returns An APInt value with the requested bits set. + static APInt getBitsSetFrom(unsigned numBits, unsigned loBit) { + APInt Res(numBits, 0); + Res.setBitsFrom(loBit); + return Res; + } + /// \brief Get a value with high bits set /// /// Constructs an APInt value that has the top hiBitsSet bits set. @@ -1222,6 +1239,11 @@ public: } } + /// Set the top bits starting from loBit. + void setBitsFrom(unsigned loBit) { + return setBits(loBit, BitWidth); + } + /// Set the bottom loBits bits. void setLowBits(unsigned loBits) { return setBits(0, loBits); diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp index ad0cf42fb31..b8cbf16f5a6 100644 --- a/llvm/unittests/ADT/APIntTest.cpp +++ b/llvm/unittests/ADT/APIntTest.cpp @@ -1584,6 +1584,16 @@ TEST(APIntTest, getBitsSet) { EXPECT_EQ(32u, i64hi32.countPopulation()); } +TEST(APIntTest, getBitsSetFrom) { + APInt i64hi31 = APInt::getBitsSetFrom(64, 33); + EXPECT_EQ(31u, i64hi31.countLeadingOnes()); + EXPECT_EQ(0u, i64hi31.countLeadingZeros()); + EXPECT_EQ(64u, i64hi31.getActiveBits()); + EXPECT_EQ(33u, i64hi31.countTrailingZeros()); + EXPECT_EQ(0u, i64hi31.countTrailingOnes()); + EXPECT_EQ(31u, i64hi31.countPopulation()); +} + TEST(APIntTest, setLowBits) { APInt i64lo32(64, 0); i64lo32.setLowBits(32); @@ -1704,3 +1714,14 @@ TEST(APIntTest, setHighBits) { EXPECT_EQ(0u, i32hi16.countTrailingOnes()); EXPECT_EQ(16u, i32hi16.countPopulation()); } + +TEST(APIntTest, setBitsFrom) { + APInt i64from63(64, 0); + i64from63.setBitsFrom(63); + EXPECT_EQ(1u, i64from63.countLeadingOnes()); + EXPECT_EQ(0u, i64from63.countLeadingZeros()); + EXPECT_EQ(64u, i64from63.getActiveBits()); + EXPECT_EQ(63u, i64from63.countTrailingZeros()); + EXPECT_EQ(0u, i64from63.countTrailingOnes()); + EXPECT_EQ(1u, i64from63.countPopulation()); +} |