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.
}
}
+ /// 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);
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);
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());
+}