aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/ADT/APIntTest.cpp
diff options
context:
space:
mode:
authorLiam Semeria <56208783+liamsemeria@users.noreply.github.com>2025-05-19 04:41:04 -0700
committerGitHub <noreply@github.com>2025-05-19 12:41:04 +0100
commitd067014f13871642888afde850cdc558c32f350c (patch)
tree2afe887e597b8dd3797e7a3a44bf11479f563bc5 /llvm/unittests/ADT/APIntTest.cpp
parent572add06012036366e02ff5fe6be8e0bd803b157 (diff)
downloadllvm-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.cpp64
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);