math: remove STRICT_ASSIGN macro
authorSzabolcs Nagy <nsz@port70.net>
Fri, 6 Sep 2013 18:35:55 +0000 (18:35 +0000)
committerSzabolcs Nagy <nsz@port70.net>
Fri, 6 Sep 2013 18:35:55 +0000 (18:35 +0000)
gcc did not always drop excess precision according to c99 at assignments
before version 4.5 even if -std=c99 was requested which caused badly
broken mathematical functions on i386 when FLT_EVAL_METHOD!=0

but STRICT_ASSIGN was not used consistently and it is worked around for
old compilers with -ffloat-store so it is no longer needed

the new convention is to get the compiler respect c99 semantics and when
excess precision is not harmful use float_t or double_t or to specialize
code using FLT_EVAL_METHOD

src/internal/libm.h
src/math/__rem_pio2.c
src/math/__rem_pio2_large.c
src/math/__rem_pio2f.c
src/math/exp.c
src/math/exp2.c
src/math/expf.c
src/math/expm1.c
src/math/expm1f.c
src/math/log1p.c
src/math/log1pf.c

index 9f0d3bc834ef615c9fd4f39155c2ad86805e80d5..ebcd78498d0e1ba2a0ad2937435457ef74793019 100644 (file)
@@ -155,15 +155,4 @@ long double __tanl(long double, long double, int);
 long double __polevll(long double, const long double *, int);
 long double __p1evll(long double, const long double *, int);
 
-#if 0
-/* Attempt to get strict C99 semantics for assignment with non-C99 compilers. */
-#define STRICT_ASSIGN(type, lval, rval) do {    \
-        volatile type __v = (rval);             \
-        (lval) = __v;                           \
-} while (0)
-#else
-/* Should work with -fexcess-precision=standard (>=gcc-4.5) or -ffloat-store */
-#define STRICT_ASSIGN(type, lval, rval) ((lval) = (type)(rval))
-#endif
-
 #endif
index 0ef57fb5b8a3c675900e745c9cd076a04c5e1663..9305be5fd432650485b307bd5636da4deebfa817 100644 (file)
@@ -112,7 +112,7 @@ int __rem_pio2(double x, double *y)
                uint32_t high;
 medium:
                /* Use a specialized rint() to get fn.  Assume round-to-nearest. */
-               STRICT_ASSIGN(double, fn, x*invpio2 + 0x1.8p52);
+               fn = x*invpio2 + 0x1.8p52;
                fn = fn - 0x1.8p52;
 // FIXME
 #ifdef HAVE_EFFICIENT_IRINT
index 27b619ccd54a05dcfe23fdcb39127092a9ce85fc..bb2dc43fe444e42591a2585d30c3d0cd9de8d499 100644 (file)
@@ -415,7 +415,8 @@ recompute:
                fw = 0.0;
                for (i=jz; i>=0; i--)
                        fw += fq[i];
-               STRICT_ASSIGN(double,fw,fw);
+               // TODO: drop excess precision here once double_t is used
+               fw = (double)fw;
                y[0] = ih==0 ? fw : -fw;
                fw = fq[0]-fw;
                for (i=1; i<=jz; i++)
