BSD 4_4 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Sat, 3 May 1986 10:20:15 +0000 (02:20 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Sat, 3 May 1986 10:20:15 +0000 (02:20 -0800)
Work on file usr/src/old/lisp/franz/tahoe/adbig.c

Synthesized-from: CSRG/cd3/4.4

usr/src/old/lisp/franz/tahoe/adbig.c [new file with mode: 0644]

diff --git a/usr/src/old/lisp/franz/tahoe/adbig.c b/usr/src/old/lisp/franz/tahoe/adbig.c
new file mode 100644 (file)
index 0000000..632746b
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ *
+ * Copyright (c) 1982, Regents, University of California
+ *
+ * stolen from 68k port by P. S. Housel 05/03/86
+ */
+#include "global.h"
+
+struct s_dot
+       {
+        long I;
+       struct s_dot *CDR;
+       };
+struct vl
+       {
+        long high;
+        long low;
+       };
+
+
+struct s_dot *adbig(a,b)
+struct s_dot *a, *b;
+{
+       int la = 1, lb = 1;
+       long *sa, *sb, *sc, *base, *alloca();
+       struct s_dot *export();
+       register struct s_dot *p;
+       register int *q, *r, *s;
+       register carry = 0;
+       Keepxs();
+
+       /* compute lengths */
+       
+       for(p = a; p->CDR; p = p->CDR) la++;
+       for(p = b; p->CDR; p = p->CDR) lb++;
+       if(lb > la) la = lb;
+
+       /* allocate storage areas on the stack */
+
+       base = alloca((3*la+1)*sizeof(long));
+       sc = base + la +1;
+       sb = sc + la;
+       sa = sb + la;
+       q  = sa;
+
+       /* copy s_dots onto stack */
+       p = a;
+       do { *--q = p->I; p = p->CDR; } while (p);
+       while(q > sb) *--q = 0;
+       p = b;
+       do { *--q = p->I; p = p->CDR; } while (p);
+       while(q > sc) *--q = 0;
+
+       /* perform the addition */
+       for(q = sa, r = sb, s = sc; q > sb;)
+       {
+               carry += *--q + *--r;
+               *--s = carry & 0x3fffffff;
+               carry >>= 30;
+       }
+       *--s = carry;
+
+       p = export(sc,base);
+       Freexs();
+       return(p);
+}