[gcalctool] Remove global MP.r



commit b3a8591c40b1c920fe9217fcc7aeec211b80847c
Author: Robert Ancell <robert ancell gmail com>
Date:   Wed May 6 12:16:35 2009 +1000

    Remove global MP.r
---
 gcalctool/mp-convert.c  |   14 +++--
 gcalctool/mp-internal.h |    5 +-
 gcalctool/mp.c          |  144 +++++++++++++++++++++++-----------------------
 3 files changed, 81 insertions(+), 82 deletions(-)

diff --git a/gcalctool/mp-convert.c b/gcalctool/mp-convert.c
index 357c58f..d731a57 100644
--- a/gcalctool/mp-convert.c
+++ b/gcalctool/mp-convert.c
@@ -59,6 +59,7 @@ void
 mp_set_from_float(float rx, MPNumber *z)
 {
     int i, k, i2, ib, ie, re, tp, rs;
+    int r[MP_SIZE];
     float rb, rj;
     
     mpchk(1, 4);
@@ -99,12 +100,12 @@ mp_set_from_float(float rx, MPNumber *z)
     /* CONVERSION LOOP (ASSUME SINGLE-PRECISION OPS. EXACT) */
     for (i = 0; i < i2; i++) {
         rj = rb * rj;
-        MP.r[i] = (int) rj;
-        rj -= (float) MP.r[i];
+        r[i] = (int) rj;
+        rj -= (float) r[i];
     }
 
     /* NORMALIZE RESULT */
-    mp_get_normalized_register(rs, &re, z, 0);
+    mp_get_normalized_register(rs, &re, r, z, 0);
 
     /* Computing MAX */
     ib = max(MP.b * 7 * MP.b, 32767) / 16;
@@ -150,6 +151,7 @@ void
 mp_set_from_double(double dx, MPNumber *z)
 {
     int i, k, i2, ib, ie, re, tp, rs;
+    int r[MP_SIZE];
     double db, dj;
 
     mpchk(1, 4);
@@ -184,12 +186,12 @@ mp_set_from_double(double dx, MPNumber *z)
     /* CONVERSION LOOP (ASSUME DOUBLE-PRECISION OPS. EXACT) */
     for (i = 0; i < i2; i++) {
         dj = db * dj;
-        MP.r[i] = (int) dj;
-        dj -= (double) MP.r[i];
+        r[i] = (int) dj;
+        dj -= (double) r[i];
     }
 
     /* NORMALIZE RESULT */
-    mp_get_normalized_register(rs, &re, z, 0);
+    mp_get_normalized_register(rs, &re, r, z, 0);
 
     /* Computing MAX */
     ib = max(MP.b * 7 * MP.b, 32767) / 16;
diff --git a/gcalctool/mp-internal.h b/gcalctool/mp-internal.h
index 1410a48..4dbf14b 100644
--- a/gcalctool/mp-internal.h
+++ b/gcalctool/mp-internal.h
@@ -37,15 +37,12 @@ struct {
 
     /* Min/max exponent value */
     int m;
-
-    /* ??? */
-    int r[MP_SIZE];
 } MP;
 
 void mpchk(int i, int j);
 void mpgcd(int *, int *);
 void mpmul2(MPNumber *, int, MPNumber *, int);
-void mp_get_normalized_register(int reg_sign, int *reg_exp, MPNumber *z, int trunc);
+void mp_get_normalized_register(int reg_sign, int *reg_exp, int *r, MPNumber *z, int trunc);
 void mpexp1(const MPNumber *, MPNumber *);
 void mpmulq(MPNumber *, int, int, MPNumber *);
 void mp_reciprocal(const MPNumber *, MPNumber *);
diff --git a/gcalctool/mp.c b/gcalctool/mp.c
index f887457..a7c869f 100644
--- a/gcalctool/mp.c
+++ b/gcalctool/mp.c
@@ -35,7 +35,7 @@ static int mp_compare_mp_to_float(const MPNumber *, float);
 static int pow_ii(int, int);
 
 static void mpadd2(const MPNumber *, const MPNumber *, MPNumber *, int, int);
-static int  mpadd3(const MPNumber *, const MPNumber *, int, int);
+static int  mpadd3(const MPNumber *, const MPNumber *, int *, int, int);
 static void mpext(int, int, MPNumber *);
 static void mplns(const MPNumber *, MPNumber *);
 static void mpmaxr(MPNumber *);
@@ -82,6 +82,7 @@ mpadd2(const MPNumber *x, const MPNumber *y, MPNumber *z, int y_sign, int trunc)
 {
     int sign_prod;
     int exp_diff, exp_result, med;
+    int r[MP_SIZE];
     
     /* X = 0 OR NEGLIGIBLE, SO RESULT = +-Y */
     if (x->sign == 0) {
@@ -148,15 +149,15 @@ mpadd2(const MPNumber *x, const MPNumber *y, MPNumber *z, int y_sign, int trunc)
     }
     
 L10:
-    exp_result = y->exponent + mpadd3(x, y, sign_prod, med);
     /* NORMALIZE, ROUND OR TRUNCATE, AND RETURN */
-    mp_get_normalized_register(y_sign, &exp_result, z, trunc);
+    exp_result = y->exponent + mpadd3(x, y, r, sign_prod, med);
+    mp_get_normalized_register(y_sign, &exp_result, r, z, trunc);
     return;
 
 L20:
-    exp_result = x->exponent + mpadd3(y, x, sign_prod, med);
     /* NORMALIZE, ROUND OR TRUNCATE, AND RETURN */
-    mp_get_normalized_register(x->sign, &exp_result, z, trunc);
+    exp_result = x->exponent + mpadd3(y, x, r, sign_prod, med);
+    mp_get_normalized_register(x->sign, &exp_result, r, z, trunc);
     return;
 }
 
@@ -164,20 +165,18 @@ L20:
 /* CALLED BY MPADD2, DOES INNER LOOPS OF ADDITION */
 /* return value is amount by which exponent needs to be increased. */
 static int
-mpadd3(const MPNumber *x, const MPNumber *y, int s, int med)
+mpadd3(const MPNumber *x, const MPNumber *y, int *r, int s, int med)
 {
     int i, c;
     
     /* CLEAR GUARD DIGITS TO RIGHT OF X DIGITS */
-    for(i = 3; i >= med; i--) {
-        MP.r[MP.t + i] = 0;
-    }
+    for(i = 3; i >= med; i--)
+        r[MP.t + i] = 0;
 
     if (s >= 0) {
         /* HERE DO ADDITION, EXPONENT(Y) >= EXPONENT(X) */
-        for (i = MP.t + 3; i >= MP.t; i--) {
-            MP.r[i] = x->fraction[i - med];
-        }
+        for (i = MP.t + 3; i >= MP.t; i--)
+            r[i] = x->fraction[i - med];
 
         c = 0;
         for (; i >= med; i--) {
@@ -185,11 +184,11 @@ mpadd3(const MPNumber *x, const MPNumber *y, int s, int med)
             
             if (c < MP.b) {
                 /* NO CARRY GENERATED HERE */
-                MP.r[i] = c;
+                r[i] = c;
                 c = 0;
             } else {
                 /* CARRY GENERATED HERE */
-                MP.r[i] = c - MP.b;
+                r[i] = c - MP.b;
                 c = 1;
             }
         }
@@ -198,28 +197,25 @@ mpadd3(const MPNumber *x, const MPNumber *y, int s, int med)
         {
             c = y->fraction[i] + c;
             if (c < MP.b) {
-                MP.r[i] = c;
+                r[i] = c;
                 i--;
                 
                 /* NO CARRY POSSIBLE HERE */
                 for (; i >= 0; i--)
-                    MP.r[i] = y->fraction[i];
+                    r[i] = y->fraction[i];
+
                 return 0;
             }
             
-            MP.r[i] = 0;
+            r[i] = 0;
             c = 1;
         }
         
         /* MUST SHIFT RIGHT HERE AS CARRY OFF END */
         if (c != 0) {
-            int j;
-
-            for (j = 2; j <= MP.t + 4; j++) {
-                i = MP.t + 5 - j;
-                MP.r[i] = MP.r[i - 1];
-            }
-            MP.r[0] = 1;
+            for (i = MP.t + 3; i > 0; i--)
+                r[i] = r[i - 1];
+            r[0] = 1;
             return 1;
         }
 
@@ -229,13 +225,13 @@ mpadd3(const MPNumber *x, const MPNumber *y, int s, int med)
     c = 0;
     for (i = MP.t + med - 1; i >= MP.t; i--) {
         /* HERE DO SUBTRACTION, ABS(Y) > ABS(X) */
-        MP.r[i] = c - x->fraction[i - med];
+        r[i] = c - x->fraction[i - med];
         c = 0;
         
         /* BORROW GENERATED HERE */    
-        if (MP.r[i] < 0) {
+        if (r[i] < 0) {
             c = -1;
-            MP.r[i] += MP.b;
+            r[i] += MP.b;
         }
     }
 
@@ -243,11 +239,11 @@ mpadd3(const MPNumber *x, const MPNumber *y, int s, int med)
         c = y->fraction[i] + c - x->fraction[i - med];
         if (c >= 0) {
             /* NO BORROW GENERATED HERE */
-            MP.r[i] = c;
+            r[i] = c;
             c = 0;
         } else {
             /* BORROW GENERATED HERE */            
-            MP.r[i] = c + MP.b;
+            r[i] = c + MP.b;
             c = -1;
         }
     }
@@ -256,19 +252,20 @@ mpadd3(const MPNumber *x, const MPNumber *y, int s, int med)
         c = y->fraction[i] + c;
 
         if (c >= 0) {
-            MP.r[i] = c;
+            r[i] = c;
             i--;
             
             /* NO CARRY POSSIBLE HERE */
             for (; i >= 0; i--)
-                MP.r[i] = y->fraction[i];
+                r[i] = y->fraction[i];
 
             return 0;
         }
         
-        MP.r[i] = c + MP.b;
+        r[i] = c + MP.b;
         c = -1;
     }
+
     return 0;
 }
 
@@ -404,6 +401,7 @@ void
 mpcmf(const MPNumber *x, MPNumber *y)
 {
     int offset_exp;
+    int r[MP_SIZE];
 
     /* RETURN 0 IF X = 0
        OR IF EXPONENT SO LARGE THAT NO FRACTIONAL PART */    
@@ -420,17 +418,16 @@ mpcmf(const MPNumber *x, MPNumber *y)
 
     /* CLEAR ACCUMULATOR */
     offset_exp = x->exponent;
-    memset(MP.r, 0, offset_exp*sizeof(int));
-
+    memset(r, 0, offset_exp*sizeof(int));
 
     /* MOVE FRACTIONAL PART OF X TO ACCUMULATOR */
-    memcpy (MP.r + offset_exp, x->fraction + offset_exp,
+    memcpy (r + offset_exp, x->fraction + offset_exp,
             (MP.t - offset_exp)*sizeof(int));
 
-    memset(MP.r + MP.t, 0, 4*sizeof(int));
+    memset(r + MP.t, 0, 4*sizeof(int));
 
     /* NORMALIZE RESULT AND RETURN */
-    mp_get_normalized_register(x->sign, &offset_exp, y, 1);
+    mp_get_normalized_register(x->sign, &offset_exp, r, y, 1);
 }
 
 /* RETURNS Y = INTEGER PART OF X (TRUNCATED TOWARDS 0), FOR MP X AND Y.
@@ -594,6 +591,7 @@ mpdivi(const MPNumber *x, int iy, MPNumber *z)
     int i__1;
     int c, i, k, b2, c2, i2, j1, j2, r1;
     int j11, kh, re, iq, ir, rs, iqj;
+    int r[MP_SIZE];
 
     rs = x->sign;
 
@@ -612,7 +610,7 @@ mpdivi(const MPNumber *x, int iy, MPNumber *z)
 
     /* CHECK FOR ZERO DIVIDEND */
     if (rs == 0) {
-        mp_get_normalized_register(rs, &re, z, 0);
+        z->sign = 0;
         return;
     }
 
@@ -660,15 +658,15 @@ mpdivi(const MPNumber *x, int iy, MPNumber *z)
 
         /* ADJUST EXPONENT AND GET T+4 DIGITS IN QUOTIENT */
         re = re + 1 - i;
-        MP.r[0] = r1;
+        r[0] = r1;
         c = MP.b * (c - iy * r1);
         kh = 2;
         if (i < MP.t) {
             kh = MP.t + 1 - i;
             for (k = 1; k < kh; k++) {
                 c += x->fraction[i];
-                MP.r[k] = c / iy;
-                c = MP.b * (c - iy * MP.r[k]);
+                r[k] = c / iy;
+                c = MP.b * (c - iy * r[k]);
                 i++;
             }
             if (c < 0)
@@ -677,14 +675,14 @@ mpdivi(const MPNumber *x, int iy, MPNumber *z)
         }
         
         for (k = kh - 1; k < i2; k++) {
-            MP.r[k] = c / iy;
-            c = MP.b * (c - iy * MP.r[k]);
+            r[k] = c / iy;
+            c = MP.b * (c - iy * r[k]);
         }
         if (c < 0)
             goto L210;
         
         /* NORMALIZE AND ROUND RESULT */
-        mp_get_normalized_register(rs, &re, z, 0);
+        mp_get_normalized_register(rs, &re, r, z, 0);
 
         return;
     }
@@ -734,7 +732,7 @@ mpdivi(const MPNumber *x, int iy, MPNumber *z)
         iqj = iq / iy;
 
         /* R(K) = QUOTIENT, C = REMAINDER */
-        MP.r[k - 1] = iqj + ir;
+        r[k - 1] = iqj + ir;
         c = iq - iy * iqj;
         
         if (c < 0)
@@ -742,7 +740,7 @@ mpdivi(const MPNumber *x, int iy, MPNumber *z)
         
         ++k;
         if (k > i2) {
-            mp_get_normalized_register(rs, &re, z, 0);
+            mp_get_normalized_register(rs, &re, r, z, 0);
             return;
         }
     }
@@ -1388,6 +1386,7 @@ mpmul(const MPNumber *x, const MPNumber *y, MPNumber *z)
 {
     int i__1;
     int c, i, j, i2, j1, re, ri, xi, rs, i2p;
+    int r[MP_SIZE];
 
     mpchk(1, 4);
     i2 = MP.t + 4;
@@ -1406,7 +1405,7 @@ mpmul(const MPNumber *x, const MPNumber *y, MPNumber *z)
 
     /* CLEAR ACCUMULATOR */
     for (i = 0; i < i2; i++)
-        MP.r[i] = 0;
+        r[i] = 0;
 
     /* PERFORM MULTIPLICATION */
     c = 8;
@@ -1419,7 +1418,7 @@ mpmul(const MPNumber *x, const MPNumber *y, MPNumber *z)
             continue;
 
         /* Computing MIN */
-        mpmlp(&MP.r[i+1], y->fraction, xi, min(MP.t, i2 - i - 1));
+        mpmlp(&r[i+1], y->fraction, xi, min(MP.t, i2 - i - 1));
         --c;
         if (c > 0)
             continue;
@@ -1436,14 +1435,14 @@ mpmul(const MPNumber *x, const MPNumber *y, MPNumber *z)
          */
         for (j = 1; j <= i2; ++j) {
             j1 = i2p - j;
-            ri = MP.r[j1 - 1] + c;
+            ri = r[j1 - 1] + c;
             if (ri < 0) {
                 mperr("*** INTEGER OVERFLOW IN MPMUL, B TOO LARGE ***");
                 z->sign = 0;
                 return;
             }
             c = ri / MP.b;
-            MP.r[j1 - 1] = ri - MP.b * c;
+            r[j1 - 1] = ri - MP.b * c;
         }
         if (c != 0) {
             mperr("*** ILLEGAL BASE B DIGIT IN CALL TO MPMUL, POSSIBLE OVERWRITING PROBLEM ***");
@@ -1463,14 +1462,14 @@ mpmul(const MPNumber *x, const MPNumber *y, MPNumber *z)
         c = 0;
         for (j = 1; j <= i2; ++j) {
             j1 = i2p - j;
-            ri = MP.r[j1 - 1] + c;
+            ri = r[j1 - 1] + c;
             if (ri < 0) {
                 mperr("*** INTEGER OVERFLOW IN MPMUL, B TOO LARGE ***");
                 z->sign = 0;
                 return;
             }
             c = ri / MP.b;
-            MP.r[j1 - 1] = ri - MP.b * c;
+            r[j1 - 1] = ri - MP.b * c;
         }
         
         if (c != 0) {
@@ -1481,7 +1480,7 @@ mpmul(const MPNumber *x, const MPNumber *y, MPNumber *z)
     }
 
     /* NORMALIZE AND ROUND RESULT */
-    mp_get_normalized_register(rs, &re, z, 0);
+    mp_get_normalized_register(rs, &re, r, z, 0);
 }
 
 
@@ -1495,6 +1494,7 @@ mpmul2(MPNumber *x, int iy, MPNumber *z, int trunc)
 {
     int c, i, c1, c2, j1, j2;
     int t1, t3, t4, ij, re, ri = 0, is, ix, rs;
+    int r[MP_SIZE];
     
     rs = x->sign;
     if (rs == 0 || iy == 0) {
@@ -1551,7 +1551,7 @@ mpmul2(MPNumber *x, int iy, MPNumber *z, int trunc)
             ri = j2 * ix + c2;
             is = ri / MP.b;
             c = j1 * ix + c1 + is;
-            MP.r[i + 3] = ri - MP.b * is;
+            r[i + 3] = ri - MP.b * is;
         }
     }
     else
@@ -1560,7 +1560,7 @@ mpmul2(MPNumber *x, int iy, MPNumber *z, int trunc)
             i = t1 - ij;
             ri = iy * x->fraction[i - 1] + c;
             c = ri / MP.b;
-            MP.r[i + 3] = ri - MP.b * c;
+            r[i + 3] = ri - MP.b * c;
         }
 
         /* CHECK FOR INTEGER OVERFLOW */
@@ -1576,7 +1576,7 @@ mpmul2(MPNumber *x, int iy, MPNumber *z, int trunc)
             i = 5 - ij;
             ri = c;
             c = ri / MP.b;
-            MP.r[i - 1] = ri - MP.b * c;
+            r[i - 1] = ri - MP.b * c;
         }
     }
 
