add FORCE_EVAL macro to evaluate float expr for their side effect updated nextafter* to use FORCE_EVAL, it can be used in many other places in the math code to improve readability.
diff --git a/src/internal/libm.h b/src/internal/libm.h index 8c5474a..a71c4c0 100644 --- a/src/internal/libm.h +++ b/src/internal/libm.h
@@ -32,6 +32,19 @@ 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 { \
diff --git a/src/math/nextafter.c b/src/math/nextafter.c index e4bfb02..a3b42c9 100644 --- a/src/math/nextafter.c +++ b/src/math/nextafter.c
@@ -29,9 +29,7 @@ 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; }
diff --git a/src/math/nextafterf.c b/src/math/nextafterf.c index 47775b9..b703487 100644 --- a/src/math/nextafterf.c +++ b/src/math/nextafterf.c
@@ -28,9 +28,7 @@ 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; }
diff --git a/src/math/nextafterl.c b/src/math/nextafterl.c index c09d9dd..edc3cc9 100644 --- a/src/math/nextafterl.c +++ b/src/math/nextafterl.c
@@ -38,10 +38,8 @@ 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 @@ 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
diff --git a/src/math/nexttoward.c b/src/math/nexttoward.c index 43f8fee..7355f2f 100644 --- a/src/math/nexttoward.c +++ b/src/math/nexttoward.c
@@ -38,10 +38,8 @@ 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
diff --git a/src/math/nexttowardf.c b/src/math/nexttowardf.c index e8e6f67..8648be6 100644 --- a/src/math/nexttowardf.c +++ b/src/math/nexttowardf.c
@@ -30,9 +30,7 @@ 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; }