Question about mpn_add_n underlying generic implementation

Grzegorz Szpetkowski gszpetkowski at
Sat Jan 18 00:15:15 UTC 2014

Hi all,

I have read manual (mostly) and I am trying to understand following code
within mpn/generic/add_n.c:

  mp_limb_t ul, vl, sl, rl, cy, cy1, cy2;

  ASSERT (n >= 1);
  ASSERT (MPN_SAME_OR_INCR_P (rp, up, n));
  ASSERT (MPN_SAME_OR_INCR_P (rp, vp, n));

  cy = 0;
      ul = *up++;
      vl = *vp++;
      sl = ul + vl;
      cy1 = sl < ul;
      rl = sl + cy;
      cy2 = rl < sl;
      cy = cy1 | cy2;
      *rp++ = rl;
  while (--n != 0);

There is some preprocessor condition for GMP_NAIL_BITS, but as I found it's
disabled in configuration by default and I am sure that my build does not
have it enabled. Essentially what is the purpose of these cy1 and cy2
variables ? What I already understand is that examined limbs (in reversed
order) are just effectively primitive integers like unsigned int, for

typedef unsigned int            mp_limb_t;

G. Sz.

More information about the gmp-discuss mailing list