Mercurial > hg > CbC > CbC_gcc
comparison libquadmath/printf/add_n.c @ 68:561a7518be6b
update gcc-4.6
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 21 Aug 2011 07:07:55 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
67:f6334be47118 | 68:561a7518be6b |
---|---|
1 /* mpn_add_n -- Add two limb vectors of equal, non-zero length. | |
2 | |
3 Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc. | |
4 | |
5 This file is part of the GNU MP Library. | |
6 | |
7 The GNU MP Library is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU Lesser General Public License as published by | |
9 the Free Software Foundation; either version 2.1 of the License, or (at your | |
10 option) any later version. | |
11 | |
12 The GNU MP Library is distributed in the hope that it will be useful, but | |
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public | |
15 License for more details. | |
16 | |
17 You should have received a copy of the GNU Lesser General Public License | |
18 along with the GNU MP Library; see the file COPYING.LIB. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, | |
20 MA 02111-1307, USA. */ | |
21 | |
22 #include <config.h> | |
23 #include "gmp-impl.h" | |
24 | |
25 mp_limb_t | |
26 #if __STDC__ | |
27 mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size) | |
28 #else | |
29 mpn_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 } |