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