=================================================================== RCS file: /home/cvs/OpenXM_contrib/gmp/mpn/generic/Attic/add_n.c,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.3 diff -u -p -r1.1.1.2 -r1.1.1.3 --- OpenXM_contrib/gmp/mpn/generic/Attic/add_n.c 2000/09/09 14:12:23 1.1.1.2 +++ OpenXM_contrib/gmp/mpn/generic/Attic/add_n.c 2003/08/25 16:06:20 1.1.1.3 @@ -1,6 +1,6 @@ -/* mpn_add_n -- Add two limb vectors of equal, non-zero length. +/* mpn_add_n -- Add equal length limb vectors. -Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc. +Copyright 1992, 1993, 1994, 1996, 2000, 2002 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -22,41 +22,60 @@ MA 02111-1307, USA. */ #include "gmp.h" #include "gmp-impl.h" + +#if GMP_NAIL_BITS == 0 + mp_limb_t -#if __STDC__ -mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size) -#else -mpn_add_n (res_ptr, s1_ptr, s2_ptr, size) - register mp_ptr res_ptr; - register mp_srcptr s1_ptr; - register mp_srcptr s2_ptr; - mp_size_t size; -#endif +mpn_add_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) { - register mp_limb_t x, y, cy; - register mp_size_t j; + mp_limb_t ul, vl, sl, rl, cy, cy1, cy2; - /* The loop counter and index J goes from -SIZE to -1. This way - the loop becomes faster. */ - j = -size; + ASSERT (n >= 1); + ASSERT (MPN_SAME_OR_SEPARATE_P (rp, up, n)); + ASSERT (MPN_SAME_OR_SEPARATE_P (rp, vp, n)); - /* Offset the base pointers to compensate for the negative indices. */ - s1_ptr -= j; - s2_ptr -= j; - res_ptr -= j; + 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; +} + +#endif + +#if GMP_NAIL_BITS >= 1 + +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_SEPARATE_P (rp, up, n)); + ASSERT (MPN_SAME_OR_SEPARATE_P (rp, vp, n)); + cy = 0; do { - y = s2_ptr[j]; - x = s1_ptr[j]; - y += cy; /* add previous carry to one addend */ - cy = (y < cy); /* get out carry from that addition */ - y = x + y; /* add other addend */ - cy = (y < x) + cy; /* get out carry from that add, combine */ - res_ptr[j] = y; + ul = *up++; + vl = *vp++; + rl = ul + vl + cy; + cy = rl >> GMP_NUMB_BITS; + *rp++ = rl & GMP_NUMB_MASK; } - while (++j != 0); + while (--n != 0); return cy; } + +#endif