xref: /llvm-project/libc/test/src/__support/big_int_test.cpp (revision ce9035f5bd3aa09cbd899489cdbc7f6c18acf1e3)
1 //===-- Unittests for the UInt integer class ------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "src/__support/CPP/optional.h"
10 #include "src/__support/big_int.h"
11 #include "src/__support/integer_literals.h"        // parse_unsigned_bigint
12 #include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128
13 
14 #include "hdr/math_macros.h" // HUGE_VALF, HUGE_VALF
15 #include "test/UnitTest/Test.h"
16 
17 namespace LIBC_NAMESPACE {
18 
19 enum Value { ZERO, ONE, TWO, MIN, MAX };
20 
21 template <typename T> auto create(Value value) {
22   switch (value) {
23   case ZERO:
24     return T(0);
25   case ONE:
26     return T(1);
27   case TWO:
28     return T(2);
29   case MIN:
30     return T::min();
31   case MAX:
32     return T::max();
33   }
34 }
35 
36 using Types = testing::TypeList< //
37 #ifdef LIBC_TYPES_HAS_INT64
38     BigInt<64, false, uint64_t>, // 64-bits unsigned (1 x uint64_t)
39     BigInt<64, true, uint64_t>,  // 64-bits   signed (1 x uint64_t)
40 #endif
41 #ifdef LIBC_TYPES_HAS_INT128
42     BigInt<128, false, __uint128_t>, // 128-bits unsigned (1 x __uint128_t)
43     BigInt<128, true, __uint128_t>,  // 128-bits   signed (1 x __uint128_t)
44 #endif
45     BigInt<16, false, uint16_t>, // 16-bits unsigned (1 x uint16_t)
46     BigInt<16, true, uint16_t>,  // 16-bits   signed (1 x uint16_t)
47     BigInt<64, false, uint16_t>, // 64-bits unsigned (4 x uint16_t)
48     BigInt<64, true, uint16_t>   // 64-bits   signed (4 x uint16_t)
49     >;
50 
51 #define ASSERT_SAME(A, B) ASSERT_TRUE((A) == (B))
52 
53 TYPED_TEST(LlvmLibcUIntClassTest, Additions, Types) {
54   ASSERT_SAME(create<T>(ZERO) + create<T>(ZERO), create<T>(ZERO));
55   ASSERT_SAME(create<T>(ONE) + create<T>(ZERO), create<T>(ONE));
56   ASSERT_SAME(create<T>(ZERO) + create<T>(ONE), create<T>(ONE));
57   ASSERT_SAME(create<T>(ONE) + create<T>(ONE), create<T>(TWO));
58   // 2's complement addition works for signed and unsigned types.
59   // - unsigned : 0xff + 0x01 = 0x00 (255 + 1 = 0)
60   // -   signed : 0xef + 0x01 = 0xf0 (127 + 1 = -128)
61   ASSERT_SAME(create<T>(MAX) + create<T>(ONE), create<T>(MIN));
62 }
63 
64 TYPED_TEST(LlvmLibcUIntClassTest, Subtraction, Types) {
65   ASSERT_SAME(create<T>(ZERO) - create<T>(ZERO), create<T>(ZERO));
66   ASSERT_SAME(create<T>(ONE) - create<T>(ONE), create<T>(ZERO));
67   ASSERT_SAME(create<T>(ONE) - create<T>(ZERO), create<T>(ONE));
68   // 2's complement subtraction works for signed and unsigned types.
69   // - unsigned : 0x00 - 0x01 = 0xff (   0 - 1 = 255)
70   // -   signed : 0xf0 - 0x01 = 0xef (-128 - 1 = 127)
71   ASSERT_SAME(create<T>(MIN) - create<T>(ONE), create<T>(MAX));
72 }
73 
74 TYPED_TEST(LlvmLibcUIntClassTest, Multiplication, Types) {
75   ASSERT_SAME(create<T>(ZERO) * create<T>(ZERO), create<T>(ZERO));
76   ASSERT_SAME(create<T>(ZERO) * create<T>(ONE), create<T>(ZERO));
77   ASSERT_SAME(create<T>(ONE) * create<T>(ZERO), create<T>(ZERO));
78   ASSERT_SAME(create<T>(ONE) * create<T>(ONE), create<T>(ONE));
79   ASSERT_SAME(create<T>(ONE) * create<T>(TWO), create<T>(TWO));
80   ASSERT_SAME(create<T>(TWO) * create<T>(ONE), create<T>(TWO));
81   // - unsigned : 0xff x 0xff = 0x01 (mod 0xff)
82   // -   signed : 0xef x 0xef = 0x01 (mod 0xff)
83   ASSERT_SAME(create<T>(MAX) * create<T>(MAX), create<T>(ONE));
84 }
85 
86 template <typename T> void print(const char *msg, T value) {
87   testing::tlog << msg;
88   IntegerToString<T, radix::Hex> buffer(value);
89   testing::tlog << buffer.view() << "\n";
90 }
91 
92 TEST(LlvmLibcUIntClassTest, SignedAddSub) {
93   // Computations performed by https://www.wolframalpha.com/
94   using T = BigInt<128, true, uint32_t>;
95   const T a = parse_bigint<T>("1927508279017230597");
96   const T b = parse_bigint<T>("278789278723478925");
97   const T s = parse_bigint<T>("2206297557740709522");
98   // Addition
99   ASSERT_SAME(a + b, s);
100   ASSERT_SAME(b + a, s); // commutative
101   // Subtraction
102   ASSERT_SAME(a - s, -b);
103   ASSERT_SAME(s - a, b);
104 }
105 
106 TEST(LlvmLibcUIntClassTest, SignedMulDiv) {
107   // Computations performed by https://www.wolframalpha.com/
108   using T = BigInt<128, true, uint16_t>;
109   struct {
110     const char *a;
111     const char *b;
112     const char *mul;
113   } const test_cases[] = {{"-4", "3", "-12"},
114                           {"-3", "-3", "9"},
115                           {"1927508279017230597", "278789278723478925",
116                            "537368642840747885329125014794668225"}};
117   for (auto tc : test_cases) {
118     const T a = parse_bigint<T>(tc.a);
119     const T b = parse_bigint<T>(tc.b);
120     const T mul = parse_bigint<T>(tc.mul);
121     // Multiplication
122     ASSERT_SAME(a * b, mul);
123     ASSERT_SAME(b * a, mul);   // commutative
124     ASSERT_SAME(a * -b, -mul); // sign
125     ASSERT_SAME(-a * b, -mul); // sign
126     ASSERT_SAME(-a * -b, mul); // sign
127     // Division
128     ASSERT_SAME(mul / a, b);
129     ASSERT_SAME(mul / b, a);
130     ASSERT_SAME(-mul / a, -b); // sign
131     ASSERT_SAME(mul / -a, -b); // sign
132     ASSERT_SAME(-mul / -a, b); // sign
133   }
134 }
135 
136 TYPED_TEST(LlvmLibcUIntClassTest, Division, Types) {
137   ASSERT_SAME(create<T>(ZERO) / create<T>(ONE), create<T>(ZERO));
138   ASSERT_SAME(create<T>(MAX) / create<T>(ONE), create<T>(MAX));
139   ASSERT_SAME(create<T>(MAX) / create<T>(MAX), create<T>(ONE));
140   ASSERT_SAME(create<T>(ONE) / create<T>(ONE), create<T>(ONE));
141   if constexpr (T::SIGNED) {
142     // Special case found by fuzzing.
143     ASSERT_SAME(create<T>(MIN) / create<T>(MIN), create<T>(ONE));
144   }
145   // - unsigned : 0xff / 0x02 = 0x7f
146   // -   signed : 0xef / 0x02 = 0x77
147   ASSERT_SAME(create<T>(MAX) / create<T>(TWO), (create<T>(MAX) >> 1));
148 
149   using word_type = typename T::word_type;
150   const T zero_one_repeated = T::all_ones() / T(0xff);
151   const word_type pattern = word_type(~0) / word_type(0xff);
152   for (const word_type part : zero_one_repeated.val) {
153     if constexpr (T::SIGNED == false) {
154       EXPECT_EQ(part, pattern);
155     }
156   }
157 }
158 
159 TYPED_TEST(LlvmLibcUIntClassTest, is_neg, Types) {
160   EXPECT_FALSE(create<T>(ZERO).is_neg());
161   EXPECT_FALSE(create<T>(ONE).is_neg());
162   EXPECT_FALSE(create<T>(TWO).is_neg());
163   EXPECT_EQ(create<T>(MIN).is_neg(), T::SIGNED);
164   EXPECT_FALSE(create<T>(MAX).is_neg());
165 }
166 
167 TYPED_TEST(LlvmLibcUIntClassTest, Masks, Types) {
168   if constexpr (!T::SIGNED) {
169     constexpr size_t BITS = T::BITS;
170     // mask_trailing_ones
171     ASSERT_SAME((mask_trailing_ones<T, 0>()), T::zero());
172     ASSERT_SAME((mask_trailing_ones<T, 1>()), T::one());
173     ASSERT_SAME((mask_trailing_ones<T, BITS - 1>()), T::all_ones() >> 1);
174     ASSERT_SAME((mask_trailing_ones<T, BITS>()), T::all_ones());
175     // mask_leading_ones
176     ASSERT_SAME((mask_leading_ones<T, 0>()), T::zero());
177     ASSERT_SAME((mask_leading_ones<T, 1>()), T::one() << (BITS - 1));
178     ASSERT_SAME((mask_leading_ones<T, BITS - 1>()), T::all_ones() - T::one());
179     ASSERT_SAME((mask_leading_ones<T, BITS>()), T::all_ones());
180     // mask_trailing_zeros
181     ASSERT_SAME((mask_trailing_zeros<T, 0>()), T::all_ones());
182     ASSERT_SAME((mask_trailing_zeros<T, 1>()), T::all_ones() - T::one());
183     ASSERT_SAME((mask_trailing_zeros<T, BITS - 1>()), T::one() << (BITS - 1));
184     ASSERT_SAME((mask_trailing_zeros<T, BITS>()), T::zero());
185     // mask_trailing_zeros
186     ASSERT_SAME((mask_leading_zeros<T, 0>()), T::all_ones());
187     ASSERT_SAME((mask_leading_zeros<T, 1>()), T::all_ones() >> 1);
188     ASSERT_SAME((mask_leading_zeros<T, BITS - 1>()), T::one());
189     ASSERT_SAME((mask_leading_zeros<T, BITS>()), T::zero());
190   }
191 }
192 
193 TYPED_TEST(LlvmLibcUIntClassTest, CountBits, Types) {
194   if constexpr (!T::SIGNED) {
195     for (size_t i = 0; i < T::BITS; ++i) {
196       const auto l_one = T::all_ones() << i; // 0b111...000
197       const auto r_one = T::all_ones() >> i; // 0b000...111
198       const int zeros = i;
199       const int ones = T::BITS - zeros;
200       ASSERT_EQ(cpp::countr_one(r_one), ones);
201       ASSERT_EQ(cpp::countl_one(l_one), ones);
202       ASSERT_EQ(cpp::countr_zero(l_one), zeros);
203       ASSERT_EQ(cpp::countl_zero(r_one), zeros);
204     }
205   }
206 }
207 
208 using LL_UInt16 = UInt<16>;
209 using LL_UInt64 = UInt<64>;
210 // We want to test UInt<128> explicitly. So, for
211 // convenience, we use a sugar which does not conflict with the UInt128 type
212 // which can resolve to __uint128_t if the platform has it.
213 using LL_UInt128 = UInt<128>;
214 using LL_UInt192 = UInt<192>;
215 using LL_UInt256 = UInt<256>;
216 using LL_UInt320 = UInt<320>;
217 using LL_UInt512 = UInt<512>;
218 using LL_UInt1024 = UInt<1024>;
219 
220 using LL_Int128 = Int<128>;
221 using LL_Int192 = Int<192>;
222 
223 TEST(LlvmLibcUIntClassTest, BitCastToFromDouble) {
224   static_assert(cpp::is_trivially_copyable<LL_UInt64>::value);
225   static_assert(sizeof(LL_UInt64) == sizeof(double));
226   const double inf = HUGE_VAL;
227   const double max = DBL_MAX;
228   const double array[] = {0.0, 0.1, 1.0, max, inf};
229   for (double value : array) {
230     LL_UInt64 back = cpp::bit_cast<LL_UInt64>(value);
231     double forth = cpp::bit_cast<double>(back);
232     EXPECT_TRUE(value == forth);
233   }
234 }
235 
236 #ifdef LIBC_TYPES_HAS_INT128
237 TEST(LlvmLibcUIntClassTest, BitCastToFromNativeUint128) {
238   static_assert(cpp::is_trivially_copyable<LL_UInt128>::value);
239   static_assert(sizeof(LL_UInt128) == sizeof(__uint128_t));
240   const __uint128_t array[] = {0, 1, ~__uint128_t(0)};
241   for (__uint128_t value : array) {
242     LL_UInt128 back = cpp::bit_cast<LL_UInt128>(value);
243     __uint128_t forth = cpp::bit_cast<__uint128_t>(back);
244     EXPECT_TRUE(value == forth);
245   }
246 }
247 #endif // LIBC_TYPES_HAS_INT128
248 
249 #ifdef LIBC_TYPES_HAS_FLOAT128
250 TEST(LlvmLibcUIntClassTest, BitCastToFromNativeFloat128) {
251   static_assert(cpp::is_trivially_copyable<LL_UInt128>::value);
252   static_assert(sizeof(LL_UInt128) == sizeof(float128));
253   const float128 array[] = {0, 0.1, 1};
254   for (float128 value : array) {
255     LL_UInt128 back = cpp::bit_cast<LL_UInt128>(value);
256     float128 forth = cpp::bit_cast<float128>(back);
257     EXPECT_TRUE(value == forth);
258   }
259 }
260 #endif // LIBC_TYPES_HAS_FLOAT128
261 
262 #ifdef LIBC_TYPES_HAS_FLOAT16
263 TEST(LlvmLibcUIntClassTest, BitCastToFromNativeFloat16) {
264   static_assert(cpp::is_trivially_copyable<LL_UInt16>::value);
265   static_assert(sizeof(LL_UInt16) == sizeof(float16));
266   const float16 array[] = {0, 0.1, 1};
267   for (float16 value : array) {
268     LL_UInt16 back = cpp::bit_cast<LL_UInt16>(value);
269     float16 forth = cpp::bit_cast<float16>(back);
270     EXPECT_TRUE(value == forth);
271   }
272 }
273 #endif // LIBC_TYPES_HAS_FLOAT16
274 
275 TEST(LlvmLibcUIntClassTest, BasicInit) {
276   LL_UInt128 half_val(12345);
277   LL_UInt128 full_val({12345, 67890});
278   ASSERT_TRUE(half_val != full_val);
279 }
280 
281 TEST(LlvmLibcUIntClassTest, AdditionTests) {
282   LL_UInt128 val1(12345);
283   LL_UInt128 val2(54321);
284   LL_UInt128 result1(66666);
285   EXPECT_EQ(val1 + val2, result1);
286   EXPECT_EQ((val1 + val2), (val2 + val1)); // addition is commutative
287 
288   // Test overflow
289   LL_UInt128 val3({0xf000000000000001, 0});
290   LL_UInt128 val4({0x100000000000000f, 0});
291   LL_UInt128 result2({0x10, 0x1});
292   EXPECT_EQ(val3 + val4, result2);
293   EXPECT_EQ(val3 + val4, val4 + val3);
294 
295   // Test overflow
296   LL_UInt128 val5({0x0123456789abcdef, 0xfedcba9876543210});
297   LL_UInt128 val6({0x1111222233334444, 0xaaaabbbbccccdddd});
298   LL_UInt128 result3({0x12346789bcdf1233, 0xa987765443210fed});
299   EXPECT_EQ(val5 + val6, result3);
300   EXPECT_EQ(val5 + val6, val6 + val5);
301 
302   // Test 192-bit addition
303   LL_UInt192 val7({0x0123456789abcdef, 0xfedcba9876543210, 0xfedcba9889abcdef});
304   LL_UInt192 val8({0x1111222233334444, 0xaaaabbbbccccdddd, 0xeeeeffffeeeeffff});
305   LL_UInt192 result4(
306       {0x12346789bcdf1233, 0xa987765443210fed, 0xedcbba98789acdef});
307   EXPECT_EQ(val7 + val8, result4);
308   EXPECT_EQ(val7 + val8, val8 + val7);
309 
310   // Test 256-bit addition
311   LL_UInt256 val9({0x1f1e1d1c1b1a1918, 0xf1f2f3f4f5f6f7f8, 0x0123456789abcdef,
312                    0xfedcba9876543210});
313   LL_UInt256 val10({0x1111222233334444, 0xaaaabbbbccccdddd, 0x1111222233334444,
314                     0xaaaabbbbccccdddd});
315   LL_UInt256 result5({0x302f3f3e4e4d5d5c, 0x9c9dafb0c2c3d5d5,
316                       0x12346789bcdf1234, 0xa987765443210fed});
317   EXPECT_EQ(val9 + val10, result5);
318   EXPECT_EQ(val9 + val10, val10 + val9);
319 }
320 
321 TEST(LlvmLibcUIntClassTest, SubtractionTests) {
322   LL_UInt128 val1(12345);
323   LL_UInt128 val2(54321);
324   LL_UInt128 result1({0xffffffffffff5c08, 0xffffffffffffffff});
325   LL_UInt128 result2(0xa3f8);
326   EXPECT_EQ(val1 - val2, result1);
327   EXPECT_EQ(val1, val2 + result1);
328   EXPECT_EQ(val2 - val1, result2);
329   EXPECT_EQ(val2, val1 + result2);
330 
331   LL_UInt128 val3({0xf000000000000001, 0});
332   LL_UInt128 val4({0x100000000000000f, 0});
333   LL_UInt128 result3(0xdffffffffffffff2);
334   LL_UInt128 result4({0x200000000000000e, 0xffffffffffffffff});
335   EXPECT_EQ(val3 - val4, result3);
336   EXPECT_EQ(val3, val4 + result3);
337   EXPECT_EQ(val4 - val3, result4);
338   EXPECT_EQ(val4, val3 + result4);
339 
340   LL_UInt128 val5({0x0123456789abcdef, 0xfedcba9876543210});
341   LL_UInt128 val6({0x1111222233334444, 0xaaaabbbbccccdddd});
342   LL_UInt128 result5({0xf0122345567889ab, 0x5431fedca9875432});
343   LL_UInt128 result6({0x0feddcbaa9877655, 0xabce01235678abcd});
344   EXPECT_EQ(val5 - val6, result5);
345   EXPECT_EQ(val5, val6 + result5);
346   EXPECT_EQ(val6 - val5, result6);
347   EXPECT_EQ(val6, val5 + result6);
348 }
349 
350 TEST(LlvmLibcUIntClassTest, MultiplicationTests) {
351   LL_UInt128 val1({5, 0});
352   LL_UInt128 val2({10, 0});
353   LL_UInt128 result1({50, 0});
354   EXPECT_EQ((val1 * val2), result1);
355   EXPECT_EQ((val1 * val2), (val2 * val1)); // multiplication is commutative
356 
357   // Check that the multiplication works accross the whole number
358   LL_UInt128 val3({0xf, 0});
359   LL_UInt128 val4({0x1111111111111111, 0x1111111111111111});
360   LL_UInt128 result2({0xffffffffffffffff, 0xffffffffffffffff});
361   EXPECT_EQ((val3 * val4), result2);
362   EXPECT_EQ((val3 * val4), (val4 * val3));
363 
364   // Check that multiplication doesn't reorder the bits.
365   LL_UInt128 val5({2, 0});
366   LL_UInt128 val6({0x1357024675316420, 0x0123456776543210});
367   LL_UInt128 result3({0x26ae048cea62c840, 0x02468aceeca86420});
368 
369   EXPECT_EQ((val5 * val6), result3);
370   EXPECT_EQ((val5 * val6), (val6 * val5));
371 
372   // Make sure that multiplication handles overflow correctly.
373   LL_UInt128 val7(2);
374   LL_UInt128 val8({0x8000800080008000, 0x8000800080008000});
375   LL_UInt128 result4({0x0001000100010000, 0x0001000100010001});
376   EXPECT_EQ((val7 * val8), result4);
377   EXPECT_EQ((val7 * val8), (val8 * val7));
378 
379   // val9 is the 128 bit mantissa of 1e60 as a float, val10 is the mantissa for
380   // 1e-60. They almost cancel on the high bits, but the result we're looking
381   // for is just the low bits. The full result would be
382   // 0x7fffffffffffffffffffffffffffffff3a4f32d17f40d08f917cf11d1e039c50
383   LL_UInt128 val9({0x01D762422C946590, 0x9F4F2726179A2245});
384   LL_UInt128 val10({0x3792F412CB06794D, 0xCDB02555653131B6});
385   LL_UInt128 result5({0x917cf11d1e039c50, 0x3a4f32d17f40d08f});
386   EXPECT_EQ((val9 * val10), result5);
387   EXPECT_EQ((val9 * val10), (val10 * val9));
388 
389   // Test 192-bit multiplication
390   LL_UInt192 val11(
391       {0xffffffffffffffff, 0x01D762422C946590, 0x9F4F2726179A2245});
392   LL_UInt192 val12(
393       {0xffffffffffffffff, 0x3792F412CB06794D, 0xCDB02555653131B6});
394 
395   LL_UInt192 result6(
396       {0x0000000000000001, 0xc695a9ab08652121, 0x5de7faf698d32732});
397   EXPECT_EQ((val11 * val12), result6);
398   EXPECT_EQ((val11 * val12), (val12 * val11));
399 
400   LL_UInt256 val13({0xffffffffffffffff, 0x01D762422C946590, 0x9F4F2726179A2245,
401                     0xffffffffffffffff});
402   LL_UInt256 val14({0xffffffffffffffff, 0xffffffffffffffff, 0x3792F412CB06794D,
403                     0xCDB02555653131B6});
404   LL_UInt256 result7({0x0000000000000001, 0xfe289dbdd36b9a6f,
405                       0x291de4c71d5f646c, 0xfd37221cb06d4978});
406   EXPECT_EQ((val13 * val14), result7);
407   EXPECT_EQ((val13 * val14), (val14 * val13));
408 }
409 
410 TEST(LlvmLibcUIntClassTest, DivisionTests) {
411   LL_UInt128 val1({10, 0});
412   LL_UInt128 val2({5, 0});
413   LL_UInt128 result1({2, 0});
414   EXPECT_EQ((val1 / val2), result1);
415   EXPECT_EQ((val1 / result1), val2);
416 
417   // Check that the division works accross the whole number
418   LL_UInt128 val3({0xffffffffffffffff, 0xffffffffffffffff});
419   LL_UInt128 val4({0xf, 0});
420   LL_UInt128 result2({0x1111111111111111, 0x1111111111111111});
421   EXPECT_EQ((val3 / val4), result2);
422   EXPECT_EQ((val3 / result2), val4);
423 
424   // Check that division doesn't reorder the bits.
425   LL_UInt128 val5({0x26ae048cea62c840, 0x02468aceeca86420});
426   LL_UInt128 val6({2, 0});
427   LL_UInt128 result3({0x1357024675316420, 0x0123456776543210});
428   EXPECT_EQ((val5 / val6), result3);
429   EXPECT_EQ((val5 / result3), val6);
430 
431   // Make sure that division handles inexact results correctly.
432   LL_UInt128 val7({1001, 0});
433   LL_UInt128 val8({10, 0});
434   LL_UInt128 result4({100, 0});
435   EXPECT_EQ((val7 / val8), result4);
436   EXPECT_EQ((val7 / result4), val8);
437 
438   // Make sure that division handles divisors of one correctly.
439   LL_UInt128 val9({0x1234567812345678, 0x9abcdef09abcdef0});
440   LL_UInt128 val10({1, 0});
441   LL_UInt128 result5({0x1234567812345678, 0x9abcdef09abcdef0});
442   EXPECT_EQ((val9 / val10), result5);
443   EXPECT_EQ((val9 / result5), val10);
444 
445   // Make sure that division handles results of slightly more than 1 correctly.
446   LL_UInt128 val11({1050, 0});
447   LL_UInt128 val12({1030, 0});
448   LL_UInt128 result6({1, 0});
449   EXPECT_EQ((val11 / val12), result6);
450 
451   // Make sure that division handles dividing by zero correctly.
452   LL_UInt128 val13({1234, 0});
453   LL_UInt128 val14({0, 0});
454   EXPECT_FALSE(val13.div(val14).has_value());
455 }
456 
457 TEST(LlvmLibcUIntClassTest, ModuloTests) {
458   LL_UInt128 val1({10, 0});
459   LL_UInt128 val2({5, 0});
460   LL_UInt128 result1({0, 0});
461   EXPECT_EQ((val1 % val2), result1);
462 
463   LL_UInt128 val3({101, 0});
464   LL_UInt128 val4({10, 0});
465   LL_UInt128 result2({1, 0});
466   EXPECT_EQ((val3 % val4), result2);
467 
468   LL_UInt128 val5({10000001, 0});
469   LL_UInt128 val6({10, 0});
470   LL_UInt128 result3({1, 0});
471   EXPECT_EQ((val5 % val6), result3);
472 
473   LL_UInt128 val7({12345, 10});
474   LL_UInt128 val8({0, 1});
475   LL_UInt128 result4({12345, 0});
476   EXPECT_EQ((val7 % val8), result4);
477 
478   LL_UInt128 val9({12345, 10});
479   LL_UInt128 val10({0, 11});
480   LL_UInt128 result5({12345, 10});
481   EXPECT_EQ((val9 % val10), result5);
482 
483   LL_UInt128 val11({10, 10});
484   LL_UInt128 val12({10, 10});
485   LL_UInt128 result6({0, 0});
486   EXPECT_EQ((val11 % val12), result6);
487 
488   LL_UInt128 val13({12345, 0});
489   LL_UInt128 val14({1, 0});
490   LL_UInt128 result7({0, 0});
491   EXPECT_EQ((val13 % val14), result7);
492 
493   LL_UInt128 val15({0xffffffffffffffff, 0xffffffffffffffff});
494   LL_UInt128 val16({0x1111111111111111, 0x111111111111111});
495   LL_UInt128 result8({0xf, 0});
496   EXPECT_EQ((val15 % val16), result8);
497 
498   LL_UInt128 val17({5076944270305263619, 54210108624}); // (10 ^ 30) + 3
499   LL_UInt128 val18({10, 0});
500   LL_UInt128 result9({3, 0});
501   EXPECT_EQ((val17 % val18), result9);
502 }
503 
504 TEST(LlvmLibcUIntClassTest, PowerTests) {
505   LL_UInt128 val1({10, 0});
506   val1.pow_n(30);
507   LL_UInt128 result1({5076944270305263616, 54210108624}); // (10 ^ 30)
508   EXPECT_EQ(val1, result1);
509 
510   LL_UInt128 val2({1, 0});
511   val2.pow_n(10);
512   LL_UInt128 result2({1, 0});
513   EXPECT_EQ(val2, result2);
514 
515   LL_UInt128 val3({0, 0});
516   val3.pow_n(10);
517   LL_UInt128 result3({0, 0});
518   EXPECT_EQ(val3, result3);
519 
520   LL_UInt128 val4({10, 0});
521   val4.pow_n(0);
522   LL_UInt128 result4({1, 0});
523   EXPECT_EQ(val4, result4);
524 
525   // Test zero to the zero. Currently it returns 1, since that's the easiest
526   // result.
527   LL_UInt128 val5({0, 0});
528   val5.pow_n(0);
529   LL_UInt128 result5({1, 0});
530   EXPECT_EQ(val5, result5);
531 
532   // Test a number that overflows. 100 ^ 20 is larger than 2 ^ 128.
533   LL_UInt128 val6({100, 0});
534   val6.pow_n(20);
535   LL_UInt128 result6({0xb9f5610000000000, 0x6329f1c35ca4bfab});
536   EXPECT_EQ(val6, result6);
537 
538   // Test that both halves of the number are being used.
539   LL_UInt128 val7({1, 1});
540   val7.pow_n(2);
541   LL_UInt128 result7({1, 2});
542   EXPECT_EQ(val7, result7);
543 
544   LL_UInt128 val_pow_two;
545   LL_UInt128 result_pow_two;
546   for (size_t i = 0; i < 128; ++i) {
547     val_pow_two = 2;
548     val_pow_two.pow_n(i);
549     result_pow_two = 1;
550     result_pow_two = result_pow_two << i;
551     EXPECT_EQ(val_pow_two, result_pow_two);
552   }
553 }
554 
555 TEST(LlvmLibcUIntClassTest, ShiftLeftTests) {
556   LL_UInt128 val1(0x0123456789abcdef);
557   LL_UInt128 result1(0x123456789abcdef0);
558   EXPECT_EQ((val1 << 4), result1);
559 
560   LL_UInt128 val2({0x13579bdf02468ace, 0x123456789abcdef0});
561   LL_UInt128 result2({0x02468ace00000000, 0x9abcdef013579bdf});
562   EXPECT_EQ((val2 << 32), result2);
563   LL_UInt128 val22 = val2;
564   val22 <<= 32;
565   EXPECT_EQ(val22, result2);
566 
567   LL_UInt128 result3({0, 0x13579bdf02468ace});
568   EXPECT_EQ((val2 << 64), result3);
569 
570   LL_UInt128 result4({0, 0x02468ace00000000});
571   EXPECT_EQ((val2 << 96), result4);
572 
573   LL_UInt128 result5({0, 0x2468ace000000000});
574   EXPECT_EQ((val2 << 100), result5);
575 
576   LL_UInt192 val3({1, 0, 0});
577   LL_UInt192 result7({0, 1, 0});
578   EXPECT_EQ((val3 << 64), result7);
579 }
580 
581 TEST(LlvmLibcUIntClassTest, ShiftRightTests) {
582   LL_UInt128 val1(0x0123456789abcdef);
583   LL_UInt128 result1(0x00123456789abcde);
584   EXPECT_EQ((val1 >> 4), result1);
585 
586   LL_UInt128 val2({0x13579bdf02468ace, 0x123456789abcdef0});
587   LL_UInt128 result2({0x9abcdef013579bdf, 0x0000000012345678});
588   EXPECT_EQ((val2 >> 32), result2);
589   LL_UInt128 val22 = val2;
590   val22 >>= 32;
591   EXPECT_EQ(val22, result2);
592 
593   LL_UInt128 result3({0x123456789abcdef0, 0});
594   EXPECT_EQ((val2 >> 64), result3);
595 
596   LL_UInt128 result4({0x0000000012345678, 0});
597   EXPECT_EQ((val2 >> 96), result4);
598 
599   LL_UInt128 result5({0x0000000001234567, 0});
600   EXPECT_EQ((val2 >> 100), result5);
601 
602   LL_UInt128 v1({0x1111222233334444, 0xaaaabbbbccccdddd});
603   LL_UInt128 r1({0xaaaabbbbccccdddd, 0});
604   EXPECT_EQ((v1 >> 64), r1);
605 
606   LL_UInt192 v2({0x1111222233334444, 0x5555666677778888, 0xaaaabbbbccccdddd});
607   LL_UInt192 r2({0x5555666677778888, 0xaaaabbbbccccdddd, 0});
608   LL_UInt192 r3({0xaaaabbbbccccdddd, 0, 0});
609   EXPECT_EQ((v2 >> 64), r2);
610   EXPECT_EQ((v2 >> 128), r3);
611   EXPECT_EQ((r2 >> 64), r3);
612 
613   LL_UInt192 val3({0, 0, 1});
614   LL_UInt192 result7({0, 1, 0});
615   EXPECT_EQ((val3 >> 64), result7);
616 }
617 
618 TEST(LlvmLibcUIntClassTest, AndTests) {
619   LL_UInt128 base({0xffff00000000ffff, 0xffffffff00000000});
620   LL_UInt128 val128({0xf0f0f0f00f0f0f0f, 0xff00ff0000ff00ff});
621   uint64_t val64 = 0xf0f0f0f00f0f0f0f;
622   int val32 = 0x0f0f0f0f;
623   LL_UInt128 result128({0xf0f0000000000f0f, 0xff00ff0000000000});
624   LL_UInt128 result64(0xf0f0000000000f0f);
625   LL_UInt128 result32(0x00000f0f);
626   EXPECT_EQ((base & val128), result128);
627   EXPECT_EQ((base & val64), result64);
628   EXPECT_EQ((base & val32), result32);
629 }
630 
631 TEST(LlvmLibcUIntClassTest, OrTests) {
632   LL_UInt128 base({0xffff00000000ffff, 0xffffffff00000000});
633   LL_UInt128 val128({0xf0f0f0f00f0f0f0f, 0xff00ff0000ff00ff});
634   uint64_t val64 = 0xf0f0f0f00f0f0f0f;
635   int val32 = 0x0f0f0f0f;
636   LL_UInt128 result128({0xfffff0f00f0fffff, 0xffffffff00ff00ff});
637   LL_UInt128 result64({0xfffff0f00f0fffff, 0xffffffff00000000});
638   LL_UInt128 result32({0xffff00000f0fffff, 0xffffffff00000000});
639   EXPECT_EQ((base | val128), result128);
640   EXPECT_EQ((base | val64), result64);
641   EXPECT_EQ((base | val32), result32);
642 }
643 
644 TEST(LlvmLibcUIntClassTest, CompoundAssignments) {
645   LL_UInt128 x({0xffff00000000ffff, 0xffffffff00000000});
646   LL_UInt128 b({0xf0f0f0f00f0f0f0f, 0xff00ff0000ff00ff});
647 
648   LL_UInt128 a = x;
649   a |= b;
650   LL_UInt128 or_result({0xfffff0f00f0fffff, 0xffffffff00ff00ff});
651   EXPECT_EQ(a, or_result);
652 
653   a = x;
654   a &= b;
655   LL_UInt128 and_result({0xf0f0000000000f0f, 0xff00ff0000000000});
656   EXPECT_EQ(a, and_result);
657 
658   a = x;
659   a ^= b;
660   LL_UInt128 xor_result({0x0f0ff0f00f0ff0f0, 0x00ff00ff00ff00ff});
661   EXPECT_EQ(a, xor_result);
662 
663   a = LL_UInt128(uint64_t(0x0123456789abcdef));
664   LL_UInt128 shift_left_result(uint64_t(0x123456789abcdef0));
665   a <<= 4;
666   EXPECT_EQ(a, shift_left_result);
667 
668   a = LL_UInt128(uint64_t(0x123456789abcdef1));
669   LL_UInt128 shift_right_result(uint64_t(0x0123456789abcdef));
670   a >>= 4;
671   EXPECT_EQ(a, shift_right_result);
672 
673   a = LL_UInt128({0xf000000000000001, 0});
674   b = LL_UInt128({0x100000000000000f, 0});
675   LL_UInt128 add_result({0x10, 0x1});
676   a += b;
677   EXPECT_EQ(a, add_result);
678 
679   a = LL_UInt128({0xf, 0});
680   b = LL_UInt128({0x1111111111111111, 0x1111111111111111});
681   LL_UInt128 mul_result({0xffffffffffffffff, 0xffffffffffffffff});
682   a *= b;
683   EXPECT_EQ(a, mul_result);
684 }
685 
686 TEST(LlvmLibcUIntClassTest, UnaryPredecrement) {
687   LL_UInt128 a = LL_UInt128({0x1111111111111111, 0x1111111111111111});
688   ++a;
689   EXPECT_EQ(a, LL_UInt128({0x1111111111111112, 0x1111111111111111}));
690 
691   a = LL_UInt128({0xffffffffffffffff, 0x0});
692   ++a;
693   EXPECT_EQ(a, LL_UInt128({0x0, 0x1}));
694 
695   a = LL_UInt128({0xffffffffffffffff, 0xffffffffffffffff});
696   ++a;
697   EXPECT_EQ(a, LL_UInt128({0x0, 0x0}));
698 }
699 
700 TEST(LlvmLibcUIntClassTest, EqualsTests) {
701   LL_UInt128 a1({0xffffffff00000000, 0xffff00000000ffff});
702   LL_UInt128 a2({0xffffffff00000000, 0xffff00000000ffff});
703   LL_UInt128 b({0xff00ff0000ff00ff, 0xf0f0f0f00f0f0f0f});
704   LL_UInt128 a_reversed({0xffff00000000ffff, 0xffffffff00000000});
705   LL_UInt128 a_upper(0xffff00000000ffff);
706   LL_UInt128 a_lower(0xffffffff00000000);
707   ASSERT_TRUE(a1 == a1);
708   ASSERT_TRUE(a1 == a2);
709   ASSERT_FALSE(a1 == b);
710   ASSERT_FALSE(a1 == a_reversed);
711   ASSERT_FALSE(a1 == a_lower);
712   ASSERT_FALSE(a1 == a_upper);
713   ASSERT_TRUE(a_lower != a_upper);
714 }
715 
716 TEST(LlvmLibcUIntClassTest, ComparisonTests) {
717   LL_UInt128 a({0xffffffff00000000, 0xffff00000000ffff});
718   LL_UInt128 b({0xff00ff0000ff00ff, 0xf0f0f0f00f0f0f0f});
719   EXPECT_GT(a, b);
720   EXPECT_GE(a, b);
721   EXPECT_LT(b, a);
722   EXPECT_LE(b, a);
723 
724   LL_UInt128 x(0xffffffff00000000);
725   LL_UInt128 y(0x00000000ffffffff);
726   EXPECT_GT(x, y);
727   EXPECT_GE(x, y);
728   EXPECT_LT(y, x);
729   EXPECT_LE(y, x);
730 
731   EXPECT_LE(a, a);
732   EXPECT_GE(a, a);
733 }
734 
735 TEST(LlvmLibcUIntClassTest, FullMulTests) {
736   LL_UInt128 a({0xffffffffffffffffULL, 0xffffffffffffffffULL});
737   LL_UInt128 b({0xfedcba9876543210ULL, 0xfefdfcfbfaf9f8f7ULL});
738   LL_UInt256 r({0x0123456789abcdf0ULL, 0x0102030405060708ULL,
739                 0xfedcba987654320fULL, 0xfefdfcfbfaf9f8f7ULL});
740   LL_UInt128 r_hi({0xfedcba987654320eULL, 0xfefdfcfbfaf9f8f7ULL});
741 
742   EXPECT_EQ(a.ful_mul(b), r);
743   EXPECT_EQ(a.quick_mul_hi(b), r_hi);
744 
745   LL_UInt192 c(
746       {0x7766554433221101ULL, 0xffeeddccbbaa9988ULL, 0x1f2f3f4f5f6f7f8fULL});
747   LL_UInt320 rr({0x8899aabbccddeeffULL, 0x0011223344556677ULL,
748                  0x583715f4d3b29171ULL, 0xffeeddccbbaa9988ULL,
749                  0x1f2f3f4f5f6f7f8fULL});
750 
751   EXPECT_EQ(a.ful_mul(c), rr);
752   EXPECT_EQ(a.ful_mul(c), c.ful_mul(a));
753 }
754 
755 #define TEST_QUICK_MUL_HI(Bits, Error)                                         \
756   do {                                                                         \
757     LL_UInt##Bits a = ~LL_UInt##Bits(0);                                       \
758     LL_UInt##Bits hi = a.quick_mul_hi(a);                                      \
759     LL_UInt##Bits trunc = static_cast<LL_UInt##Bits>(a.ful_mul(a) >> Bits);    \
760     uint64_t overflow = trunc.sub_overflow(hi);                                \
761     EXPECT_EQ(overflow, uint64_t(0));                                          \
762     EXPECT_LE(uint64_t(trunc), uint64_t(Error));                               \
763   } while (0)
764 
765 TEST(LlvmLibcUIntClassTest, QuickMulHiTests) {
766   TEST_QUICK_MUL_HI(128, 1);
767   TEST_QUICK_MUL_HI(192, 2);
768   TEST_QUICK_MUL_HI(256, 3);
769   TEST_QUICK_MUL_HI(512, 7);
770 }
771 
772 TEST(LlvmLibcUIntClassTest, ConstexprInitTests) {
773   constexpr LL_UInt128 add = LL_UInt128(1) + LL_UInt128(2);
774   ASSERT_EQ(add, LL_UInt128(3));
775   constexpr LL_UInt128 sub = LL_UInt128(5) - LL_UInt128(4);
776   ASSERT_EQ(sub, LL_UInt128(1));
777 }
778 
779 #define TEST_QUICK_DIV_UINT32_POW2(x, e)                                       \
780   do {                                                                         \
781     LL_UInt320 y({0x8899aabbccddeeffULL, 0x0011223344556677ULL,                \
782                   0x583715f4d3b29171ULL, 0xffeeddccbbaa9988ULL,                \
783                   0x1f2f3f4f5f6f7f8fULL});                                     \
784     LL_UInt320 d = LL_UInt320(x);                                              \
785     d <<= e;                                                                   \
786     LL_UInt320 q1 = y / d;                                                     \
787     LL_UInt320 r1 = y % d;                                                     \
788     LL_UInt320 r2 = *y.div_uint_half_times_pow_2(x, e);                        \
789     EXPECT_EQ(q1, y);                                                          \
790     EXPECT_EQ(r1, r2);                                                         \
791   } while (0)
792 
793 TEST(LlvmLibcUIntClassTest, DivUInt32TimesPow2Tests) {
794   for (size_t i = 0; i < 320; i += 32) {
795     TEST_QUICK_DIV_UINT32_POW2(1, i);
796     TEST_QUICK_DIV_UINT32_POW2(13151719, i);
797   }
798 
799   TEST_QUICK_DIV_UINT32_POW2(1, 75);
800   TEST_QUICK_DIV_UINT32_POW2(1, 101);
801 
802   TEST_QUICK_DIV_UINT32_POW2(1000000000, 75);
803   TEST_QUICK_DIV_UINT32_POW2(1000000000, 101);
804 }
805 
806 TEST(LlvmLibcUIntClassTest, ComparisonInt128Tests) {
807   LL_Int128 a(123);
808   LL_Int128 b(0);
809   LL_Int128 c(-1);
810 
811   ASSERT_TRUE(a == a);
812   ASSERT_TRUE(b == b);
813   ASSERT_TRUE(c == c);
814 
815   ASSERT_TRUE(a != b);
816   ASSERT_TRUE(a != c);
817   ASSERT_TRUE(b != a);
818   ASSERT_TRUE(b != c);
819   ASSERT_TRUE(c != a);
820   ASSERT_TRUE(c != b);
821 
822   ASSERT_TRUE(a > b);
823   ASSERT_TRUE(a >= b);
824   ASSERT_TRUE(a > c);
825   ASSERT_TRUE(a >= c);
826   ASSERT_TRUE(b > c);
827   ASSERT_TRUE(b >= c);
828 
829   ASSERT_TRUE(b < a);
830   ASSERT_TRUE(b <= a);
831   ASSERT_TRUE(c < a);
832   ASSERT_TRUE(c <= a);
833   ASSERT_TRUE(c < b);
834   ASSERT_TRUE(c <= b);
835 }
836 
837 TEST(LlvmLibcUIntClassTest, BasicArithmeticInt128Tests) {
838   LL_Int128 a(123);
839   LL_Int128 b(0);
840   LL_Int128 c(-3);
841 
842   ASSERT_EQ(a * a, LL_Int128(123 * 123));
843   ASSERT_EQ(a * c, LL_Int128(-369));
844   ASSERT_EQ(c * a, LL_Int128(-369));
845   ASSERT_EQ(c * c, LL_Int128(9));
846   ASSERT_EQ(a * b, b);
847   ASSERT_EQ(b * a, b);
848   ASSERT_EQ(b * c, b);
849   ASSERT_EQ(c * b, b);
850 }
851 
852 #ifdef LIBC_TYPES_HAS_INT128
853 
854 TEST(LlvmLibcUIntClassTest, ConstructorFromUInt128Tests) {
855   __uint128_t a = (__uint128_t(123) << 64) + 1;
856   __int128_t b = -static_cast<__int128_t>(a);
857   LL_Int128 c(a);
858   LL_Int128 d(b);
859 
860   LL_Int192 e(a);
861   LL_Int192 f(b);
862 
863   ASSERT_EQ(static_cast<int>(c), 1);
864   ASSERT_EQ(static_cast<int>(c >> 64), 123);
865   ASSERT_EQ(static_cast<uint64_t>(d), static_cast<uint64_t>(b));
866   ASSERT_EQ(static_cast<uint64_t>(d >> 64), static_cast<uint64_t>(b >> 64));
867   ASSERT_EQ(c + d, LL_Int128(a + b));
868 
869   ASSERT_EQ(static_cast<int>(e), 1);
870   ASSERT_EQ(static_cast<int>(e >> 64), 123);
871   ASSERT_EQ(static_cast<uint64_t>(f), static_cast<uint64_t>(b));
872   ASSERT_EQ(static_cast<uint64_t>(f >> 64), static_cast<uint64_t>(b >> 64));
873   ASSERT_EQ(LL_UInt192(e + f), LL_UInt192(a + b));
874 }
875 
876 TEST(LlvmLibcUIntClassTest, WordTypeUInt128Tests) {
877   using LL_UInt256_128 = BigInt<256, false, __uint128_t>;
878   using LL_UInt128_128 = BigInt<128, false, __uint128_t>;
879 
880   LL_UInt256_128 a(1);
881 
882   ASSERT_EQ(static_cast<int>(a), 1);
883   a = (a << 128) + 2;
884   ASSERT_EQ(static_cast<int>(a), 2);
885   ASSERT_EQ(static_cast<uint64_t>(a), uint64_t(2));
886   a = (a << 32) + 3;
887   ASSERT_EQ(static_cast<int>(a), 3);
888   ASSERT_EQ(static_cast<uint64_t>(a), uint64_t(0x2'0000'0003));
889   ASSERT_EQ(static_cast<int>(a >> 32), 2);
890   ASSERT_EQ(static_cast<int>(a >> (128 + 32)), 1);
891 
892   LL_UInt128_128 b(__uint128_t(1) << 127);
893   LL_UInt128_128 c(b);
894   a = b.ful_mul(c);
895 
896   ASSERT_EQ(static_cast<int>(a >> 254), 1);
897 
898   LL_UInt256_128 d = LL_UInt256_128(123) << 4;
899   ASSERT_EQ(static_cast<int>(d), 123 << 4);
900   LL_UInt256_128 e = a / d;
901   LL_UInt256_128 f = a % d;
902   LL_UInt256_128 r = *a.div_uint_half_times_pow_2(123, 4);
903   EXPECT_TRUE(e == a);
904   EXPECT_TRUE(f == r);
905 }
906 
907 #endif // LIBC_TYPES_HAS_INT128
908 
909 TEST(LlvmLibcUIntClassTest, OtherWordTypeTests) {
910   using LL_UInt96 = BigInt<96, false, uint32_t>;
911 
912   LL_UInt96 a(1);
913 
914   ASSERT_EQ(static_cast<int>(a), 1);
915   a = (a << 32) + 2;
916   ASSERT_EQ(static_cast<int>(a), 2);
917   ASSERT_EQ(static_cast<uint64_t>(a), uint64_t(0x1'0000'0002));
918   a = (a << 32) + 3;
919   ASSERT_EQ(static_cast<int>(a), 3);
920   ASSERT_EQ(static_cast<int>(a >> 32), 2);
921   ASSERT_EQ(static_cast<int>(a >> 64), 1);
922 }
923 
924 } // namespace LIBC_NAMESPACE
925