|
26 | 26 | #include "modinv32_impl.h"
|
27 | 27 | #ifdef SECP256K1_WIDEMUL_INT128
|
28 | 28 | #include "modinv64_impl.h"
|
| 29 | +#include "int128_impl.h" |
29 | 30 | #endif
|
30 | 31 |
|
31 | 32 | #define CONDITIONAL_TEST(cnt, nam) if (count < (cnt)) { printf("Skipping %s (iteration count too low)\n", nam); } else
|
@@ -430,6 +431,47 @@ void run_scratch_tests(void) {
|
430 | 431 | secp256k1_context_destroy(none);
|
431 | 432 | }
|
432 | 433 |
|
| 434 | + |
| 435 | +#ifdef SECP256K1_WIDEMUL_INT128 |
| 436 | +void run_int128_tests(void) { |
| 437 | + { /* secp256k1_u128_accum_mul */ |
| 438 | + secp256k1_uint128 res; |
| 439 | + |
| 440 | + /* Check secp256k1_u128_accum_mul overflow */ |
| 441 | + secp256k1_u128_from_u64(&res, 0); |
| 442 | + secp256k1_u128_accum_mul(&res, UINT64_MAX, UINT64_MAX); |
| 443 | + secp256k1_u128_accum_mul(&res, UINT64_MAX, UINT64_MAX); |
| 444 | + CHECK(secp256k1_u128_to_u64(&res) == 2); |
| 445 | + CHECK(secp256k1_u128_hi_u64(&res) == 18446744073709551612U); |
| 446 | + } |
| 447 | + { /* secp256k1_u128_accum_mul */ |
| 448 | + secp256k1_int128 res; |
| 449 | + |
| 450 | + /* Compute INT128_MAX = 2^127 - 1 with secp256k1_i128_accum_mul */ |
| 451 | + secp256k1_i128_from_i64(&res, 0); |
| 452 | + secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MAX); |
| 453 | + secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MAX); |
| 454 | + CHECK(secp256k1_i128_to_i64(&res) == 2); |
| 455 | + secp256k1_i128_accum_mul(&res, 4, 9223372036854775807); |
| 456 | + secp256k1_i128_accum_mul(&res, 1, 1); |
| 457 | + CHECK((uint64_t)secp256k1_i128_to_i64(&res) == UINT64_MAX); |
| 458 | + secp256k1_i128_rshift(&res, 64); |
| 459 | + CHECK(secp256k1_i128_to_i64(&res) == INT64_MAX); |
| 460 | + |
| 461 | + /* Compute INT128_MIN = - 2^127 with secp256k1_i128_accum_mul */ |
| 462 | + secp256k1_i128_from_i64(&res, 0); |
| 463 | + secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MIN); |
| 464 | + CHECK(secp256k1_i128_to_i64(&res) == INT64_MIN); |
| 465 | + secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MIN); |
| 466 | + CHECK(secp256k1_i128_to_i64(&res) == 0); |
| 467 | + secp256k1_i128_accum_mul(&res, 2, INT64_MIN); |
| 468 | + CHECK(secp256k1_i128_to_i64(&res) == 0); |
| 469 | + secp256k1_i128_rshift(&res, 64); |
| 470 | + CHECK(secp256k1_i128_to_i64(&res) == INT64_MIN); |
| 471 | + } |
| 472 | +} |
| 473 | +#endif |
| 474 | + |
433 | 475 | void run_ctz_tests(void) {
|
434 | 476 | static const uint32_t b32[] = {1, 0xffffffff, 0x5e56968f, 0xe0d63129};
|
435 | 477 | static const uint64_t b64[] = {1, 0xffffffffffffffff, 0xbcd02462139b3fc3, 0x98b5f80c769693ef};
|
@@ -7100,6 +7142,9 @@ int main(int argc, char **argv) {
|
7100 | 7142 | run_rand_bits();
|
7101 | 7143 | run_rand_int();
|
7102 | 7144 |
|
| 7145 | +#ifdef SECP256K1_WIDEMUL_INT128 |
| 7146 | + run_int128_tests(); |
| 7147 | +#endif |
7103 | 7148 | run_ctz_tests();
|
7104 | 7149 | run_modinv_tests();
|
7105 | 7150 | run_inverse_tests();
|
|
0 commit comments