1*8ccd4a63SDavid du Colombier #include "os.h"
2*8ccd4a63SDavid du Colombier #include <mp.h>
3*8ccd4a63SDavid du Colombier #include "dat.h"
4*8ccd4a63SDavid du Colombier
5*8ccd4a63SDavid du Colombier // sum = abs(b1) + abs(b2), i.e., add the magnitudes
6*8ccd4a63SDavid du Colombier void
mpmagadd(mpint * b1,mpint * b2,mpint * sum)7*8ccd4a63SDavid du Colombier mpmagadd(mpint *b1, mpint *b2, mpint *sum)
8*8ccd4a63SDavid du Colombier {
9*8ccd4a63SDavid du Colombier int m, n;
10*8ccd4a63SDavid du Colombier mpint *t;
11*8ccd4a63SDavid du Colombier
12*8ccd4a63SDavid du Colombier // get the sizes right
13*8ccd4a63SDavid du Colombier if(b2->top > b1->top){
14*8ccd4a63SDavid du Colombier t = b1;
15*8ccd4a63SDavid du Colombier b1 = b2;
16*8ccd4a63SDavid du Colombier b2 = t;
17*8ccd4a63SDavid du Colombier }
18*8ccd4a63SDavid du Colombier n = b1->top;
19*8ccd4a63SDavid du Colombier m = b2->top;
20*8ccd4a63SDavid du Colombier if(n == 0){
21*8ccd4a63SDavid du Colombier mpassign(mpzero, sum);
22*8ccd4a63SDavid du Colombier return;
23*8ccd4a63SDavid du Colombier }
24*8ccd4a63SDavid du Colombier if(m == 0){
25*8ccd4a63SDavid du Colombier mpassign(b1, sum);
26*8ccd4a63SDavid du Colombier return;
27*8ccd4a63SDavid du Colombier }
28*8ccd4a63SDavid du Colombier mpbits(sum, (n+1)*Dbits);
29*8ccd4a63SDavid du Colombier sum->top = n+1;
30*8ccd4a63SDavid du Colombier
31*8ccd4a63SDavid du Colombier mpvecadd(b1->p, n, b2->p, m, sum->p);
32*8ccd4a63SDavid du Colombier sum->sign = 1;
33*8ccd4a63SDavid du Colombier
34*8ccd4a63SDavid du Colombier mpnorm(sum);
35*8ccd4a63SDavid du Colombier }
36*8ccd4a63SDavid du Colombier
37*8ccd4a63SDavid du Colombier // sum = b1 + b2
38*8ccd4a63SDavid du Colombier void
mpadd(mpint * b1,mpint * b2,mpint * sum)39*8ccd4a63SDavid du Colombier mpadd(mpint *b1, mpint *b2, mpint *sum)
40*8ccd4a63SDavid du Colombier {
41*8ccd4a63SDavid du Colombier int sign;
42*8ccd4a63SDavid du Colombier
43*8ccd4a63SDavid du Colombier if(b1->sign != b2->sign){
44*8ccd4a63SDavid du Colombier if(b1->sign < 0)
45*8ccd4a63SDavid du Colombier mpmagsub(b2, b1, sum);
46*8ccd4a63SDavid du Colombier else
47*8ccd4a63SDavid du Colombier mpmagsub(b1, b2, sum);
48*8ccd4a63SDavid du Colombier } else {
49*8ccd4a63SDavid du Colombier sign = b1->sign;
50*8ccd4a63SDavid du Colombier mpmagadd(b1, b2, sum);
51*8ccd4a63SDavid du Colombier if(sum->top != 0)
52*8ccd4a63SDavid du Colombier sum->sign = sign;
53*8ccd4a63SDavid du Colombier }
54*8ccd4a63SDavid du Colombier }
55