xref: /plan9/sys/src/libmp/port/mpvecadd.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include "os.h"
2*7dd7cddfSDavid du Colombier #include <mp.h>
3*7dd7cddfSDavid du Colombier #include "dat.h"
4*7dd7cddfSDavid du Colombier 
5*7dd7cddfSDavid du Colombier // prereq: alen >= blen, sum has at least blen+1 digits
6*7dd7cddfSDavid du Colombier void
mpvecadd(mpdigit * a,int alen,mpdigit * b,int blen,mpdigit * sum)7*7dd7cddfSDavid du Colombier mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
8*7dd7cddfSDavid du Colombier {
9*7dd7cddfSDavid du Colombier 	int i, carry;
10*7dd7cddfSDavid du Colombier 	mpdigit x, y;
11*7dd7cddfSDavid du Colombier 
12*7dd7cddfSDavid du Colombier 	carry = 0;
13*7dd7cddfSDavid du Colombier 	for(i = 0; i < blen; i++){
14*7dd7cddfSDavid du Colombier 		x = *a++;
15*7dd7cddfSDavid du Colombier 		y = *b++;
16*7dd7cddfSDavid du Colombier 		x += carry;
17*7dd7cddfSDavid du Colombier 		if(x < carry)
18*7dd7cddfSDavid du Colombier 			carry = 1;
19*7dd7cddfSDavid du Colombier 		else
20*7dd7cddfSDavid du Colombier 			carry = 0;
21*7dd7cddfSDavid du Colombier 		x += y;
22*7dd7cddfSDavid du Colombier 		if(x < y)
23*7dd7cddfSDavid du Colombier 			carry++;
24*7dd7cddfSDavid du Colombier 		*sum++ = x;
25*7dd7cddfSDavid du Colombier 	}
26*7dd7cddfSDavid du Colombier 	for(; i < alen; i++){
27*7dd7cddfSDavid du Colombier 		x = *a++ + carry;
28*7dd7cddfSDavid du Colombier 		if(x < carry)
29*7dd7cddfSDavid du Colombier 			carry = 1;
30*7dd7cddfSDavid du Colombier 		else
31*7dd7cddfSDavid du Colombier 			carry = 0;
32*7dd7cddfSDavid du Colombier 		*sum++ = x;
33*7dd7cddfSDavid du Colombier 	}
34*7dd7cddfSDavid du Colombier 	*sum = carry;
35*7dd7cddfSDavid du Colombier }
36