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/Support/MathExtrasTest.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'llvm/unittests/Support/MathExtrasTest.cpp') diff --git a/llvm/unittests/Support/MathExtrasTest.cpp b/llvm/unittests/Support/MathExtrasTest.cpp index cf055c6..b9ed0df 100644 --- a/llvm/unittests/Support/MathExtrasTest.cpp +++ b/llvm/unittests/Support/MathExtrasTest.cpp @@ -180,6 +180,18 @@ TEST(MathExtras, isShiftedMask_32) { EXPECT_TRUE(isShiftedMask_32(0xf0000000)); EXPECT_TRUE(isShiftedMask_32(0xffff0000)); EXPECT_TRUE(isShiftedMask_32(0xff << 1)); + + unsigned MaskIdx, MaskLen; + EXPECT_FALSE(isShiftedMask_32(0x01010101, MaskIdx, MaskLen)); + EXPECT_TRUE(isShiftedMask_32(0xf0000000, MaskIdx, MaskLen)); + EXPECT_EQ(28, MaskIdx); + EXPECT_EQ(4, MaskLen); + EXPECT_TRUE(isShiftedMask_32(0xffff0000, MaskIdx, MaskLen)); + EXPECT_EQ(16, MaskIdx); + EXPECT_EQ(16, MaskLen); + EXPECT_TRUE(isShiftedMask_32(0xff << 1, MaskIdx, MaskLen)); + EXPECT_EQ(1, MaskIdx); + EXPECT_EQ(8, MaskLen); } TEST(MathExtras, isShiftedMask_64) { @@ -187,6 +199,18 @@ TEST(MathExtras, isShiftedMask_64) { EXPECT_TRUE(isShiftedMask_64(0xf000000000000000ull)); EXPECT_TRUE(isShiftedMask_64(0xffff000000000000ull)); EXPECT_TRUE(isShiftedMask_64(0xffull << 55)); + + unsigned MaskIdx, MaskLen; + EXPECT_FALSE(isShiftedMask_64(0x0101010101010101ull, MaskIdx, MaskLen)); + EXPECT_TRUE(isShiftedMask_64(0xf000000000000000ull, MaskIdx, MaskLen)); + EXPECT_EQ(60, MaskIdx); + EXPECT_EQ(4, MaskLen); + EXPECT_TRUE(isShiftedMask_64(0xffff000000000000ull, MaskIdx, MaskLen)); + EXPECT_EQ(48, MaskIdx); + EXPECT_EQ(16, MaskLen); + EXPECT_TRUE(isShiftedMask_64(0xffull << 55, MaskIdx, MaskLen)); + EXPECT_EQ(55, MaskIdx); + EXPECT_EQ(8, MaskLen); } TEST(MathExtras, isPowerOf2_32) { -- cgit v1.1