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