From ac37f3d61a544276ec709a0ee3474f47d5f2e0fd Mon Sep 17 00:00:00 2001 From: CSRG Date: Fri, 25 Nov 1983 21:13:33 -0800 Subject: [PATCH] BSD 4_3_Reno development Work on file usr/src/pgrm/lisp/franz/68k/adbig.c Work on file usr/src/pgrm/lisp/franz/68k/mulbig.c Synthesized-from: CSRG/cd2/4.3reno --- usr/src/pgrm/lisp/franz/68k/adbig.c | 58 ++++++++++++++++++++++++++ usr/src/pgrm/lisp/franz/68k/mulbig.c | 62 ++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 usr/src/pgrm/lisp/franz/68k/adbig.c create mode 100644 usr/src/pgrm/lisp/franz/68k/mulbig.c diff --git a/usr/src/pgrm/lisp/franz/68k/adbig.c b/usr/src/pgrm/lisp/franz/68k/adbig.c new file mode 100644 index 0000000000..70fbfd08d9 --- /dev/null +++ b/usr/src/pgrm/lisp/franz/68k/adbig.c @@ -0,0 +1,58 @@ +/* + * $Header: adbig.c,v 1.2 83/11/26 12:12:37 sklower Exp $ + * $Locker: $ + * + * Copyright (c) 1982, Regents, University of California + * + */ +#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); +} diff --git a/usr/src/pgrm/lisp/franz/68k/mulbig.c b/usr/src/pgrm/lisp/franz/68k/mulbig.c new file mode 100644 index 0000000000..e4476e2c60 --- /dev/null +++ b/usr/src/pgrm/lisp/franz/68k/mulbig.c @@ -0,0 +1,62 @@ +/* + * $Header: mulbig.c,v 1.2 83/11/26 12:13:29 sklower Exp $ + * $Locker: $ + * + * Copyright (c) 1982, Regents, University of California + * + */ + +#include "global.h" + +struct s_dot { long I; struct s_dot *CDR; }; +struct vl { long high; long low; }; + +struct s_dot *mulbig(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; + long carry = 0, test; + struct vl work; + Keepxs(); + + /* compute lengths */ + + for(p = a; p->CDR; p = p->CDR) la++; + for(p = b; p->CDR; p = p->CDR) lb++; + + /* allocate storage areas on the stack */ + + base = alloca((la + la + lb + lb + 1)*sizeof(long)); + sc = base + la + lb + 1; + sb = sc + lb; + sa = sb + la; + q = sa; + + /* copy s_dots onto stack */ + p = a; + do { *--q = p->I; p = p->CDR; } while (p); + p = b; + do { *--q = p->I; p = p->CDR; } while (p); + while(q > base) *--q = 0; /* initialize target */ + + /* perform the multiplication */ + for(q = sb; q > sc; *--s = carry) + for((r = sa, s = (q--) - lb, carry = 0); r > sb;) + { + carry += *--s; + emul(*q,*--r,carry,&work); + test = work.low; + carry = work.high << 2; + if(test < 0) carry += 2; + if(test & 0x40000000) carry +=1; + *s = test & 0x3fffffff; + } + + p = export(sc,base); + Freexs(); + return(p); +} -- 2.20.1