50#include <gtest/gtest.h>
60TEST(BitfieldTest, Mask0Bits)
62 EXPECT_EQ(0x0,
mask(0));
65TEST(BitfieldTest, Mask1Bit)
67 EXPECT_EQ(0x1,
mask(1));
70TEST(BitfieldTest, Mask8Bits)
72 EXPECT_EQ(0xFF,
mask(8));
75TEST(BitfieldTest, Mask16Bits)
77 EXPECT_EQ(0xFFFF,
mask(16));
80TEST(BitfieldTest, Mask32Bits)
82 EXPECT_EQ(0xFFFFFFFF,
mask(32));
85TEST(BitfieldTest, MaskAllBits)
87 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(64));
90TEST(BitfieldTest, MaskAllBitsGreaterThan64)
95 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(70));
104 EXPECT_EQ(1,
mask(0, 0));
109 EXPECT_EQ((1 << 1) + 1,
mask(1, 0));
112TEST(BitfieldTest, MaskThreeBits)
114 EXPECT_EQ((1 << 5) + (1 << 4) + (1 << 3),
mask(5, 3));
117TEST(BitfieldTest, MaskEntireRange)
119 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(63, 0));
122TEST(BitfieldTest, MaskOutsideOfRange)
125 EXPECT_EQ(0xFFFFFFFFFFFFFFFF,
mask(100, 0));
132TEST(BitfieldTest, ExtractOneBit)
135 EXPECT_EQ(1,
bits(
x, 31));
138TEST(BitfieldTest, Extract63rdBit)
140 int64_t
x = 1ULL << 63;
141 EXPECT_EQ(1,
bits(
x, 63));
144TEST(BitfieldTest, ExtractFirstBit)
147 EXPECT_EQ(1,
bits(
x, 0));
150TEST(BitfieldTest, ExtractFirstBitFirstBitZero)
153 EXPECT_EQ(0,
bits(
x, 0));
156TEST(BitfieldTest, ExtractThreeBits)
158 uint64_t
x = 1 << 31;
159 EXPECT_EQ((1 << 2),
bits(
x, 31, 29));
167TEST(BitfieldTest, MbitsStandardCase)
169 uint64_t
x = (1 << 10) + (1 << 1);
170 EXPECT_EQ((1 << 10),
mbits(
x, 10, 8));
173TEST(BitfieldTest, MbitsEntireRange)
175 uint64_t
x = (1ULL << 63) + 1;
176 EXPECT_EQ((1ULL << 63) + 1,
mbits(
x, 63, 0));
184TEST(BitfieldTest, SignExtendPositiveInput)
191TEST(BitfieldTest, SignExtendNegativeInput)
198TEST(BitfieldTest, SignExtendPositiveInputOutsideRange)
200 EXPECT_EQ((1 << 10),
sext<8>(1 << 10));
203TEST(BitfieldTest, SignExtendNegativeInputOutsideRange)
205 uint64_t
val = 0x4800000010000008;
206 uint64_t
output = 0xF800000010000008;
214TEST(BitfieldTest, SignZeroExtendPositiveInput)
221TEST(BitfieldTest, SignZeroExtendNegativeInput)
228TEST(BitfieldTest, SignZeroExtendPositiveInputOutsideRange)
233TEST(BitfieldTest, SignZeroExtendNegativeInputOutsideRange)
235 uint64_t
val = 0x4800000010000008;
236 uint64_t
output = 0xF800000010000008;
244TEST(BitfieldTest, InsertOneBitTo3)
247 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1) + 1;
251TEST(BitfieldTest, InsertOneBitTo18)
254 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1) + 1;
258TEST(BitfieldTest, InsertOneBitTo3LsbZero)
261 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1);
265TEST(BitfieldTest, InsertOneBitTo18LsbZero)
268 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1);
272TEST(BitfieldTest, InsertOnBitTo8LsbZero)
274 int64_t
val = (1 << 8);
275 int64_t
bits = (1 << 3) + (1 << 2) + (1 << 1);
279TEST(BitfieldTest, InsertMultipleBits)
281 int64_t
val = (1ULL << 63);
282 int64_t
bits = (1 << 2) + 1;
286TEST(BitfieldTest, InsertMultipleBitsOverwrite)
288 int64_t
val = (1 << 29);
289 int64_t
bits = (1 << 2) + 1;
294TEST(BitfieldTest, ReverseBits8Bit)
296 uint8_t value = (1 << 7);
300TEST(BitfieldTest, ReverseBits64Bit)
302 uint64_t value = 0xF0F0F0F0F0F0F0F1;
311 uint64_t
val = (1 << 29) + (1 << 1);
317 uint64_t
val = (1ULL << 63) + (1ULL << 60) + (1 << 1);
329 uint64_t
val = (1ULL << 63) + (1 << 1);
331 EXPECT_EQ(1, findLsbSetFallback(
val));
339TEST(BitfieldTest, FindLsbGeneralized)
341 static constexpr size_t N{1000};
342 std::bitset<N>
bs{0};
344 for (
size_t i{0};
i < N ; ++
i) {
345 bs = std::bitset<N>{1} <<
i;
349 const auto leadingOne = std::bitset<N>{1} << (N-1);
350 for (
size_t i{0};
i < N ; ++
i) {
351 bs = leadingOne | (std::bitset<N>{1} <<
i);
360TEST(BitfieldTest, PopCountNoBits)
365TEST(BitfieldTest, PopCountOneBit)
367 int64_t
val = (1 << 9);
371TEST(BitfieldTest, PopCountManyBits)
373 int64_t
val = (1 << 22) + (1 << 21) + (1 << 15) + (1 << 9) + 1;
377TEST(BitfieldTest, PopCountAllOnes)
379 int64_t
val = 0xFFFFFFFFFFFFFFFF;
388TEST(BitfieldTest, AlignToPowerOfTwo0)
393TEST(BitfieldTest, AlignToPowerOfTwo3)
398TEST(BitfieldTest, AlignToPowerOfTwo5)
403TEST(BitfieldTest, AlignToPowerOfTwo10)
408TEST(BitfieldTest, AlignToPowerOfTwo16)
413TEST(BitfieldTest, AlignToPowerOfTwo31)
424TEST(BitfieldTest, CountTrailingZeros32BitsNoTrailing)
427 EXPECT_EQ(0,
ctz32(value));
430TEST(BitfieldTest, CountTrailingZeros32Bits)
432 uint32_t value = (1 << 30) + (1 << 29);
433 EXPECT_EQ(29,
ctz32(value));
436TEST(BitfieldTest, CountTrailingZeros64BitsNoTrailing)
438 uint64_t value = (1 << 29) + 1;
439 EXPECT_EQ(0,
ctz64(value));
442TEST(BitfieldTest, CountTrailingZeros64Bits)
444 uint64_t value = 1ULL << 63;
445 EXPECT_EQ(63,
ctz64(value));
448TEST(BitfieldTest, CountTrailingZero64AllZeros)
451 EXPECT_EQ(64,
ctz64(value));
460TEST(BitfieldTest, CountLeadingZeros32BitsNoTrailing)
463 EXPECT_EQ(31,
clz32(value));
466TEST(BitfieldTest, CountLeadingZeros32Bits)
468 uint32_t value = (1 << 30) + (1 << 29);
469 EXPECT_EQ(1,
clz32(value));
472TEST(BitfieldTest, CountLeadingZeros64BitsNoTrailing)
474 uint64_t value = (1 << 29) + 1;
475 EXPECT_EQ(34,
clz64(value));
478TEST(BitfieldTest, CountLeadingZeros64Bits)
480 uint64_t value = 1ULL << 63;
481 EXPECT_EQ(0,
clz64(value));
484TEST(BitfieldTest, CountLeadingZero64AllZeros)
487 EXPECT_EQ(64,
clz64(value));
496TEST(BitfieldTest, DecodeMaskOneBit)
499 EXPECT_FALSE(decode_1(0b0));
500 EXPECT_TRUE(decode_1(0b1));
503 EXPECT_TRUE(decode_0(0b0));
504 EXPECT_FALSE(decode_0(0b1));
507 EXPECT_TRUE(decode_x(0b0));
508 EXPECT_TRUE(decode_x(0b1));
515TEST(BitfieldTest, DecodeMaskMultipleBits)
518 uint8_t, 3, 0,
'1',
'0',
'1',
'X'>();
520 EXPECT_FALSE(decode(0b0000));
521 EXPECT_FALSE(decode(0b0010));
523 EXPECT_TRUE(decode(0b1010));
524 EXPECT_TRUE(decode(0b1011));
TEST(BitfieldTest, Mask0Bits)
constexpr int findMsbSet(uint64_t val)
Returns the bit position of the MSB that is set in the input.
constexpr int clz32(uint32_t value)
Count leading zeros in a 32-bit value.
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
constexpr int popCount(uint64_t val)
Returns the number of set ones in the provided value.
constexpr T mbits(T val, unsigned first, unsigned last)
Mask off the given bits in place like bits() but without shifting.
constexpr int ctz32(uint32_t value)
Count trailing zeros in a 32-bit value.
constexpr uint64_t szext(uint64_t val)
Sign-extend an N-bit value to 64 bits.
constexpr T insertBits(T val, unsigned first, unsigned last, B bit_val)
Returns val with bits first to last set to the LSBs of bit_val.
constexpr uint64_t alignToPowerOfTwo(uint64_t val)
Align to the next highest power of two.
constexpr uint64_t sext(uint64_t val)
Sign-extend an N-bit value to 64 bits.
constexpr int findLsbSet(uint64_t val)
Returns the bit position of the LSB that is set in the input That function will either use a builtin ...
constexpr int ctz64(uint64_t value)
Count trailing zeros in a 64-bit value.
constexpr int clz64(uint64_t value)
Count leading zeros in a 64-bit value.
std::enable_if_t< std::is_integral_v< T >, T > reverseBits(T val, size_t size=sizeof(T))
Takes a value and returns the bit reversed version.
Copyright (c) 2024 Arm Limited All rights reserved.
constexpr auto bitPatternMatcher()
This helper implements a pattern matcher that can be used for instruction decoding.
static void output(const char *filename)