From fd2bb51f1ec3f53e5dd1e69eb48bf191b49edda4 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Tue, 8 Feb 2022 11:57:05 +0000 Subject: [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 --- llvm/unittests/ADT/APIntTest.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'llvm/unittests/ADT/APIntTest.cpp') 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); } } } -- cgit v1.1