BSD 4 release
[unix-history] / usr / src / cmd / lisp / divbig.c
index c598f2d..b14db55 100644 (file)
@@ -1,3 +1,6 @@
+
+static char *sccsid = "@(#)divbig.c    34.1 10/3/80";
+
 #include "global.h"
 
 #define b 0x40000000
 #include "global.h"
 
 #define b 0x40000000
@@ -11,10 +14,11 @@ lispval dividend, divisor, *quotient, *remainder;
        int borrow, negrem = 0;
        int *utop = sp(), *ubot, *vbot, *qbot;
        register lispval work; lispval export();
        int borrow, negrem = 0;
        int *utop = sp(), *ubot, *vbot, *qbot;
        register lispval work; lispval export();
+       snpand(3);
 
        /* copy dividend */
 
        /* copy dividend */
-       for(work = dividend; work; work = work ->CDR)
-               stack(work->I);
+       for(work = dividend; work; work = work ->s.CDR)
+               stack(work->s.I);
        ubot = sp();
        if(*ubot < 0) {         /* knuth's division alg works only for pos
                                        bignums                         */
        ubot = sp();
        if(*ubot < 0) {         /* knuth's division alg works only for pos
                                        bignums                         */
@@ -27,8 +31,8 @@ lispval dividend, divisor, *quotient, *remainder;
 
        
        /*copy divisor */
 
        
        /*copy divisor */
-       for(work = divisor; work; work = work->CDR)
-               stack(work->I);
+       for(work = divisor; work; work = work->s.CDR)
+               stack(work->s.I);
 
        vbot = sp();
        stack(0);
 
        vbot = sp();
        stack(0);
@@ -88,7 +92,9 @@ d8:   if(remainder) {
                *quotient = export(qbot + m + 1, qbot);
        }
 }
                *quotient = export(qbot + m + 1, qbot);
        }
 }
-/*static*/ calqhat(ujp,v1p)
+/*
+ * asm code commented out due to optimizer bug
+calqhat(ujp,v1p)
 register int *ujp, *v1p;
 {
 asm("  movl    $0x3fffffff,r0");
 register int *ujp, *v1p;
 {
 asm("  movl    $0x3fffffff,r0");
@@ -105,7 +111,7 @@ asm("       bleq    out1");
 asm("  decl    r0");
 asm("out1:");
 }
 asm("  decl    r0");
 asm("out1:");
 }
-/*static*/ mlsb(utop,ubot,vtop,nqhat)
+mlsb(utop,ubot,vtop,nqhat)
 register int *utop, *ubot, *vtop;
 register int nqhat;
 {
 register int *utop, *ubot, *vtop;
 register int nqhat;
 {
@@ -116,7 +122,7 @@ asm("       extzv   $0,$30,r2,(r11)");
 asm("  extv    $30,$32,r2,r0");
 asm("  acbl    r10,$-4,r11,loop2");
 }
 asm("  extv    $30,$32,r2,r0");
 asm("  acbl    r10,$-4,r11,loop2");
 }
-/*static*/ adback(utop,ubot,vtop)
+adback(utop,ubot,vtop)
 register int *utop, *ubot, *vtop;
 {
 asm("  clrl    r0");
 register int *utop, *ubot, *vtop;
 {
 asm("  clrl    r0");
@@ -126,7 +132,7 @@ asm("       extzv   $0,$30,r0,(r11)");
 asm("  extv    $30,$2,r0,r0");
 asm("  acbl    r10,$-4,r11,loop3");
 }
 asm("  extv    $30,$2,r0,r0");
 asm("  acbl    r10,$-4,r11,loop3");
 }
-/*static*/ dsdiv(top,bot,div)
+dsdiv(top,bot,div)
 register int* bot;
 {
 asm("  clrl    r0");
 register int* bot;
 {
 asm("  clrl    r0");
@@ -134,7 +140,7 @@ asm("loop4: emul    r0,$0x40000000,(r11),r1");
 asm("  ediv    12(ap),r1,(r11),r0");
 asm("  acbl    4(ap),$4,r11,loop4");
 }
 asm("  ediv    12(ap),r1,(r11),r0");
 asm("  acbl    4(ap),$4,r11,loop4");
 }
-/*static*/ dsmult(top,bot,mult)
+dsmult(top,bot,mult)
 register int* top;
 {
 asm("  clrl    r0");
 register int* top;
 {
 asm("  clrl    r0");
@@ -144,7 +150,7 @@ asm("       extv    $30,$32,r1,r0");
 asm("  acbl    8(ap),$-4,r11,loop5");
 asm("  movl    r1,4(r11)");
 }
 asm("  acbl    8(ap),$-4,r11,loop5");
 asm("  movl    r1,4(r11)");
 }
-/*static*/ lispval export(top,bot)
+lispval export(top,bot)
 register lispval bot;
 {
        register r10, r9, r8, r7, r6;
 register lispval bot;
 {
        register r10, r9, r8, r7, r6;
@@ -152,6 +158,7 @@ asm("       movl    4(ap),r10");
 asm("  movl    $0xC0000000,r4");
 asm("  jmp     Bexport");
 }
 asm("  movl    $0xC0000000,r4");
 asm("  jmp     Bexport");
 }
+*/
 
 #define MAXINT 0x8000000L
 
 
 #define MAXINT 0x8000000L
 
@@ -184,9 +191,9 @@ top:
                break;
        case SDOT:
                lbot->val = Labsval();
                break;
        case SDOT:
                lbot->val = Labsval();
-               for(count = 0; handy->CDR!=((lispval) 0); handy = handy->CDR)
+               for(count = 0; handy->s.CDR!=((lispval) 0); handy = handy->s.CDR)
                        count += 30;
                        count += 30;
-               count += Ihau(handy->I);
+               count += Ihau(handy->s.I);
                break;
        default:
                handy = errorh(Vermisc,"Haulong: bad argument",nil,
                break;
        default:
                handy = errorh(Vermisc,"Haulong: bad argument",nil,
@@ -215,8 +222,8 @@ on1:
                stack(work->i);
                break;
        case SDOT:
                stack(work->i);
                break;
        case SDOT:
-               for(; work!=((lispval) 0); work = work->CDR)
-                       stack(work->I);
+               for(; work!=((lispval) 0); work = work->s.CDR)
+                       stack(work->s.I);
                break;
        default:
                work = errorh(Vermisc,"Haipart: bad first argument",nil,
                break;
        default:
                work = errorh(Vermisc,"Haipart: bad first argument",nil,
@@ -240,7 +247,8 @@ on1:
        n = work->i;
        if(n >= mylen || -n >= mylen)
                goto done;
        n = work->i;
        if(n >= mylen || -n >= mylen)
                goto done;
-       if(n >= 0) {
+       if(n==0) return(inewint(0));
+       if(n > 0) {
                                /* Here we want n most significant bits
                                   so chop off mylen - n bits */
                stack(0);
                                /* Here we want n most significant bits
                                   so chop off mylen - n bits */
                stack(0);