xref: /plan9-contrib/sys/src/libmp/port/mpvecsub.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: a >= b, alen >= blen, diff has at least alen digits
6*7dd7cddfSDavid du Colombier void
mpvecsub(mpdigit * a,int alen,mpdigit * b,int blen,mpdigit * diff)7*7dd7cddfSDavid du Colombier mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
8*7dd7cddfSDavid du Colombier {
9*7dd7cddfSDavid du Colombier 	int i, borrow;
10*7dd7cddfSDavid du Colombier 	mpdigit x, y;
11*7dd7cddfSDavid du Colombier 
12*7dd7cddfSDavid du Colombier 	borrow = 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 		y += borrow;
17*7dd7cddfSDavid du Colombier 		if(y < borrow)
18*7dd7cddfSDavid du Colombier 			borrow = 1;
19*7dd7cddfSDavid du Colombier 		else
20*7dd7cddfSDavid du Colombier 			borrow = 0;
21*7dd7cddfSDavid du Colombier 		if(x < y)
22*7dd7cddfSDavid du Colombier 			borrow++;
23*7dd7cddfSDavid du Colombier 		*diff++ = x - y;
24*7dd7cddfSDavid du Colombier 	}
25*7dd7cddfSDavid du Colombier 	for(; i < alen; i++){
26*7dd7cddfSDavid du Colombier 		x = *a++;
27*7dd7cddfSDavid du Colombier 		y = x - borrow;
28*7dd7cddfSDavid du Colombier 		if(y > x)
29*7dd7cddfSDavid du Colombier 			borrow = 1;
30*7dd7cddfSDavid du Colombier 		else
31*7dd7cddfSDavid du Colombier 			borrow = 0;
32*7dd7cddfSDavid du Colombier 		*diff++ = y;
33*7dd7cddfSDavid du Colombier 	}
34*7dd7cddfSDavid du Colombier }
35