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
TEST(BitTest,BitCast)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
3451454e05SKazu Hirata // In these first two tests all of the original_uintx values are truncated
3551454e05SKazu Hirata // except for 64. We could avoid this, but there's really no point.
3651454e05SKazu Hirata
TEST(BitTest,ByteSwapUnsignedRoundTrip)3751454e05SKazu Hirata TEST(BitTest, ByteSwapUnsignedRoundTrip) {
3851454e05SKazu Hirata // The point of the bit twiddling of magic is to test with and without bits
3951454e05SKazu Hirata // in every byte.
4051454e05SKazu Hirata uint64_t value = 1;
4151454e05SKazu Hirata for (std::size_t i = 0; i <= sizeof(value); ++i) {
4251454e05SKazu Hirata uint8_t original_uint8 = static_cast<uint8_t>(value);
4351454e05SKazu Hirata EXPECT_EQ(original_uint8, llvm::byteswap(llvm::byteswap(original_uint8)));
4451454e05SKazu Hirata
4551454e05SKazu Hirata uint16_t original_uint16 = static_cast<uint16_t>(value);
4651454e05SKazu Hirata EXPECT_EQ(original_uint16, llvm::byteswap(llvm::byteswap(original_uint16)));
4751454e05SKazu Hirata
4851454e05SKazu Hirata uint32_t original_uint32 = static_cast<uint32_t>(value);
4951454e05SKazu Hirata EXPECT_EQ(original_uint32, llvm::byteswap(llvm::byteswap(original_uint32)));
5051454e05SKazu Hirata
5151454e05SKazu Hirata uint64_t original_uint64 = static_cast<uint64_t>(value);
5251454e05SKazu Hirata EXPECT_EQ(original_uint64, llvm::byteswap(llvm::byteswap(original_uint64)));
5351454e05SKazu Hirata
5451454e05SKazu Hirata value = (value << 8) | 0x55; // binary 0101 0101.
5551454e05SKazu Hirata }
5651454e05SKazu Hirata }
5751454e05SKazu Hirata
TEST(BitTest,ByteSwapSignedRoundTrip)5851454e05SKazu Hirata TEST(BitTest, ByteSwapSignedRoundTrip) {
5951454e05SKazu Hirata // The point of the bit twiddling of magic is to test with and without bits
6051454e05SKazu Hirata // in every byte.
6151454e05SKazu Hirata uint64_t value = 1;
6251454e05SKazu Hirata for (std::size_t i = 0; i <= sizeof(value); ++i) {
6351454e05SKazu Hirata int8_t original_int8 = static_cast<int8_t>(value);
6451454e05SKazu Hirata EXPECT_EQ(original_int8, llvm::byteswap(llvm::byteswap(original_int8)));
6551454e05SKazu Hirata
6651454e05SKazu Hirata int16_t original_int16 = static_cast<int16_t>(value);
6751454e05SKazu Hirata EXPECT_EQ(original_int16, llvm::byteswap(llvm::byteswap(original_int16)));
6851454e05SKazu Hirata
6951454e05SKazu Hirata int32_t original_int32 = static_cast<int32_t>(value);
7051454e05SKazu Hirata EXPECT_EQ(original_int32, llvm::byteswap(llvm::byteswap(original_int32)));
7151454e05SKazu Hirata
7251454e05SKazu Hirata int64_t original_int64 = static_cast<int64_t>(value);
7351454e05SKazu Hirata EXPECT_EQ(original_int64, llvm::byteswap(llvm::byteswap(original_int64)));
7451454e05SKazu Hirata
7551454e05SKazu Hirata // Test other sign.
7651454e05SKazu Hirata value *= -1;
7751454e05SKazu Hirata
7851454e05SKazu Hirata original_int8 = static_cast<int8_t>(value);
7951454e05SKazu Hirata EXPECT_EQ(original_int8, llvm::byteswap(llvm::byteswap(original_int8)));
8051454e05SKazu Hirata
8151454e05SKazu Hirata original_int16 = static_cast<int16_t>(value);
8251454e05SKazu Hirata EXPECT_EQ(original_int16, llvm::byteswap(llvm::byteswap(original_int16)));
8351454e05SKazu Hirata
8451454e05SKazu Hirata original_int32 = static_cast<int32_t>(value);
8551454e05SKazu Hirata EXPECT_EQ(original_int32, llvm::byteswap(llvm::byteswap(original_int32)));
8651454e05SKazu Hirata
8751454e05SKazu Hirata original_int64 = static_cast<int64_t>(value);
8851454e05SKazu Hirata EXPECT_EQ(original_int64, llvm::byteswap(llvm::byteswap(original_int64)));
8951454e05SKazu Hirata
9051454e05SKazu Hirata // Return to normal sign and twiddle.
9151454e05SKazu Hirata value *= -1;
9251454e05SKazu Hirata value = (value << 8) | 0x55; // binary 0101 0101.
9351454e05SKazu Hirata }
9451454e05SKazu Hirata }
9551454e05SKazu Hirata
TEST(BitTest,ByteSwap)9651454e05SKazu Hirata TEST(BitTest, ByteSwap) {
9751454e05SKazu Hirata // Unsigned types.
9851454e05SKazu Hirata EXPECT_EQ(uint8_t(0x11), llvm::byteswap(uint8_t(0x11)));
9951454e05SKazu Hirata EXPECT_EQ(uint16_t(0x1122), llvm::byteswap(uint16_t(0x2211)));
10051454e05SKazu Hirata EXPECT_EQ(uint32_t(0x11223344), llvm::byteswap(uint32_t(0x44332211)));
10151454e05SKazu Hirata EXPECT_EQ(uint64_t(0x1122334455667788ULL),
10251454e05SKazu Hirata llvm::byteswap(uint64_t(0x8877665544332211ULL)));
10351454e05SKazu Hirata
10451454e05SKazu Hirata // Signed types.
10551454e05SKazu Hirata EXPECT_EQ(int8_t(0x11), llvm::byteswap(int8_t(0x11)));
10651454e05SKazu Hirata EXPECT_EQ(int16_t(0x1122), llvm::byteswap(int16_t(0x2211)));
10751454e05SKazu Hirata EXPECT_EQ(int32_t(0x11223344), llvm::byteswap(int32_t(0x44332211)));
10851454e05SKazu Hirata EXPECT_EQ(int64_t(0x1122334455667788LL),
10951454e05SKazu Hirata llvm::byteswap(int64_t(0x8877665544332211LL)));
11051454e05SKazu Hirata }
11151454e05SKazu Hirata
TEST(BitTest,HasSingleBit)112336a4e03SSimon Pilgrim TEST(BitTest, HasSingleBit) {
113336a4e03SSimon Pilgrim EXPECT_FALSE(llvm::has_single_bit(0U));
114336a4e03SSimon Pilgrim EXPECT_FALSE(llvm::has_single_bit(0ULL));
115336a4e03SSimon Pilgrim
116336a4e03SSimon Pilgrim EXPECT_FALSE(llvm::has_single_bit(~0U));
117336a4e03SSimon Pilgrim EXPECT_FALSE(llvm::has_single_bit(~0ULL));
118336a4e03SSimon Pilgrim
119336a4e03SSimon Pilgrim EXPECT_TRUE(llvm::has_single_bit(1U));
120336a4e03SSimon Pilgrim EXPECT_TRUE(llvm::has_single_bit(1ULL));
121336a4e03SSimon Pilgrim
122336a4e03SSimon Pilgrim static const int8_t kValueS8 = -128;
123336a4e03SSimon Pilgrim EXPECT_TRUE(llvm::has_single_bit(static_cast<uint8_t>(kValueS8)));
124336a4e03SSimon Pilgrim
125336a4e03SSimon Pilgrim static const int16_t kValueS16 = -32768;
126336a4e03SSimon Pilgrim EXPECT_TRUE(llvm::has_single_bit(static_cast<uint16_t>(kValueS16)));
127336a4e03SSimon Pilgrim }
128336a4e03SSimon Pilgrim
TEST(BitTest,BitFloor)129eaabc1bbSKazu Hirata TEST(BitTest, BitFloor) {
130eaabc1bbSKazu Hirata EXPECT_EQ(0u, llvm::bit_floor(uint8_t(0)));
131eaabc1bbSKazu Hirata EXPECT_EQ(0u, llvm::bit_floor(uint16_t(0)));
132eaabc1bbSKazu Hirata EXPECT_EQ(0u, llvm::bit_floor(uint32_t(0)));
133eaabc1bbSKazu Hirata EXPECT_EQ(0u, llvm::bit_floor(uint64_t(0)));
134eaabc1bbSKazu Hirata
135eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_floor(uint8_t(1)));
136eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_floor(uint16_t(1)));
137eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_floor(uint32_t(1)));
138eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_floor(uint64_t(1)));
139eaabc1bbSKazu Hirata
140eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_floor(uint8_t(2)));
141eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_floor(uint16_t(2)));
142eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_floor(uint32_t(2)));
143eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_floor(uint64_t(2)));
144eaabc1bbSKazu Hirata
145eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_floor(uint8_t(3)));
146eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_floor(uint16_t(3)));
147eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_floor(uint32_t(3)));
148eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_floor(uint64_t(3)));
149eaabc1bbSKazu Hirata
150eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_floor(uint8_t(4)));
151eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_floor(uint16_t(4)));
152eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_floor(uint32_t(4)));
153eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_floor(uint64_t(4)));
154eaabc1bbSKazu Hirata
155eaabc1bbSKazu Hirata EXPECT_EQ(0x40u, llvm::bit_floor(uint8_t(0x7f)));
156eaabc1bbSKazu Hirata EXPECT_EQ(0x4000u, llvm::bit_floor(uint16_t(0x7fff)));
157eaabc1bbSKazu Hirata EXPECT_EQ(0x40000000u, llvm::bit_floor(uint32_t(0x7fffffffu)));
158eaabc1bbSKazu Hirata EXPECT_EQ(0x4000000000000000ull,
159eaabc1bbSKazu Hirata llvm::bit_floor(uint64_t(0x7fffffffffffffffull)));
160eaabc1bbSKazu Hirata
161eaabc1bbSKazu Hirata EXPECT_EQ(0x80u, llvm::bit_floor(uint8_t(0x80)));
162eaabc1bbSKazu Hirata EXPECT_EQ(0x8000u, llvm::bit_floor(uint16_t(0x8000)));
163eaabc1bbSKazu Hirata EXPECT_EQ(0x80000000u, llvm::bit_floor(uint32_t(0x80000000u)));
164eaabc1bbSKazu Hirata EXPECT_EQ(0x8000000000000000ull,
165eaabc1bbSKazu Hirata llvm::bit_floor(uint64_t(0x8000000000000000ull)));
166eaabc1bbSKazu Hirata
167eaabc1bbSKazu Hirata EXPECT_EQ(0x80u, llvm::bit_floor(uint8_t(0xff)));
168eaabc1bbSKazu Hirata EXPECT_EQ(0x8000u, llvm::bit_floor(uint16_t(0xffff)));
169eaabc1bbSKazu Hirata EXPECT_EQ(0x80000000u, llvm::bit_floor(uint32_t(0xffffffffu)));
170eaabc1bbSKazu Hirata EXPECT_EQ(0x8000000000000000ull,
171eaabc1bbSKazu Hirata llvm::bit_floor(uint64_t(0xffffffffffffffffull)));
172eaabc1bbSKazu Hirata }
173eaabc1bbSKazu Hirata
TEST(BitTest,BitCeil)174eaabc1bbSKazu Hirata TEST(BitTest, BitCeil) {
175eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_ceil(uint8_t(0)));
176eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_ceil(uint16_t(0)));
177eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_ceil(uint32_t(0)));
178eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_ceil(uint64_t(0)));
179eaabc1bbSKazu Hirata
180eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_ceil(uint8_t(1)));
181eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_ceil(uint16_t(1)));
182eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_ceil(uint32_t(1)));
183eaabc1bbSKazu Hirata EXPECT_EQ(1u, llvm::bit_ceil(uint64_t(1)));
184eaabc1bbSKazu Hirata
185eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_ceil(uint8_t(2)));
186eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_ceil(uint16_t(2)));
187eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_ceil(uint32_t(2)));
188eaabc1bbSKazu Hirata EXPECT_EQ(2u, llvm::bit_ceil(uint64_t(2)));
189eaabc1bbSKazu Hirata
190eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_ceil(uint8_t(3)));
191eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_ceil(uint16_t(3)));
192eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_ceil(uint32_t(3)));
193eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_ceil(uint64_t(3)));
194eaabc1bbSKazu Hirata
195eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_ceil(uint8_t(4)));
196eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_ceil(uint16_t(4)));
197eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_ceil(uint32_t(4)));
198eaabc1bbSKazu Hirata EXPECT_EQ(4u, llvm::bit_ceil(uint64_t(4)));
199eaabc1bbSKazu Hirata
200eaabc1bbSKazu Hirata // The result is the largest representable value for each type.
201eaabc1bbSKazu Hirata EXPECT_EQ(0x80u, llvm::bit_ceil(uint8_t(0x7f)));
202eaabc1bbSKazu Hirata EXPECT_EQ(0x8000u, llvm::bit_ceil(uint16_t(0x7fff)));
203eaabc1bbSKazu Hirata EXPECT_EQ(0x80000000u, llvm::bit_ceil(uint32_t(0x7fffffffu)));
204eaabc1bbSKazu Hirata EXPECT_EQ(0x8000000000000000ull,
205eaabc1bbSKazu Hirata llvm::bit_ceil(uint64_t(0x7fffffffffffffffull)));
206eaabc1bbSKazu Hirata }
207eaabc1bbSKazu Hirata
TEST(BitTest,BitWidth)208eaabc1bbSKazu Hirata TEST(BitTest, BitWidth) {
209eaabc1bbSKazu Hirata EXPECT_EQ(0, llvm::bit_width(uint8_t(0)));
210eaabc1bbSKazu Hirata EXPECT_EQ(0, llvm::bit_width(uint16_t(0)));
211eaabc1bbSKazu Hirata EXPECT_EQ(0, llvm::bit_width(uint32_t(0)));
212eaabc1bbSKazu Hirata EXPECT_EQ(0, llvm::bit_width(uint64_t(0)));
213eaabc1bbSKazu Hirata
214eaabc1bbSKazu Hirata EXPECT_EQ(1, llvm::bit_width(uint8_t(1)));
215eaabc1bbSKazu Hirata EXPECT_EQ(1, llvm::bit_width(uint16_t(1)));
216eaabc1bbSKazu Hirata EXPECT_EQ(1, llvm::bit_width(uint32_t(1)));
217eaabc1bbSKazu Hirata EXPECT_EQ(1, llvm::bit_width(uint64_t(1)));
218eaabc1bbSKazu Hirata
219eaabc1bbSKazu Hirata EXPECT_EQ(2, llvm::bit_width(uint8_t(2)));
220eaabc1bbSKazu Hirata EXPECT_EQ(2, llvm::bit_width(uint16_t(2)));
221eaabc1bbSKazu Hirata EXPECT_EQ(2, llvm::bit_width(uint32_t(2)));
222eaabc1bbSKazu Hirata EXPECT_EQ(2, llvm::bit_width(uint64_t(2)));
223eaabc1bbSKazu Hirata
224eaabc1bbSKazu Hirata EXPECT_EQ(2, llvm::bit_width(uint8_t(3)));
225eaabc1bbSKazu Hirata EXPECT_EQ(2, llvm::bit_width(uint16_t(3)));
226eaabc1bbSKazu Hirata EXPECT_EQ(2, llvm::bit_width(uint32_t(3)));
227eaabc1bbSKazu Hirata EXPECT_EQ(2, llvm::bit_width(uint64_t(3)));
228eaabc1bbSKazu Hirata
229eaabc1bbSKazu Hirata EXPECT_EQ(3, llvm::bit_width(uint8_t(4)));
230eaabc1bbSKazu Hirata EXPECT_EQ(3, llvm::bit_width(uint16_t(4)));
231eaabc1bbSKazu Hirata EXPECT_EQ(3, llvm::bit_width(uint32_t(4)));
232eaabc1bbSKazu Hirata EXPECT_EQ(3, llvm::bit_width(uint64_t(4)));
233eaabc1bbSKazu Hirata
234eaabc1bbSKazu Hirata EXPECT_EQ(7, llvm::bit_width(uint8_t(0x7f)));
235eaabc1bbSKazu Hirata EXPECT_EQ(15, llvm::bit_width(uint16_t(0x7fff)));
236eaabc1bbSKazu Hirata EXPECT_EQ(31, llvm::bit_width(uint32_t(0x7fffffffu)));
237eaabc1bbSKazu Hirata EXPECT_EQ(63, llvm::bit_width(uint64_t(0x7fffffffffffffffull)));
238eaabc1bbSKazu Hirata
239eaabc1bbSKazu Hirata EXPECT_EQ(8, llvm::bit_width(uint8_t(0x80)));
240eaabc1bbSKazu Hirata EXPECT_EQ(16, llvm::bit_width(uint16_t(0x8000)));
241eaabc1bbSKazu Hirata EXPECT_EQ(32, llvm::bit_width(uint32_t(0x80000000u)));
242eaabc1bbSKazu Hirata EXPECT_EQ(64, llvm::bit_width(uint64_t(0x8000000000000000ull)));
243eaabc1bbSKazu Hirata
244eaabc1bbSKazu Hirata EXPECT_EQ(8, llvm::bit_width(uint8_t(0xff)));
245eaabc1bbSKazu Hirata EXPECT_EQ(16, llvm::bit_width(uint16_t(0xffff)));
246eaabc1bbSKazu Hirata EXPECT_EQ(32, llvm::bit_width(uint32_t(0xffffffffu)));
247eaabc1bbSKazu Hirata EXPECT_EQ(64, llvm::bit_width(uint64_t(0xffffffffffffffffull)));
248eaabc1bbSKazu Hirata }
249eaabc1bbSKazu Hirata
TEST(BitTest,CountlZero)2500c4f53fcSKazu Hirata TEST(BitTest, CountlZero) {
2510c4f53fcSKazu Hirata uint8_t Z8 = 0;
2520c4f53fcSKazu Hirata uint16_t Z16 = 0;
2530c4f53fcSKazu Hirata uint32_t Z32 = 0;
2540c4f53fcSKazu Hirata uint64_t Z64 = 0;
2550c4f53fcSKazu Hirata EXPECT_EQ(8, llvm::countl_zero(Z8));
2560c4f53fcSKazu Hirata EXPECT_EQ(16, llvm::countl_zero(Z16));
2570c4f53fcSKazu Hirata EXPECT_EQ(32, llvm::countl_zero(Z32));
2580c4f53fcSKazu Hirata EXPECT_EQ(64, llvm::countl_zero(Z64));
2590c4f53fcSKazu Hirata
2600c4f53fcSKazu Hirata uint8_t NZ8 = 42;
2610c4f53fcSKazu Hirata uint16_t NZ16 = 42;
2620c4f53fcSKazu Hirata uint32_t NZ32 = 42;
2630c4f53fcSKazu Hirata uint64_t NZ64 = 42;
2640c4f53fcSKazu Hirata EXPECT_EQ(2, llvm::countl_zero(NZ8));
2650c4f53fcSKazu Hirata EXPECT_EQ(10, llvm::countl_zero(NZ16));
2660c4f53fcSKazu Hirata EXPECT_EQ(26, llvm::countl_zero(NZ32));
2670c4f53fcSKazu Hirata EXPECT_EQ(58, llvm::countl_zero(NZ64));
2680c4f53fcSKazu Hirata
2690c4f53fcSKazu Hirata EXPECT_EQ(8, llvm::countl_zero(0x00F000FFu));
2700c4f53fcSKazu Hirata EXPECT_EQ(8, llvm::countl_zero(0x00F12345u));
2710c4f53fcSKazu Hirata for (unsigned i = 0; i <= 30; ++i) {
2720c4f53fcSKazu Hirata EXPECT_EQ(int(31 - i), llvm::countl_zero(1u << i));
2730c4f53fcSKazu Hirata }
2740c4f53fcSKazu Hirata
2750c4f53fcSKazu Hirata EXPECT_EQ(8, llvm::countl_zero(0x00F1234500F12345ULL));
2760c4f53fcSKazu Hirata EXPECT_EQ(1, llvm::countl_zero(1ULL << 62));
2770c4f53fcSKazu Hirata for (unsigned i = 0; i <= 62; ++i) {
2780c4f53fcSKazu Hirata EXPECT_EQ(int(63 - i), llvm::countl_zero(1ULL << i));
2790c4f53fcSKazu Hirata }
2800c4f53fcSKazu Hirata }
2810c4f53fcSKazu Hirata
TEST(BitTest,CountrZero)2820c4f53fcSKazu Hirata TEST(BitTest, CountrZero) {
2830c4f53fcSKazu Hirata uint8_t Z8 = 0;
2840c4f53fcSKazu Hirata uint16_t Z16 = 0;
2850c4f53fcSKazu Hirata uint32_t Z32 = 0;
2860c4f53fcSKazu Hirata uint64_t Z64 = 0;
2870c4f53fcSKazu Hirata EXPECT_EQ(8, llvm::countr_zero(Z8));
2880c4f53fcSKazu Hirata EXPECT_EQ(16, llvm::countr_zero(Z16));
2890c4f53fcSKazu Hirata EXPECT_EQ(32, llvm::countr_zero(Z32));
2900c4f53fcSKazu Hirata EXPECT_EQ(64, llvm::countr_zero(Z64));
2910c4f53fcSKazu Hirata
2920c4f53fcSKazu Hirata uint8_t NZ8 = 42;
2930c4f53fcSKazu Hirata uint16_t NZ16 = 42;
2940c4f53fcSKazu Hirata uint32_t NZ32 = 42;
2950c4f53fcSKazu Hirata uint64_t NZ64 = 42;
2960c4f53fcSKazu Hirata EXPECT_EQ(1, llvm::countr_zero(NZ8));
2970c4f53fcSKazu Hirata EXPECT_EQ(1, llvm::countr_zero(NZ16));
2980c4f53fcSKazu Hirata EXPECT_EQ(1, llvm::countr_zero(NZ32));
2990c4f53fcSKazu Hirata EXPECT_EQ(1, llvm::countr_zero(NZ64));
3000c4f53fcSKazu Hirata }
3010c4f53fcSKazu Hirata
TEST(BitTest,CountlOne)3020c4f53fcSKazu Hirata TEST(BitTest, CountlOne) {
3030c4f53fcSKazu Hirata for (int i = 30; i >= 0; --i) {
3040c4f53fcSKazu Hirata // Start with all ones and unset some bit.
3050c4f53fcSKazu Hirata EXPECT_EQ(31 - i, llvm::countl_one(0xFFFFFFFF ^ (1 << i)));
3060c4f53fcSKazu Hirata }
3070c4f53fcSKazu Hirata for (int i = 62; i >= 0; --i) {
3080c4f53fcSKazu Hirata // Start with all ones and unset some bit.
3090c4f53fcSKazu Hirata EXPECT_EQ(63 - i, llvm::countl_one(0xFFFFFFFFFFFFFFFFULL ^ (1LL << i)));
3100c4f53fcSKazu Hirata }
3110c4f53fcSKazu Hirata for (int i = 30; i >= 0; --i) {
3120c4f53fcSKazu Hirata // Start with all ones and unset some bit.
3130c4f53fcSKazu Hirata EXPECT_EQ(31 - i, llvm::countl_one(0xFFFFFFFF ^ (1 << i)));
3140c4f53fcSKazu Hirata }
3150c4f53fcSKazu Hirata }
3160c4f53fcSKazu Hirata
TEST(BitTest,CountrOne)3170c4f53fcSKazu Hirata TEST(BitTest, CountrOne) {
3180c4f53fcSKazu Hirata uint8_t AllOnes8 = ~(uint8_t)0;
3190c4f53fcSKazu Hirata uint16_t AllOnes16 = ~(uint16_t)0;
3200c4f53fcSKazu Hirata uint32_t AllOnes32 = ~(uint32_t)0;
3210c4f53fcSKazu Hirata uint64_t AllOnes64 = ~(uint64_t)0;
3220c4f53fcSKazu Hirata EXPECT_EQ(8, llvm::countr_one(AllOnes8));
3230c4f53fcSKazu Hirata EXPECT_EQ(16, llvm::countr_one(AllOnes16));
3240c4f53fcSKazu Hirata EXPECT_EQ(32, llvm::countr_one(AllOnes32));
3250c4f53fcSKazu Hirata EXPECT_EQ(64, llvm::countr_one(AllOnes64));
3260c4f53fcSKazu Hirata
3270c4f53fcSKazu Hirata uint8_t X8 = 6;
3280c4f53fcSKazu Hirata uint16_t X16 = 6;
3290c4f53fcSKazu Hirata uint32_t X32 = 6;
3300c4f53fcSKazu Hirata uint64_t X64 = 6;
3310c4f53fcSKazu Hirata EXPECT_EQ(0, llvm::countr_one(X8));
3320c4f53fcSKazu Hirata EXPECT_EQ(0, llvm::countr_one(X16));
3330c4f53fcSKazu Hirata EXPECT_EQ(0, llvm::countr_one(X32));
3340c4f53fcSKazu Hirata EXPECT_EQ(0, llvm::countr_one(X64));
3350c4f53fcSKazu Hirata
3360c4f53fcSKazu Hirata uint8_t Y8 = 23;
3370c4f53fcSKazu Hirata uint16_t Y16 = 23;
3380c4f53fcSKazu Hirata uint32_t Y32 = 23;
3390c4f53fcSKazu Hirata uint64_t Y64 = 23;
3400c4f53fcSKazu Hirata EXPECT_EQ(3, llvm::countr_one(Y8));
3410c4f53fcSKazu Hirata EXPECT_EQ(3, llvm::countr_one(Y16));
3420c4f53fcSKazu Hirata EXPECT_EQ(3, llvm::countr_one(Y32));
3430c4f53fcSKazu Hirata EXPECT_EQ(3, llvm::countr_one(Y64));
3440c4f53fcSKazu Hirata }
3450c4f53fcSKazu Hirata
TEST(BitTest,PopCount)346134d017bSSimon Pilgrim TEST(BitTest, PopCount) {
347134d017bSSimon Pilgrim EXPECT_EQ(0, llvm::popcount(0U));
348134d017bSSimon Pilgrim EXPECT_EQ(0, llvm::popcount(0ULL));
349134d017bSSimon Pilgrim
350134d017bSSimon Pilgrim EXPECT_EQ(32, llvm::popcount(~0U));
351134d017bSSimon Pilgrim EXPECT_EQ(64, llvm::popcount(~0ULL));
352134d017bSSimon Pilgrim
353134d017bSSimon Pilgrim for (int I = 0; I != 32; ++I)
354134d017bSSimon Pilgrim EXPECT_EQ(1, llvm::popcount(1U << I));
355134d017bSSimon Pilgrim }
356134d017bSSimon Pilgrim
TEST(BitTest,Rotl)357*f1f62ed0SKazu Hirata TEST(BitTest, Rotl) {
358*f1f62ed0SKazu Hirata EXPECT_EQ(0x53U, llvm::rotl<uint8_t>(0x53, 0));
359*f1f62ed0SKazu Hirata EXPECT_EQ(0x4dU, llvm::rotl<uint8_t>(0x53, 2));
360*f1f62ed0SKazu Hirata EXPECT_EQ(0xa6U, llvm::rotl<uint8_t>(0x53, 9));
361*f1f62ed0SKazu Hirata EXPECT_EQ(0x9aU, llvm::rotl<uint8_t>(0x53, -5));
362*f1f62ed0SKazu Hirata
363*f1f62ed0SKazu Hirata EXPECT_EQ(0xabcdU, llvm::rotl<uint16_t>(0xabcd, 0));
364*f1f62ed0SKazu Hirata EXPECT_EQ(0xf36aU, llvm::rotl<uint16_t>(0xabcd, 6));
365*f1f62ed0SKazu Hirata EXPECT_EQ(0xaf36U, llvm::rotl<uint16_t>(0xabcd, 18));
366*f1f62ed0SKazu Hirata EXPECT_EQ(0xf36aU, llvm::rotl<uint16_t>(0xabcd, -10));
367*f1f62ed0SKazu Hirata
368*f1f62ed0SKazu Hirata EXPECT_EQ(0xdeadbeefU, llvm::rotl<uint32_t>(0xdeadbeef, 0));
369*f1f62ed0SKazu Hirata EXPECT_EQ(0x7ddfbd5bU, llvm::rotl<uint32_t>(0xdeadbeef, 17));
370*f1f62ed0SKazu Hirata EXPECT_EQ(0x5b7ddfbdU, llvm::rotl<uint32_t>(0xdeadbeef, 41));
371*f1f62ed0SKazu Hirata EXPECT_EQ(0xb6fbbf7aU, llvm::rotl<uint32_t>(0xdeadbeef, -22));
372*f1f62ed0SKazu Hirata
373*f1f62ed0SKazu Hirata EXPECT_EQ(0x12345678deadbeefULL, llvm::rotl<uint64_t>(0x12345678deadbeefULL, 0));
374*f1f62ed0SKazu Hirata EXPECT_EQ(0xf56df77891a2b3c6ULL, llvm::rotl<uint64_t>(0x12345678deadbeefULL, 35));
375*f1f62ed0SKazu Hirata EXPECT_EQ(0x8d159e37ab6fbbc4ULL, llvm::rotl<uint64_t>(0x12345678deadbeefULL, 70));
376*f1f62ed0SKazu Hirata EXPECT_EQ(0xb7dde2468acf1bd5ULL, llvm::rotl<uint64_t>(0x12345678deadbeefULL, -19));
377*f1f62ed0SKazu Hirata }
378*f1f62ed0SKazu Hirata
TEST(BitTest,Rotr)379*f1f62ed0SKazu Hirata TEST(BitTest, Rotr) {
380*f1f62ed0SKazu Hirata EXPECT_EQ(0x53U, llvm::rotr<uint8_t>(0x53, 0));
381*f1f62ed0SKazu Hirata EXPECT_EQ(0xd4U, llvm::rotr<uint8_t>(0x53, 2));
382*f1f62ed0SKazu Hirata EXPECT_EQ(0xa9U, llvm::rotr<uint8_t>(0x53, 9));
383*f1f62ed0SKazu Hirata EXPECT_EQ(0x6aU, llvm::rotr<uint8_t>(0x53, -5));
384*f1f62ed0SKazu Hirata
385*f1f62ed0SKazu Hirata EXPECT_EQ(0xabcdU, llvm::rotr<uint16_t>(0xabcd, 0));
386*f1f62ed0SKazu Hirata EXPECT_EQ(0x36afU, llvm::rotr<uint16_t>(0xabcd, 6));
387*f1f62ed0SKazu Hirata EXPECT_EQ(0x6af3U, llvm::rotr<uint16_t>(0xabcd, 18));
388*f1f62ed0SKazu Hirata EXPECT_EQ(0x36afU, llvm::rotr<uint16_t>(0xabcd, -10));
389*f1f62ed0SKazu Hirata
390*f1f62ed0SKazu Hirata EXPECT_EQ(0xdeadbeefU, llvm::rotr<uint32_t>(0xdeadbeef, 0));
391*f1f62ed0SKazu Hirata EXPECT_EQ(0xdf77ef56U, llvm::rotr<uint32_t>(0xdeadbeef, 17));
392*f1f62ed0SKazu Hirata EXPECT_EQ(0x77ef56dfU, llvm::rotr<uint32_t>(0xdeadbeef, 41));
393*f1f62ed0SKazu Hirata EXPECT_EQ(0xbbf7ab6fU, llvm::rotr<uint32_t>(0xdeadbeef, -22));
394*f1f62ed0SKazu Hirata
395*f1f62ed0SKazu Hirata EXPECT_EQ(0x12345678deadbeefULL, llvm::rotr<uint64_t>(0x12345678deadbeefULL, 0));
396*f1f62ed0SKazu Hirata EXPECT_EQ(0x1bd5b7dde2468acfULL, llvm::rotr<uint64_t>(0x12345678deadbeefULL, 35));
397*f1f62ed0SKazu Hirata EXPECT_EQ(0xbc48d159e37ab6fbULL, llvm::rotr<uint64_t>(0x12345678deadbeefULL, 70));
398*f1f62ed0SKazu Hirata EXPECT_EQ(0xb3c6f56df77891a2ULL, llvm::rotr<uint64_t>(0x12345678deadbeefULL, -19));
399*f1f62ed0SKazu Hirata }
400*f1f62ed0SKazu Hirata
401134d017bSSimon Pilgrim } // anonymous namespace
402