38 #include <gtest/gtest.h>
46 TEST(BitfieldTest, Mask0Bits)
48 EXPECT_EQ(0x0,
mask(0));
51 TEST(BitfieldTest, Mask1Bit)
53 EXPECT_EQ(0x1,
mask(1));
56 TEST(BitfieldTest, Mask8Bits)
58 EXPECT_EQ(0xFF,
mask(8));
61 TEST(BitfieldTest, Mask16Bits)
63 EXPECT_EQ(0xFFFF,
mask(16));
66 TEST(BitfieldTest, Mask32Bits)
68 EXPECT_EQ(0xFFFFFFFF,
mask(32));
71 TEST(BitfieldTest, MaskAllBits)
73 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(64));
76 TEST(BitfieldTest, MaskAllBitsGreaterThan64)
81 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(70));
88 TEST(BitfieldTest, MaskOneBit)
90 EXPECT_EQ(1,
mask(0, 0));
93 TEST(BitfieldTest, MaskTwoBits)
95 EXPECT_EQ((1 << 1) + 1,
mask(1, 0));
98 TEST(BitfieldTest, MaskThreeBits)
100 EXPECT_EQ((1 << 5) + (1 << 4) + (1 << 3),
mask(5, 3));
103 TEST(BitfieldTest, MaskEntireRange)
105 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(63, 0));
108 TEST(BitfieldTest, MaskOutsideOfRange)
111 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(100, 0));
118 TEST(BitfieldTest, ExtractOneBit)
121 EXPECT_EQ(1,
bits(
x, 31));
124 TEST(BitfieldTest, Extract63rdBit)
126 int64_t
x = 1
ULL << 63;
127 EXPECT_EQ(1,
bits(
x, 63));
130 TEST(BitfieldTest, ExtractFirstBit)
133 EXPECT_EQ(1,
bits(
x, 0));
136 TEST(BitfieldTest, ExtractFirstBitFirstBitZero)
139 EXPECT_EQ(0,
bits(
x, 0));
142 TEST(BitfieldTest, ExtractThreeBits)
144 uint64_t
x = 1 << 31;
145 EXPECT_EQ((1 << 2),
bits(
x, 31, 29));
153 TEST(BitfieldTest, MbitsStandardCase)
155 uint64_t
x = (1 << 10) + (1 << 1);
156 EXPECT_EQ((1 << 10),
mbits(
x, 10, 8));
159 TEST(BitfieldTest, MbitsEntireRange)
161 uint64_t
x = (1
ULL << 63) + 1;
162 EXPECT_EQ((1
ULL << 63) + 1,
mbits(
x, 63, 0));
169 TEST(BitfieldTest, SignExtendPositiveInput)
176 TEST(BitfieldTest, SignExtendNegativeInput)
183 TEST(BitfieldTest, SignExtendPositiveInputOutsideRange)
185 EXPECT_EQ((1 << 10), sext<8>(1 << 10));
188 TEST(BitfieldTest, SignExtendNegativeInputOutsideRange)
190 uint64_t
val = 0x4800000010000008;
191 uint64_t
output = 0xF800000010000008;
199 TEST(BitfieldTest, InsertOneBitTo3)
202 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1) + 1;
206 TEST(BitfieldTest, InsertOneBitTo18)
209 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1) + 1;
213 TEST(BitfieldTest, InsertOneBitTo3LsbZero)
216 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1);
220 TEST(BitfieldTest, InsertOneBitTo18LsbZero)
223 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1);
227 TEST(BitfieldTest, InsertOnBitTo8LsbZero)
229 int64_t
val = (1 << 8);
230 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1);
234 TEST(BitfieldTest, InsertMultipleBits)
236 int64_t
val = (1
ULL << 63);
237 int64_t
bits = (1 << 2) + 1;
241 TEST(BitfieldTest, InsertMultipleBitsOverwrite)
243 int64_t
val = (1 << 29);
244 int64_t
bits = (1 << 2) + 1;
249 TEST(BitfieldTest, ReverseBits8Bit)
251 uint8_t value = (1 << 7);
255 TEST(BitfieldTest, ReverseBits64Bit)
257 uint64_t value = 0xF0F0F0F0F0F0F0F1;
266 uint64_t
val = (1 << 29) + (1 << 1);
272 uint64_t
val = (1
ULL << 63) + (1
ULL << 60) + (1 << 1);
277 TEST(BitfieldTest, FindMsbZero)
284 uint64_t
val = (1
ULL << 63) + (1 << 1);
288 TEST(BitfieldTest, FindLsbZero)
297 TEST(BitfieldTest, PopCountNoBits)
302 TEST(BitfieldTest, PopCountOneBit)
304 int64_t
val = (1 << 9);
308 TEST(BitfieldTest, PopCountManyBits)
310 int64_t
val = (1 << 22) + (1 << 21) + (1 << 15) + (1 << 9) + 1;
314 TEST(BitfieldTest, PopCountAllOnes)
316 int64_t
val = 0xFFFFFFFFFFFFFFFF;
325 TEST(BitfieldTest, AlignToPowerOfTwo0)
330 TEST(BitfieldTest, AlignToPowerOfTwo3)
335 TEST(BitfieldTest, AlignToPowerOfTwo5)
340 TEST(BitfieldTest, AlignToPowerOfTwo10)
345 TEST(BitfieldTest, AlignToPowerOfTwo16)
350 TEST(BitfieldTest, AlignToPowerOfTwo31)
361 TEST(BitfieldTest, CountTrailingZeros32BitsNoTrailing)
364 EXPECT_EQ(0,
ctz32(value));
367 TEST(BitfieldTest, CountTrailingZeros32Bits)
369 uint32_t value = (1 << 30) + (1 << 29);
370 EXPECT_EQ(29,
ctz32(value));
373 TEST(BitfieldTest, CountTrailingZeros64BitsNoTrailing)
375 uint64_t value = (1 << 29) + 1;
376 EXPECT_EQ(0,
ctz64(value));
379 TEST(BitfieldTest, CountTrailingZeros64Bits)
381 uint64_t value = 1
ULL << 63;
382 EXPECT_EQ(63,
ctz64(value));
385 TEST(BitfieldTest, CountTrailingZero64AllZeros)
388 EXPECT_EQ(64,
ctz64(value));