xref: /plan9/sys/src/libmp/port/mpadd.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
17dd7cddfSDavid du Colombier #include "os.h"
27dd7cddfSDavid du Colombier #include <mp.h>
37dd7cddfSDavid du Colombier #include "dat.h"
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier // sum = abs(b1) + abs(b2), i.e., add the magnitudes
67dd7cddfSDavid du Colombier void
mpmagadd(mpint * b1,mpint * b2,mpint * sum)77dd7cddfSDavid du Colombier mpmagadd(mpint *b1, mpint *b2, mpint *sum)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier 	int m, n;
107dd7cddfSDavid du Colombier 	mpint *t;
117dd7cddfSDavid du Colombier 
127dd7cddfSDavid du Colombier 	// get the sizes right
137dd7cddfSDavid du Colombier 	if(b2->top > b1->top){
147dd7cddfSDavid du Colombier 		t = b1;
157dd7cddfSDavid du Colombier 		b1 = b2;
167dd7cddfSDavid du Colombier 		b2 = t;
177dd7cddfSDavid du Colombier 	}
187dd7cddfSDavid du Colombier 	n = b1->top;
197dd7cddfSDavid du Colombier 	m = b2->top;
207dd7cddfSDavid du Colombier 	if(n == 0){
217dd7cddfSDavid du Colombier 		mpassign(mpzero, sum);
227dd7cddfSDavid du Colombier 		return;
237dd7cddfSDavid du Colombier 	}
247dd7cddfSDavid du Colombier 	if(m == 0){
257dd7cddfSDavid du Colombier 		mpassign(b1, sum);
267dd7cddfSDavid du Colombier 		return;
277dd7cddfSDavid du Colombier 	}
287dd7cddfSDavid du Colombier 	mpbits(sum, (n+1)*Dbits);
2959cc4ca5SDavid du Colombier 	sum->top = n+1;
307dd7cddfSDavid du Colombier 
317dd7cddfSDavid du Colombier 	mpvecadd(b1->p, n, b2->p, m, sum->p);
327dd7cddfSDavid du Colombier 	sum->sign = 1;
337dd7cddfSDavid du Colombier 
347dd7cddfSDavid du Colombier 	mpnorm(sum);
357dd7cddfSDavid du Colombier }
367dd7cddfSDavid du Colombier 
377dd7cddfSDavid du Colombier // sum = b1 + b2
387dd7cddfSDavid du Colombier void
mpadd(mpint * b1,mpint * b2,mpint * sum)397dd7cddfSDavid du Colombier mpadd(mpint *b1, mpint *b2, mpint *sum)
407dd7cddfSDavid du Colombier {
417dd7cddfSDavid du Colombier 	int sign;
427dd7cddfSDavid du Colombier 
437dd7cddfSDavid du Colombier 	if(b1->sign != b2->sign){
447dd7cddfSDavid du Colombier 		if(b1->sign < 0)
457dd7cddfSDavid du Colombier 			mpmagsub(b2, b1, sum);
467dd7cddfSDavid du Colombier 		else
477dd7cddfSDavid du Colombier 			mpmagsub(b1, b2, sum);
487dd7cddfSDavid du Colombier 	} else {
497dd7cddfSDavid du Colombier 		sign = b1->sign;
507dd7cddfSDavid du Colombier 		mpmagadd(b1, b2, sum);
51*80ee5cbfSDavid du Colombier 		if(sum->top != 0)
527dd7cddfSDavid du Colombier 			sum->sign = sign;
537dd7cddfSDavid du Colombier 	}
547dd7cddfSDavid du Colombier }
55