Skip to content

Commit 99934da

Browse files
authored
[ADT] Introduce APInt::clearHighBits (#91938)
This patch addresses #90034 (comment).
1 parent 4b44502 commit 99934da

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

llvm/include/llvm/ADT/APInt.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,6 +1398,13 @@ class [[nodiscard]] APInt {
13981398
*this &= Keep;
13991399
}
14001400

1401+
/// Set top hiBits bits to 0.
1402+
void clearHighBits(unsigned hiBits) {
1403+
assert(hiBits <= BitWidth && "More bits than bitwidth");
1404+
APInt Keep = getLowBitsSet(BitWidth, BitWidth - hiBits);
1405+
*this &= Keep;
1406+
}
1407+
14011408
/// Set the sign bit to 0.
14021409
void clearSignBit() { clearBit(BitWidth - 1); }
14031410

llvm/unittests/ADT/APIntTest.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2534,6 +2534,71 @@ TEST(APIntTest, clearLowBits) {
25342534
EXPECT_EQ(16u, i32hi16.popcount());
25352535
}
25362536

2537+
TEST(APIntTest, clearHighBits) {
2538+
APInt i64hi32 = APInt::getAllOnes(64);
2539+
i64hi32.clearHighBits(32);
2540+
EXPECT_EQ(32u, i64hi32.countr_one());
2541+
EXPECT_EQ(0u, i64hi32.countr_zero());
2542+
EXPECT_EQ(32u, i64hi32.getActiveBits());
2543+
EXPECT_EQ(32u, i64hi32.countl_zero());
2544+
EXPECT_EQ(0u, i64hi32.countl_one());
2545+
EXPECT_EQ(32u, i64hi32.popcount());
2546+
2547+
APInt i128hi64 = APInt::getAllOnes(128);
2548+
i128hi64.clearHighBits(64);
2549+
EXPECT_EQ(64u, i128hi64.countr_one());
2550+
EXPECT_EQ(0u, i128hi64.countr_zero());
2551+
EXPECT_EQ(64u, i128hi64.getActiveBits());
2552+
EXPECT_EQ(64u, i128hi64.countl_zero());
2553+
EXPECT_EQ(0u, i128hi64.countl_one());
2554+
EXPECT_EQ(64u, i128hi64.popcount());
2555+
2556+
APInt i128hi24 = APInt::getAllOnes(128);
2557+
i128hi24.clearHighBits(104);
2558+
EXPECT_EQ(24u, i128hi24.countr_one());
2559+
EXPECT_EQ(0u, i128hi24.countr_zero());
2560+
EXPECT_EQ(24u, i128hi24.getActiveBits());
2561+
EXPECT_EQ(104u, i128hi24.countl_zero());
2562+
EXPECT_EQ(0u, i128hi24.countl_one());
2563+
EXPECT_EQ(24u, i128hi24.popcount());
2564+
2565+
APInt i128hi104 = APInt::getAllOnes(128);
2566+
i128hi104.clearHighBits(24);
2567+
EXPECT_EQ(104u, i128hi104.countr_one());
2568+
EXPECT_EQ(0u, i128hi104.countr_zero());
2569+
EXPECT_EQ(104u, i128hi104.getActiveBits());
2570+
EXPECT_EQ(24u, i128hi104.countl_zero());
2571+
EXPECT_EQ(0u, i128hi104.countl_one());
2572+
EXPECT_EQ(104u, i128hi104.popcount());
2573+
2574+
APInt i128hi0 = APInt::getAllOnes(128);
2575+
i128hi0.clearHighBits(128);
2576+
EXPECT_EQ(0u, i128hi0.countr_one());
2577+
EXPECT_EQ(128u, i128hi0.countr_zero());
2578+
EXPECT_EQ(0u, i128hi0.getActiveBits());
2579+
EXPECT_EQ(128u, i128hi0.countl_zero());
2580+
EXPECT_EQ(0u, i128hi0.countl_one());
2581+
EXPECT_EQ(0u, i128hi0.popcount());
2582+
2583+
APInt i80hi1 = APInt::getAllOnes(80);
2584+
i80hi1.clearHighBits(79);
2585+
EXPECT_EQ(1u, i80hi1.countr_one());
2586+
EXPECT_EQ(0u, i80hi1.countr_zero());
2587+
EXPECT_EQ(1u, i80hi1.getActiveBits());
2588+
EXPECT_EQ(79u, i80hi1.countl_zero());
2589+
EXPECT_EQ(0u, i80hi1.countl_one());
2590+
EXPECT_EQ(1u, i80hi1.popcount());
2591+
2592+
APInt i32hi16 = APInt::getAllOnes(32);
2593+
i32hi16.clearHighBits(16);
2594+
EXPECT_EQ(16u, i32hi16.countr_one());
2595+
EXPECT_EQ(0u, i32hi16.countr_zero());
2596+
EXPECT_EQ(16u, i32hi16.getActiveBits());
2597+
EXPECT_EQ(16u, i32hi16.countl_zero());
2598+
EXPECT_EQ(0u, i32hi16.countl_one());
2599+
EXPECT_EQ(16u, i32hi16.popcount());
2600+
}
2601+
25372602
TEST(APIntTest, abds) {
25382603
using APIntOps::abds;
25392604

0 commit comments

Comments
 (0)