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