gonzui


Format: Advanced Search

t2ex/bsd_source/lib/libc/src_bsd/stdlib/sum.cbare sourcepermlink (0.01 seconds)

Search this content:

    1: /****************************************************************
    2: 
    3: The author of this software is David M. Gay.
    4: 
    5: Copyright (C) 1998 by Lucent Technologies
    6: All Rights Reserved
    7: 
    8: Permission to use, copy, modify, and distribute this software and
    9: its documentation for any purpose and without fee is hereby
   10: granted, provided that the above copyright notice appear in all
   11: copies and that both that the copyright notice and this
   12: permission notice and warranty disclaimer appear in supporting
   13: documentation, and that the name of Lucent or any of its entities
   14: not be used in advertising or publicity pertaining to
   15: distribution of the software without specific, written prior
   16: permission.
   17: 
   18: LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
   19: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
   20: IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
   21: SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   22: WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
   23: IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
   24: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
   25: THIS SOFTWARE.
   26: 
   27: ****************************************************************/
   28: 
   29: /* Please send bug reports to David M. Gay (dmg at acm dot org,
   30:  * with " at " changed at "@" and " dot " changed to ".").      */
   31: 
   32: #include "gdtoaimp.h"
   33: 
   34:  Bigint *
   35: #ifdef KR_headers
   36: sum(a, b) Bigint *a; Bigint *b;
   37: #else
   38: sum(Bigint *a, Bigint *b)
   39: #endif
   40: {
   41:         Bigint *c;
   42:         ULong carry, *xc, *xa, *xb, *xe, y;
   43: #ifdef Pack_32
   44:         ULong z;
   45: #endif
   46: 
   47:         if (a->wds < b->wds) {
   48:                 c = b; b = a; a = c;
   49:                 }
   50:         c = Balloc(a->k);
   51:         if (c == NULL)
   52:                 return (NULL);
   53:         c->wds = a->wds;
   54:         carry = 0;
   55:         xa = a->x;
   56:         xb = b->x;
   57:         xc = c->x;
   58:         xe = xc + b->wds;
   59: #ifdef Pack_32
   60:         do {
   61:                 y = (*xa & 0xffff) + (*xb & 0xffff) + carry;
   62:                 carry = (y & 0x10000) >> 16;
   63:                 z = (*xa++ >> 16) + (*xb++ >> 16) + carry;
   64:                 carry = (z & 0x10000) >> 16;
   65:                 Storeinc(xc, z, y);
   66:                 }
   67:                 while(xc < xe);
   68:         xe += a->wds - b->wds;
   69:         while(xc < xe) {
   70:                 y = (*xa & 0xffff) + carry;
   71:                 carry = (y & 0x10000) >> 16;
   72:                 z = (*xa++ >> 16) + carry;
   73:                 carry = (z & 0x10000) >> 16;
   74:                 Storeinc(xc, z, y);
   75:                 }
   76: #else
   77:         do {
   78:                 y = *xa++ + *xb++ + carry;
   79:                 carry = (y & 0x10000) >> 16;
   80:                 *xc++ = y & 0xffff;
   81:                 }
   82:                 while(xc < xe);
   83:         xe += a->wds - b->wds;
   84:         while(xc < xe) {
   85:                 y = *xa++ + carry;
   86:                 carry = (y & 0x10000) >> 16;
   87:                 *xc++ = y & 0xffff;
   88:                 }
   89: #endif
   90:         if (carry) {
   91:                 if (c->wds == c->maxwds) {
   92:                         b = Balloc(c->k + 1);
   93:                         if (b == NULL)
   94:                                 return (NULL);
   95:                         Bcopy(b, c);
   96:                         Bfree(c);
   97:                         c = b;
   98:                         }
   99:                 c->x[c->wds++] = 1;
  100:                 }
  101:         return c;
  102:         }