|
|
1.1 root 1: /* Copyright (c) 1982, Regents, University of California */
2: struct sdot { long I; struct sdot *CDR; };
3: struct vl { long high; long low; };
4:
5: struct sdot *adbig(a,b)
6: struct sdot *a, *b;
7: {
8: int la = 1, lb = 1;
9: long *sa, *sb, *sc, *base, *alloca();
10: struct sdot *export();
11: register struct sdot *p;
12: register int *q, *r, *s;
13: register carry = 0;
14:
15: /* compute lengths */
16:
17: for(p = a; p->CDR; p = p->CDR) la++;
18: for(p = b; p->CDR; p = p->CDR) lb++;
19: if(lb > la) la = lb;
20:
21: /* allocate storage areas on the stack */
22:
23: base = alloca((3*la+1)*sizeof(long));
24: sc = base + la +1;
25: sb = sc + la;
26: sa = sb + la;
27: q = sa;
28:
29: /* copy sdots onto stack */
30: p = a;
31: do { *--q = p->I; p = p->CDR; } while (p);
32: while(q > sb) *--q = 0;
33: p = b;
34: do { *--q = p->I; p = p->CDR; } while (p);
35: while(q > sc) *--q = 0;
36:
37: /* perform the addition */
38: for(q = sa, r = sb, s = sc; q > sb;)
39: {
40: carry += *--q + *--r;
41: *--s = carry & 0x3fffffff;
42: carry >>= 30;
43: }
44: *--s = carry;
45:
46: return(export(sc,base));
47: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.