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