BSD 4_3_Net_2 release
[unix-history] / usr / src / usr.bin / lisp / franz / tahoe / mlsb.c
CommitLineData
50bcbc75
C
1/* file: mlsb.c
2** functions: mlsb(), adback(), dsdiv(), dsadd1(), dsrsh()
3/* Copyright (c) 1982, Regents, University of California */
4
5struct vl /* very long? */
6 {long high;
7 long low;
8 };
9
10long mlsb(utop,ubot,vtop,nqhat)
11long *utop; register long *ubot, *vtop;
12register nqhat;
13{
14 register handy, carry;
15 struct vl work;
16
17 for(carry = 0; utop >= ubot; utop--) {
18
19 --vtop;
20 asm("addl3 r8,*4(fp),r0");
21 asm("emul r10,(r11),r0,-60(fp)");
22
23 carry = work.high;
24 handy = work.low;
25 *utop = handy & 0x3fffffff;
26 carry <<= 2;
27 if(handy & 0x80000000) carry += 2;
28 if(handy & 0x40000000) carry += 1;
29 }
30 return(carry);
31}
32
33long adback(utop,ubot,vtop)
34register long *utop, *ubot, *vtop;
35{
36 register handy, carry;
37 carry = 0;
38 for(; utop >= ubot; utop--) {
39 carry += *--vtop;
40 carry += *utop;
41 *utop = carry & 0x3fffffff;
42 /* next junk is faster version of carry >>= 30; */
43 handy = carry;
44 carry = 0;
45 if(handy & 0x80000000) carry -= 2;
46 if(handy & 0x40000000) carry += 1;
47 }
48 return(carry);
49}
50
51long dsdiv(top,bot,div)
52register long *top, *bot;
53register long div;
54{
55 struct vl work; char err;
56 register long handy, carry = 0;
57 for(carry = 0;bot <= top; bot++) {
58 handy = *bot;
59 if(carry & 1) handy |= 0x40000000;
60 if(carry & 2) handy |= 0x80000000;
61 carry >>= 2;
62 work.low = handy;
63 work.high = carry;
64 /* *bot = ediv(&work,div,&err); */
65 /* carry = work.high; */
66 asm("ediv r10,-60(fp),(r11),r8");
67 }
68 return(carry);
69}
70
71dsadd1(top,bot)
72long *top, *bot;
73{
74 register long *p, work, carry = 0;
75
76 /*
77 * this assumes canonical inputs
78 */
79 for(p = top; p >= bot; p--) {
80 work = *p + carry;
81 *p = work & 0x3fffffff;
82 carry = 0;
83 if (work & 0x40000000) carry += 1;
84 if (work & 0x80000000) carry -= 2;
85 }
86 p[1] = work;
87}
88
89long dsrsh(top,bot,ncnt,mask1)
90long *top, *bot;
91long ncnt, mask1;
92{
93 register long *p = bot;
94 register r = -ncnt, l = 30+ncnt, carry = 0, work, save;
95 long mask = -1 ^ mask1;
96
97 while(p <= top) {
98 save = work = *p; save &= mask; work >>= r;
99 carry <<= l; work |= carry; *p++ = work;
100 carry = save;
101 }
102 return(carry);
103}