38 #include <gtest/gtest.h>
48 TEST(BitfieldTest, Mask0Bits)
50 EXPECT_EQ(0x0,
mask(0));
53 TEST(BitfieldTest, Mask1Bit)
55 EXPECT_EQ(0x1,
mask(1));
58 TEST(BitfieldTest, Mask8Bits)
60 EXPECT_EQ(0xFF,
mask(8));
63 TEST(BitfieldTest, Mask16Bits)
65 EXPECT_EQ(0xFFFF,
mask(16));
68 TEST(BitfieldTest, Mask32Bits)
70 EXPECT_EQ(0xFFFFFFFF,
mask(32));
73 TEST(BitfieldTest, MaskAllBits)
75 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(64));
78 TEST(BitfieldTest, MaskAllBitsGreaterThan64)
83 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(70));
90 TEST(BitfieldTest, MaskOneBit)
92 EXPECT_EQ(1,
mask(0, 0));
95 TEST(BitfieldTest, MaskTwoBits)
97 EXPECT_EQ((1 << 1) + 1,
mask(1, 0));
100 TEST(BitfieldTest, MaskThreeBits)
102 EXPECT_EQ((1 << 5) + (1 << 4) + (1 << 3),
mask(5, 3));
105 TEST(BitfieldTest, MaskEntireRange)
107 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(63, 0));
110 TEST(BitfieldTest, MaskOutsideOfRange)
113 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(100, 0));
120 TEST(BitfieldTest, ExtractOneBit)
123 EXPECT_EQ(1,
bits(
x, 31));
126 TEST(BitfieldTest, Extract63rdBit)
128 int64_t
x = 1ULL << 63;
129 EXPECT_EQ(1,
bits(
x, 63));
132 TEST(BitfieldTest, ExtractFirstBit)
135 EXPECT_EQ(1,
bits(
x, 0));
138 TEST(BitfieldTest, ExtractFirstBitFirstBitZero)
141 EXPECT_EQ(0,
bits(
x, 0));
144 TEST(BitfieldTest, ExtractThreeBits)
146 uint64_t
x = 1 << 31;
147 EXPECT_EQ((1 << 2),
bits(
x, 31, 29));
155 TEST(BitfieldTest, MbitsStandardCase)
157 uint64_t
x = (1 << 10) + (1 << 1);
158 EXPECT_EQ((1 << 10),
mbits(
x, 10, 8));
161 TEST(BitfieldTest, MbitsEntireRange)
163 uint64_t
x = (1ULL << 63) + 1;
164 EXPECT_EQ((1ULL << 63) + 1,
mbits(
x, 63, 0));
172 TEST(BitfieldTest, SignExtendPositiveInput)
179 TEST(BitfieldTest, SignExtendNegativeInput)
186 TEST(BitfieldTest, SignExtendPositiveInputOutsideRange)
188 EXPECT_EQ((1 << 10), sext<8>(1 << 10));
191 TEST(BitfieldTest, SignExtendNegativeInputOutsideRange)
193 uint64_t
val = 0x4800000010000008;
194 uint64_t
output = 0xF800000010000008;
202 TEST(BitfieldTest, SignZeroExtendPositiveInput)
209 TEST(BitfieldTest, SignZeroExtendNegativeInput)
216 TEST(BitfieldTest, SignZeroExtendPositiveInputOutsideRange)
218 EXPECT_EQ(0, szext<8>(1 << 10));
221 TEST(BitfieldTest, SignZeroExtendNegativeInputOutsideRange)
223 uint64_t
val = 0x4800000010000008;
224 uint64_t
output = 0xF800000010000008;
232 TEST(BitfieldTest, InsertOneBitTo3)
235 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1) + 1;
239 TEST(BitfieldTest, InsertOneBitTo18)
242 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1) + 1;
246 TEST(BitfieldTest, InsertOneBitTo3LsbZero)
249 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1);
253 TEST(BitfieldTest, InsertOneBitTo18LsbZero)
256 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1);
260 TEST(BitfieldTest, InsertOnBitTo8LsbZero)
262 int64_t
val = (1 << 8);
263 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1);
267 TEST(BitfieldTest, InsertMultipleBits)
269 int64_t
val = (1ULL << 63);
270 int64_t
bits = (1 << 2) + 1;
274 TEST(BitfieldTest, InsertMultipleBitsOverwrite)
276 int64_t
val = (1 << 29);
277 int64_t
bits = (1 << 2) + 1;
282 TEST(BitfieldTest, ReverseBits8Bit)
284 uint8_t value = (1 << 7);
288 TEST(BitfieldTest, ReverseBits64Bit)
290 uint64_t value = 0xF0F0F0F0F0F0F0F1;
299 uint64_t
val = (1 << 29) + (1 << 1);
305 uint64_t
val = (1ULL << 63) + (1ULL << 60) + (1 << 1);
310 TEST(BitfieldTest, FindMsbZero)
317 uint64_t
val = (1ULL << 63) + (1 << 1);
321 TEST(BitfieldTest, FindLsbZero)
330 TEST(BitfieldTest, PopCountNoBits)
335 TEST(BitfieldTest, PopCountOneBit)
337 int64_t
val = (1 << 9);
341 TEST(BitfieldTest, PopCountManyBits)
343 int64_t
val = (1 << 22) + (1 << 21) + (1 << 15) + (1 << 9) + 1;
347 TEST(BitfieldTest, PopCountAllOnes)
349 int64_t
val = 0xFFFFFFFFFFFFFFFF;
358 TEST(BitfieldTest, AlignToPowerOfTwo0)
363 TEST(BitfieldTest, AlignToPowerOfTwo3)
368 TEST(BitfieldTest, AlignToPowerOfTwo5)
373 TEST(BitfieldTest, AlignToPowerOfTwo10)
378 TEST(BitfieldTest, AlignToPowerOfTwo16)
383 TEST(BitfieldTest, AlignToPowerOfTwo31)
394 TEST(BitfieldTest, CountTrailingZeros32BitsNoTrailing)
397 EXPECT_EQ(0,
ctz32(value));
400 TEST(BitfieldTest, CountTrailingZeros32Bits)
402 uint32_t value = (1 << 30) + (1 << 29);
403 EXPECT_EQ(29,
ctz32(value));
406 TEST(BitfieldTest, CountTrailingZeros64BitsNoTrailing)
408 uint64_t value = (1 << 29) + 1;
409 EXPECT_EQ(0,
ctz64(value));
412 TEST(BitfieldTest, CountTrailingZeros64Bits)
414 uint64_t value = 1ULL << 63;
415 EXPECT_EQ(63,
ctz64(value));
418 TEST(BitfieldTest, CountTrailingZero64AllZeros)
421 EXPECT_EQ(64,
ctz64(value));