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