xref: /llvm-project/llvm/unittests/ADT/BitTest.cpp (revision 0c4f53fcff794d8ad4b1b43443affc37c2061f55)
1 //===- llvm/unittests/ADT/BitTest.cpp - <bit> tests ---===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ADT/bit.h"
10 #include "gtest/gtest.h"
11 #include <cstdint>
12 #include <cstdlib>
13 
14 using namespace llvm;
15 
16 namespace {
17 
18 TEST(BitTest, BitCast) {
19   static const uint8_t kValueU8 = 0x80;
20   EXPECT_TRUE(llvm::bit_cast<int8_t>(kValueU8) < 0);
21 
22   static const uint16_t kValueU16 = 0x8000;
23   EXPECT_TRUE(llvm::bit_cast<int16_t>(kValueU16) < 0);
24 
25   static const float kValueF32 = 5632.34f;
26   EXPECT_FLOAT_EQ(kValueF32,
27                   llvm::bit_cast<float>(llvm::bit_cast<uint32_t>(kValueF32)));
28 
29   static const double kValueF64 = 87987234.983498;
30   EXPECT_DOUBLE_EQ(kValueF64,
31                    llvm::bit_cast<double>(llvm::bit_cast<uint64_t>(kValueF64)));
32 }
33 
34 TEST(BitTest, HasSingleBit) {
35   EXPECT_FALSE(llvm::has_single_bit(0U));
36   EXPECT_FALSE(llvm::has_single_bit(0ULL));
37 
38   EXPECT_FALSE(llvm::has_single_bit(~0U));
39   EXPECT_FALSE(llvm::has_single_bit(~0ULL));
40 
41   EXPECT_TRUE(llvm::has_single_bit(1U));
42   EXPECT_TRUE(llvm::has_single_bit(1ULL));
43 
44   static const int8_t kValueS8 = -128;
45   EXPECT_TRUE(llvm::has_single_bit(static_cast<uint8_t>(kValueS8)));
46 
47   static const int16_t kValueS16 = -32768;
48   EXPECT_TRUE(llvm::has_single_bit(static_cast<uint16_t>(kValueS16)));
49 }
50 
51 TEST(BitTest, CountlZero) {
52   uint8_t Z8 = 0;
53   uint16_t Z16 = 0;
54   uint32_t Z32 = 0;
55   uint64_t Z64 = 0;
56   EXPECT_EQ(8, llvm::countl_zero(Z8));
57   EXPECT_EQ(16, llvm::countl_zero(Z16));
58   EXPECT_EQ(32, llvm::countl_zero(Z32));
59   EXPECT_EQ(64, llvm::countl_zero(Z64));
60 
61   uint8_t NZ8 = 42;
62   uint16_t NZ16 = 42;
63   uint32_t NZ32 = 42;
64   uint64_t NZ64 = 42;
65   EXPECT_EQ(2, llvm::countl_zero(NZ8));
66   EXPECT_EQ(10, llvm::countl_zero(NZ16));
67   EXPECT_EQ(26, llvm::countl_zero(NZ32));
68   EXPECT_EQ(58, llvm::countl_zero(NZ64));
69 
70   EXPECT_EQ(8, llvm::countl_zero(0x00F000FFu));
71   EXPECT_EQ(8, llvm::countl_zero(0x00F12345u));
72   for (unsigned i = 0; i <= 30; ++i) {
73     EXPECT_EQ(int(31 - i), llvm::countl_zero(1u << i));
74   }
75 
76   EXPECT_EQ(8, llvm::countl_zero(0x00F1234500F12345ULL));
77   EXPECT_EQ(1, llvm::countl_zero(1ULL << 62));
78   for (unsigned i = 0; i <= 62; ++i) {
79     EXPECT_EQ(int(63 - i), llvm::countl_zero(1ULL << i));
80   }
81 }
82 
83 TEST(BitTest, CountrZero) {
84   uint8_t Z8 = 0;
85   uint16_t Z16 = 0;
86   uint32_t Z32 = 0;
87   uint64_t Z64 = 0;
88   EXPECT_EQ(8, llvm::countr_zero(Z8));
89   EXPECT_EQ(16, llvm::countr_zero(Z16));
90   EXPECT_EQ(32, llvm::countr_zero(Z32));
91   EXPECT_EQ(64, llvm::countr_zero(Z64));
92 
93   uint8_t NZ8 = 42;
94   uint16_t NZ16 = 42;
95   uint32_t NZ32 = 42;
96   uint64_t NZ64 = 42;
97   EXPECT_EQ(1, llvm::countr_zero(NZ8));
98   EXPECT_EQ(1, llvm::countr_zero(NZ16));
99   EXPECT_EQ(1, llvm::countr_zero(NZ32));
100   EXPECT_EQ(1, llvm::countr_zero(NZ64));
101 }
102 
103 TEST(BitTest, CountlOne) {
104   for (int i = 30; i >= 0; --i) {
105     // Start with all ones and unset some bit.
106     EXPECT_EQ(31 - i, llvm::countl_one(0xFFFFFFFF ^ (1 << i)));
107   }
108   for (int i = 62; i >= 0; --i) {
109     // Start with all ones and unset some bit.
110     EXPECT_EQ(63 - i, llvm::countl_one(0xFFFFFFFFFFFFFFFFULL ^ (1LL << i)));
111   }
112   for (int i = 30; i >= 0; --i) {
113     // Start with all ones and unset some bit.
114     EXPECT_EQ(31 - i, llvm::countl_one(0xFFFFFFFF ^ (1 << i)));
115   }
116 }
117 
118 TEST(BitTest, CountrOne) {
119   uint8_t AllOnes8 = ~(uint8_t)0;
120   uint16_t AllOnes16 = ~(uint16_t)0;
121   uint32_t AllOnes32 = ~(uint32_t)0;
122   uint64_t AllOnes64 = ~(uint64_t)0;
123   EXPECT_EQ(8, llvm::countr_one(AllOnes8));
124   EXPECT_EQ(16, llvm::countr_one(AllOnes16));
125   EXPECT_EQ(32, llvm::countr_one(AllOnes32));
126   EXPECT_EQ(64, llvm::countr_one(AllOnes64));
127 
128   uint8_t X8 = 6;
129   uint16_t X16 = 6;
130   uint32_t X32 = 6;
131   uint64_t X64 = 6;
132   EXPECT_EQ(0, llvm::countr_one(X8));
133   EXPECT_EQ(0, llvm::countr_one(X16));
134   EXPECT_EQ(0, llvm::countr_one(X32));
135   EXPECT_EQ(0, llvm::countr_one(X64));
136 
137   uint8_t Y8 = 23;
138   uint16_t Y16 = 23;
139   uint32_t Y32 = 23;
140   uint64_t Y64 = 23;
141   EXPECT_EQ(3, llvm::countr_one(Y8));
142   EXPECT_EQ(3, llvm::countr_one(Y16));
143   EXPECT_EQ(3, llvm::countr_one(Y32));
144   EXPECT_EQ(3, llvm::countr_one(Y64));
145 }
146 
147 TEST(BitTest, PopCount) {
148   EXPECT_EQ(0, llvm::popcount(0U));
149   EXPECT_EQ(0, llvm::popcount(0ULL));
150 
151   EXPECT_EQ(32, llvm::popcount(~0U));
152   EXPECT_EQ(64, llvm::popcount(~0ULL));
153 
154   for (int I = 0; I != 32; ++I)
155     EXPECT_EQ(1, llvm::popcount(1U << I));
156 }
157 
158 } // anonymous namespace
159