diff options
author | Liam Semeria <56208783+liamsemeria@users.noreply.github.com> | 2025-05-19 04:41:04 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-19 12:41:04 +0100 |
commit | d067014f13871642888afde850cdc558c32f350c (patch) | |
tree | 2afe887e597b8dd3797e7a3a44bf11479f563bc5 /llvm/unittests/ADT/APIntTest.cpp | |
parent | 572add06012036366e02ff5fe6be8e0bd803b157 (diff) | |
download | llvm-d067014f13871642888afde850cdc558c32f350c.zip llvm-d067014f13871642888afde850cdc558c32f350c.tar.gz llvm-d067014f13871642888afde850cdc558c32f350c.tar.bz2 |
[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-dev@redking.me.uk>
Diffstat (limited to 'llvm/unittests/ADT/APIntTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/APIntTest.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
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); |