projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
BSD 4 release
[unix-history]
/
usr
/
src
/
cmd
/
lisp
/
divbig.c
diff --git
a/usr/src/cmd/lisp/divbig.c
b/usr/src/cmd/lisp/divbig.c
index
c598f2d
..
b14db55
100644
(file)
--- 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
#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);