@@ -1585,7 +1585,7 @@ mpmul2(MPNumber *x, int iy, MPNumber *z, int trunc)
         /* NORMALIZE AND ROUND OR TRUNCATE RESULT */
         if (c == 0)
         {
-            mp_get_normalized_register(rs, &re, z, trunc);
+            mp_get_normalized_register(rs, &re, r, z, trunc);
             return;
         }
         
@@ -1598,11 +1598,11 @@ mpmul2(MPNumber *x, int iy, MPNumber *z, int trunc)
         
         for (ij = 1; ij <= t3; ++ij) {
             i = t4 - ij;
-            MP.r[i] = MP.r[i - 1];
+            r[i] = r[i - 1];
         }
         ri = c;
         c = ri / MP.b;
-        MP.r[0] = ri - MP.b * c;
+        r[0] = ri - MP.b * c;
         ++re;
     }
 }
@@ -1669,7 +1669,7 @@ mp_invert_sign(const MPNumber *x, MPNumber *y)
  *  NOT PRESERVED. R*-ROUNDING IS USED IF TRUNC == 0
  */
 void
-mp_get_normalized_register(int reg_sign, int *reg_exp, MPNumber *z, int trunc)
+mp_get_normalized_register(int reg_sign, int *reg_exp, int *r, MPNumber *z, int trunc)
 {
     int i__1;
 
@@ -1692,7 +1692,7 @@ mp_get_normalized_register(int reg_sign, int *reg_exp, MPNumber *z, int trunc)
 
     /* LOOK FOR FIRST NONZERO DIGIT */
     for (i = 0; i < i2; i++) {
-        if (MP.r[i] > 0)
+        if (r[i] > 0)
             break;
     }
 
@@ -1707,9 +1707,9 @@ mp_get_normalized_register(int reg_sign, int *reg_exp, MPNumber *z, int trunc)
         *reg_exp -= i;
         i2m = i2 - i;
         for (j = 0; j < i2m; j++)
-            MP.r[j] = MP.r[j + i];
+            r[j] = r[j + i];
         for (; j < i2; j++)
-            MP.r[j] = 0;
+            r[j] = 0;
     }
 
     /* CHECK TO SEE IF TRUNCATION IS DESIRED */
