7 #ifndef SECP256K1_MODINV64_IMPL_H 8 #define SECP256K1_MODINV64_IMPL_H 32 static 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;
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;
177 uint64_t u = 8, v = 0, q = 0, r = 8;
178 volatile uint64_t c1, c2;
179 uint64_t mask1, mask2, f = f0,
g = g0, x, y, z;
182 for (i = 3; i < 62; ++i) {
192 x = (f ^ mask1) - mask1;
193 y = (u ^ mask1) - mask1;
194 z = (v ^ mask1) - mask1;
202 zeta = (zeta ^ mask1) - 1;
243 uint64_t u = 1, v = 0, q = 0, r = 1;
244 uint64_t f = f0,
g = g0,
m;
246 int i = 62, limit, zeros;
269 tmp = f; f =
g;
g = -tmp;
270 tmp = u; u = q; q = -tmp;
271 tmp = v; v = r; r = -tmp;
275 limit = ((int)eta + 1) > i ? i : ((int)eta + 1);
278 m = (UINT64_MAX >> (64 - limit)) & 63U;
281 w = (f *
g * (f * f - 2)) &
m;
285 limit = ((int)eta + 1) > i ? i : ((int)eta + 1);
288 m = (UINT64_MAX >> (64 - limit)) & 15U;
291 w = f + (((f + 1) & 4) << 1);
329 uint64_t u = 1, v = 0, q = 0, r = 1;
330 uint64_t f = f0,
g = g0,
m;
332 int i = 62, limit, zeros;
346 jac ^= (zeros & ((f >> 1) ^ (f >> 2)));
357 tmp = f; f =
g;
g = tmp;
358 tmp = u; u = q; q = tmp;
359 tmp = v; v = r; r = tmp;
362 jac ^= ((f &
g) >> 1);
366 limit = ((int)eta + 1) > i ? i : ((int)eta + 1);
369 m = (UINT64_MAX >> (64 - limit)) & 63U;
372 w = (f *
g * (f * f - 2)) &
m;
376 limit = ((int)eta + 1) > i ? i : ((int)eta + 1);
379 m = (UINT64_MAX >> (64 - limit)) & 15U;
382 w = f + (((f + 1) & 4) << 1);
414 const uint64_t M62 = UINT64_MAX >> 2;
415 const int64_t d0 = d->
v[0], d1 = d->
v[1], d2 = d->
v[2], d3 = d->
v[3], d4 = d->
v[4];
416 const int64_t e0 = e->
v[0], e1 = e->
v[1], e2 = e->
v[2], e3 = e->
v[3], e4 = e->
v[4];
417 const int64_t u =
t->u, v =
t->v, q =
t->q, r =
t->r;
418 int64_t md, me, sd, se;
425 VERIFY_CHECK(secp256k1_modinv64_abs(u) <= (((int64_t)1 << 62) - secp256k1_modinv64_abs(v)));
426 VERIFY_CHECK(secp256k1_modinv64_abs(q) <= (((int64_t)1 << 62) - secp256k1_modinv64_abs(r)));
431 md = (u & sd) + (v & se);
432 me = (q & sd) + (r & se);
505 const uint64_t M62 = UINT64_MAX >> 2;
506 const int64_t f0 = f->
v[0], f1 = f->
v[1], f2 = f->
v[2], f3 = f->
v[3], f4 = f->
v[4];
507 const int64_t g0 =
g->v[0], g1 =
g->v[1], g2 =
g->v[2], g3 =
g->v[3], g4 =
g->v[4];
508 const int64_t u =
t->u, v =
t->v, q =
t->q, r =
t->r;
558 const uint64_t M62 = UINT64_MAX >> 2;
559 const int64_t u =
t->u, v =
t->v, q =
t->q, r =
t->r;
576 for (i = 1; i < len; ++i) {
602 for (i = 0; i < 10; ++i) {
629 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&
g, 5, &SECP256K1_SIGNED62_ONE, 0) == 0);
631 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, 5, &SECP256K1_SIGNED62_ONE, -1) == 0 ||
632 secp256k1_modinv64_mul_cmp_62(&f, 5, &SECP256K1_SIGNED62_ONE, 1) == 0 ||
633 (secp256k1_modinv64_mul_cmp_62(x, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
634 secp256k1_modinv64_mul_cmp_62(&d, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
635 (secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->
modulus, 1) == 0 ||
636 secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->
modulus, -1) == 0)));
656 int64_t cond, fn, gn;
677 for (j = 1; j < len; ++j) {
681 if (cond == 0)
break;
687 cond = ((int64_t)len - 2) >> 63;
688 cond |= fn ^ (fn >> 63);
689 cond |= gn ^ (gn >> 63);
692 f.
v[len - 2] |= (uint64_t)fn << 62;
693 g.v[len - 2] |= (uint64_t)gn << 62;
709 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&
g, len, &SECP256K1_SIGNED62_ONE, 0) == 0);
711 VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &SECP256K1_SIGNED62_ONE, -1) == 0 ||
712 secp256k1_modinv64_mul_cmp_62(&f, len, &SECP256K1_SIGNED62_ONE, 1) == 0 ||
713 (secp256k1_modinv64_mul_cmp_62(x, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
714 secp256k1_modinv64_mul_cmp_62(&d, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
715 (secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->
modulus, 1) == 0 ||
716 secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->
modulus, -1) == 0)));
727 #define JACOBI64_ITERATIONS 12 729 #define JACOBI64_ITERATIONS 25 739 int64_t cond, fn, gn;
744 VERIFY_CHECK(
g.v[0] >= 0 &&
g.v[1] >= 0 &&
g.v[2] >= 0 &&
g.v[3] >= 0 &&
g.v[4] >= 0);
767 for (j = 1; j < len; ++j) {
771 if (cond == 0)
return 1 - 2*(jac & 1);
777 cond = ((int64_t)len - 2) >> 63;
781 if (cond == 0) --len;
#define VERIFY_CHECK(cond)
static int64_t secp256k1_modinv64_posdivsteps_62_var(int64_t eta, uint64_t f0, uint64_t g0, secp256k1_modinv64_trans2x2 *t, int *jacp)
static void secp256k1_modinv64(secp256k1_modinv64_signed62 *x, const secp256k1_modinv64_modinfo *modinfo)
static SECP256K1_INLINE void secp256k1_i128_mul(secp256k1_int128 *r, int64_t a, int64_t b)
static SECP256K1_INLINE void secp256k1_i128_from_i64(secp256k1_int128 *r, int64_t a)
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_update_fg_62_var(int len, secp256k1_modinv64_signed62 *f, secp256k1_modinv64_signed62 *g, const secp256k1_modinv64_trans2x2 *t)
static SECP256K1_INLINE void secp256k1_i128_rshift(secp256k1_int128 *r, unsigned int n)
static SECP256K1_INLINE void secp256k1_i128_accum_mul(secp256k1_int128 *r, int64_t a, int64_t b)
int128_t secp256k1_int128
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)
static void secp256k1_modinv64_update_fg_62(secp256k1_modinv64_signed62 *f, secp256k1_modinv64_signed62 *g, const secp256k1_modinv64_trans2x2 *t)
static SECP256K1_INLINE void secp256k1_i128_det(secp256k1_int128 *r, int64_t a, int64_t b, int64_t c, int64_t d)
static int64_t secp256k1_modinv64_divsteps_59(int64_t zeta, uint64_t f0, uint64_t g0, secp256k1_modinv64_trans2x2 *t)
secp256k1_modinv64_signed62 modulus
static SECP256K1_INLINE int64_t secp256k1_i128_to_i64(const secp256k1_int128 *a)
static int secp256k1_jacobi64_maybe_var(const secp256k1_modinv64_signed62 *x, const secp256k1_modinv64_modinfo *modinfo)
static SECP256K1_INLINE int secp256k1_i128_eq_var(const secp256k1_int128 *a, const secp256k1_int128 *b)
static SECP256K1_INLINE int secp256k1_i128_check_pow2(const secp256k1_int128 *r, unsigned int n, int sign)
static void secp256k1_modinv64_var(secp256k1_modinv64_signed62 *x, const secp256k1_modinv64_modinfo *modinfo)
#define JACOBI64_ITERATIONS
static SECP256K1_INLINE uint64_t secp256k1_i128_to_u64(const secp256k1_int128 *a)
static void secp256k1_modinv64_normalize_62(secp256k1_modinv64_signed62 *r, int64_t sign, const secp256k1_modinv64_modinfo *modinfo)