From d067014f13871642888afde850cdc558c32f350c Mon Sep 17 00:00:00 2001 From: Liam Semeria <56208783+liamsemeria@users.noreply.github.com> Date: Mon, 19 May 2025 04:41:04 -0700 Subject: [APInt] Added APInt::clearBits() method (#137098) Added APInt::clearBits(unsigned loBit, unsigned hiBit) that clears bits within a certain range. Fixes #136550 --------- Co-authored-by: Simon Pilgrim --- llvm/unittests/ADT/APIntTest.cpp | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'llvm/unittests/ADT/APIntTest.cpp') diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp index b14366e..a58fbd6 100644 --- a/llvm/unittests/ADT/APIntTest.cpp +++ b/llvm/unittests/ADT/APIntTest.cpp @@ -2520,6 +2520,70 @@ TEST(APIntTest, setAllBits) { EXPECT_EQ(128u, i128.popcount()); } +TEST(APIntTest, clearBits) { + APInt i32 = APInt::getAllOnes(32); + i32.clearBits(1, 3); + EXPECT_EQ(1u, i32.countr_one()); + EXPECT_EQ(0u, i32.countr_zero()); + EXPECT_EQ(32u, i32.getActiveBits()); + EXPECT_EQ(0u, i32.countl_zero()); + EXPECT_EQ(29u, i32.countl_one()); + EXPECT_EQ(30u, i32.popcount()); + + i32.clearBits(15, 15); + EXPECT_EQ(1u, i32.countr_one()); + EXPECT_EQ(0u, i32.countr_zero()); + EXPECT_EQ(32u, i32.getActiveBits()); + EXPECT_EQ(0u, i32.countl_zero()); + EXPECT_EQ(29u, i32.countl_one()); + EXPECT_EQ(30u, i32.popcount()); + + i32.clearBits(28, 31); + EXPECT_EQ(1u, i32.countr_one()); + EXPECT_EQ(0u, i32.countr_zero()); + EXPECT_EQ(32u, i32.getActiveBits()); + EXPECT_EQ(0u, i32.countl_zero()); + EXPECT_EQ(1u, i32.countl_one()); + EXPECT_EQ(27u, i32.popcount()); + EXPECT_EQ(APInt(32, "8FFFFFF9", 16), i32); + + APInt i256 = APInt::getAllOnes(256); + i256.clearBits(10, 250); + EXPECT_EQ(10u, i256.countr_one()); + EXPECT_EQ(0u, i256.countr_zero()); + EXPECT_EQ(256u, i256.getActiveBits()); + EXPECT_EQ(0u, i256.countl_zero()); + EXPECT_EQ(6u, i256.countl_one()); + EXPECT_EQ(16u, i256.popcount()); + + APInt i311 = APInt::getAllOnes(311); + i311.clearBits(33, 99); + EXPECT_EQ(33u, i311.countr_one()); + EXPECT_EQ(0u, i311.countr_zero()); + EXPECT_EQ(311u, i311.getActiveBits()); + EXPECT_EQ(0u, i311.countl_zero()); + EXPECT_EQ(212u, i311.countl_one()); + EXPECT_EQ(245u, i311.popcount()); + + APInt i64hi32 = APInt::getAllOnes(64); + i64hi32.clearBits(0, 32); + EXPECT_EQ(32u, i64hi32.countl_one()); + EXPECT_EQ(0u, i64hi32.countl_zero()); + EXPECT_EQ(64u, i64hi32.getActiveBits()); + EXPECT_EQ(32u, i64hi32.countr_zero()); + EXPECT_EQ(0u, i64hi32.countr_one()); + EXPECT_EQ(32u, i64hi32.popcount()); + + i64hi32 = APInt::getAllOnes(64); + i64hi32.clearBits(32, 64); + EXPECT_EQ(32u, i64hi32.countr_one()); + EXPECT_EQ(0u, i64hi32.countr_zero()); + EXPECT_EQ(32u, i64hi32.getActiveBits()); + EXPECT_EQ(32u, i64hi32.countl_zero()); + EXPECT_EQ(0u, i64hi32.countl_one()); + EXPECT_EQ(32u, i64hi32.popcount()); +} + TEST(APIntTest, getLoBits) { APInt i32(32, 0xfa); i32.setHighBits(1); -- cgit v1.1