@@ -1722,7 +1722,7 @@ mp_get_normalized_register(int reg_sign, int *reg_exp, MPNumber *z, int trunc)
             round = 0;
             /* ODD BASE, ROUND IF R(T+1)... > 1/2 */
             for (i = 0; i < 4; i++) {
-                i__1 = MP.r[MP.t + i] - b2;
+                i__1 = r[MP.t + i] - b2;
                 if (i__1 < 0)
                     break;
                 else if (i__1 == 0)
@@ -1738,12 +1738,12 @@ mp_get_normalized_register(int reg_sign, int *reg_exp, MPNumber *z, int trunc)
              *  AFTER R(T+2).
              */
             round = 1;
-            i__1 = MP.r[MP.t] - b2;
+            i__1 = r[MP.t] - b2;
             if (i__1 < 0)
                 round = 0;
             else if (i__1 == 0) {
-                if (MP.r[MP.t - 1] % 2 != 0) {
-                    if (MP.r[MP.t + 1] + MP.r[MP.t + 2] + MP.r[MP.t + 3] == 0) {
+                if (r[MP.t - 1] % 2 != 0) {
+                    if (r[MP.t + 1] + r[MP.t + 2] + r[MP.t + 3] == 0) {
                         round = 0;
                     }
                 }
@@ -1753,16 +1753,16 @@ mp_get_normalized_register(int reg_sign, int *reg_exp, MPNumber *z, int trunc)
         /* ROUND */
         if (round) {
             for (j = MP.t - 1; j >= 0; j--) {
-                ++MP.r[j];
-                if (MP.r[j] < MP.b)
+                ++r[j];
+                if (r[j] < MP.b)
                     break;
-                MP.r[j] = 0;
+                r[j] = 0;
             }
 
             /* EXCEPTIONAL CASE, ROUNDED UP TO .10000... */
             if (j < 0) {
                 ++(*reg_exp);
-                MP.r[0] = 1;
+                r[0] = 1;
             }
         }
     }
@@ -1783,7 +1783,7 @@ mp_get_normalized_register(int reg_sign, int *reg_exp, MPNumber *z, int trunc)
     z->sign = reg_sign;
     z->exponent = *reg_exp;
     for (i = 0; i < MP.t; i++)
-        z->fraction[i] = MP.r[i];
+        z->fraction[i] = r[i];
 }
 
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]