add FORCE_EVAL macro to evaluate float expr for their side effect
authornsz <nsz@port70.net>
Sun, 6 May 2012 19:24:28 +0000 (21:24 +0200)
committernsz <nsz@port70.net>
Sun, 6 May 2012 19:24:28 +0000 (21:24 +0200)
updated nextafter* to use FORCE_EVAL, it can be used in many other
places in the math code to improve readability.

src/internal/libm.h
src/math/nextafter.c
src/math/nextafterf.c
src/math/nextafterl.c
src/math/nexttoward.c
src/math/nexttowardf.c

index 8c5474a8483091e4d5582722b9e0916755845227..a71c4c05ab092b77bfd2c24e8a6eaab569745bea 100644 (file)
@@ -32,6 +32,19 @@ union dshape {
        uint64_t bits;
 };
 
+#define FORCE_EVAL(x) do {                          \
+       if (sizeof(x) == sizeof(float)) {           \
+               volatile float __x;                 \
+               __x = (x);                          \
+       } else if (sizeof(x) == sizeof(double)) {   \
+               volatile double __x;                \
+               __x = (x);                          \
+       } else {                                    \
+               volatile long double __x;           \
+               __x = (x);                          \
+       }                                           \
+} while(0)
+
 /* Get two 32 bit ints from a double.  */
 #define EXTRACT_WORDS(hi,lo,d)                                  \
 do {                                                            \
index e4bfb022cb8d81471764a393442e024188fa8813..a3b42c99d197e4fc925653e4535c1ba95c74cb8b 100644 (file)
@@ -29,9 +29,7 @@ double nextafter(double x, double y)
        if (e == 0x7ff)
                return x + x;
        /* raise underflow if ux.value is subnormal or zero */
-       if (e == 0) {
-               volatile double z;
-               z = x*x + ux.value*ux.value;
-       }
+       if (e == 0)
+               FORCE_EVAL(x*x + ux.value*ux.value);
        return ux.value;
 }
index 47775b92fd1db2c9c211fe0ea156d9ba10dc2276..b703487bbca25211cffb54dd000ebe5c34d69189 100644 (file)
@@ -28,9 +28,7 @@ float nextafterf(float x, float y)
        if (e == 0x7f800000)
                return x + x;
        /* raise underflow if ux.value is subnormal or zero */
-       if (e == 0) {
-               volatile float z;
-               z = x*x + ux.value*ux.value;
-       }
+       if (e == 0)
+               FORCE_EVAL(x*x + ux.value*ux.value);
        return ux.value;
 }
index c09d9dd0e0f2863722df950748ef1c0f16feed87..edc3cc9c7626292623a44525f8a09cf5004480d3 100644 (file)
@@ -38,10 +38,8 @@ long double nextafterl(long double x, long double y)
        if (ux.bits.exp == 0x7fff)
                return x + x;
        /* raise underflow if ux.value is subnormal or zero */
-       if (ux.bits.exp == 0) {
-               volatile float z;
-               z = x*x + ux.value*ux.value;
-       }
+       if (ux.bits.exp == 0)
+               FORCE_EVAL(x*x + ux.value*ux.value);
        return ux.value;
 }
 #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
@@ -77,10 +75,8 @@ long double nextafterl(long double x, long double y)
        if (ux.bits.exp == 0x7fff)
                return x + x;
        /* raise underflow if ux.value is subnormal or zero */
-       if (ux.bits.exp == 0) {
-               volatile float z;
-               z = x*x + ux.value*ux.value;
-       }
+       if (ux.bits.exp == 0)
+               FORCE_EVAL(x*x + ux.value*ux.value);
        return ux.value;
 }
 #endif
index 43f8fee8decc33efa08bb168d187445e36023ba1..7355f2f19d5afa71fb7a985d72d724ca74d59fd8 100644 (file)
@@ -38,10 +38,8 @@ double nexttoward(double x, long double y)
        if (e == 0x7ff)
                return x + x;
        /* raise underflow if ux.value is subnormal or zero */
-       if (e == 0) {
-               volatile float z;
-               z = x*x + ux.value*ux.value;
-       }
+       if (e == 0)
+               FORCE_EVAL(x*x + ux.value*ux.value);
        return ux.value;
 }
 #endif
index e8e6f67641ae672f9534f9dbe95b01f29f2ed53a..8648be6a684a669a2fd3a37784ccdac3733f060a 100644 (file)
@@ -30,9 +30,7 @@ float nexttowardf(float x, long double y)
        if (e == 0x7f800000)
                return x + x;
        /* raise underflow if ux.value is subnormal or zero */
-       if (e == 0) {
-               volatile float z;
-               z = x*x + ux.value*ux.value;
-       }
+       if (e == 0)
+               FORCE_EVAL(x*x + ux.value*ux.value);
        return ux.value;
 }