simplify/debloat radix point alignment code in floatscan
authorRich Felker <dalias@aerifal.cx>
Wed, 11 Apr 2012 18:20:45 +0000 (14:20 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 11 Apr 2012 18:20:45 +0000 (14:20 -0400)
now that this is the first operation, it can rely on the circular
buffer contents not being wrapped when it begins. we limit the number
of digits read slightly in the initial parsing loops too so that this
code does not have to consider the case where it might cause the
circular buffer to wrap; this is perfectly fine because KMAX is chosen
as a power of two for circular-buffer purposes and is much larger than
it otherwise needs to be, anyway.

these changes should not affect performance at all.

src/internal/floatscan.c

index d5444daaff8e03cf61ae93f9648e6f92129dd293..6390d46a1372089e41c82c0931a1eb7dd4058642 100644 (file)
@@ -77,7 +77,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po
                if (c == '.') {
                        if (lrp!=-1) break;
                        lrp = dc;
-               } else if (k < KMAX) {
+               } else if (k < KMAX-2) {
                        dc++;
                        if (j) x[k] = x[k]*10 + c-'0';
                        else x[k] = c-'0';
@@ -88,7 +88,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po
                        gotdig=1;
                } else {
                        dc++;
-                       x[KMAX-1] |= c-'0';
+                       if (c!='0') x[KMAX-3] |= 1;
                }
        }
        if (lrp==-1) lrp=dc;
@@ -146,7 +146,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po
                int rpm9 = rp>=0 ? rp%9 : rp%9+9;
                int p10 = p10s[rpm9-1];
                uint32_t carry = 0;
-               for (k=a; k!=z; k=(k+1 & MASK)) {
+               for (k=a; k!=z; k++) {
                        uint32_t tmp = x[k] % p10;
                        x[k] = x[k]/p10 + carry;
                        carry = 1000000000/p10 * tmp;
@@ -155,12 +155,7 @@ static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int po
                                rp -= 9;
                        }
                }
-               if (carry) {
-                       if ((z+1 & MASK) != a) {
-                               x[z] = carry;
-                               z = (z+1 & MASK);
-                       } else x[z-1 & MASK] |= 1;
-               }
+               if (carry) x[z++] = carry;
                rp += 9-rpm9;
        }