docs: function ecp_add(R, N1, N2, a, p, l) {
  	var x1 = N1[0], y1 = N1[1], z1 = N1[2], x2 = N2[0], y2 = N2[1], z2 = N2[2];
  	var xr = R[0], yr = R[1], zr = R[2];
  	if (mpn_zero_p(z1, l)) {
  		if (mpn_zero_p(z2, l)) {
  			mpn_zero(xr, l), mpn_zero(yr, l), mpn_zero(zr, l);
  			return R;
  		}
  		return ecp_copy(R, N2, l);
  	}
  	if (mpn_zero_p(z2, l)) {
  		return ecp_copy(R, N1, l);
  	}
  	if (mpn_one_p(z2, l)) {
  		return ecp_add_aff(R, N1, N2, a, p, l);
  	}
  	var t0 = _ecp_t0, t1 = _ecp_t1, t2 = _ecp_t2, t3 = _ecp_t3, t4 = _ecp_t4, t5 = _ecp_t5, t6 = _ecp_t6;
  	fp_sqr(t0, z1, p, l);
  	fp_mul(t1, x2, t0, p, l);
  	fp_mul(t2, z1, t0, p, l);
  	fp_mul(t0, y2, t2, p, l);
  	fp_sqr(t2, z2, p, l);
  	fp_mul(t3, x1, t2, p, l);
  	fp_mul(t4, z2, t2, p, l);
  	fp_mul(t2, y1, t4, p, l);
  	if (mpn_cmp(t3, t1, l) == 0) {
  		if (mpn_cmp(t2, t0, l) == 0) {
  			return ecp_dbl(R, N1, a, p, l);
  		}
  		mpn_zero(xr, l), mpn_zero(yr, l), mpn_zero(zr, l);
  		xr[0] = yr[0] = 1;
  		return R;
  	}
  	fp_sub(t4, t1, t3, p, l);
  	fp_sub(t1, t0, t2, p, l);
  	fp_sqr(t0, t4, p, l);
  	fp_mul(t5, t4, t0, p, l);
  	fp_mul(t6, t3, t0, p, l);
  	fp_sub(xr, fp_sub(xr, fp_sqr(xr, t1, p, l), t5, p, l), fp_dbl(t0, t6, p, l), p, l);
  	fp_sub(yr, fp_mul(yr, t1, fp_sub(t6, t6, xr, p, l), p, l), fp_mul(t0, t2, t5, p, l), p, l);
  	fp_mul(zr, t4, fp_mul(t0, z1, z2, p, l), p, l);
  	return R;
  }