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