+
+static char *sccsid = "@(#)divbig.c 34.1 10/3/80";
+
#include "global.h"
#define b 0x40000000
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 */
/*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);
*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");
asm(" decl r0");
asm("out1:");
}
-/*static*/ mlsb(utop,ubot,vtop,nqhat)
+mlsb(utop,ubot,vtop,nqhat)
register int *utop, *ubot, *vtop;
register int nqhat;
{
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");
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");
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");
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;
asm(" movl $0xC0000000,r4");
asm(" jmp Bexport");
}
+*/
#define MAXINT 0x8000000L
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,
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,
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);