diff options
author | 2017-10-06 11:34:26 -0700 | |
---|---|---|
committer | 2017-10-06 16:46:56 -0700 | |
commit | c60f75d6d6f229fa7b5494d54189e974883dafa2 (patch) | |
tree | f728320ab915995a011f15089e726ca674f36dc8 /runtime/base/bit_utils_test.cc | |
parent | 7ec532fd6387a309c824f1abba466003593a685e (diff) |
base: Add more bit utils and bit struct class
Allows efficient, zero-cost, bitwise memory storage.
// Definition for type 'Example'
BITSTRUCT_DEFINE_START(Example, 10)
BitStructUint<0, 2> u2; // Every field must be a BitStruct[*].
BitStructInt<2, 7> i7;
BitStructUint<9, 1> i1;
BITSTRUCT_DEFINE_END(Example);
Would define a bit struct with this layout:
<- 1 -> <-- 7 --> <- 2 ->
+--------+---------------+-----+
| i1 | i7 | u2 +
+--------+---------------+-----+
10 9 2 0
See bit_struct.h for more documentation.
(Also adds new BitField[Extract|Insert|Clear] bit_utils similar
to the ARM bitfield instructions).
Test: art/test.py --gtest
Change-Id: I5e43f2468c5d275ee872546855527bb4ea73ad4c
Diffstat (limited to 'runtime/base/bit_utils_test.cc')
-rw-r--r-- | runtime/base/bit_utils_test.cc | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/runtime/base/bit_utils_test.cc b/runtime/base/bit_utils_test.cc index c96c6dc933..0276d8ded2 100644 --- a/runtime/base/bit_utils_test.cc +++ b/runtime/base/bit_utils_test.cc @@ -345,6 +345,97 @@ static_assert(IsAbsoluteUint<32, int64_t>(std::numeric_limits<uint32_t>::max()), "TestIsAbsoluteUint64#27"); static_assert(!IsAbsoluteUint<32, int64_t>(kUint32MaxPlus1), "TestIsAbsoluteUint64#28"); +static_assert(MaskLeastSignificant(0) == 0b0, "TestMaskLeastSignificant#1"); +static_assert(MaskLeastSignificant(1) == 0b1, "TestMaskLeastSignificant#2"); +static_assert(MaskLeastSignificant(2) == 0b11, "TestMaskLeastSignificant#3"); +static_assert(MaskLeastSignificant<uint8_t>(8) == 0xFF, "TestMaskLeastSignificant#4"); +static_assert(MaskLeastSignificant<int8_t>(8) == 0xFF, "TestMaskLeastSignificant#5"); + +static_assert(BitFieldClear(0xFF, /*lsb*/0, /*width*/0) == 0xFF, "TestBitFieldClear#1"); +static_assert(BitFieldClear(std::numeric_limits<uint32_t>::max(), /*lsb*/0, /*width*/32) == 0x0, + "TestBitFieldClear#2"); +static_assert(BitFieldClear(std::numeric_limits<int32_t>::max(), /*lsb*/0, /*width*/32) == 0x0, + "TestBitFieldClear#3"); +static_assert(BitFieldClear(0xFF, /*lsb*/0, /*width*/2) == 0b11111100, "TestBitFieldClear#4"); +static_assert(BitFieldClear(0xFF, /*lsb*/0, /*width*/3) == 0b11111000, "TestBitFieldClear#5"); +static_assert(BitFieldClear(0xFF, /*lsb*/1, /*width*/3) == 0b11110001, "TestBitFieldClear#6"); +static_assert(BitFieldClear(0xFF, /*lsb*/2, /*width*/3) == 0b11100011, "TestBitFieldClear#7"); + +static_assert(BitFieldExtract(0xFF, /*lsb*/0, /*width*/0) == 0x0, "TestBitFieldExtract#1"); +static_assert(BitFieldExtract(std::numeric_limits<uint32_t>::max(), /*lsb*/0, /*width*/32) + == std::numeric_limits<uint32_t>::max(), + "TestBitFieldExtract#2"); +static_assert(BitFieldExtract(std::numeric_limits<int32_t>::max(), /*lsb*/0, /*width*/32) + == std::numeric_limits<int32_t>::max(), + "TestBitFieldExtract#3"); +static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb*/0, /*width*/2) == 0b00000011, + "TestBitFieldExtract#4"); +static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb*/0, /*width*/3) == 0b00000111, + "TestBitFieldExtract#5"); +static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb*/1, /*width*/3) == 0b00000111, + "TestBitFieldExtract#6"); +static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb*/2, /*width*/3) == 0b00000111, + "TestBitFieldExtract#7"); +static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb*/3, /*width*/3) == 0b00000111, + "TestBitFieldExtract#8"); +static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb*/8, /*width*/3) == 0b00000000, + "TestBitFieldExtract#9"); +static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb*/7, /*width*/3) == 0b00000001, + "TestBitFieldExtract#10"); +static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb*/6, /*width*/3) == 0b00000011, + "TestBitFieldExtract#11"); +static_assert(BitFieldExtract(0xFF, /*lsb*/0, /*width*/2) == -1, "TestBitFieldExtract#12"); +static_assert(BitFieldExtract(0xFF, /*lsb*/0, /*width*/3) == -1, "TestBitFieldExtract#13"); +static_assert(BitFieldExtract(0xFF, /*lsb*/1, /*width*/3) == -1, "TestBitFieldExtract#14"); +static_assert(BitFieldExtract(0xFF, /*lsb*/2, /*width*/3) == -1, "TestBitFieldExtract#15"); +static_assert(BitFieldExtract(0xFF, /*lsb*/3, /*width*/3) == -1, "TestBitFieldExtract#16"); +static_assert(BitFieldExtract(0xFF, /*lsb*/8, /*width*/3) == 0b00000000, "TestBitFieldExtract#17"); +static_assert(BitFieldExtract(0xFF, /*lsb*/7, /*width*/3) == 0b00000001, "TestBitFieldExtract#18"); +static_assert(BitFieldExtract(0xFF, /*lsb*/6, /*width*/3) == 0b00000011, "TestBitFieldExtract#19"); +static_assert(BitFieldExtract(static_cast<uint8_t>(0b01101010), /*lsb*/2, /*width*/4) + == 0b00001010, + "TestBitFieldExtract#20"); +static_assert(BitFieldExtract(static_cast<int8_t>(0b01101010), /*lsb*/2, /*width*/4) + == static_cast<int8_t>(0b11111010), + "TestBitFieldExtract#21"); + +static_assert(BitFieldInsert(0xFF, /*data*/0x0, /*lsb*/0, /*width*/0) == 0xFF, + "TestBitFieldInsert#1"); +static_assert(BitFieldInsert(std::numeric_limits<uint32_t>::max(), + /*data*/std::numeric_limits<uint32_t>::max(), + /*lsb*/0, + /*width*/32) + == std::numeric_limits<uint32_t>::max(), + "TestBitFieldInsert#2"); +static_assert(BitFieldInsert(std::numeric_limits<int32_t>::max(), + /*data*/std::numeric_limits<uint32_t>::max(), + /*lsb*/0, + /*width*/32) + == std::numeric_limits<uint32_t>::max(), + "TestBitFieldInsert#3"); +static_assert(BitFieldInsert(0u, + /*data*/std::numeric_limits<uint32_t>::max(), + /*lsb*/0, + /*width*/32) + == std::numeric_limits<uint32_t>::max(), + "TestBitFieldInsert#4"); +static_assert(BitFieldInsert(-(-0), + /*data*/std::numeric_limits<uint32_t>::max(), + /*lsb*/0, + /*width*/32) + == std::numeric_limits<uint32_t>::max(), + "TestBitFieldInsert#5"); +static_assert(BitFieldInsert(0x00, /*data*/0b11u, /*lsb*/0, /*width*/2) == 0b00000011, + "TestBitFieldInsert#6"); +static_assert(BitFieldInsert(0x00, /*data*/0b111u, /*lsb*/0, /*width*/3) == 0b00000111, + "TestBitFieldInsert#7"); +static_assert(BitFieldInsert(0x00, /*data*/0b111u, /*lsb*/1, /*width*/3) == 0b00001110, + "TestBitFieldInsert#8"); +static_assert(BitFieldInsert(0x00, /*data*/0b111u, /*lsb*/2, /*width*/3) == 0b00011100, + "TestBitFieldInsert#9"); +static_assert(BitFieldInsert(0b01011100, /*data*/0b1101u, /*lsb*/4, /*width*/4) == 0b11011100, + "TestBitFieldInsert#10"); + template <typename Container> void CheckElements(const std::initializer_list<uint32_t>& expected, const Container& elements) { auto expected_it = expected.begin(); |