mp_limb_t mpn_add_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) { 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; do { ul = *up++; vl = *vp++; sl = ul + vl; cy1 = sl < ul; rl = sl + cy; cy2 = rl < sl; cy = cy1 | cy2; *rp++ = rl; } while (--n != 0); return cy; }
mp_limb_t mpn_rshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt) { mp_limb_t high_limb, low_limb; unsigned int tnc; mp_size_t i; mp_limb_t retval; ASSERT (n >= 1); ASSERT (cnt >= 1); ASSERT (cnt < GMP_NUMB_BITS); ASSERT (MPN_SAME_OR_INCR_P (rp, up, n)); tnc = GMP_NUMB_BITS - cnt; high_limb = *up++; retval = (high_limb << tnc) & GMP_NUMB_MASK; low_limb = high_limb >> cnt; for (i = n - 1; i != 0; i--) { high_limb = *up++; *rp++ = low_limb | ((high_limb << tnc) & GMP_NUMB_MASK); low_limb = high_limb >> cnt; } *rp = low_limb; return retval; }
mp_limb_t mpn_add_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) { mp_limb_t ul, vl, rl, cy; ASSERT (n >= 1); ASSERT (MPN_SAME_OR_INCR_P (rp, up, n)); ASSERT (MPN_SAME_OR_INCR_P (rp, vp, n)); cy = 0; do { ul = *up++; vl = *vp++; rl = ul + vl + cy; cy = rl >> GMP_NUMB_BITS; *rp++ = rl & GMP_NUMB_MASK; } while (--n != 0); return cy; }