xref: /llvm-project/llvm/unittests/ADT/BitTest.cpp (revision 0c4f53fcff794d8ad4b1b43443affc37c2061f55)
1134d017bSSimon Pilgrim //===- llvm/unittests/ADT/BitTest.cpp - <bit> tests ---===//
2134d017bSSimon Pilgrim //
3134d017bSSimon Pilgrim // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4134d017bSSimon Pilgrim // See https://llvm.org/LICENSE.txt for license information.
5134d017bSSimon Pilgrim // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6134d017bSSimon Pilgrim //
7134d017bSSimon Pilgrim //===----------------------------------------------------------------------===//
8134d017bSSimon Pilgrim 
9134d017bSSimon Pilgrim #include "llvm/ADT/bit.h"
10134d017bSSimon Pilgrim #include "gtest/gtest.h"
11134d017bSSimon Pilgrim #include <cstdint>
12134d017bSSimon Pilgrim #include <cstdlib>
13134d017bSSimon Pilgrim 
14134d017bSSimon Pilgrim using namespace llvm;
15134d017bSSimon Pilgrim 
16134d017bSSimon Pilgrim namespace {
17134d017bSSimon Pilgrim 
18134d017bSSimon Pilgrim TEST(BitTest, BitCast) {
19134d017bSSimon Pilgrim   static const uint8_t kValueU8 = 0x80;
20134d017bSSimon Pilgrim   EXPECT_TRUE(llvm::bit_cast<int8_t>(kValueU8) < 0);
21134d017bSSimon Pilgrim 
22134d017bSSimon Pilgrim   static const uint16_t kValueU16 = 0x8000;
23134d017bSSimon Pilgrim   EXPECT_TRUE(llvm::bit_cast<int16_t>(kValueU16) < 0);
24134d017bSSimon Pilgrim 
25134d017bSSimon Pilgrim   static const float kValueF32 = 5632.34f;
26134d017bSSimon Pilgrim   EXPECT_FLOAT_EQ(kValueF32,
27134d017bSSimon Pilgrim                   llvm::bit_cast<float>(llvm::bit_cast<uint32_t>(kValueF32)));
28134d017bSSimon Pilgrim 
29134d017bSSimon Pilgrim   static const double kValueF64 = 87987234.983498;
30134d017bSSimon Pilgrim   EXPECT_DOUBLE_EQ(kValueF64,
31134d017bSSimon Pilgrim                    llvm::bit_cast<double>(llvm::bit_cast<uint64_t>(kValueF64)));
32134d017bSSimon Pilgrim }
33134d017bSSimon Pilgrim 
34336a4e03SSimon Pilgrim TEST(BitTest, HasSingleBit) {
35336a4e03SSimon Pilgrim   EXPECT_FALSE(llvm::has_single_bit(0U));
36336a4e03SSimon Pilgrim   EXPECT_FALSE(llvm::has_single_bit(0ULL));
37336a4e03SSimon Pilgrim 
38336a4e03SSimon Pilgrim   EXPECT_FALSE(llvm::has_single_bit(~0U));
39336a4e03SSimon Pilgrim   EXPECT_FALSE(llvm::has_single_bit(~0ULL));
40336a4e03SSimon Pilgrim 
41336a4e03SSimon Pilgrim   EXPECT_TRUE(llvm::has_single_bit(1U));
42336a4e03SSimon Pilgrim   EXPECT_TRUE(llvm::has_single_bit(1ULL));
43336a4e03SSimon Pilgrim 
44336a4e03SSimon Pilgrim   static const int8_t kValueS8 = -128;
45336a4e03SSimon Pilgrim   EXPECT_TRUE(llvm::has_single_bit(static_cast<uint8_t>(kValueS8)));
46336a4e03SSimon Pilgrim 
47336a4e03SSimon Pilgrim   static const int16_t kValueS16 = -32768;
48336a4e03SSimon Pilgrim   EXPECT_TRUE(llvm::has_single_bit(static_cast<uint16_t>(kValueS16)));
49336a4e03SSimon Pilgrim }
50336a4e03SSimon Pilgrim 
51*0c4f53fcSKazu Hirata TEST(BitTest, CountlZero) {
52*0c4f53fcSKazu Hirata   uint8_t Z8 = 0;
53*0c4f53fcSKazu Hirata   uint16_t Z16 = 0;
54*0c4f53fcSKazu Hirata   uint32_t Z32 = 0;
55*0c4f53fcSKazu Hirata   uint64_t Z64 = 0;
56*0c4f53fcSKazu Hirata   EXPECT_EQ(8, llvm::countl_zero(Z8));
57*0c4f53fcSKazu Hirata   EXPECT_EQ(16, llvm::countl_zero(Z16));
58*0c4f53fcSKazu Hirata   EXPECT_EQ(32, llvm::countl_zero(Z32));
59*0c4f53fcSKazu Hirata   EXPECT_EQ(64, llvm::countl_zero(Z64));
60*0c4f53fcSKazu Hirata 
61*0c4f53fcSKazu Hirata   uint8_t NZ8 = 42;
62*0c4f53fcSKazu Hirata   uint16_t NZ16 = 42;
63*0c4f53fcSKazu Hirata   uint32_t NZ32 = 42;
64*0c4f53fcSKazu Hirata   uint64_t NZ64 = 42;
65*0c4f53fcSKazu Hirata   EXPECT_EQ(2, llvm::countl_zero(NZ8));
66*0c4f53fcSKazu Hirata   EXPECT_EQ(10, llvm::countl_zero(NZ16));
67*0c4f53fcSKazu Hirata   EXPECT_EQ(26, llvm::countl_zero(NZ32));
68*0c4f53fcSKazu Hirata   EXPECT_EQ(58, llvm::countl_zero(NZ64));
69*0c4f53fcSKazu Hirata 
70*0c4f53fcSKazu Hirata   EXPECT_EQ(8, llvm::countl_zero(0x00F000FFu));
71*0c4f53fcSKazu Hirata   EXPECT_EQ(8, llvm::countl_zero(0x00F12345u));
72*0c4f53fcSKazu Hirata   for (unsigned i = 0; i <= 30; ++i) {
73*0c4f53fcSKazu Hirata     EXPECT_EQ(int(31 - i), llvm::countl_zero(1u << i));
74*0c4f53fcSKazu Hirata   }
75*0c4f53fcSKazu Hirata 
76*0c4f53fcSKazu Hirata   EXPECT_EQ(8, llvm::countl_zero(0x00F1234500F12345ULL));
77*0c4f53fcSKazu Hirata   EXPECT_EQ(1, llvm::countl_zero(1ULL << 62));
78*0c4f53fcSKazu Hirata   for (unsigned i = 0; i <= 62; ++i) {
79*0c4f53fcSKazu Hirata     EXPECT_EQ(int(63 - i), llvm::countl_zero(1ULL << i));
80*0c4f53fcSKazu Hirata   }
81*0c4f53fcSKazu Hirata }
82*0c4f53fcSKazu Hirata 
83*0c4f53fcSKazu Hirata TEST(BitTest, CountrZero) {
84*0c4f53fcSKazu Hirata   uint8_t Z8 = 0;
85*0c4f53fcSKazu Hirata   uint16_t Z16 = 0;
86*0c4f53fcSKazu Hirata   uint32_t Z32 = 0;
87*0c4f53fcSKazu Hirata   uint64_t Z64 = 0;
88*0c4f53fcSKazu Hirata   EXPECT_EQ(8, llvm::countr_zero(Z8));
89*0c4f53fcSKazu Hirata   EXPECT_EQ(16, llvm::countr_zero(Z16));
90*0c4f53fcSKazu Hirata   EXPECT_EQ(32, llvm::countr_zero(Z32));
91*0c4f53fcSKazu Hirata   EXPECT_EQ(64, llvm::countr_zero(Z64));
92*0c4f53fcSKazu Hirata 
93*0c4f53fcSKazu Hirata   uint8_t NZ8 = 42;
94*0c4f53fcSKazu Hirata   uint16_t NZ16 = 42;
95*0c4f53fcSKazu Hirata   uint32_t NZ32 = 42;
96*0c4f53fcSKazu Hirata   uint64_t NZ64 = 42;
97*0c4f53fcSKazu Hirata   EXPECT_EQ(1, llvm::countr_zero(NZ8));
98*0c4f53fcSKazu Hirata   EXPECT_EQ(1, llvm::countr_zero(NZ16));
99*0c4f53fcSKazu Hirata   EXPECT_EQ(1, llvm::countr_zero(NZ32));
100*0c4f53fcSKazu Hirata   EXPECT_EQ(1, llvm::countr_zero(NZ64));
101*0c4f53fcSKazu Hirata }
102*0c4f53fcSKazu Hirata 
103*0c4f53fcSKazu Hirata TEST(BitTest, CountlOne) {
104*0c4f53fcSKazu Hirata   for (int i = 30; i >= 0; --i) {
105*0c4f53fcSKazu Hirata     // Start with all ones and unset some bit.
106*0c4f53fcSKazu Hirata     EXPECT_EQ(31 - i, llvm::countl_one(0xFFFFFFFF ^ (1 << i)));
107*0c4f53fcSKazu Hirata   }
108*0c4f53fcSKazu Hirata   for (int i = 62; i >= 0; --i) {
109*0c4f53fcSKazu Hirata     // Start with all ones and unset some bit.
110*0c4f53fcSKazu Hirata     EXPECT_EQ(63 - i, llvm::countl_one(0xFFFFFFFFFFFFFFFFULL ^ (1LL << i)));
111*0c4f53fcSKazu Hirata   }
112*0c4f53fcSKazu Hirata   for (int i = 30; i >= 0; --i) {
113*0c4f53fcSKazu Hirata     // Start with all ones and unset some bit.
114*0c4f53fcSKazu Hirata     EXPECT_EQ(31 - i, llvm::countl_one(0xFFFFFFFF ^ (1 << i)));
115*0c4f53fcSKazu Hirata   }
116*0c4f53fcSKazu Hirata }
117*0c4f53fcSKazu Hirata 
118*0c4f53fcSKazu Hirata TEST(BitTest, CountrOne) {
119*0c4f53fcSKazu Hirata   uint8_t AllOnes8 = ~(uint8_t)0;
120*0c4f53fcSKazu Hirata   uint16_t AllOnes16 = ~(uint16_t)0;
121*0c4f53fcSKazu Hirata   uint32_t AllOnes32 = ~(uint32_t)0;
122*0c4f53fcSKazu Hirata   uint64_t AllOnes64 = ~(uint64_t)0;
123*0c4f53fcSKazu Hirata   EXPECT_EQ(8, llvm::countr_one(AllOnes8));
124*0c4f53fcSKazu Hirata   EXPECT_EQ(16, llvm::countr_one(AllOnes16));
125*0c4f53fcSKazu Hirata   EXPECT_EQ(32, llvm::countr_one(AllOnes32));
126*0c4f53fcSKazu Hirata   EXPECT_EQ(64, llvm::countr_one(AllOnes64));
127*0c4f53fcSKazu Hirata 
128*0c4f53fcSKazu Hirata   uint8_t X8 = 6;
129*0c4f53fcSKazu Hirata   uint16_t X16 = 6;
130*0c4f53fcSKazu Hirata   uint32_t X32 = 6;
131*0c4f53fcSKazu Hirata   uint64_t X64 = 6;
132*0c4f53fcSKazu Hirata   EXPECT_EQ(0, llvm::countr_one(X8));
133*0c4f53fcSKazu Hirata   EXPECT_EQ(0, llvm::countr_one(X16));
134*0c4f53fcSKazu Hirata   EXPECT_EQ(0, llvm::countr_one(X32));
135*0c4f53fcSKazu Hirata   EXPECT_EQ(0, llvm::countr_one(X64));
136*0c4f53fcSKazu Hirata 
137*0c4f53fcSKazu Hirata   uint8_t Y8 = 23;
138*0c4f53fcSKazu Hirata   uint16_t Y16 = 23;
139*0c4f53fcSKazu Hirata   uint32_t Y32 = 23;
140*0c4f53fcSKazu Hirata   uint64_t Y64 = 23;
141*0c4f53fcSKazu Hirata   EXPECT_EQ(3, llvm::countr_one(Y8));
142*0c4f53fcSKazu Hirata   EXPECT_EQ(3, llvm::countr_one(Y16));
143*0c4f53fcSKazu Hirata   EXPECT_EQ(3, llvm::countr_one(Y32));
144*0c4f53fcSKazu Hirata   EXPECT_EQ(3, llvm::countr_one(Y64));
145*0c4f53fcSKazu Hirata }
146*0c4f53fcSKazu Hirata 
147134d017bSSimon Pilgrim TEST(BitTest, PopCount) {
148134d017bSSimon Pilgrim   EXPECT_EQ(0, llvm::popcount(0U));
149134d017bSSimon Pilgrim   EXPECT_EQ(0, llvm::popcount(0ULL));
150134d017bSSimon Pilgrim 
151134d017bSSimon Pilgrim   EXPECT_EQ(32, llvm::popcount(~0U));
152134d017bSSimon Pilgrim   EXPECT_EQ(64, llvm::popcount(~0ULL));
153134d017bSSimon Pilgrim 
154134d017bSSimon Pilgrim   for (int I = 0; I != 32; ++I)
155134d017bSSimon Pilgrim     EXPECT_EQ(1, llvm::popcount(1U << I));
156134d017bSSimon Pilgrim }
157134d017bSSimon Pilgrim 
158134d017bSSimon Pilgrim } // anonymous namespace
159