1:     2:     3:     4:     5:     6:     7:     8:     9:    10:    11:    12:    13:    14:    15:    16:    17:    18:    19:    20:    21:    22:    23:    24:    25:    26:    27: 
   28: 
   29:    30: 
   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:         }