xref: /plan9/sys/src/cmd/unix/drawterm/libmp/mpvecadd.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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 // prereq: alen >= blen, sum has at least blen+1 digits
6*8ccd4a63SDavid du Colombier void
mpvecadd(mpdigit * a,int alen,mpdigit * b,int blen,mpdigit * sum)7*8ccd4a63SDavid du Colombier mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
8*8ccd4a63SDavid du Colombier {
9*8ccd4a63SDavid du Colombier 	int i, carry;
10*8ccd4a63SDavid du Colombier 	mpdigit x, y;
11*8ccd4a63SDavid du Colombier 
12*8ccd4a63SDavid du Colombier 	carry = 0;
13*8ccd4a63SDavid du Colombier 	for(i = 0; i < blen; i++){
14*8ccd4a63SDavid du Colombier 		x = *a++;
15*8ccd4a63SDavid du Colombier 		y = *b++;
16*8ccd4a63SDavid du Colombier 		x += carry;
17*8ccd4a63SDavid du Colombier 		if(x < carry)
18*8ccd4a63SDavid du Colombier 			carry = 1;
19*8ccd4a63SDavid du Colombier 		else
20*8ccd4a63SDavid du Colombier 			carry = 0;
21*8ccd4a63SDavid du Colombier 		x += y;
22*8ccd4a63SDavid du Colombier 		if(x < y)
23*8ccd4a63SDavid du Colombier 			carry++;
24*8ccd4a63SDavid du Colombier 		*sum++ = x;
25*8ccd4a63SDavid du Colombier 	}
26*8ccd4a63SDavid du Colombier 	for(; i < alen; i++){
27*8ccd4a63SDavid du Colombier 		x = *a++ + carry;
28*8ccd4a63SDavid du Colombier 		if(x < carry)
29*8ccd4a63SDavid du Colombier 			carry = 1;
30*8ccd4a63SDavid du Colombier 		else
31*8ccd4a63SDavid du Colombier 			carry = 0;
32*8ccd4a63SDavid du Colombier 		*sum++ = x;
33*8ccd4a63SDavid du Colombier 	}
34*8ccd4a63SDavid du Colombier 	*sum = carry;
35*8ccd4a63SDavid du Colombier }
36