index 198ee91b16bc08cbfa1112905152f2a1a318f3b7..5bdeb52984651b31138f456fae7bd3db41ecadb0 100644 (file)
@@ -44,7 +44,7 @@ int __rem_pio2f(float x, double *y)
        /* 25+53 bit pi is good enough for medium size */
        if (ix < 0x4dc90fdb) {  /* |x| ~< 2^28*(pi/2), medium size */
                /* Use a specialized rint() to get fn.  Assume round-to-nearest. */
-               STRICT_ASSIGN(double, fn, x*invpio2 + 0x1.8p52);
+               fn = x*invpio2 + 0x1.8p52;
                fn = fn - 0x1.8p52;
 // FIXME
 #ifdef HAVE_EFFICIENT_IRINT
index 2b182acdeace1763cce73ab9b637d81cdcf48df9..9ea672fac6168b16c33cffa2b9f48960cf3c2f81 100644 (file)
@@ -94,7 +94,7 @@ double exp(double x)
                        return x;
                if (x > 709.782712893383973096) {
                        /* overflow if x!=inf */
-                       STRICT_ASSIGN(double, x, 0x1p1023 * x);
+                       x *= 0x1p1023;
                        return x;
                }
                if (x < -708.39641853226410622) {
@@ -113,7 +113,7 @@ double exp(double x)
                        k = 1 - sign - sign;
                hi = x - k*ln2hi;  /* k*ln2hi is exact here */
                lo = k*ln2lo;
-               STRICT_ASSIGN(double, x, hi - lo);
+               x = hi - lo;
        } else if (hx > 0x3e300000)  {  /* if |x| > 2**-28 */
                k = 0;
                hi = x;
index 2e078fb038a4dacf6fe906fe58bc47b813416062..e14adba530e49d25849107a75952d7776402319b 100644 (file)
@@ -340,7 +340,7 @@ double exp2(double x)
        if (ix >= 0x408ff000) {  /* |x| >= 1022 or nan */
                if (ix >= 0x40900000 && u.i>>63 == 0) {  /* x >= 1024 or nan */
                        /* overflow */
-                       STRICT_ASSIGN(double, x, x * 0x1p1023);
+                       x *= 0x1p1023;
                        return x;
                }
                if (ix >= 0x7ff00000)  /* -inf or -nan */
index 5572bbf639bc5819382ae75f7ccdcc7eb17ef5fb..16e9afe62a21cbd09d6845f8076fb37e4fa5a560 100644 (file)
@@ -41,7 +41,7 @@ float expf(float x)
        if (hx >= 0x42aeac50) {  /* if |x| >= -87.33655f or NaN */
                if (hx >= 0x42b17218 && !sign) {  /* x >= 88.722839f */
                        /* overflow */
-                       STRICT_ASSIGN(float, x, x * 0x1p127f);
+                       x *= 0x1p127f;
                        return x;
                }
                if (sign) {
@@ -60,7 +60,7 @@ float expf(float x)
                        k = 1 - sign - sign;
                hi = x - k*ln2hi;  /* k*ln2hi is exact here */
                lo = k*ln2lo;
-               STRICT_ASSIGN(float, x, hi - lo);
+               x = hi - lo;
        } else if (hx > 0x39000000) {  /* |x| > 2**-14 */
                k = 0;
                hi = x;
index a7eb2c0bd51a3006fe7ee588bd8a3fbb12bed216..ac1e61e4f7f6a0d09651c814f7885cc6f25b163a 100644 (file)
@@ -155,7 +155,7 @@ double expm1(double x)
                        hi = x - t*ln2_hi;  /* t*ln2_hi is exact here */
                        lo = t*ln2_lo;
                }
-               STRICT_ASSIGN(double, x, hi - lo);
+               x = hi-lo;
                c = (hi-x)-lo;
        } else if (hx < 0x3c900000) {  /* |x| < 2**-54, return x */
                if (hx < 0x00100000)
index 698ab45f40a5c6a077f43aa9eefd8320f84224c5..297e0b44a2ebcc99d406bc7641d1fbf8aa76b097 100644 (file)
@@ -65,7 +65,7 @@ float expm1f(float x)
                        hi = x - t*ln2_hi;      /* t*ln2_hi is exact here */
                        lo = t*ln2_lo;
                }
-               STRICT_ASSIGN(float, x, hi - lo);
+               x = hi-lo;
                c = (hi-x)-lo;
        } else if (hx < 0x33000000) {  /* when |x|<2**-25, return x */
                if (hx < 0x00800000)
index 9bed63c298356c6c692a452892cc1c36b8072a74..a71ac42367dda0fed4ff396656f06fcdd05e4155 100644 (file)
@@ -122,7 +122,7 @@ double log1p(double x)
                return x+x;
        if (k != 0) {
                if (hx < 0x43400000) {
-                       STRICT_ASSIGN(double, u, 1.0 + x);
+                       u = 1 + x;
                        GET_HIGH_WORD(hu, u);
                        k = (hu>>20) - 1023;
                        c = k > 0 ? 1.0-(u-x) : x-(u-1.0); /* correction term */
index c38e0bcbd331a366d9559d030f0b554c6fb91d85..e6940d296eac6f21c441bfcc38055da481b00dda 100644 (file)
@@ -61,7 +61,7 @@ float log1pf(float x)
                return x+x;
        if (k != 0) {
                if (hx < 0x5a000000) {
-                       STRICT_ASSIGN(float, u, 1.0f + x);
+                       u = 1 + x;
                        GET_FLOAT_WORD(hu, u);
                        k = (hu>>23) - 127;
                        /* correction term */