xref: /aosp_15_r20/art/libartbase/base/bit_utils_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include <vector>
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include "bit_utils.h"
20*795d594fSAndroid Build Coastguard Worker #include "bit_utils_iterator.h"
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker #include "gtest/gtest.h"
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker namespace art {
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker // NOTE: CLZ(0u) is undefined.
27*795d594fSAndroid Build Coastguard Worker static_assert(31 == CLZ<uint32_t>(1u), "TestCLZ32#1");
28*795d594fSAndroid Build Coastguard Worker static_assert(30 == CLZ<uint32_t>(2u), "TestCLZ32#2");
29*795d594fSAndroid Build Coastguard Worker static_assert(16 == CLZ<uint32_t>(0x00008765u), "TestCLZ32#3");
30*795d594fSAndroid Build Coastguard Worker static_assert(15 == CLZ<uint32_t>(0x00012345u), "TestCLZ32#4");
31*795d594fSAndroid Build Coastguard Worker static_assert(1 == CLZ<uint32_t>(0x43214321u), "TestCLZ32#5");
32*795d594fSAndroid Build Coastguard Worker static_assert(0 == CLZ<uint32_t>(0x87654321u), "TestCLZ32#6");
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker // NOTE: CLZ(0ull) is undefined.
35*795d594fSAndroid Build Coastguard Worker static_assert(63 == CLZ<uint64_t>(UINT64_C(1)), "TestCLZ64#1");
36*795d594fSAndroid Build Coastguard Worker static_assert(62 == CLZ<uint64_t>(UINT64_C(3)), "TestCLZ64#2");
37*795d594fSAndroid Build Coastguard Worker static_assert(48 == CLZ<uint64_t>(UINT64_C(0x00008765)), "TestCLZ64#3");
38*795d594fSAndroid Build Coastguard Worker static_assert(32 == CLZ<uint64_t>(UINT64_C(0x87654321)), "TestCLZ64#4");
39*795d594fSAndroid Build Coastguard Worker static_assert(31 == CLZ<uint64_t>(UINT64_C(0x123456789)), "TestCLZ64#5");
40*795d594fSAndroid Build Coastguard Worker static_assert(16 == CLZ<uint64_t>(UINT64_C(0x876543211234)), "TestCLZ64#6");
41*795d594fSAndroid Build Coastguard Worker static_assert(1 == CLZ<uint64_t>(UINT64_C(0x4321432187654321)), "TestCLZ64#7");
42*795d594fSAndroid Build Coastguard Worker static_assert(0 == CLZ<uint64_t>(UINT64_C(0x8765432187654321)), "TestCLZ64#8");
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker // NOTE: CTZ(0u) is undefined.
45*795d594fSAndroid Build Coastguard Worker static_assert(0 == CTZ<uint32_t>(1u), "TestCTZ32#1");
46*795d594fSAndroid Build Coastguard Worker static_assert(1 == CTZ<uint32_t>(2u), "TestCTZ32#2");
47*795d594fSAndroid Build Coastguard Worker static_assert(15 == CTZ<uint32_t>(0x45678000u), "TestCTZ32#3");
48*795d594fSAndroid Build Coastguard Worker static_assert(16 == CTZ<uint32_t>(0x43210000u), "TestCTZ32#4");
49*795d594fSAndroid Build Coastguard Worker static_assert(30 == CTZ<uint32_t>(0xc0000000u), "TestCTZ32#5");
50*795d594fSAndroid Build Coastguard Worker static_assert(31 == CTZ<uint32_t>(0x80000000u), "TestCTZ32#6");
51*795d594fSAndroid Build Coastguard Worker 
52*795d594fSAndroid Build Coastguard Worker // NOTE: CTZ(0ull) is undefined.
53*795d594fSAndroid Build Coastguard Worker static_assert(0 == CTZ<uint64_t>(UINT64_C(1)), "TestCTZ64#1");
54*795d594fSAndroid Build Coastguard Worker static_assert(1 == CTZ<uint64_t>(UINT64_C(2)), "TestCTZ64#2");
55*795d594fSAndroid Build Coastguard Worker static_assert(16 == CTZ<uint64_t>(UINT64_C(0x43210000)), "TestCTZ64#3");
56*795d594fSAndroid Build Coastguard Worker static_assert(31 == CTZ<uint64_t>(UINT64_C(0x80000000)), "TestCTZ64#4");
57*795d594fSAndroid Build Coastguard Worker static_assert(32 == CTZ<uint64_t>(UINT64_C(0x8765432100000000)), "TestCTZ64#5");
58*795d594fSAndroid Build Coastguard Worker static_assert(48 == CTZ<uint64_t>(UINT64_C(0x4321000000000000)), "TestCTZ64#6");
59*795d594fSAndroid Build Coastguard Worker static_assert(62 == CTZ<uint64_t>(UINT64_C(0x4000000000000000)), "TestCTZ64#7");
60*795d594fSAndroid Build Coastguard Worker static_assert(63 == CTZ<uint64_t>(UINT64_C(0x8000000000000000)), "TestCTZ64#8");
61*795d594fSAndroid Build Coastguard Worker 
62*795d594fSAndroid Build Coastguard Worker static_assert(0 == POPCOUNT<uint32_t>(0u), "TestPOPCOUNT32#1");
63*795d594fSAndroid Build Coastguard Worker static_assert(1 == POPCOUNT<uint32_t>(8u), "TestPOPCOUNT32#2");
64*795d594fSAndroid Build Coastguard Worker static_assert(15 == POPCOUNT<uint32_t>(0x55555554u), "TestPOPCOUNT32#3");
65*795d594fSAndroid Build Coastguard Worker static_assert(16 == POPCOUNT<uint32_t>(0xaaaaaaaau), "TestPOPCOUNT32#4");
66*795d594fSAndroid Build Coastguard Worker static_assert(31 == POPCOUNT<uint32_t>(0xfffffffeu), "TestPOPCOUNT32#5");
67*795d594fSAndroid Build Coastguard Worker static_assert(32 == POPCOUNT<uint32_t>(0xffffffffu), "TestPOPCOUNT32#6");
68*795d594fSAndroid Build Coastguard Worker 
69*795d594fSAndroid Build Coastguard Worker static_assert(0 == POPCOUNT<uint64_t>(UINT64_C(0)), "TestPOPCOUNT64#1");
70*795d594fSAndroid Build Coastguard Worker static_assert(1 == POPCOUNT<uint64_t>(UINT64_C(0x40000)), "TestPOPCOUNT64#2");
71*795d594fSAndroid Build Coastguard Worker static_assert(16 == POPCOUNT<uint64_t>(UINT64_C(0x1414141482828282)), "TestPOPCOUNT64#3");
72*795d594fSAndroid Build Coastguard Worker static_assert(31 == POPCOUNT<uint64_t>(UINT64_C(0x0000ffff00007fff)), "TestPOPCOUNT64#4");
73*795d594fSAndroid Build Coastguard Worker static_assert(32 == POPCOUNT<uint64_t>(UINT64_C(0x5555555555555555)), "TestPOPCOUNT64#5");
74*795d594fSAndroid Build Coastguard Worker static_assert(48 == POPCOUNT<uint64_t>(UINT64_C(0x7777bbbbddddeeee)), "TestPOPCOUNT64#6");
75*795d594fSAndroid Build Coastguard Worker static_assert(63 == POPCOUNT<uint64_t>(UINT64_C(0x7fffffffffffffff)), "TestPOPCOUNT64#7");
76*795d594fSAndroid Build Coastguard Worker static_assert(64 == POPCOUNT<uint64_t>(UINT64_C(0xffffffffffffffff)), "TestPOPCOUNT64#8");
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker static_assert(-1 == MostSignificantBit<uint32_t>(0u), "TestMSB32#1");
79*795d594fSAndroid Build Coastguard Worker static_assert(0 == MostSignificantBit<uint32_t>(1u), "TestMSB32#2");
80*795d594fSAndroid Build Coastguard Worker static_assert(31 == MostSignificantBit<uint32_t>(~static_cast<uint32_t>(0u)), "TestMSB32#3");
81*795d594fSAndroid Build Coastguard Worker static_assert(2 == MostSignificantBit<uint32_t>(0b110), "TestMSB32#4");
82*795d594fSAndroid Build Coastguard Worker static_assert(2 == MostSignificantBit<uint32_t>(0b100), "TestMSB32#5");
83*795d594fSAndroid Build Coastguard Worker 
84*795d594fSAndroid Build Coastguard Worker static_assert(-1 == MostSignificantBit<uint64_t>(UINT64_C(0)), "TestMSB64#1");
85*795d594fSAndroid Build Coastguard Worker static_assert(0 == MostSignificantBit<uint64_t>(UINT64_C(1)), "TestMSB64#2");
86*795d594fSAndroid Build Coastguard Worker static_assert(63 == MostSignificantBit<uint64_t>(~UINT64_C(0)), "TestMSB64#3");
87*795d594fSAndroid Build Coastguard Worker static_assert(34 == MostSignificantBit<uint64_t>(UINT64_C(0x700000000)), "TestMSB64#4");
88*795d594fSAndroid Build Coastguard Worker static_assert(34 == MostSignificantBit<uint64_t>(UINT64_C(0x777777777)), "TestMSB64#5");
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker static_assert(-1 == LeastSignificantBit<uint32_t>(0u), "TestLSB32#1");
91*795d594fSAndroid Build Coastguard Worker static_assert(0 == LeastSignificantBit<uint32_t>(1u), "TestLSB32#1");
92*795d594fSAndroid Build Coastguard Worker static_assert(0 == LeastSignificantBit<uint32_t>(~static_cast<uint32_t>(0u)), "TestLSB32#1");
93*795d594fSAndroid Build Coastguard Worker static_assert(1 == LeastSignificantBit<uint32_t>(0b110), "TestLSB32#1");
94*795d594fSAndroid Build Coastguard Worker static_assert(2 == LeastSignificantBit<uint32_t>(0b100), "TestLSB32#1");
95*795d594fSAndroid Build Coastguard Worker 
96*795d594fSAndroid Build Coastguard Worker static_assert(-1 == LeastSignificantBit<uint64_t>(UINT64_C(0)), "TestLSB64#1");
97*795d594fSAndroid Build Coastguard Worker static_assert(0 == LeastSignificantBit<uint64_t>(UINT64_C(1)), "TestLSB64#2");
98*795d594fSAndroid Build Coastguard Worker static_assert(0 == LeastSignificantBit<uint64_t>(~UINT64_C(0)), "TestLSB64#3");
99*795d594fSAndroid Build Coastguard Worker static_assert(12 == LeastSignificantBit<uint64_t>(UINT64_C(0x5000)), "TestLSB64#4");
100*795d594fSAndroid Build Coastguard Worker static_assert(48 == LeastSignificantBit<uint64_t>(UINT64_C(0x5555000000000000)), "TestLSB64#5");
101*795d594fSAndroid Build Coastguard Worker 
102*795d594fSAndroid Build Coastguard Worker static_assert(0u == MinimumBitsToStore<uint32_t>(0u), "TestMinBits2Store32#1");
103*795d594fSAndroid Build Coastguard Worker static_assert(1u == MinimumBitsToStore<uint32_t>(1u), "TestMinBits2Store32#2");
104*795d594fSAndroid Build Coastguard Worker static_assert(2u == MinimumBitsToStore<uint32_t>(0b10u), "TestMinBits2Store32#3");
105*795d594fSAndroid Build Coastguard Worker static_assert(2u == MinimumBitsToStore<uint32_t>(0b11u), "TestMinBits2Store32#4");
106*795d594fSAndroid Build Coastguard Worker static_assert(3u == MinimumBitsToStore<uint32_t>(0b100u), "TestMinBits2Store32#5");
107*795d594fSAndroid Build Coastguard Worker static_assert(3u == MinimumBitsToStore<uint32_t>(0b110u), "TestMinBits2Store32#6");
108*795d594fSAndroid Build Coastguard Worker static_assert(3u == MinimumBitsToStore<uint32_t>(0b101u), "TestMinBits2Store32#7");
109*795d594fSAndroid Build Coastguard Worker static_assert(8u == MinimumBitsToStore<uint32_t>(0xFFu), "TestMinBits2Store32#8");
110*795d594fSAndroid Build Coastguard Worker static_assert(32u == MinimumBitsToStore<uint32_t>(~static_cast<uint32_t>(0u)),
111*795d594fSAndroid Build Coastguard Worker               "TestMinBits2Store32#9");
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker static_assert(0u == MinimumBitsToStore<uint64_t>(UINT64_C(0)), "TestMinBits2Store64#1");
114*795d594fSAndroid Build Coastguard Worker static_assert(1u == MinimumBitsToStore<uint64_t>(UINT64_C(1)), "TestMinBits2Store64#2");
115*795d594fSAndroid Build Coastguard Worker static_assert(2u == MinimumBitsToStore<uint64_t>(UINT64_C(0b10)), "TestMinBits2Store64#3");
116*795d594fSAndroid Build Coastguard Worker static_assert(2u == MinimumBitsToStore<uint64_t>(UINT64_C(0b11)), "TestMinBits2Store64#4");
117*795d594fSAndroid Build Coastguard Worker static_assert(3u == MinimumBitsToStore<uint64_t>(UINT64_C(0b100)), "TestMinBits2Store64#5");
118*795d594fSAndroid Build Coastguard Worker static_assert(3u == MinimumBitsToStore<uint64_t>(UINT64_C(0b110)), "TestMinBits2Store64#6");
119*795d594fSAndroid Build Coastguard Worker static_assert(3u == MinimumBitsToStore<uint64_t>(UINT64_C(0b101)), "TestMinBits2Store64#7");
120*795d594fSAndroid Build Coastguard Worker static_assert(8u == MinimumBitsToStore<uint64_t>(UINT64_C(0xFF)), "TestMinBits2Store64#8");
121*795d594fSAndroid Build Coastguard Worker static_assert(32u == MinimumBitsToStore<uint64_t>(UINT64_C(0xFFFFFFFF)), "TestMinBits2Store64#9");
122*795d594fSAndroid Build Coastguard Worker static_assert(33u == MinimumBitsToStore<uint64_t>(UINT64_C(0x1FFFFFFFF)), "TestMinBits2Store64#10");
123*795d594fSAndroid Build Coastguard Worker static_assert(64u == MinimumBitsToStore<uint64_t>(~UINT64_C(0)), "TestMinBits2Store64#11");
124*795d594fSAndroid Build Coastguard Worker 
125*795d594fSAndroid Build Coastguard Worker static_assert(0 == TruncToPowerOfTwo<uint32_t>(0u), "TestTruncToPowerOfTwo32#1");
126*795d594fSAndroid Build Coastguard Worker static_assert(1 == TruncToPowerOfTwo<uint32_t>(1u), "TestTruncToPowerOfTwo32#2");
127*795d594fSAndroid Build Coastguard Worker static_assert(2 == TruncToPowerOfTwo<uint32_t>(2u), "TestTruncToPowerOfTwo32#3");
128*795d594fSAndroid Build Coastguard Worker static_assert(2 == TruncToPowerOfTwo<uint32_t>(3u), "TestTruncToPowerOfTwo32#4");
129*795d594fSAndroid Build Coastguard Worker static_assert(4 == TruncToPowerOfTwo<uint32_t>(7u), "TestTruncToPowerOfTwo32#5");
130*795d594fSAndroid Build Coastguard Worker static_assert(0x20000u == TruncToPowerOfTwo<uint32_t>(0x3aaaau),
131*795d594fSAndroid Build Coastguard Worker               "TestTruncToPowerOfTwo32#6");
132*795d594fSAndroid Build Coastguard Worker static_assert(0x40000000u == TruncToPowerOfTwo<uint32_t>(0x40000001u),
133*795d594fSAndroid Build Coastguard Worker               "TestTruncToPowerOfTwo32#7");
134*795d594fSAndroid Build Coastguard Worker static_assert(0x80000000u == TruncToPowerOfTwo<uint32_t>(0x80000000u),
135*795d594fSAndroid Build Coastguard Worker               "TestTruncToPowerOfTwo32#8");
136*795d594fSAndroid Build Coastguard Worker 
137*795d594fSAndroid Build Coastguard Worker static_assert(0 == TruncToPowerOfTwo<uint64_t>(UINT64_C(0)), "TestTruncToPowerOfTwo64#1");
138*795d594fSAndroid Build Coastguard Worker static_assert(1 == TruncToPowerOfTwo<uint64_t>(UINT64_C(1)), "TestTruncToPowerOfTwo64#2");
139*795d594fSAndroid Build Coastguard Worker static_assert(2 == TruncToPowerOfTwo<uint64_t>(UINT64_C(2)), "TestTruncToPowerOfTwo64#3");
140*795d594fSAndroid Build Coastguard Worker static_assert(2 == TruncToPowerOfTwo<uint64_t>(UINT64_C(3)), "TestTruncToPowerOfTwo64#4");
141*795d594fSAndroid Build Coastguard Worker static_assert(4 == TruncToPowerOfTwo<uint64_t>(UINT64_C(7)), "TestTruncToPowerOfTwo64#5");
142*795d594fSAndroid Build Coastguard Worker static_assert(UINT64_C(0x20000) == TruncToPowerOfTwo<uint64_t>(UINT64_C(0x3aaaa)),
143*795d594fSAndroid Build Coastguard Worker               "TestTruncToPowerOfTwo64#6");
144*795d594fSAndroid Build Coastguard Worker static_assert(
145*795d594fSAndroid Build Coastguard Worker     UINT64_C(0x4000000000000000) == TruncToPowerOfTwo<uint64_t>(UINT64_C(0x4000000000000001)),
146*795d594fSAndroid Build Coastguard Worker     "TestTruncToPowerOfTwo64#7");
147*795d594fSAndroid Build Coastguard Worker static_assert(
148*795d594fSAndroid Build Coastguard Worker     UINT64_C(0x8000000000000000) == TruncToPowerOfTwo<uint64_t>(UINT64_C(0x8000000000000000)),
149*795d594fSAndroid Build Coastguard Worker     "TestTruncToPowerOfTwo64#8");
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker static_assert(0 == RoundUpToPowerOfTwo<uint32_t>(0u), "TestRoundUpPowerOfTwo32#1");
152*795d594fSAndroid Build Coastguard Worker static_assert(1 == RoundUpToPowerOfTwo<uint32_t>(1u), "TestRoundUpPowerOfTwo32#2");
153*795d594fSAndroid Build Coastguard Worker static_assert(2 == RoundUpToPowerOfTwo<uint32_t>(2u), "TestRoundUpPowerOfTwo32#3");
154*795d594fSAndroid Build Coastguard Worker static_assert(4 == RoundUpToPowerOfTwo<uint32_t>(3u), "TestRoundUpPowerOfTwo32#4");
155*795d594fSAndroid Build Coastguard Worker static_assert(8 == RoundUpToPowerOfTwo<uint32_t>(7u), "TestRoundUpPowerOfTwo32#5");
156*795d594fSAndroid Build Coastguard Worker static_assert(0x40000u == RoundUpToPowerOfTwo<uint32_t>(0x2aaaau),
157*795d594fSAndroid Build Coastguard Worker               "TestRoundUpPowerOfTwo32#6");
158*795d594fSAndroid Build Coastguard Worker static_assert(0x80000000u == RoundUpToPowerOfTwo<uint32_t>(0x40000001u),
159*795d594fSAndroid Build Coastguard Worker               "TestRoundUpPowerOfTwo32#7");
160*795d594fSAndroid Build Coastguard Worker static_assert(0x80000000u == RoundUpToPowerOfTwo<uint32_t>(0x80000000u),
161*795d594fSAndroid Build Coastguard Worker               "TestRoundUpPowerOfTwo32#8");
162*795d594fSAndroid Build Coastguard Worker 
163*795d594fSAndroid Build Coastguard Worker static_assert(0 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0)), "TestRoundUpPowerOfTwo64#1");
164*795d594fSAndroid Build Coastguard Worker static_assert(1 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(1)), "TestRoundUpPowerOfTwo64#2");
165*795d594fSAndroid Build Coastguard Worker static_assert(2 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(2)), "TestRoundUpPowerOfTwo64#3");
166*795d594fSAndroid Build Coastguard Worker static_assert(4 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(3)), "TestRoundUpPowerOfTwo64#4");
167*795d594fSAndroid Build Coastguard Worker static_assert(8 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(7)), "TestRoundUpPowerOfTwo64#5");
168*795d594fSAndroid Build Coastguard Worker static_assert(UINT64_C(0x40000) == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0x2aaaa)),
169*795d594fSAndroid Build Coastguard Worker               "TestRoundUpPowerOfTwo64#6");
170*795d594fSAndroid Build Coastguard Worker static_assert(
171*795d594fSAndroid Build Coastguard Worker     UINT64_C(0x8000000000000000) == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0x4000000000000001)),
172*795d594fSAndroid Build Coastguard Worker     "TestRoundUpPowerOfTwo64#7");
173*795d594fSAndroid Build Coastguard Worker static_assert(
174*795d594fSAndroid Build Coastguard Worker     UINT64_C(0x8000000000000000) == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0x8000000000000000)),
175*795d594fSAndroid Build Coastguard Worker     "TestRoundUpPowerOfTwo64#8");
176*795d594fSAndroid Build Coastguard Worker 
177*795d594fSAndroid Build Coastguard Worker static constexpr int64_t kInt32MinMinus1 =
178*795d594fSAndroid Build Coastguard Worker     static_cast<int64_t>(std::numeric_limits<int32_t>::min()) - 1;
179*795d594fSAndroid Build Coastguard Worker static constexpr int64_t kInt32MaxPlus1 =
180*795d594fSAndroid Build Coastguard Worker     static_cast<int64_t>(std::numeric_limits<int32_t>::max()) + 1;
181*795d594fSAndroid Build Coastguard Worker static constexpr int64_t kUint32MaxPlus1 =
182*795d594fSAndroid Build Coastguard Worker     static_cast<int64_t>(std::numeric_limits<uint32_t>::max()) + 1;
183*795d594fSAndroid Build Coastguard Worker 
TEST(BitUtilsTest,TestIsInt32)184*795d594fSAndroid Build Coastguard Worker TEST(BitUtilsTest, TestIsInt32) {
185*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int32_t>(1, -2));
186*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int32_t>(1, -1));
187*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int32_t>(1, 0));
188*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int32_t>(1, 1));
189*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int32_t>(4, -9));
190*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int32_t>(4, -8));
191*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int32_t>(4, 7));
192*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int32_t>(4, 8));
193*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int32_t>(31, std::numeric_limits<int32_t>::min()));
194*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int32_t>(31, std::numeric_limits<int32_t>::max()));
195*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int32_t>(32, std::numeric_limits<int32_t>::min()));
196*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int32_t>(32, std::numeric_limits<int32_t>::max()));
197*795d594fSAndroid Build Coastguard Worker }
198*795d594fSAndroid Build Coastguard Worker 
TEST(BitUtilsTest,TestIsInt64)199*795d594fSAndroid Build Coastguard Worker TEST(BitUtilsTest, TestIsInt64) {
200*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(1, -2));
201*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int64_t>(1, -1));
202*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int64_t>(1, 0));
203*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(1, 1));
204*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(4, -9));
205*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int64_t>(4, -8));
206*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int64_t>(4, 7));
207*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(4, 8));
208*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(31, std::numeric_limits<int32_t>::min()));
209*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(31, std::numeric_limits<int32_t>::max()));
210*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int64_t>(32, std::numeric_limits<int32_t>::min()));
211*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int64_t>(32, std::numeric_limits<int32_t>::max()));
212*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(32, kInt32MinMinus1));
213*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(32, kInt32MaxPlus1));
214*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(63, std::numeric_limits<int64_t>::min()));
215*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(IsInt<int64_t>(63, std::numeric_limits<int64_t>::max()));
216*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int64_t>(64, std::numeric_limits<int64_t>::min()));
217*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(IsInt<int64_t>(64, std::numeric_limits<int64_t>::max()));
218*795d594fSAndroid Build Coastguard Worker }
219*795d594fSAndroid Build Coastguard Worker 
220*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<1, int32_t>(-2), "TestIsInt32#1");
221*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<1, int32_t>(-1), "TestIsInt32#2");
222*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<1, int32_t>(0), "TestIsInt32#3");
223*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<1, int32_t>(1), "TestIsInt32#4");
224*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<4, int32_t>(-9), "TestIsInt32#5");
225*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<4, int32_t>(-8), "TestIsInt32#6");
226*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<4, int32_t>(7), "TestIsInt32#7");
227*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<4, int32_t>(8), "TestIsInt32#8");
228*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<31, int32_t>(std::numeric_limits<int32_t>::min()), "TestIsInt32#9");
229*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<31, int32_t>(std::numeric_limits<int32_t>::max()), "TestIsInt32#10");
230*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<32, int32_t>(std::numeric_limits<int32_t>::min()), "TestIsInt32#11");
231*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<32, int32_t>(std::numeric_limits<int32_t>::max()), "TestIsInt32#12");
232*795d594fSAndroid Build Coastguard Worker 
233*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<1, int64_t>(-2), "TestIsInt64#1");
234*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<1, int64_t>(-1), "TestIsInt64#2");
235*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<1, int64_t>(0), "TestIsInt64#3");
236*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<1, int64_t>(1), "TestIsInt64#4");
237*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<4, int64_t>(-9), "TestIsInt64#5");
238*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<4, int64_t>(-8), "TestIsInt64#6");
239*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<4, int64_t>(7), "TestIsInt64#7");
240*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<4, int64_t>(8), "TestIsInt64#8");
241*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<31, int64_t>(std::numeric_limits<int32_t>::min()), "TestIsInt64#9");
242*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<31, int64_t>(std::numeric_limits<int32_t>::max()), "TestIsInt64#10");
243*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<32, int64_t>(std::numeric_limits<int32_t>::min()), "TestIsInt64#11");
244*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<32, int64_t>(std::numeric_limits<int32_t>::max()), "TestIsInt64#12");
245*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<32, int64_t>(kInt32MinMinus1), "TestIsInt64#13");
246*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<32, int64_t>(kInt32MaxPlus1), "TestIsInt64#14");
247*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<63, int64_t>(std::numeric_limits<int64_t>::min()), "TestIsInt64#15");
248*795d594fSAndroid Build Coastguard Worker static_assert(!IsInt<63, int64_t>(std::numeric_limits<int64_t>::max()), "TestIsInt64#16");
249*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<64, int64_t>(std::numeric_limits<int64_t>::min()), "TestIsInt64#17");
250*795d594fSAndroid Build Coastguard Worker static_assert(IsInt<64, int64_t>(std::numeric_limits<int64_t>::max()), "TestIsInt64#18");
251*795d594fSAndroid Build Coastguard Worker 
252*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<1, int32_t>(-1), "TestIsUint32#1");
253*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<1, int32_t>(0), "TestIsUint32#2");
254*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<1, int32_t>(1), "TestIsUint32#3");
255*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<1, int32_t>(2), "TestIsUint32#4");
256*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<4, int32_t>(-1), "TestIsUint32#5");
257*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<4, int32_t>(0), "TestIsUint32#6");
258*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<4, int32_t>(15), "TestIsUint32#7");
259*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<4, int32_t>(16), "TestIsUint32#8");
260*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<30, int32_t>(std::numeric_limits<int32_t>::max()), "TestIsUint32#9");
261*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<31, int32_t>(std::numeric_limits<int32_t>::max()), "TestIsUint32#10");
262*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<32, int32_t>(-1), "TestIsUint32#11");
263*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<32, int32_t>(0), "TestIsUint32#11");
264*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<32, uint32_t>(static_cast<uint32_t>(-1)), "TestIsUint32#12");
265*795d594fSAndroid Build Coastguard Worker 
266*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<1, int64_t>(-1), "TestIsUint64#1");
267*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<1, int64_t>(0), "TestIsUint64#2");
268*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<1, int64_t>(1), "TestIsUint64#3");
269*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<1, int64_t>(2), "TestIsUint64#4");
270*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<4, int64_t>(-1), "TestIsUint64#5");
271*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<4, int64_t>(0), "TestIsUint64#6");
272*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<4, int64_t>(15), "TestIsUint64#7");
273*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<4, int64_t>(16), "TestIsUint64#8");
274*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<30, int64_t>(std::numeric_limits<int32_t>::max()), "TestIsUint64#9");
275*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<31, int64_t>(std::numeric_limits<int32_t>::max()), "TestIsUint64#10");
276*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<62, int64_t>(std::numeric_limits<int64_t>::max()), "TestIsUint64#11");
277*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<63, int64_t>(std::numeric_limits<int64_t>::max()), "TestIsUint64#12");
278*795d594fSAndroid Build Coastguard Worker static_assert(!IsUint<64, int64_t>(-1), "TestIsUint64#13");
279*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<64, int64_t>(0), "TestIsUint64#14");
280*795d594fSAndroid Build Coastguard Worker static_assert(IsUint<64, uint64_t>(static_cast<uint32_t>(-1)), "TestIsUint64#15");
281*795d594fSAndroid Build Coastguard Worker 
282*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<1, int32_t>(-2), "TestIsAbsoluteUint32#1");
283*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<1, int32_t>(-1), "TestIsAbsoluteUint32#2");
284*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<1, int32_t>(0), "TestIsAbsoluteUint32#3");
285*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<1, int32_t>(1), "TestIsAbsoluteUint32#4");
286*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<1, int32_t>(2), "TestIsAbsoluteUint32#5");
287*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<4, int32_t>(-16), "TestIsAbsoluteUint32#6");
288*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<4, int32_t>(-15), "TestIsAbsoluteUint32#7");
289*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<4, int32_t>(0), "TestIsAbsoluteUint32#8");
290*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<4, int32_t>(15), "TestIsAbsoluteUint32#9");
291*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<4, int32_t>(16), "TestIsAbsoluteUint32#10");
292*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<30, int32_t>(std::numeric_limits<int32_t>::max()),
293*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint32#11");
294*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<31, int32_t>(std::numeric_limits<int32_t>::max()),
295*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint32#12");
296*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<31, int32_t>(std::numeric_limits<int32_t>::min()),
297*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint32#13");
298*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<31, int32_t>(std::numeric_limits<int32_t>::min() + 1),
299*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint32#14");
300*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<32, int32_t>(std::numeric_limits<int32_t>::max()),
301*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint32#15");
302*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<32, int32_t>(std::numeric_limits<int32_t>::min()),
303*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint32#16");
304*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<32, int32_t>(0), "TestIsAbsoluteUint32#17");
305*795d594fSAndroid Build Coastguard Worker 
306*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<1, int64_t>(-2), "TestIsAbsoluteUint64#1");
307*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<1, int64_t>(-1), "TestIsAbsoluteUint64#2");
308*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<1, int64_t>(0), "TestIsAbsoluteUint64#3");
309*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<1, int64_t>(1), "TestIsAbsoluteUint64#4");
310*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<1, int64_t>(2), "TestIsAbsoluteUint64#5");
311*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<4, int64_t>(-16), "TestIsAbsoluteUint64#6");
312*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<4, int64_t>(-15), "TestIsAbsoluteUint64#7");
313*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<4, int64_t>(0), "TestIsAbsoluteUint64#8");
314*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<4, int64_t>(15), "TestIsAbsoluteUint64#9");
315*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<4, int64_t>(16), "TestIsAbsoluteUint64#10");
316*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<30, int64_t>(std::numeric_limits<int32_t>::max()),
317*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#11");
318*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<31, int64_t>(std::numeric_limits<int32_t>::max()),
319*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#12");
320*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<31, int64_t>(std::numeric_limits<int32_t>::min()),
321*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#13");
322*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<31, int64_t>(std::numeric_limits<int32_t>::min() + 1),
323*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#14");
324*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<32, int64_t>(std::numeric_limits<int32_t>::max()),
325*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#15");
326*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<32, int64_t>(std::numeric_limits<int32_t>::min()),
327*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#16");
328*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<62, int64_t>(std::numeric_limits<int64_t>::max()),
329*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#17");
330*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<63, int64_t>(std::numeric_limits<int64_t>::max()),
331*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#18");
332*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<63, int64_t>(std::numeric_limits<int64_t>::min()),
333*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#19");
334*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<63, int64_t>(std::numeric_limits<int64_t>::min() + 1),
335*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#20");
336*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<64, int64_t>(std::numeric_limits<int64_t>::max()),
337*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#21");
338*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<64, int64_t>(std::numeric_limits<int64_t>::min()),
339*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#22");
340*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<32, int64_t>(-kUint32MaxPlus1), "TestIsAbsoluteUint64#23");
341*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<32, int64_t>(-kUint32MaxPlus1 + 1), "TestIsAbsoluteUint64#24");
342*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<32, int64_t>(0), "TestIsAbsoluteUint64#25");
343*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<64, int64_t>(0), "TestIsAbsoluteUint64#26");
344*795d594fSAndroid Build Coastguard Worker static_assert(IsAbsoluteUint<32, int64_t>(std::numeric_limits<uint32_t>::max()),
345*795d594fSAndroid Build Coastguard Worker               "TestIsAbsoluteUint64#27");
346*795d594fSAndroid Build Coastguard Worker static_assert(!IsAbsoluteUint<32, int64_t>(kUint32MaxPlus1), "TestIsAbsoluteUint64#28");
347*795d594fSAndroid Build Coastguard Worker 
348*795d594fSAndroid Build Coastguard Worker static_assert(MaskLeastSignificant(0) == 0b0, "TestMaskLeastSignificant#1");
349*795d594fSAndroid Build Coastguard Worker static_assert(MaskLeastSignificant(1) == 0b1, "TestMaskLeastSignificant#2");
350*795d594fSAndroid Build Coastguard Worker static_assert(MaskLeastSignificant(2) == 0b11, "TestMaskLeastSignificant#3");
351*795d594fSAndroid Build Coastguard Worker static_assert(MaskLeastSignificant<uint8_t>(8) == 0xFF, "TestMaskLeastSignificant#4");
352*795d594fSAndroid Build Coastguard Worker static_assert(MaskLeastSignificant<int8_t>(8) == 0xFF, "TestMaskLeastSignificant#5");
353*795d594fSAndroid Build Coastguard Worker static_assert(MaskLeastSignificant<uint64_t>(63) == (std::numeric_limits<uint64_t>::max() >> 1u),
354*795d594fSAndroid Build Coastguard Worker               "TestMaskLeastSignificant#6");
355*795d594fSAndroid Build Coastguard Worker 
356*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldClear(0xFF, /*lsb=*/0, /*width=*/0) == 0xFF, "TestBitFieldClear#1");
357*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldClear(std::numeric_limits<uint32_t>::max(), /*lsb=*/0, /*width=*/32) == 0x0,
358*795d594fSAndroid Build Coastguard Worker               "TestBitFieldClear#2");
359*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldClear(std::numeric_limits<int32_t>::max(), /*lsb=*/0, /*width=*/32) == 0x0,
360*795d594fSAndroid Build Coastguard Worker               "TestBitFieldClear#3");
361*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldClear(0xFF, /*lsb=*/0, /*width=*/2) == 0b11111100, "TestBitFieldClear#4");
362*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldClear(0xFF, /*lsb=*/0, /*width=*/3) == 0b11111000, "TestBitFieldClear#5");
363*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldClear(0xFF, /*lsb=*/1, /*width=*/3) == 0b11110001, "TestBitFieldClear#6");
364*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldClear(0xFF, /*lsb=*/2, /*width=*/3) == 0b11100011, "TestBitFieldClear#7");
365*795d594fSAndroid Build Coastguard Worker 
366*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(0xFF, /*lsb=*/0, /*width=*/0) == 0x0, "TestBitFieldExtract#1");
367*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(std::numeric_limits<uint32_t>::max(), /*lsb=*/0, /*width=*/32)
368*795d594fSAndroid Build Coastguard Worker                   == std::numeric_limits<uint32_t>::max(),
369*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#2");
370*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(std::numeric_limits<int32_t>::max(), /*lsb=*/0, /*width=*/32)
371*795d594fSAndroid Build Coastguard Worker                   == std::numeric_limits<int32_t>::max(),
372*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#3");
373*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb=*/0, /*width=*/2) == 0b00000011,
374*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#4");
375*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb=*/0, /*width=*/3) == 0b00000111,
376*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#5");
377*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb=*/1, /*width=*/3) == 0b00000111,
378*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#6");
379*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb=*/2, /*width=*/3) == 0b00000111,
380*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#7");
381*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb=*/3, /*width=*/3) == 0b00000111,
382*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#8");
383*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb=*/8, /*width=*/3) == 0b00000000,
384*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#9");
385*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb=*/7, /*width=*/3) == 0b00000001,
386*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#10");
387*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<uint32_t>(0xFF), /*lsb=*/6, /*width=*/3) == 0b00000011,
388*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#11");
389*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(0xFF, /*lsb=*/0, /*width=*/2) == -1, "TestBitFieldExtract#12");
390*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(0xFF, /*lsb=*/0, /*width=*/3) == -1, "TestBitFieldExtract#13");
391*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(0xFF, /*lsb=*/1, /*width=*/3) == -1, "TestBitFieldExtract#14");
392*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(0xFF, /*lsb=*/2, /*width=*/3) == -1, "TestBitFieldExtract#15");
393*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(0xFF, /*lsb=*/3, /*width=*/3) == -1, "TestBitFieldExtract#16");
394*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(0xFF, /*lsb=*/8, /*width=*/3) == 0b00000000,
395*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#17");
396*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(0xFF, /*lsb=*/7, /*width=*/3) == 0b00000001,
397*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#18");
398*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(0xFF, /*lsb=*/6, /*width=*/3) == 0b00000011,
399*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#19");
400*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<uint8_t>(0b01101010), /*lsb=*/2, /*width=*/4)
401*795d594fSAndroid Build Coastguard Worker                   == 0b00001010,
402*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#20");
403*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldExtract(static_cast<int8_t>(0b01101010), /*lsb=*/2, /*width=*/4)
404*795d594fSAndroid Build Coastguard Worker                   == static_cast<int8_t>(0b11111010),
405*795d594fSAndroid Build Coastguard Worker               "TestBitFieldExtract#21");
406*795d594fSAndroid Build Coastguard Worker 
407*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(0xFF, /*data=*/0x0, /*lsb=*/0, /*width=*/0) == 0xFF,
408*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#1");
409*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(std::numeric_limits<uint32_t>::max(),
410*795d594fSAndroid Build Coastguard Worker                              /*data=*/std::numeric_limits<uint32_t>::max(),
411*795d594fSAndroid Build Coastguard Worker                              /*lsb=*/0,
412*795d594fSAndroid Build Coastguard Worker                              /*width=*/32)
413*795d594fSAndroid Build Coastguard Worker                   == std::numeric_limits<uint32_t>::max(),
414*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#2");
415*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(std::numeric_limits<int32_t>::max(),
416*795d594fSAndroid Build Coastguard Worker                              /*data=*/std::numeric_limits<uint32_t>::max(),
417*795d594fSAndroid Build Coastguard Worker                              /*lsb=*/0,
418*795d594fSAndroid Build Coastguard Worker                              /*width=*/32)
419*795d594fSAndroid Build Coastguard Worker                   == std::numeric_limits<uint32_t>::max(),
420*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#3");
421*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(0u,
422*795d594fSAndroid Build Coastguard Worker                              /*data=*/std::numeric_limits<uint32_t>::max(),
423*795d594fSAndroid Build Coastguard Worker                              /*lsb=*/0,
424*795d594fSAndroid Build Coastguard Worker                              /*width=*/32)
425*795d594fSAndroid Build Coastguard Worker                   == std::numeric_limits<uint32_t>::max(),
426*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#4");
427*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(-(-0),
428*795d594fSAndroid Build Coastguard Worker                              /*data=*/std::numeric_limits<uint32_t>::max(),
429*795d594fSAndroid Build Coastguard Worker                              /*lsb=*/0,
430*795d594fSAndroid Build Coastguard Worker                              /*width=*/32)
431*795d594fSAndroid Build Coastguard Worker                   == std::numeric_limits<uint32_t>::max(),
432*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#5");
433*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(0x00, /*data=*/0b11u, /*lsb=*/0, /*width=*/2) == 0b00000011,
434*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#6");
435*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(0x00, /*data=*/0b111u, /*lsb=*/0, /*width=*/3) == 0b00000111,
436*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#7");
437*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(0x00, /*data=*/0b111u, /*lsb=*/1, /*width=*/3) == 0b00001110,
438*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#8");
439*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(0x00, /*data=*/0b111u, /*lsb=*/2, /*width=*/3) == 0b00011100,
440*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#9");
441*795d594fSAndroid Build Coastguard Worker static_assert(BitFieldInsert(0b01011100, /*data=*/0b1101u, /*lsb=*/4, /*width=*/4) == 0b11011100,
442*795d594fSAndroid Build Coastguard Worker               "TestBitFieldInsert#10");
443*795d594fSAndroid Build Coastguard Worker 
444*795d594fSAndroid Build Coastguard Worker template <typename Container>
CheckElements(const std::initializer_list<uint32_t> & expected,const Container & elements)445*795d594fSAndroid Build Coastguard Worker void CheckElements(const std::initializer_list<uint32_t>& expected, const Container& elements) {
446*795d594fSAndroid Build Coastguard Worker   auto expected_it = expected.begin();
447*795d594fSAndroid Build Coastguard Worker   auto element_it = elements.begin();
448*795d594fSAndroid Build Coastguard Worker   size_t idx = 0u;
449*795d594fSAndroid Build Coastguard Worker   while (expected_it != expected.end() && element_it != elements.end()) {
450*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(*expected_it, *element_it) << idx;
451*795d594fSAndroid Build Coastguard Worker     ++idx;
452*795d594fSAndroid Build Coastguard Worker     ++expected_it;
453*795d594fSAndroid Build Coastguard Worker     ++element_it;
454*795d594fSAndroid Build Coastguard Worker   }
455*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(expected_it == expected.end() && element_it == elements.end())
456*795d594fSAndroid Build Coastguard Worker       << std::boolalpha << (expected_it == expected.end()) << " " << (element_it == elements.end());
457*795d594fSAndroid Build Coastguard Worker }
458*795d594fSAndroid Build Coastguard Worker 
TEST(BitUtilsTest,TestLowToHighBits32)459*795d594fSAndroid Build Coastguard Worker TEST(BitUtilsTest, TestLowToHighBits32) {
460*795d594fSAndroid Build Coastguard Worker   CheckElements({}, LowToHighBits<uint32_t>(0u));
461*795d594fSAndroid Build Coastguard Worker   CheckElements({0}, LowToHighBits<uint32_t>(1u));
462*795d594fSAndroid Build Coastguard Worker   CheckElements({15}, LowToHighBits<uint32_t>(0x8000u));
463*795d594fSAndroid Build Coastguard Worker   CheckElements({31}, LowToHighBits<uint32_t>(0x80000000u));
464*795d594fSAndroid Build Coastguard Worker   CheckElements({0, 31}, LowToHighBits<uint32_t>(0x80000001u));
465*795d594fSAndroid Build Coastguard Worker   CheckElements({0, 1, 2, 3, 4, 5, 6, 7, 31}, LowToHighBits<uint32_t>(0x800000ffu));
466*795d594fSAndroid Build Coastguard Worker   CheckElements({0, 8, 16, 24, 31}, LowToHighBits<uint32_t>(0x81010101u));
467*795d594fSAndroid Build Coastguard Worker   CheckElements({16, 17, 30, 31}, LowToHighBits<uint32_t>(0xc0030000u));
468*795d594fSAndroid Build Coastguard Worker   CheckElements({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
469*795d594fSAndroid Build Coastguard Worker                  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31},
470*795d594fSAndroid Build Coastguard Worker                 LowToHighBits<uint32_t>(0xffffffffu));
471*795d594fSAndroid Build Coastguard Worker }
472*795d594fSAndroid Build Coastguard Worker 
TEST(BitUtilsTest,TestLowToHighBits64)473*795d594fSAndroid Build Coastguard Worker TEST(BitUtilsTest, TestLowToHighBits64) {
474*795d594fSAndroid Build Coastguard Worker   CheckElements({}, LowToHighBits<uint64_t>(UINT64_C(0)));
475*795d594fSAndroid Build Coastguard Worker   CheckElements({0}, LowToHighBits<uint64_t>(UINT64_C(1)));
476*795d594fSAndroid Build Coastguard Worker   CheckElements({32}, LowToHighBits<uint64_t>(UINT64_C(0x100000000)));
477*795d594fSAndroid Build Coastguard Worker   CheckElements({63}, LowToHighBits<uint64_t>(UINT64_C(0x8000000000000000)));
478*795d594fSAndroid Build Coastguard Worker   CheckElements({0, 63}, LowToHighBits<uint64_t>(UINT64_C(0x8000000000000001)));
479*795d594fSAndroid Build Coastguard Worker   CheckElements({0, 1, 2, 3, 4, 5, 6, 7, 63},
480*795d594fSAndroid Build Coastguard Worker                 LowToHighBits<uint64_t>(UINT64_C(0x80000000000000ff)));
481*795d594fSAndroid Build Coastguard Worker   CheckElements({0, 8, 16, 24, 32, 40, 48, 56, 63},
482*795d594fSAndroid Build Coastguard Worker                 LowToHighBits<uint64_t>(UINT64_C(0x8101010101010101)));
483*795d594fSAndroid Build Coastguard Worker   CheckElements({16, 17, 62, 63}, LowToHighBits<uint64_t>(UINT64_C(0xc000000000030000)));
484*795d594fSAndroid Build Coastguard Worker   CheckElements({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
485*795d594fSAndroid Build Coastguard Worker                  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
486*795d594fSAndroid Build Coastguard Worker                  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
487*795d594fSAndroid Build Coastguard Worker                  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63},
488*795d594fSAndroid Build Coastguard Worker                 LowToHighBits<uint64_t>(UINT64_C(0xffffffffffffffff)));
489*795d594fSAndroid Build Coastguard Worker }
490*795d594fSAndroid Build Coastguard Worker 
TEST(BitUtilsTest,TestHighToLowBits32)491*795d594fSAndroid Build Coastguard Worker TEST(BitUtilsTest, TestHighToLowBits32) {
492*795d594fSAndroid Build Coastguard Worker   CheckElements({}, HighToLowBits<uint32_t>(0u));
493*795d594fSAndroid Build Coastguard Worker   CheckElements({0}, HighToLowBits<uint32_t>(1u));
494*795d594fSAndroid Build Coastguard Worker   CheckElements({15}, HighToLowBits<uint32_t>(0x8000u));
495*795d594fSAndroid Build Coastguard Worker   CheckElements({31}, HighToLowBits<uint32_t>(0x80000000u));
496*795d594fSAndroid Build Coastguard Worker   CheckElements({31, 0}, HighToLowBits<uint32_t>(0x80000001u));
497*795d594fSAndroid Build Coastguard Worker   CheckElements({31, 7, 6, 5, 4, 3, 2, 1, 0}, HighToLowBits<uint32_t>(0x800000ffu));
498*795d594fSAndroid Build Coastguard Worker   CheckElements({31, 24, 16, 8, 0}, HighToLowBits<uint32_t>(0x81010101u));
499*795d594fSAndroid Build Coastguard Worker   CheckElements({31, 30, 17, 16}, HighToLowBits<uint32_t>(0xc0030000u));
500*795d594fSAndroid Build Coastguard Worker   CheckElements({31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,
501*795d594fSAndroid Build Coastguard Worker                  15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0},
502*795d594fSAndroid Build Coastguard Worker                 HighToLowBits<uint32_t>(0xffffffffu));
503*795d594fSAndroid Build Coastguard Worker }
504*795d594fSAndroid Build Coastguard Worker 
TEST(BitUtilsTest,TestHighToLowBits64)505*795d594fSAndroid Build Coastguard Worker TEST(BitUtilsTest, TestHighToLowBits64) {
506*795d594fSAndroid Build Coastguard Worker   CheckElements({}, HighToLowBits<uint64_t>(UINT64_C(0)));
507*795d594fSAndroid Build Coastguard Worker   CheckElements({0}, HighToLowBits<uint64_t>(UINT64_C(1)));
508*795d594fSAndroid Build Coastguard Worker   CheckElements({32}, HighToLowBits<uint64_t>(UINT64_C(0x100000000)));
509*795d594fSAndroid Build Coastguard Worker   CheckElements({63}, HighToLowBits<uint64_t>(UINT64_C(0x8000000000000000)));
510*795d594fSAndroid Build Coastguard Worker   CheckElements({63, 0}, HighToLowBits<uint64_t>(UINT64_C(0x8000000000000001)));
511*795d594fSAndroid Build Coastguard Worker   CheckElements({63, 7, 6, 5, 4, 3, 2, 1, 0},
512*795d594fSAndroid Build Coastguard Worker                 HighToLowBits<uint64_t>(UINT64_C(0x80000000000000ff)));
513*795d594fSAndroid Build Coastguard Worker   CheckElements({63, 56, 48, 40, 32, 24, 16, 8, 0},
514*795d594fSAndroid Build Coastguard Worker                 HighToLowBits<uint64_t>(UINT64_C(0x8101010101010101)));
515*795d594fSAndroid Build Coastguard Worker   CheckElements({63, 62, 17, 16}, HighToLowBits<uint64_t>(UINT64_C(0xc000000000030000)));
516*795d594fSAndroid Build Coastguard Worker   CheckElements({63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48,
517*795d594fSAndroid Build Coastguard Worker                  47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32,
518*795d594fSAndroid Build Coastguard Worker                  31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,
519*795d594fSAndroid Build Coastguard Worker                  15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0},
520*795d594fSAndroid Build Coastguard Worker                 HighToLowBits<uint64_t>(UINT64_C(0xffffffffffffffff)));
521*795d594fSAndroid Build Coastguard Worker }
522*795d594fSAndroid Build Coastguard Worker 
523*795d594fSAndroid Build Coastguard Worker }  // namespace art
524