[APInt] Implement getLowBitsSet/getHighBitsSet/getBitsSet using setLowBits/setHighBits/setBits
This patch implements getLowBitsSet/getHighBitsSet/getBitsSet in terms of the new setLowBits/setHighBits/setBits methods by making an all 0s APInt and then calling the appropriate set method.
This also adds support to setBits to allow loBits/hiBits to be in the other order to match with getBitsSet behavior.
Differential Revision: https://reviews.llvm.org/D30563
llvm-svn: 297112
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index 8a9c4eb..ad0cf42 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -1557,6 +1557,24 @@
}
TEST(APIntTest, getHighBitsSet) {
+ APInt i64hi1lo1 = APInt::getBitsSet(64, 63, 1);
+ EXPECT_EQ(1u, i64hi1lo1.countLeadingOnes());
+ EXPECT_EQ(0u, i64hi1lo1.countLeadingZeros());
+ EXPECT_EQ(64u, i64hi1lo1.getActiveBits());
+ EXPECT_EQ(0u, i64hi1lo1.countTrailingZeros());
+ EXPECT_EQ(1u, i64hi1lo1.countTrailingOnes());
+ EXPECT_EQ(2u, i64hi1lo1.countPopulation());
+
+ APInt i127hi1lo1 = APInt::getBitsSet(127, 126, 1);
+ EXPECT_EQ(1u, i127hi1lo1.countLeadingOnes());
+ EXPECT_EQ(0u, i127hi1lo1.countLeadingZeros());
+ EXPECT_EQ(127u, i127hi1lo1.getActiveBits());
+ EXPECT_EQ(0u, i127hi1lo1.countTrailingZeros());
+ EXPECT_EQ(1u, i127hi1lo1.countTrailingOnes());
+ EXPECT_EQ(2u, i127hi1lo1.countPopulation());
+}
+
+TEST(APIntTest, getBitsSet) {
APInt i64hi32 = APInt::getHighBitsSet(64, 32);
EXPECT_EQ(32u, i64hi32.countLeadingOnes());
EXPECT_EQ(0u, i64hi32.countLeadingZeros());