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