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