Index: llvm/include/llvm/ADT/APInt.h =================================================================== --- llvm/include/llvm/ADT/APInt.h +++ llvm/include/llvm/ADT/APInt.h @@ -605,7 +605,10 @@ /// \returns An APInt value with the requested bits set. static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit) { APInt Res(numBits, 0); - Res.setBits(loBit, hiBit); + if (loBit <= hiBit) + Res.setBits(loBit, hiBit); + else + Res.setBitsWithWrap(loBit, hiBit); return Res; } @@ -1430,6 +1433,13 @@ setBit(BitWidth - 1); } + /// Wrap version for setting the bits from loBit (inclusive) to hiBit (exclusive) to 1. + void setBitsWithWrap(unsigned loBit, unsigned hiBit) { + assert(loBit > hiBit && "loBit smaller than hiBit"); + setLowBits(hiBit); + setHighBits(BitWidth - loBit); + } + /// Set the bits from loBit (inclusive) to hiBit (exclusive) to 1. void setBits(unsigned loBit, unsigned hiBit) { assert(hiBit <= BitWidth && "hiBit out of range"); Index: llvm/unittests/ADT/APIntTest.cpp =================================================================== --- llvm/unittests/ADT/APIntTest.cpp +++ llvm/unittests/ADT/APIntTest.cpp @@ -2044,6 +2044,22 @@ EXPECT_EQ(1u, i127hi1lo1.countTrailingZeros()); EXPECT_EQ(0u, i127hi1lo1.countTrailingOnes()); EXPECT_EQ(125u, i127hi1lo1.countPopulation()); + + APInt i64hi1lo1wrap = APInt::getBitsSet(64, 63, 1); + EXPECT_EQ(1u, i64hi1lo1wrap.countLeadingOnes()); + EXPECT_EQ(0u, i64hi1lo1wrap.countLeadingZeros()); + EXPECT_EQ(64u, i64hi1lo1wrap.getActiveBits()); + EXPECT_EQ(0u, i64hi1lo1wrap.countTrailingZeros()); + EXPECT_EQ(1u, i64hi1lo1wrap.countTrailingOnes()); + EXPECT_EQ(2u, i64hi1lo1wrap.countPopulation()); + + APInt i127hi1lo1wrap = APInt::getBitsSet(127, 126, 1); + EXPECT_EQ(1u, i127hi1lo1wrap.countLeadingOnes()); + EXPECT_EQ(0u, i127hi1lo1wrap.countLeadingZeros()); + EXPECT_EQ(127u, i127hi1lo1wrap.getActiveBits()); + EXPECT_EQ(0u, i127hi1lo1wrap.countTrailingZeros()); + EXPECT_EQ(1u, i127hi1lo1wrap.countTrailingOnes()); + EXPECT_EQ(2u, i127hi1lo1wrap.countPopulation()); } TEST(APIntTest, getHighBitsSet) {