[APInt] Rewrite getLoBits in a way that will do one less memory allocation in the...
authorCraig Topper <craig.topper@gmail.com>
Fri, 31 Mar 2017 18:48:14 +0000 (18:48 +0000)
committerCraig Topper <craig.topper@gmail.com>
Fri, 31 Mar 2017 18:48:14 +0000 (18:48 +0000)
llvm-svn: 299243

llvm/lib/Support/APInt.cpp
llvm/unittests/ADT/APIntTest.cpp

index 37ad30981d13fb01c57290eee9da225f4d29cda3..8ac881e4c7fec719882e0a856d1c47c223e712c7 100644 (file)
@@ -724,13 +724,14 @@ bool APInt::isSplat(unsigned SplatSizeInBits) const {
 
 /// This function returns the high "numBits" bits of this APInt.
 APInt APInt::getHiBits(unsigned numBits) const {
-  return APIntOps::lshr(*this, BitWidth - numBits);
+  return this->lshr(BitWidth - numBits);
 }
 
 /// This function returns the low "numBits" bits of this APInt.
 APInt APInt::getLoBits(unsigned numBits) const {
-  return APIntOps::lshr(APIntOps::shl(*this, BitWidth - numBits),
-                        BitWidth - numBits);
+  APInt Result(getLowBitsSet(BitWidth, numBits));
+  Result &= *this;
+  return Result;
 }
 
 unsigned APInt::countLeadingZerosSlowCase() const {
index f05cbb9d9152733039de03b1ce41e100ee23c9bd..51c6347cbe8005d257fabfa98075b31ad6b1595d 100644 (file)
@@ -1958,3 +1958,21 @@ TEST(APIntTest, setAllBits) {
   EXPECT_EQ(128u, i128.countTrailingOnes());
   EXPECT_EQ(128u, i128.countPopulation());
 }
+
+TEST(APIntTest, getLoBits) {
+  APInt i32(32, 0xfa);
+  i32.setHighBits(1);
+  EXPECT_EQ(0xa, i32.getLoBits(4));
+  APInt i128(128, 0xfa);
+  i128.setHighBits(1);
+  EXPECT_EQ(0xa, i128.getLoBits(4));
+}
+
+TEST(APIntTest, getHiBits) {
+  APInt i32(32, 0xfa);
+  i32.setHighBits(2);
+  EXPECT_EQ(0xc, i32.getHiBits(4));
+  APInt i128(128, 0xfa);
+  i128.setHighBits(2);
+  EXPECT_EQ(0xc, i128.getHiBits(4));
+}