89 const int64_t M62 = (int64_t)(UINT64_MAX >> 2);
90 int64_t r0 = r->
v[0], r1 = r->
v[1], r2 = r->
v[2], r3 = r->
v[3], r4 = r->
v[4];
91 volatile int64_t cond_add, cond_negate;
96 for (i = 0; i < 5; ++i) {
110 r0 += modinfo->
modulus.
v[0] & cond_add;
111 r1 += modinfo->
modulus.
v[1] & cond_add;
112 r2 += modinfo->
modulus.
v[2] & cond_add;
113 r3 += modinfo->
modulus.
v[3] & cond_add;
114 r4 += modinfo->
modulus.
v[4] & cond_add;
115 cond_negate =
sign >> 63;
116 r0 = (r0 ^ cond_negate) - cond_negate;
117 r1 = (r1 ^ cond_negate) - cond_negate;
118 r2 = (r2 ^ cond_negate) - cond_negate;
119 r3 = (r3 ^ cond_negate) - cond_negate;
120 r4 = (r4 ^ cond_negate) - cond_negate;
122 r1 += r0 >> 62; r0 &= M62;
123 r2 += r1 >> 62; r1 &= M62;
124 r3 += r2 >> 62; r2 &= M62;
125 r4 += r3 >> 62; r3 &= M62;
130 r0 += modinfo->
modulus.
v[0] & cond_add;
131 r1 += modinfo->
modulus.
v[1] & cond_add;
132 r2 += modinfo->
modulus.
v[2] & cond_add;
133 r3 += modinfo->
modulus.
v[3] & cond_add;
134 r4 += modinfo->
modulus.
v[4] & cond_add;
136 r1 += r0 >> 62; r0 &= M62;
137 r2 += r1 >> 62; r1 &= M62;
138 r3 += r2 >> 62; r2 &= M62;
139 r4 += r3 >> 62; r3 &= M62;
241 uint64_t u = 1, v = 0, q = 0, r = 1;
242 uint64_t f = f0,
g = g0,
m;
244 int i = 62, limit, zeros;
267 tmp = f; f =
g;
g = -tmp;
268 tmp = u; u = q; q = -tmp;
269 tmp = v; v = r; r = -tmp;
273 limit = ((int)eta + 1) > i ? i : ((int)eta + 1);
276 m = (UINT64_MAX >> (64 - limit)) & 63U;
279 w = (f *
g * (f * f - 2)) &
m;
283 limit = ((int)eta + 1) > i ? i : ((int)eta + 1);
286 m = (UINT64_MAX >> (64 - limit)) & 15U;
289 w = f + (((f + 1) & 4) << 1);
412 const uint64_t M62 = UINT64_MAX >> 2;
413 const int64_t d0 = d->
v[0], d1 = d->
v[1], d2 = d->
v[2], d3 = d->
v[3], d4 = d->
v[4];
414 const int64_t e0 = e->
v[0], e1 = e->
v[1], e2 = e->
v[2], e3 = e->
v[3], e4 = e->
v[4];
415 const int64_t u =
t->u, v =
t->v, q =
t->q, r =
t->r;
416 int64_t md, me, sd, se;
422 VERIFY_CHECK(secp256k1_modinv64_abs(u) <= (((int64_t)1 << 62) - secp256k1_modinv64_abs(v)));
423 VERIFY_CHECK(secp256k1_modinv64_abs(q) <= (((int64_t)1 << 62) - secp256k1_modinv64_abs(r)));
428 md = (u & sd) + (v & se);
429 me = (q & sd) + (r & se);
431 secp256k1_i128_mul(&cd, u, d0);
432 secp256k1_i128_accum_mul(&cd, v, e0);
433 secp256k1_i128_mul(&ce, q, d0);
434 secp256k1_i128_accum_mul(&ce, r, e0);
436 md -= (modinfo->
modulus_inv62 * secp256k1_i128_to_u64(&cd) + md) & M62;
437 me -= (modinfo->
modulus_inv62 * secp256k1_i128_to_u64(&ce) + me) & M62;
439 secp256k1_i128_accum_mul(&cd, modinfo->
modulus.
v[0], md);
440 secp256k1_i128_accum_mul(&ce, modinfo->
modulus.
v[0], me);
442 VERIFY_CHECK((secp256k1_i128_to_u64(&cd) & M62) == 0); secp256k1_i128_rshift(&cd, 62);
443 VERIFY_CHECK((secp256k1_i128_to_u64(&ce) & M62) == 0); secp256k1_i128_rshift(&ce, 62);
445 secp256k1_i128_accum_mul(&cd, u, d1);
446 secp256k1_i128_accum_mul(&cd, v, e1);
447 secp256k1_i128_accum_mul(&ce, q, d1);
448 secp256k1_i128_accum_mul(&ce, r, e1);
450 secp256k1_i128_accum_mul(&cd, modinfo->
modulus.
v[1], md);
451 secp256k1_i128_accum_mul(&ce, modinfo->
modulus.
v[1], me);
453 d->
v[0] = secp256k1_i128_to_u64(&cd) & M62; secp256k1_i128_rshift(&cd, 62);
454 e->
v[0] = secp256k1_i128_to_u64(&ce) & M62; secp256k1_i128_rshift(&ce, 62);
456 secp256k1_i128_accum_mul(&cd, u, d2);
457 secp256k1_i128_accum_mul(&cd, v, e2);
458 secp256k1_i128_accum_mul(&ce, q, d2);
459 secp256k1_i128_accum_mul(&ce, r, e2);
461 secp256k1_i128_accum_mul(&cd, modinfo->
modulus.
v[2], md);
462 secp256k1_i128_accum_mul(&ce, modinfo->
modulus.
v[2], me);
464 d->
v[1] = secp256k1_i128_to_u64(&cd) & M62; secp256k1_i128_rshift(&cd, 62);
465 e->
v[1] = secp256k1_i128_to_u64(&ce) & M62; secp256k1_i128_rshift(&ce, 62);
467 secp256k1_i128_accum_mul(&cd, u, d3);
468 secp256k1_i128_accum_mul(&cd, v, e3);
469 secp256k1_i128_accum_mul(&ce, q, d3);
470 secp256k1_i128_accum_mul(&ce, r, e3);
472 secp256k1_i128_accum_mul(&cd, modinfo->
modulus.
v[3], md);
473 secp256k1_i128_accum_mul(&ce, modinfo->
modulus.
v[3], me);
475 d->
v[2] = secp256k1_i128_to_u64(&cd) & M62; secp256k1_i128_rshift(&cd, 62);
476 e->
v[2] = secp256k1_i128_to_u64(&ce) & M62; secp256k1_i128_rshift(&ce, 62);
478 secp256k1_i128_accum_mul(&cd, u, d4);
479 secp256k1_i128_accum_mul(&cd, v, e4);
480 secp256k1_i128_accum_mul(&ce, q, d4);
481 secp256k1_i128_accum_mul(&ce, r, e4);
482 secp256k1_i128_accum_mul(&cd, modinfo->
modulus.
v[4], md);
483 secp256k1_i128_accum_mul(&ce, modinfo->
modulus.
v[4], me);
484 d->
v[3] = secp256k1_i128_to_u64(&cd) & M62; secp256k1_i128_rshift(&cd, 62);
485 e->
v[3] = secp256k1_i128_to_u64(&ce) & M62; secp256k1_i128_rshift(&ce, 62);
487 d->
v[4] = secp256k1_i128_to_i64(&cd);
488 e->
v[4] = secp256k1_i128_to_i64(&ce);
501 const uint64_t M62 = UINT64_MAX >> 2;
502 const int64_t f0 = f->
v[0], f1 = f->
v[1], f2 = f->
v[2], f3 = f->
v[3], f4 = f->
v[4];
503 const int64_t g0 =
g->v[0], g1 =
g->v[1], g2 =
g->v[2], g3 =
g->v[3], g4 =
g->v[4];
504 const int64_t u =
t->u, v =
t->v, q =
t->q, r =
t->r;
507 secp256k1_i128_mul(&cf, u, f0);
508 secp256k1_i128_accum_mul(&cf, v, g0);
509 secp256k1_i128_mul(&cg, q, f0);
510 secp256k1_i128_accum_mul(&cg, r, g0);
512 VERIFY_CHECK((secp256k1_i128_to_u64(&cf) & M62) == 0); secp256k1_i128_rshift(&cf, 62);
513 VERIFY_CHECK((secp256k1_i128_to_u64(&cg) & M62) == 0); secp256k1_i128_rshift(&cg, 62);
515 secp256k1_i128_accum_mul(&cf, u, f1);
516 secp256k1_i128_accum_mul(&cf, v, g1);
517 secp256k1_i128_accum_mul(&cg, q, f1);
518 secp256k1_i128_accum_mul(&cg, r, g1);
519 f->
v[0] = secp256k1_i128_to_u64(&cf) & M62; secp256k1_i128_rshift(&cf, 62);
520 g->v[0] = secp256k1_i128_to_u64(&cg) & M62; secp256k1_i128_rshift(&cg, 62);
522 secp256k1_i128_accum_mul(&cf, u, f2);
523 secp256k1_i128_accum_mul(&cf, v, g2);
524 secp256k1_i128_accum_mul(&cg, q, f2);
525 secp256k1_i128_accum_mul(&cg, r, g2);
526 f->
v[1] = secp256k1_i128_to_u64(&cf) & M62; secp256k1_i128_rshift(&cf, 62);
527 g->v[1] = secp256k1_i128_to_u64(&cg) & M62; secp256k1_i128_rshift(&cg, 62);
529 secp256k1_i128_accum_mul(&cf, u, f3);
530 secp256k1_i128_accum_mul(&cf, v, g3);
531 secp256k1_i128_accum_mul(&cg, q, f3);
532 secp256k1_i128_accum_mul(&cg, r, g3);
533 f->
v[2] = secp256k1_i128_to_u64(&cf) & M62; secp256k1_i128_rshift(&cf, 62);
534 g->v[2] = secp256k1_i128_to_u64(&cg) & M62; secp256k1_i128_rshift(&cg, 62);
536 secp256k1_i128_accum_mul(&cf, u, f4);
537 secp256k1_i128_accum_mul(&cf, v, g4);
538 secp256k1_i128_accum_mul(&cg, q, f4);
539 secp256k1_i128_accum_mul(&cg, r, g4);
540 f->
v[3] = secp256k1_i128_to_u64(&cf) & M62; secp256k1_i128_rshift(&cf, 62);
541 g->v[3] = secp256k1_i128_to_u64(&cg) & M62; secp256k1_i128_rshift(&cg, 62);
543 f->
v[4] = secp256k1_i128_to_i64(&cf);
544 g->v[4] = secp256k1_i128_to_i64(&cg);
554 const uint64_t M62 = UINT64_MAX >> 2;
555 const int64_t u =
t->u, v =
t->v, q =
t->q, r =
t->r;
563 secp256k1_i128_mul(&cf, u, fi);
564 secp256k1_i128_accum_mul(&cf, v, gi);
565 secp256k1_i128_mul(&cg, q, fi);
566 secp256k1_i128_accum_mul(&cg, r, gi);
568 VERIFY_CHECK((secp256k1_i128_to_u64(&cf) & M62) == 0); secp256k1_i128_rshift(&cf, 62);
569 VERIFY_CHECK((secp256k1_i128_to_u64(&cg) & M62) == 0); secp256k1_i128_rshift(&cg, 62);
572 for (i = 1; i < len; ++i) {
575 secp256k1_i128_accum_mul(&cf, u, fi);
576 secp256k1_i128_accum_mul(&cf, v, gi);
577 secp256k1_i128_accum_mul(&cg, q, fi);
578 secp256k1_i128_accum_mul(&cg, r, gi);
579 f->
v[i - 1] = secp256k1_i128_to_u64(&cf) & M62; secp256k1_i128_rshift(&cf, 62);
580 g->v[i - 1] = secp256k1_i128_to_u64(&cg) & M62; secp256k1_i128_rshift(&cg, 62);
583 f->
v[len - 1] = secp256k1_i128_to_i64(&cf);
584 g->v[len - 1] = secp256k1_i128_to_i64(&cg);
598 for (i = 0; i < 10; ++i) {
623 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&
g, 5, &SECP256K1_SIGNED62_ONE, 0) == 0);
625 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, 5, &SECP256K1_SIGNED62_ONE, -1) == 0 ||
626 secp256k1_modinv64_mul_cmp_62(&f, 5, &SECP256K1_SIGNED62_ONE, 1) == 0 ||
627 (secp256k1_modinv64_mul_cmp_62(x, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
628 secp256k1_modinv64_mul_cmp_62(&d, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
629 secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->
modulus, 1) == 0));
648 int64_t cond, fn, gn;
668 for (j = 1; j < len; ++j) {
672 if (cond == 0)
break;
678 cond = ((int64_t)len - 2) >> 63;
679 cond |= fn ^ (fn >> 63);
680 cond |= gn ^ (gn >> 63);
683 f.
v[len - 2] |= (uint64_t)fn << 62;
684 g.v[len - 2] |= (uint64_t)gn << 62;
699 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&
g, len, &SECP256K1_SIGNED62_ONE, 0) == 0);
701 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &SECP256K1_SIGNED62_ONE, -1) == 0 ||
702 secp256k1_modinv64_mul_cmp_62(&f, len, &SECP256K1_SIGNED62_ONE, 1) == 0 ||
703 (secp256k1_modinv64_mul_cmp_62(x, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
704 secp256k1_modinv64_mul_cmp_62(&d, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
705 secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->
modulus, 1) == 0));