+ if (EC_ATINF(a))
+ EC_SETINF(d);
+ else if (!MP_LEN(a->y))
+ EC_COPY(d, a);
+ else {
+ field *f = c->f;
+ ecctx *cc = (ecctx *)c;
+ mp *lambda;
+ mp *dy, *dx;
+
+ dx = F_SQR(f, MP_NEW, a->x);
+ dy = F_DBL(f, MP_NEW, a->y);
+ dx = F_TPL(f, dx, dx);
+ dx = F_ADD(f, dx, dx, cc->a);
+ dy = F_INV(f, dy, dy);
+ lambda = F_MUL(d, MP_NEW, dx, dy);
+
+ dx = F_SQR(f, dx, lambda);
+ dy = F_DBL(d, dy, a->x);
+ dx = F_SUB(f, dx, dx, dy);
+ dy = F_SUB(f, dy, a->x, dx);
+ dy = F_MUL(f, dy, lambda, dy);
+ dy = F_SUB(f, dy, dy, a->y);