diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2022-02-08 11:57:05 +0000 | 
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2022-02-08 12:04:13 +0000 | 
| commit | fd2bb51f1ec3f53e5dd1e69eb48bf191b49edda4 (patch) | |
| tree | e7d98c9374e34954036564ef7b0083c3d387d0c2 /llvm/unittests/ADT/APIntTest.cpp | |
| parent | 83f9b13d8cc2dd148c8ff7c1c71584e1eb634b75 (diff) | |
| download | llvm-fd2bb51f1ec3f53e5dd1e69eb48bf191b49edda4.zip llvm-fd2bb51f1ec3f53e5dd1e69eb48bf191b49edda4.tar.gz llvm-fd2bb51f1ec3f53e5dd1e69eb48bf191b49edda4.tar.bz2 | |
[ADT] Add APInt/MathExtras isShiftedMask variant returning mask offset/length
In many cases, calls to isShiftedMask are immediately followed with checks to determine the size and position of the bitmask.
This patch adds variants of APInt::isShiftedMask, isShiftedMask_32 and isShiftedMask_64 that return these values as additional arguments.
I've updated a number of cases that were either performing seperate size/position calculations or had created their own local wrapper versions of these.
Differential Revision: https://reviews.llvm.org/D119019
Diffstat (limited to 'llvm/unittests/ADT/APIntTest.cpp')
| -rw-r--r-- | llvm/unittests/ADT/APIntTest.cpp | 22 | 
1 files changed, 22 insertions, 0 deletions
| diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp index 95cb213..566ceab 100644 --- a/llvm/unittests/ADT/APIntTest.cpp +++ b/llvm/unittests/ADT/APIntTest.cpp @@ -1746,21 +1746,43 @@ TEST(APIntTest, isShiftedMask) {    EXPECT_TRUE(APInt(32, 0xffff0000).isShiftedMask());    EXPECT_TRUE(APInt(32, 0xff << 1).isShiftedMask()); +  unsigned MaskIdx, MaskLen; +  EXPECT_FALSE(APInt(32, 0x01010101).isShiftedMask(MaskIdx, MaskLen)); +  EXPECT_TRUE(APInt(32, 0xf0000000).isShiftedMask(MaskIdx, MaskLen)); +  EXPECT_EQ(28, MaskIdx); +  EXPECT_EQ(4, MaskLen); +  EXPECT_TRUE(APInt(32, 0xffff0000).isShiftedMask(MaskIdx, MaskLen)); +  EXPECT_EQ(16, MaskIdx); +  EXPECT_EQ(16, MaskLen); +  EXPECT_TRUE(APInt(32, 0xff << 1).isShiftedMask(MaskIdx, MaskLen)); +  EXPECT_EQ(1, MaskIdx); +  EXPECT_EQ(8, MaskLen); +    for (int N : { 1, 2, 3, 4, 7, 8, 16, 32, 64, 127, 128, 129, 256 }) {      EXPECT_FALSE(APInt(N, 0).isShiftedMask()); +    EXPECT_FALSE(APInt(N, 0).isShiftedMask(MaskIdx, MaskLen));      APInt One(N, 1);      for (int I = 1; I < N; ++I) {        APInt MaskVal = One.shl(I) - 1;        EXPECT_TRUE(MaskVal.isShiftedMask()); +      EXPECT_TRUE(MaskVal.isShiftedMask(MaskIdx, MaskLen)); +      EXPECT_EQ(0, MaskIdx); +      EXPECT_EQ(I, MaskLen);      }      for (int I = 1; I < N - 1; ++I) {        APInt MaskVal = One.shl(I);        EXPECT_TRUE(MaskVal.isShiftedMask()); +      EXPECT_TRUE(MaskVal.isShiftedMask(MaskIdx, MaskLen)); +      EXPECT_EQ(I, MaskIdx); +      EXPECT_EQ(1, MaskLen);      }      for (int I = 1; I < N; ++I) {        APInt MaskVal = APInt::getHighBitsSet(N, I);        EXPECT_TRUE(MaskVal.isShiftedMask()); +      EXPECT_TRUE(MaskVal.isShiftedMask(MaskIdx, MaskLen)); +      EXPECT_EQ(N - I, MaskIdx); +      EXPECT_EQ(I, MaskLen);      }    }  } | 
