Commit | Line | Data |
---|---|---|
50bcbc75 C |
1 | /* file: mlsb.c |
2 | ** functions: mlsb(), adback(), dsdiv(), dsadd1(), dsrsh() | |
3 | /* Copyright (c) 1982, Regents, University of California */ | |
4 | ||
5 | struct vl /* very long? */ | |
6 | {long high; | |
7 | long low; | |
8 | }; | |
9 | ||
10 | long mlsb(utop,ubot,vtop,nqhat) | |
11 | long *utop; register long *ubot, *vtop; | |
12 | register 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 | ||
33 | long adback(utop,ubot,vtop) | |
34 | register 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 | ||
51 | long dsdiv(top,bot,div) | |
52 | register long *top, *bot; | |
53 | register 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 | ||
71 | dsadd1(top,bot) | |
72 | long *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 | ||
89 | long dsrsh(top,bot,ncnt,mask1) | |
90 | long *top, *bot; | |
91 | long 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 | } |