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: }