7#ifndef SECP256K1_MODINV64_IMPL_H
8#define SECP256K1_MODINV64_IMPL_H
32static int64_t secp256k1_modinv64_abs(int64_t v) {
42 const uint64_t M62 = UINT64_MAX >> 2;
46 for (i = 0; i < 4; ++i) {
60 secp256k1_modinv64_mul_62(&am, a, alen, 1);
61 secp256k1_modinv64_mul_62(&bm, b, 5, factor);
62 for (i = 0; i < 4; ++i) {
67 for (i = 4; i >= 0; --i) {
68 if (am.
v[i] < bm.
v[i])
return -1;
69 if (am.
v[i] > bm.
v[i])
return 1;
87 const int64_t M62 = (int64_t)(UINT64_MAX >> 2);
88 int64_t r0 = r->
v[0], r1 = r->
v[1], r2 = r->
v[2], r3 = r->
v[3], r4 = r->
v[4];
89 volatile int64_t cond_add, cond_negate;
94 for (i = 0; i < 5; ++i) {
108 r0 += modinfo->
modulus.
v[0] & cond_add;
109 r1 += modinfo->
modulus.
v[1] & cond_add;
110 r2 += modinfo->
modulus.
v[2] & cond_add;
111 r3 += modinfo->
modulus.
v[3] & cond_add;
112 r4 += modinfo->
modulus.
v[4] & cond_add;
113 cond_negate = sign >> 63;
114 r0 = (r0 ^ cond_negate) - cond_negate;
115 r1 = (r1 ^ cond_negate) - cond_negate;
116 r2 = (r2 ^ cond_negate) - cond_negate;
117 r3 = (r3 ^ cond_negate) - cond_negate;
118 r4 = (r4 ^ cond_negate) - cond_negate;
120 r1 += r0 >> 62; r0 &= M62;
121 r2 += r1 >> 62; r1 &= M62;
122 r3 += r2 >> 62; r2 &= M62;
123 r4 += r3 >> 62; r3 &= M62;
128 r0 += modinfo->
modulus.
v[0] & cond_add;
129 r1 += modinfo->
modulus.
v[1] & cond_add;
130 r2 += modinfo->
modulus.
v[2] & cond_add;
131 r3 += modinfo->
modulus.
v[3] & cond_add;
132 r4 += modinfo->
modulus.
v[4] & cond_add;
134 r1 += r0 >> 62; r0 &= M62;
135 r2 += r1 >> 62; r1 &= M62;
136 r3 += r2 >> 62; r2 &= M62;
137 r4 += r3 >> 62; r3 &= M62;
175 uint64_t u = 8, v = 0, q = 0, r = 8;
176 volatile uint64_t c1, c2;
177 uint64_t mask1, mask2, f = f0, g = g0, x, y, z;
180 for (i = 3; i < 62; ++i) {
190 x = (f ^ mask1) - mask1;
191 y = (u ^ mask1) - mask1;
192 z = (v ^ mask1) - mask1;
200 zeta = (zeta ^ mask1) - 1;
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);
320 const uint64_t M62 = UINT64_MAX >> 2;
321 const int64_t d0 = d->
v[0], d1 = d->
v[1], d2 = d->
v[2], d3 = d->
v[3], d4 = d->
v[4];
322 const int64_t e0 = e->
v[0], e1 = e->
v[1], e2 = e->
v[2], e3 = e->
v[3], e4 = e->
v[4];
323 const int64_t u = t->
u, v = t->
v, q = t->
q, r = t->
r;
324 int64_t md, me, sd, se;
331 VERIFY_CHECK((secp256k1_modinv64_abs(u) + secp256k1_modinv64_abs(v)) >= 0);
332 VERIFY_CHECK((secp256k1_modinv64_abs(q) + secp256k1_modinv64_abs(r)) >= 0);
333 VERIFY_CHECK((secp256k1_modinv64_abs(u) + secp256k1_modinv64_abs(v)) <= (int64_t)1 << 62);
334 VERIFY_CHECK((secp256k1_modinv64_abs(q) + secp256k1_modinv64_abs(r)) <= (int64_t)1 << 62);
339 md = (u & sd) + (v & se);
340 me = (q & sd) + (r & se);
413 const uint64_t M62 = UINT64_MAX >> 2;
414 const int64_t f0 = f->
v[0], f1 = f->
v[1], f2 = f->
v[2], f3 = f->
v[3], f4 = f->
v[4];
415 const int64_t g0 = g->
v[0], g1 = g->
v[1], g2 = g->
v[2], g3 = g->
v[3], g4 = g->
v[4];
416 const int64_t u = t->
u, v = t->
v, q = t->
q, r = t->
r;
466 const uint64_t M62 = UINT64_MAX >> 2;
467 const int64_t u = t->
u, v = t->
v, q = t->
q, r = t->
r;
484 for (i = 1; i < len; ++i) {
510 for (i = 0; i < 10; ++i) {
537 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, 5, &SECP256K1_SIGNED62_ONE, 0) == 0);
539 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, 5, &SECP256K1_SIGNED62_ONE, -1) == 0 ||
540 secp256k1_modinv64_mul_cmp_62(&f, 5, &SECP256K1_SIGNED62_ONE, 1) == 0 ||
541 (secp256k1_modinv64_mul_cmp_62(x, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
542 secp256k1_modinv64_mul_cmp_62(&d, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
543 (secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->
modulus, 1) == 0 ||
544 secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->
modulus, -1) == 0)));
564 int64_t cond, fn, gn;
585 for (j = 1; j < len; ++j) {
589 if (cond == 0)
break;
595 cond = ((int64_t)len - 2) >> 63;
596 cond |= fn ^ (fn >> 63);
597 cond |= gn ^ (gn >> 63);
600 f.
v[len - 2] |= (uint64_t)fn << 62;
601 g.
v[len - 2] |= (uint64_t)gn << 62;
617 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &SECP256K1_SIGNED62_ONE, 0) == 0);
619 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &SECP256K1_SIGNED62_ONE, -1) == 0 ||
620 secp256k1_modinv64_mul_cmp_62(&f, len, &SECP256K1_SIGNED62_ONE, 1) == 0 ||
621 (secp256k1_modinv64_mul_cmp_62(x, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
622 secp256k1_modinv64_mul_cmp_62(&d, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
623 (secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->
modulus, 1) == 0 ||
624 secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->
modulus, -1) == 0)));
int128_t secp256k1_int128
static SECP256K1_INLINE void secp256k1_i128_det(secp256k1_int128 *r, int64_t a, int64_t b, int64_t c, int64_t d)
static SECP256K1_INLINE void secp256k1_i128_rshift(secp256k1_int128 *r, unsigned int n)
static SECP256K1_INLINE uint64_t secp256k1_i128_to_u64(const secp256k1_int128 *a)
static SECP256K1_INLINE void secp256k1_i128_from_i64(secp256k1_int128 *r, int64_t a)
static SECP256K1_INLINE int secp256k1_i128_eq_var(const secp256k1_int128 *a, const secp256k1_int128 *b)
static SECP256K1_INLINE int64_t secp256k1_i128_to_i64(const secp256k1_int128 *a)
static SECP256K1_INLINE void secp256k1_i128_mul(secp256k1_int128 *r, int64_t a, int64_t b)
static SECP256K1_INLINE int secp256k1_i128_check_pow2(const secp256k1_int128 *r, unsigned int n)
static SECP256K1_INLINE void secp256k1_i128_accum_mul(secp256k1_int128 *r, int64_t a, int64_t b)
static int64_t secp256k1_modinv64_divsteps_62_var(int64_t eta, uint64_t f0, uint64_t g0, secp256k1_modinv64_trans2x2 *t)
static void secp256k1_modinv64_normalize_62(secp256k1_modinv64_signed62 *r, int64_t sign, const secp256k1_modinv64_modinfo *modinfo)
static void secp256k1_modinv64(secp256k1_modinv64_signed62 *x, const secp256k1_modinv64_modinfo *modinfo)
static void secp256k1_modinv64_var(secp256k1_modinv64_signed62 *x, const secp256k1_modinv64_modinfo *modinfo)
static void secp256k1_modinv64_update_fg_62_var(int len, secp256k1_modinv64_signed62 *f, secp256k1_modinv64_signed62 *g, const secp256k1_modinv64_trans2x2 *t)
static int64_t secp256k1_modinv64_divsteps_59(int64_t zeta, uint64_t f0, uint64_t g0, secp256k1_modinv64_trans2x2 *t)
static void secp256k1_modinv64_update_fg_62(secp256k1_modinv64_signed62 *f, secp256k1_modinv64_signed62 *g, const secp256k1_modinv64_trans2x2 *t)
static void secp256k1_modinv64_update_de_62(secp256k1_modinv64_signed62 *d, secp256k1_modinv64_signed62 *e, const secp256k1_modinv64_trans2x2 *t, const secp256k1_modinv64_modinfo *modinfo)
static SECP256K1_INLINE int secp256k1_ctz64_var(uint64_t x)
#define VERIFY_CHECK(cond)
secp256k1_modinv64_signed62 modulus