Bell 32V development
[unix-history] / usr / src / libmp / madd.c
CommitLineData
9cedae46
TL
1#include <mp.h>
2m_add(a,b,c) struct mint *a,*b,*c;
3{ int carry,i;
4 int x;
5 short *cval;
6 cval=xalloc(a->len+1,"m_add");
7 carry=0;
8 for(i=0;i<b->len;i++)
9 { x=carry+a->val[i]+b->val[i];
10 if(x&0100000)
11 { carry=1;
12 cval[i]=x&077777;
13 }
14 else
15 { carry=0;
16 cval[i]=x;
17 }
18 }
19 for(;i<a->len;i++)
20 { x=carry+a->val[i];
21 if(x&0100000) cval[i]=x&077777;
22 else
23 { carry=0;
24 cval[i]=x;
25 }
26
27 }
28 if(carry==1)
29 { cval[i]=1;
30 c->len=i+1;
31 }
32 else c->len=a->len;
33 c->val=cval;
34 if(c->len==0) shfree(cval);
35 return;
36}
37madd(a,b,c) struct mint *a,*b,*c;
38{ struct mint x,y,z;
39 int sign;
40 x.len=a->len;
41 x.val=a->val;
42 y.len=b->len;
43 y.val=b->val;
44 z.len=0;
45 sign=1;
46 if(x.len>=0)
47 if(y.len>=0)
48 if(x.len>=y.len) m_add(&x,&y,&z);
49 else m_add(&y,&x,&z);
50 else
51 { y.len= -y.len;
52 msub(&x,&y,&z);
53 }
54 else if(y.len<=0)
55 { x.len = -x.len;
56 y.len= -y.len;
57 sign= -1;
58 madd(&x,&y,&z);
59 }
60 else
61 { x.len= -x.len;
62 msub(&y,&x,&z);
63 }
64 xfree(c);
65 c->val=z.val;
66 c->len=sign*z.len;
67 return;
68}
69m_sub(a,b,c) struct mint *a,*b,*c;
70{ int x,i;
71 int borrow;
72 short one;
73 struct mint mone;
74 one=1; mone.len= 1; mone.val= &one;
75 c->val=xalloc(a->len,"m_sub");
76 borrow=0;
77 for(i=0;i<b->len;i++)
78 { x=borrow+a->val[i]-b->val[i];
79 if(x&0100000)
80 { borrow= -1;
81 c->val[i]=x&077777;
82 }
83 else
84 { borrow=0;
85 c->val[i]=x;
86 }
87 }
88 for(;i<a->len;i++)
89 { x=borrow+a->val[i];
90 if(x&0100000) c->val[i]=x&077777;
91 else
92 { borrow=0;
93 c->val[i]=x;
94 }
95 }
96 if(borrow<0)
97 { for(i=0;i<a->len;i++) c->val[i] ^= 077777;
98 c->len=a->len;
99 madd(c,&mone,c);
100 }
101 for(i=a->len-1;i>=0;--i) if(c->val[i]>0)
102 { if(borrow==0) c->len=i+1;
103 else c->len= -i-1;
104 return;
105 }
106 shfree(c->val);
107 return;
108}
109msub(a,b,c) struct mint *a,*b,*c;
110{ struct mint x,y,z;
111 int sign;
112 x.len=a->len;
113 y.len=b->len;
114 x.val=a->val;
115 y.val=b->val;
116 z.len=0;
117 sign=1;
118 if(x.len>=0)
119 if(y.len>=0)
120 if(x.len>=y.len) m_sub(&x,&y,&z);
121 else
122 { sign= -1;
123 msub(&y,&x,&z);
124 }
125 else
126 { y.len= -y.len;
127 madd(&x,&y,&z);
128 }
129 else if(y.len<=0)
130 { sign= -1;
131 x.len= -x.len;
132 y.len= -y.len;
133 msub(&y,&x,&z);
134 }
135 else
136 { x.len= -x.len;
137 madd(&x,&y,&z);
138 sign= -1;
139 }
140 if(a==c && x.len!=0) xfree(a);
141 else if(b==c && y.len!=0) xfree(b);
142 else xfree(c);
143 c->val=z.val;
144 c->len=sign*z.len;
145 return;
146}