X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/2b84abb596f52ab2068d52108adc96838ad4340a..31cef89cb428866f787983e68246030321893df4:/usr/src/cmd/lisp/divbig.c?ds=inline diff --git a/usr/src/cmd/lisp/divbig.c b/usr/src/cmd/lisp/divbig.c index c598f2d56d..b14db552c6 100644 --- a/usr/src/cmd/lisp/divbig.c +++ b/usr/src/cmd/lisp/divbig.c @@ -1,3 +1,6 @@ + +static char *sccsid = "@(#)divbig.c 34.1 10/3/80"; + #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(); + snpand(3); /* 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 */ @@ -27,8 +31,8 @@ lispval dividend, divisor, *quotient, *remainder; /*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); @@ -88,7 +92,9 @@ d8: if(remainder) { *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"); @@ -105,7 +111,7 @@ asm(" bleq 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; { @@ -116,7 +122,7 @@ asm(" extzv $0,$30,r2,(r11)"); 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"); @@ -126,7 +132,7 @@ asm(" extzv $0,$30,r0,(r11)"); 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"); @@ -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"); } -/*static*/ dsmult(top,bot,mult) +dsmult(top,bot,mult) 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)"); } -/*static*/ lispval export(top,bot) +lispval export(top,bot) 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"); } +*/ #define MAXINT 0x8000000L @@ -184,9 +191,9 @@ top: 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 += Ihau(handy->I); + count += Ihau(handy->s.I); break; default: handy = errorh(Vermisc,"Haulong: bad argument",nil, @@ -215,8 +222,8 @@ on1: 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, @@ -240,7 +247,8 @@ on1: 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);