-static mp *fdbl(field *ff, mp *d, mp *x)
-{
- fctx *f = (fctx *)ff;
- d = mp_lsl(d, x, 1);
- if (MP_CMP(d, >, f->mm.m))
- d = mp_sub(d, d, f->mm.m);
+static mp *fsqrt(field *ff, mp *d, mp *x) {
+ fctx_prime *f = (fctx_prime *)ff; d = mpmont_reduce(&f->mm, d, x);
+ d = mp_modsqrt(d, d, f->mm.m); if (!d) return (d);
+ return (mpmont_mul(&f->mm, d, d, f->mm.r2));
+}
+
+static mp *fdbl(field *ff, mp *d, mp *x) {
+ fctx_prime *f = (fctx_prime *)ff; d = mp_lsl(d, x, 1);
+ if (MP_CMP(d, >=, f->mm.m)) d = mp_sub(d, d, f->mm.m);