1/* mpn_add_n -- Add two limb vectors of equal, non-zero length. 2 3Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library. 6 7The GNU MP Library is free software; you can redistribute it and/or modify 8it under the terms of the GNU Library General Public License as published by 9the Free Software Foundation; either version 2 of the License, or (at your 10option) any later version. 11 12The GNU MP Library is distributed in the hope that it will be useful, but 13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public 15License for more details. 16 17You should have received a copy of the GNU Library General Public License 18along with the GNU MP Library; see the file COPYING.LIB. If not, write to 19the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, 20MA 02111-1307, USA. */ 21 22#include "gmp.h" 23#include "gmp-impl.h" 24 25mp_limb_t 26#if __STDC__ 27mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size) 28#else 29mpn_add_n (res_ptr, s1_ptr, s2_ptr, size) 30 register mp_ptr res_ptr; 31 register mp_srcptr s1_ptr; 32 register mp_srcptr s2_ptr; 33 mp_size_t size; 34#endif 35{ 36 register mp_limb_t x, y, cy; 37 register mp_size_t j; 38 39 /* The loop counter and index J goes from -SIZE to -1. This way 40 the loop becomes faster. */ 41 j = -size; 42 43 /* Offset the base pointers to compensate for the negative indices. */ 44 s1_ptr -= j; 45 s2_ptr -= j; 46 res_ptr -= j; 47 48 cy = 0; 49 do 50 { 51 y = s2_ptr[j]; 52 x = s1_ptr[j]; 53 y += cy; /* add previous carry to one addend */ 54 cy = (y < cy); /* get out carry from that addition */ 55 y = x + y; /* add other addend */ 56 cy = (y < x) + cy; /* get out carry from that add, combine */ 57 res_ptr[j] = y; 58 } 59 while (++j != 0); 60 61 return cy; 62} 63