blob: 9f22fb4670b9d02f0fd958b047eec515bd0036dd [file] [log] [blame]
Vladimir Marko80afd022015-05-19 18:08:00 +01001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <vector>
18
19#include "bit_utils.h"
Andreas Gampe5678db52017-06-08 14:11:18 -070020#include "bit_utils_iterator.h"
Vladimir Marko80afd022015-05-19 18:08:00 +010021
22#include "gtest/gtest.h"
23
24namespace art {
25
26// NOTE: CLZ(0u) is undefined.
27static_assert(31 == CLZ<uint32_t>(1u), "TestCLZ32#1");
28static_assert(30 == CLZ<uint32_t>(2u), "TestCLZ32#2");
29static_assert(16 == CLZ<uint32_t>(0x00008765u), "TestCLZ32#3");
30static_assert(15 == CLZ<uint32_t>(0x00012345u), "TestCLZ32#4");
31static_assert(1 == CLZ<uint32_t>(0x43214321u), "TestCLZ32#5");
32static_assert(0 == CLZ<uint32_t>(0x87654321u), "TestCLZ32#6");
33
34// NOTE: CLZ(0ull) is undefined.
35static_assert(63 == CLZ<uint64_t>(UINT64_C(1)), "TestCLZ64#1");
36static_assert(62 == CLZ<uint64_t>(UINT64_C(3)), "TestCLZ64#2");
37static_assert(48 == CLZ<uint64_t>(UINT64_C(0x00008765)), "TestCLZ64#3");
38static_assert(32 == CLZ<uint64_t>(UINT64_C(0x87654321)), "TestCLZ64#4");
39static_assert(31 == CLZ<uint64_t>(UINT64_C(0x123456789)), "TestCLZ64#5");
40static_assert(16 == CLZ<uint64_t>(UINT64_C(0x876543211234)), "TestCLZ64#6");
41static_assert(1 == CLZ<uint64_t>(UINT64_C(0x4321432187654321)), "TestCLZ64#7");
42static_assert(0 == CLZ<uint64_t>(UINT64_C(0x8765432187654321)), "TestCLZ64#8");
43
44// NOTE: CTZ(0u) is undefined.
45static_assert(0 == CTZ<uint32_t>(1u), "TestCTZ32#1");
46static_assert(1 == CTZ<uint32_t>(2u), "TestCTZ32#2");
47static_assert(15 == CTZ<uint32_t>(0x45678000u), "TestCTZ32#3");
48static_assert(16 == CTZ<uint32_t>(0x43210000u), "TestCTZ32#4");
49static_assert(30 == CTZ<uint32_t>(0xc0000000u), "TestCTZ32#5");
50static_assert(31 == CTZ<uint32_t>(0x80000000u), "TestCTZ32#6");
51
52// NOTE: CTZ(0ull) is undefined.
53static_assert(0 == CTZ<uint64_t>(UINT64_C(1)), "TestCTZ64#1");
54static_assert(1 == CTZ<uint64_t>(UINT64_C(2)), "TestCTZ64#2");
55static_assert(16 == CTZ<uint64_t>(UINT64_C(0x43210000)), "TestCTZ64#3");
56static_assert(31 == CTZ<uint64_t>(UINT64_C(0x80000000)), "TestCTZ64#4");
57static_assert(32 == CTZ<uint64_t>(UINT64_C(0x8765432100000000)), "TestCTZ64#5");
58static_assert(48 == CTZ<uint64_t>(UINT64_C(0x4321000000000000)), "TestCTZ64#6");
59static_assert(62 == CTZ<uint64_t>(UINT64_C(0x4000000000000000)), "TestCTZ64#7");
60static_assert(63 == CTZ<uint64_t>(UINT64_C(0x8000000000000000)), "TestCTZ64#8");
61
62static_assert(0 == POPCOUNT<uint32_t>(0u), "TestPOPCOUNT32#1");
63static_assert(1 == POPCOUNT<uint32_t>(8u), "TestPOPCOUNT32#2");
64static_assert(15 == POPCOUNT<uint32_t>(0x55555554u), "TestPOPCOUNT32#3");
65static_assert(16 == POPCOUNT<uint32_t>(0xaaaaaaaau), "TestPOPCOUNT32#4");
66static_assert(31 == POPCOUNT<uint32_t>(0xfffffffeu), "TestPOPCOUNT32#5");
67static_assert(32 == POPCOUNT<uint32_t>(0xffffffffu), "TestPOPCOUNT32#6");
68
69static_assert(0 == POPCOUNT<uint64_t>(UINT64_C(0)), "TestPOPCOUNT64#1");
70static_assert(1 == POPCOUNT<uint64_t>(UINT64_C(0x40000)), "TestPOPCOUNT64#2");
71static_assert(16 == POPCOUNT<uint64_t>(UINT64_C(0x1414141482828282)), "TestPOPCOUNT64#3");
72static_assert(31 == POPCOUNT<uint64_t>(UINT64_C(0x0000ffff00007fff)), "TestPOPCOUNT64#4");
73static_assert(32 == POPCOUNT<uint64_t>(UINT64_C(0x5555555555555555)), "TestPOPCOUNT64#5");
74static_assert(48 == POPCOUNT<uint64_t>(UINT64_C(0x7777bbbbddddeeee)), "TestPOPCOUNT64#6");
75static_assert(63 == POPCOUNT<uint64_t>(UINT64_C(0x7fffffffffffffff)), "TestPOPCOUNT64#7");
76static_assert(64 == POPCOUNT<uint64_t>(UINT64_C(0xffffffffffffffff)), "TestPOPCOUNT64#8");
77
78static_assert(-1 == MostSignificantBit<uint32_t>(0u), "TestMSB32#1");
79static_assert(0 == MostSignificantBit<uint32_t>(1u), "TestMSB32#2");
80static_assert(31 == MostSignificantBit<uint32_t>(~static_cast<uint32_t>(0u)), "TestMSB32#3");
81static_assert(2 == MostSignificantBit<uint32_t>(0b110), "TestMSB32#4");
82static_assert(2 == MostSignificantBit<uint32_t>(0b100), "TestMSB32#5");
83
84static_assert(-1 == MostSignificantBit<uint64_t>(UINT64_C(0)), "TestMSB64#1");
85static_assert(0 == MostSignificantBit<uint64_t>(UINT64_C(1)), "TestMSB64#2");
86static_assert(63 == MostSignificantBit<uint64_t>(~UINT64_C(0)), "TestMSB64#3");
87static_assert(34 == MostSignificantBit<uint64_t>(UINT64_C(0x700000000)), "TestMSB64#4");
88static_assert(34 == MostSignificantBit<uint64_t>(UINT64_C(0x777777777)), "TestMSB64#5");
89
90static_assert(-1 == LeastSignificantBit<uint32_t>(0u), "TestLSB32#1");
91static_assert(0 == LeastSignificantBit<uint32_t>(1u), "TestLSB32#1");
92static_assert(0 == LeastSignificantBit<uint32_t>(~static_cast<uint32_t>(0u)), "TestLSB32#1");
93static_assert(1 == LeastSignificantBit<uint32_t>(0b110), "TestLSB32#1");
94static_assert(2 == LeastSignificantBit<uint32_t>(0b100), "TestLSB32#1");
95
96static_assert(-1 == LeastSignificantBit<uint64_t>(UINT64_C(0)), "TestLSB64#1");
97static_assert(0 == LeastSignificantBit<uint64_t>(UINT64_C(1)), "TestLSB64#2");
98static_assert(0 == LeastSignificantBit<uint64_t>(~UINT64_C(0)), "TestLSB64#3");
99static_assert(12 == LeastSignificantBit<uint64_t>(UINT64_C(0x5000)), "TestLSB64#4");
100static_assert(48 == LeastSignificantBit<uint64_t>(UINT64_C(0x5555000000000000)), "TestLSB64#5");
101
102static_assert(0u == MinimumBitsToStore<uint32_t>(0u), "TestMinBits2Store32#1");
103static_assert(1u == MinimumBitsToStore<uint32_t>(1u), "TestMinBits2Store32#2");
104static_assert(2u == MinimumBitsToStore<uint32_t>(0b10u), "TestMinBits2Store32#3");
105static_assert(2u == MinimumBitsToStore<uint32_t>(0b11u), "TestMinBits2Store32#4");
106static_assert(3u == MinimumBitsToStore<uint32_t>(0b100u), "TestMinBits2Store32#5");
107static_assert(3u == MinimumBitsToStore<uint32_t>(0b110u), "TestMinBits2Store32#6");
108static_assert(3u == MinimumBitsToStore<uint32_t>(0b101u), "TestMinBits2Store32#7");
109static_assert(8u == MinimumBitsToStore<uint32_t>(0xFFu), "TestMinBits2Store32#8");
110static_assert(32u == MinimumBitsToStore<uint32_t>(~static_cast<uint32_t>(0u)),
111 "TestMinBits2Store32#9");
112
113static_assert(0u == MinimumBitsToStore<uint64_t>(UINT64_C(0)), "TestMinBits2Store64#1");
114static_assert(1u == MinimumBitsToStore<uint64_t>(UINT64_C(1)), "TestMinBits2Store64#2");
115static_assert(2u == MinimumBitsToStore<uint64_t>(UINT64_C(0b10)), "TestMinBits2Store64#3");
116static_assert(2u == MinimumBitsToStore<uint64_t>(UINT64_C(0b11)), "TestMinBits2Store64#4");
117static_assert(3u == MinimumBitsToStore<uint64_t>(UINT64_C(0b100)), "TestMinBits2Store64#5");
118static_assert(3u == MinimumBitsToStore<uint64_t>(UINT64_C(0b110)), "TestMinBits2Store64#6");
119static_assert(3u == MinimumBitsToStore<uint64_t>(UINT64_C(0b101)), "TestMinBits2Store64#7");
120static_assert(8u == MinimumBitsToStore<uint64_t>(UINT64_C(0xFF)), "TestMinBits2Store64#8");
121static_assert(32u == MinimumBitsToStore<uint64_t>(UINT64_C(0xFFFFFFFF)), "TestMinBits2Store64#9");
122static_assert(33u == MinimumBitsToStore<uint64_t>(UINT64_C(0x1FFFFFFFF)), "TestMinBits2Store64#10");
123static_assert(64u == MinimumBitsToStore<uint64_t>(~UINT64_C(0)), "TestMinBits2Store64#11");
124
125static_assert(0 == RoundUpToPowerOfTwo<uint32_t>(0u), "TestRoundUpPowerOfTwo32#1");
126static_assert(1 == RoundUpToPowerOfTwo<uint32_t>(1u), "TestRoundUpPowerOfTwo32#2");
127static_assert(2 == RoundUpToPowerOfTwo<uint32_t>(2u), "TestRoundUpPowerOfTwo32#3");
128static_assert(4 == RoundUpToPowerOfTwo<uint32_t>(3u), "TestRoundUpPowerOfTwo32#4");
129static_assert(8 == RoundUpToPowerOfTwo<uint32_t>(7u), "TestRoundUpPowerOfTwo32#5");
130static_assert(0x40000u == RoundUpToPowerOfTwo<uint32_t>(0x2aaaau),
131 "TestRoundUpPowerOfTwo32#6");
132static_assert(0x80000000u == RoundUpToPowerOfTwo<uint32_t>(0x40000001u),
133 "TestRoundUpPowerOfTwo32#7");
134static_assert(0x80000000u == RoundUpToPowerOfTwo<uint32_t>(0x80000000u),
135 "TestRoundUpPowerOfTwo32#8");
136
137static_assert(0 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0)), "TestRoundUpPowerOfTwo64#1");
138static_assert(1 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(1)), "TestRoundUpPowerOfTwo64#2");
139static_assert(2 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(2)), "TestRoundUpPowerOfTwo64#3");
140static_assert(4 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(3)), "TestRoundUpPowerOfTwo64#4");
141static_assert(8 == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(7)), "TestRoundUpPowerOfTwo64#5");
142static_assert(UINT64_C(0x40000) == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0x2aaaa)),
143 "TestRoundUpPowerOfTwo64#6");
144static_assert(
145 UINT64_C(0x8000000000000000) == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0x4000000000000001)),
146 "TestRoundUpPowerOfTwo64#7");
147static_assert(
148 UINT64_C(0x8000000000000000) == RoundUpToPowerOfTwo<uint64_t>(UINT64_C(0x8000000000000000)),
149 "TestRoundUpPowerOfTwo64#8");
150
151static constexpr int64_t kInt32MinMinus1 =
152 static_cast<int64_t>(std::numeric_limits<int32_t>::min()) - 1;
153static constexpr int64_t kInt32MaxPlus1 =
154 static_cast<int64_t>(std::numeric_limits<int32_t>::max()) + 1;
155static constexpr int64_t kUint32MaxPlus1 =
156 static_cast<int64_t>(std::numeric_limits<uint32_t>::max()) + 1;
157
158TEST(BitUtilsTest, TestIsInt32) {
159 EXPECT_FALSE(IsInt<int32_t>(1, -2));
160 EXPECT_TRUE(IsInt<int32_t>(1, -1));
161 EXPECT_TRUE(IsInt<int32_t>(1, 0));
162 EXPECT_FALSE(IsInt<int32_t>(1, 1));
163 EXPECT_FALSE(IsInt<int32_t>(4, -9));
164 EXPECT_TRUE(IsInt<int32_t>(4, -8));
165 EXPECT_TRUE(IsInt<int32_t>(4, 7));
166 EXPECT_FALSE(IsInt<int32_t>(4, 8));
167 EXPECT_FALSE(IsInt<int32_t>(31, std::numeric_limits<int32_t>::min()));
168 EXPECT_FALSE(IsInt<int32_t>(31, std::numeric_limits<int32_t>::max()));
169 EXPECT_TRUE(IsInt<int32_t>(32, std::numeric_limits<int32_t>::min()));
170 EXPECT_TRUE(IsInt<int32_t>(32, std::numeric_limits<int32_t>::max()));
171}
172
173TEST(BitUtilsTest, TestIsInt64) {
174 EXPECT_FALSE(IsInt<int64_t>(1, -2));
175 EXPECT_TRUE(IsInt<int64_t>(1, -1));
176 EXPECT_TRUE(IsInt<int64_t>(1, 0));
177 EXPECT_FALSE(IsInt<int64_t>(1, 1));
178 EXPECT_FALSE(IsInt<int64_t>(4, -9));
179 EXPECT_TRUE(IsInt<int64_t>(4, -8));
180 EXPECT_TRUE(IsInt<int64_t>(4, 7));
181 EXPECT_FALSE(IsInt<int64_t>(4, 8));
182 EXPECT_FALSE(IsInt<int64_t>(31, std::numeric_limits<int32_t>::min()));
183 EXPECT_FALSE(IsInt<int64_t>(31, std::numeric_limits<int32_t>::max()));
184 EXPECT_TRUE(IsInt<int64_t>(32, std::numeric_limits<int32_t>::min()));
185 EXPECT_TRUE(IsInt<int64_t>(32, std::numeric_limits<int32_t>::max()));
186 EXPECT_FALSE(IsInt<int64_t>(32, kInt32MinMinus1));
187 EXPECT_FALSE(IsInt<int64_t>(32, kInt32MaxPlus1));
188 EXPECT_FALSE(IsInt<int64_t>(63, std::numeric_limits<int64_t>::min()));
189 EXPECT_FALSE(IsInt<int64_t>(63, std::numeric_limits<int64_t>::max()));
190 EXPECT_TRUE(IsInt<int64_t>(64, std::numeric_limits<int64_t>::min()));
191 EXPECT_TRUE(IsInt<int64_t>(64, std::numeric_limits<int64_t>::max()));
192}
193
194static_assert(!IsInt<1, int32_t>(-2), "TestIsInt32#1");
195static_assert(IsInt<1, int32_t>(-1), "TestIsInt32#2");
196static_assert(IsInt<1, int32_t>(0), "TestIsInt32#3");
197static_assert(!IsInt<1, int32_t>(1), "TestIsInt32#4");
198static_assert(!IsInt<4, int32_t>(-9), "TestIsInt32#5");
199static_assert(IsInt<4, int32_t>(-8), "TestIsInt32#6");
200static_assert(IsInt<4, int32_t>(7), "TestIsInt32#7");
201static_assert(!IsInt<4, int32_t>(8), "TestIsInt32#8");
202static_assert(!IsInt<31, int32_t>(std::numeric_limits<int32_t>::min()), "TestIsInt32#9");
203static_assert(!IsInt<31, int32_t>(std::numeric_limits<int32_t>::max()), "TestIsInt32#10");
204static_assert(IsInt<32, int32_t>(std::numeric_limits<int32_t>::min()), "TestIsInt32#11");
205static_assert(IsInt<32, int32_t>(std::numeric_limits<int32_t>::max()), "TestIsInt32#12");
206
207static_assert(!IsInt<1, int64_t>(-2), "TestIsInt64#1");
208static_assert(IsInt<1, int64_t>(-1), "TestIsInt64#2");
209static_assert(IsInt<1, int64_t>(0), "TestIsInt64#3");
210static_assert(!IsInt<1, int64_t>(1), "TestIsInt64#4");
211static_assert(!IsInt<4, int64_t>(-9), "TestIsInt64#5");
212static_assert(IsInt<4, int64_t>(-8), "TestIsInt64#6");
213static_assert(IsInt<4, int64_t>(7), "TestIsInt64#7");
214static_assert(!IsInt<4, int64_t>(8), "TestIsInt64#8");
215static_assert(!IsInt<31, int64_t>(std::numeric_limits<int32_t>::min()), "TestIsInt64#9");
216static_assert(!IsInt<31, int64_t>(std::numeric_limits<int32_t>::max()), "TestIsInt64#10");
217static_assert(IsInt<32, int64_t>(std::numeric_limits<int32_t>::min()), "TestIsInt64#11");
218static_assert(IsInt<32, int64_t>(std::numeric_limits<int32_t>::max()), "TestIsInt64#12");
219static_assert(!IsInt<32, int64_t>(kInt32MinMinus1), "TestIsInt64#13");
220static_assert(!IsInt<32, int64_t>(kInt32MaxPlus1), "TestIsInt64#14");
221static_assert(!IsInt<63, int64_t>(std::numeric_limits<int64_t>::min()), "TestIsInt64#15");
222static_assert(!IsInt<63, int64_t>(std::numeric_limits<int64_t>::max()), "TestIsInt64#16");
223static_assert(IsInt<64, int64_t>(std::numeric_limits<int64_t>::min()), "TestIsInt64#17");
224static_assert(IsInt<64, int64_t>(std::numeric_limits<int64_t>::max()), "TestIsInt64#18");
225
226static_assert(!IsUint<1, int32_t>(-1), "TestIsUint32#1");
227static_assert(IsUint<1, int32_t>(0), "TestIsUint32#2");
228static_assert(IsUint<1, int32_t>(1), "TestIsUint32#3");
229static_assert(!IsUint<1, int32_t>(2), "TestIsUint32#4");
230static_assert(!IsUint<4, int32_t>(-1), "TestIsUint32#5");
231static_assert(IsUint<4, int32_t>(0), "TestIsUint32#6");
232static_assert(IsUint<4, int32_t>(15), "TestIsUint32#7");
233static_assert(!IsUint<4, int32_t>(16), "TestIsUint32#8");
234static_assert(!IsUint<30, int32_t>(std::numeric_limits<int32_t>::max()), "TestIsUint32#9");
235static_assert(IsUint<31, int32_t>(std::numeric_limits<int32_t>::max()), "TestIsUint32#10");
236static_assert(!IsUint<32, int32_t>(-1), "TestIsUint32#11");
237static_assert(IsUint<32, int32_t>(0), "TestIsUint32#11");
238static_assert(IsUint<32, uint32_t>(static_cast<uint32_t>(-1)), "TestIsUint32#12");
239
240static_assert(!IsUint<1, int64_t>(-1), "TestIsUint64#1");
241static_assert(IsUint<1, int64_t>(0), "TestIsUint64#2");
242static_assert(IsUint<1, int64_t>(1), "TestIsUint64#3");
243static_assert(!IsUint<1, int64_t>(2), "TestIsUint64#4");
244static_assert(!IsUint<4, int64_t>(-1), "TestIsUint64#5");
245static_assert(IsUint<4, int64_t>(0), "TestIsUint64#6");
246static_assert(IsUint<4, int64_t>(15), "TestIsUint64#7");
247static_assert(!IsUint<4, int64_t>(16), "TestIsUint64#8");
248static_assert(!IsUint<30, int64_t>(std::numeric_limits<int32_t>::max()), "TestIsUint64#9");
249static_assert(IsUint<31, int64_t>(std::numeric_limits<int32_t>::max()), "TestIsUint64#10");
250static_assert(!IsUint<62, int64_t>(std::numeric_limits<int64_t>::max()), "TestIsUint64#11");
251static_assert(IsUint<63, int64_t>(std::numeric_limits<int64_t>::max()), "TestIsUint64#12");
252static_assert(!IsUint<64, int64_t>(-1), "TestIsUint64#13");
253static_assert(IsUint<64, int64_t>(0), "TestIsUint64#14");
254static_assert(IsUint<64, uint64_t>(static_cast<uint32_t>(-1)), "TestIsUint64#15");
255
256static_assert(!IsAbsoluteUint<1, int32_t>(-2), "TestIsAbsoluteUint32#1");
257static_assert(IsAbsoluteUint<1, int32_t>(-1), "TestIsAbsoluteUint32#2");
258static_assert(IsAbsoluteUint<1, int32_t>(0), "TestIsAbsoluteUint32#3");
259static_assert(IsAbsoluteUint<1, int32_t>(1), "TestIsAbsoluteUint32#4");
260static_assert(!IsAbsoluteUint<1, int32_t>(2), "TestIsAbsoluteUint32#5");
261static_assert(!IsAbsoluteUint<4, int32_t>(-16), "TestIsAbsoluteUint32#6");
262static_assert(IsAbsoluteUint<4, int32_t>(-15), "TestIsAbsoluteUint32#7");
263static_assert(IsAbsoluteUint<4, int32_t>(0), "TestIsAbsoluteUint32#8");
264static_assert(IsAbsoluteUint<4, int32_t>(15), "TestIsAbsoluteUint32#9");
265static_assert(!IsAbsoluteUint<4, int32_t>(16), "TestIsAbsoluteUint32#10");
266static_assert(!IsAbsoluteUint<30, int32_t>(std::numeric_limits<int32_t>::max()),
267 "TestIsAbsoluteUint32#11");
268static_assert(IsAbsoluteUint<31, int32_t>(std::numeric_limits<int32_t>::max()),
269 "TestIsAbsoluteUint32#12");
270static_assert(!IsAbsoluteUint<31, int32_t>(std::numeric_limits<int32_t>::min()),
271 "TestIsAbsoluteUint32#13");
272static_assert(IsAbsoluteUint<31, int32_t>(std::numeric_limits<int32_t>::min() + 1),
273 "TestIsAbsoluteUint32#14");
274static_assert(IsAbsoluteUint<32, int32_t>(std::numeric_limits<int32_t>::max()),
275 "TestIsAbsoluteUint32#15");
276static_assert(IsAbsoluteUint<32, int32_t>(std::numeric_limits<int32_t>::min()),
277 "TestIsAbsoluteUint32#16");
278static_assert(IsAbsoluteUint<32, int32_t>(0), "TestIsAbsoluteUint32#17");
279
280static_assert(!IsAbsoluteUint<1, int64_t>(-2), "TestIsAbsoluteUint64#1");
281static_assert(IsAbsoluteUint<1, int64_t>(-1), "TestIsAbsoluteUint64#2");
282static_assert(IsAbsoluteUint<1, int64_t>(0), "TestIsAbsoluteUint64#3");
283static_assert(IsAbsoluteUint<1, int64_t>(1), "TestIsAbsoluteUint64#4");
284static_assert(!IsAbsoluteUint<1, int64_t>(2), "TestIsAbsoluteUint64#5");
285static_assert(!IsAbsoluteUint<4, int64_t>(-16), "TestIsAbsoluteUint64#6");
286static_assert(IsAbsoluteUint<4, int64_t>(-15), "TestIsAbsoluteUint64#7");
287static_assert(IsAbsoluteUint<4, int64_t>(0), "TestIsAbsoluteUint64#8");
288static_assert(IsAbsoluteUint<4, int64_t>(15), "TestIsAbsoluteUint64#9");
289static_assert(!IsAbsoluteUint<4, int64_t>(16), "TestIsAbsoluteUint64#10");
290static_assert(!IsAbsoluteUint<30, int64_t>(std::numeric_limits<int32_t>::max()),
291 "TestIsAbsoluteUint64#11");
292static_assert(IsAbsoluteUint<31, int64_t>(std::numeric_limits<int32_t>::max()),
293 "TestIsAbsoluteUint64#12");
294static_assert(!IsAbsoluteUint<31, int64_t>(std::numeric_limits<int32_t>::min()),
295 "TestIsAbsoluteUint64#13");
296static_assert(IsAbsoluteUint<31, int64_t>(std::numeric_limits<int32_t>::min() + 1),
297 "TestIsAbsoluteUint64#14");
298static_assert(IsAbsoluteUint<32, int64_t>(std::numeric_limits<int32_t>::max()),
299 "TestIsAbsoluteUint64#15");
300static_assert(IsAbsoluteUint<32, int64_t>(std::numeric_limits<int32_t>::min()),
301 "TestIsAbsoluteUint64#16");
302static_assert(!IsAbsoluteUint<62, int64_t>(std::numeric_limits<int64_t>::max()),
303 "TestIsAbsoluteUint64#17");
304static_assert(IsAbsoluteUint<63, int64_t>(std::numeric_limits<int64_t>::max()),
305 "TestIsAbsoluteUint64#18");
306static_assert(!IsAbsoluteUint<63, int64_t>(std::numeric_limits<int64_t>::min()),
307 "TestIsAbsoluteUint64#19");
308static_assert(IsAbsoluteUint<63, int64_t>(std::numeric_limits<int64_t>::min() + 1),
309 "TestIsAbsoluteUint64#20");
310static_assert(IsAbsoluteUint<64, int64_t>(std::numeric_limits<int64_t>::max()),
311 "TestIsAbsoluteUint64#21");
312static_assert(IsAbsoluteUint<64, int64_t>(std::numeric_limits<int64_t>::min()),
313 "TestIsAbsoluteUint64#22");
314static_assert(!IsAbsoluteUint<32, int64_t>(-kUint32MaxPlus1), "TestIsAbsoluteUint64#23");
315static_assert(IsAbsoluteUint<32, int64_t>(-kUint32MaxPlus1 + 1), "TestIsAbsoluteUint64#24");
316static_assert(IsAbsoluteUint<32, int64_t>(0), "TestIsAbsoluteUint64#25");
317static_assert(IsAbsoluteUint<64, int64_t>(0), "TestIsAbsoluteUint64#26");
318static_assert(IsAbsoluteUint<32, int64_t>(std::numeric_limits<uint32_t>::max()),
319 "TestIsAbsoluteUint64#27");
320static_assert(!IsAbsoluteUint<32, int64_t>(kUint32MaxPlus1), "TestIsAbsoluteUint64#28");
321
322template <typename Container>
323void CheckElements(const std::initializer_list<uint32_t>& expected, const Container& elements) {
324 auto expected_it = expected.begin();
325 auto element_it = elements.begin();
326 size_t idx = 0u;
327 while (expected_it != expected.end() && element_it != elements.end()) {
328 EXPECT_EQ(*expected_it, *element_it) << idx;
329 ++idx;
330 ++expected_it;
331 ++element_it;
332 }
333 ASSERT_TRUE(expected_it == expected.end() && element_it == elements.end())
334 << std::boolalpha << (expected_it == expected.end()) << " " << (element_it == elements.end());
335}
336
337TEST(BitUtilsTest, TestLowToHighBits32) {
338 CheckElements({}, LowToHighBits<uint32_t>(0u));
339 CheckElements({0}, LowToHighBits<uint32_t>(1u));
340 CheckElements({15}, LowToHighBits<uint32_t>(0x8000u));
341 CheckElements({31}, LowToHighBits<uint32_t>(0x80000000u));
342 CheckElements({0, 31}, LowToHighBits<uint32_t>(0x80000001u));
343 CheckElements({0, 1, 2, 3, 4, 5, 6, 7, 31}, LowToHighBits<uint32_t>(0x800000ffu));
344 CheckElements({0, 8, 16, 24, 31}, LowToHighBits<uint32_t>(0x81010101u));
345 CheckElements({16, 17, 30, 31}, LowToHighBits<uint32_t>(0xc0030000u));
346 CheckElements({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
347 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31},
348 LowToHighBits<uint32_t>(0xffffffffu));
349}
350
351TEST(BitUtilsTest, TestLowToHighBits64) {
352 CheckElements({}, LowToHighBits<uint64_t>(UINT64_C(0)));
353 CheckElements({0}, LowToHighBits<uint64_t>(UINT64_C(1)));
354 CheckElements({32}, LowToHighBits<uint64_t>(UINT64_C(0x100000000)));
355 CheckElements({63}, LowToHighBits<uint64_t>(UINT64_C(0x8000000000000000)));
356 CheckElements({0, 63}, LowToHighBits<uint64_t>(UINT64_C(0x8000000000000001)));
357 CheckElements({0, 1, 2, 3, 4, 5, 6, 7, 63},
358 LowToHighBits<uint64_t>(UINT64_C(0x80000000000000ff)));
359 CheckElements({0, 8, 16, 24, 32, 40, 48, 56, 63},
360 LowToHighBits<uint64_t>(UINT64_C(0x8101010101010101)));
361 CheckElements({16, 17, 62, 63}, LowToHighBits<uint64_t>(UINT64_C(0xc000000000030000)));
362 CheckElements({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
363 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
364 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
365 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63},
366 LowToHighBits<uint64_t>(UINT64_C(0xffffffffffffffff)));
367}
368
369TEST(BitUtilsTest, TestHighToLowBits32) {
370 CheckElements({}, HighToLowBits<uint32_t>(0u));
371 CheckElements({0}, HighToLowBits<uint32_t>(1u));
372 CheckElements({15}, HighToLowBits<uint32_t>(0x8000u));
373 CheckElements({31}, HighToLowBits<uint32_t>(0x80000000u));
374 CheckElements({31, 0}, HighToLowBits<uint32_t>(0x80000001u));
375 CheckElements({31, 7, 6, 5, 4, 3, 2, 1, 0}, HighToLowBits<uint32_t>(0x800000ffu));
376 CheckElements({31, 24, 16, 8, 0}, HighToLowBits<uint32_t>(0x81010101u));
377 CheckElements({31, 30, 17, 16}, HighToLowBits<uint32_t>(0xc0030000u));
378 CheckElements({31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,
379 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0},
380 HighToLowBits<uint32_t>(0xffffffffu));
381}
382
383TEST(BitUtilsTest, TestHighToLowBits64) {
384 CheckElements({}, HighToLowBits<uint64_t>(UINT64_C(0)));
385 CheckElements({0}, HighToLowBits<uint64_t>(UINT64_C(1)));
386 CheckElements({32}, HighToLowBits<uint64_t>(UINT64_C(0x100000000)));
387 CheckElements({63}, HighToLowBits<uint64_t>(UINT64_C(0x8000000000000000)));
388 CheckElements({63, 0}, HighToLowBits<uint64_t>(UINT64_C(0x8000000000000001)));
389 CheckElements({63, 7, 6, 5, 4, 3, 2, 1, 0},
390 HighToLowBits<uint64_t>(UINT64_C(0x80000000000000ff)));
391 CheckElements({63, 56, 48, 40, 32, 24, 16, 8, 0},
392 HighToLowBits<uint64_t>(UINT64_C(0x8101010101010101)));
393 CheckElements({63, 62, 17, 16}, HighToLowBits<uint64_t>(UINT64_C(0xc000000000030000)));
394 CheckElements({63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48,
395 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32,
396 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,
397 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0},
398 HighToLowBits<uint64_t>(UINT64_C(0xffffffffffffffff)));
399}
400
401} // namespace art