1: /*
2: * $Header: mulbig.c,v 1.2 83/11/26 12:13:29 sklower Exp $
3: * $Locker: $
4: *
5: * Copyright (c) 1982, Regents, University of California
6: *
7: */
8:
9: #include "global.h"
10:
11: struct s_dot { long I; struct s_dot *CDR; };
12: struct vl { long high; long low; };
13:
14: struct s_dot *mulbig(a,b)
15: struct s_dot *a, *b;
16: {
17: int la = 1, lb = 1;
18: long *sa, *sb, *sc, *base, *alloca();
19: struct s_dot *export();
20: register struct s_dot *p;
21: register int *q, *r, *s;
22: long carry = 0, test;
23: struct vl work;
24: Keepxs();
25:
26: /* compute lengths */
27:
28: for(p = a; p->CDR; p = p->CDR) la++;
29: for(p = b; p->CDR; p = p->CDR) lb++;
30:
31: /* allocate storage areas on the stack */
32:
33: base = alloca((la + la + lb + lb + 1)*sizeof(long));
34: sc = base + la + lb + 1;
35: sb = sc + lb;
36: sa = sb + la;
37: q = sa;
38:
39: /* copy s_dots onto stack */
40: p = a;
41: do { *--q = p->I; p = p->CDR; } while (p);
42: p = b;
43: do { *--q = p->I; p = p->CDR; } while (p);
44: while(q > base) *--q = 0; /* initialize target */
45:
46: /* perform the multiplication */
47: for(q = sb; q > sc; *--s = carry)
48: for((r = sa, s = (q--) - lb, carry = 0); r > sb;)
49: {
50: carry += *--s;
51: emul(*q,*--r,carry,&work);
52: test = work.low;
53: carry = work.high << 2;
54: if(test < 0) carry += 2;
55: if(test & 0x40000000) carry +=1;
56: *s = test & 0x3fffffff;
57: }
58:
59: p = export(sc,base);
60: Freexs();
61: return(p);
62: }
Defined functions
Defined struct's
s_dot
defined in line
11; used 10 times
vl
defined in line
12; used 2 times