Browse Source

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.

nsz 13 years ago
parent
commit
6ab8136b44
6 changed files with 25 additions and 24 deletions
  1. 13 0
      src/internal/libm.h
  2. 2 4
      src/math/nextafter.c
  3. 2 4
      src/math/nextafterf.c
  4. 4 8
      src/math/nextafterl.c
  5. 2 4
      src/math/nexttoward.c
  6. 2 4
      src/math/nexttowardf.c

+ 13 - 0
src/internal/libm.h

@@ -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 {                                                            \

+ 2 - 4
src/math/nextafter.c

@@ -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;
 }

+ 2 - 4
src/math/nextafterf.c

@@ -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;
 }

+ 4 - 8
src/math/nextafterl.c

@@ -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

+ 2 - 4
src/math/nexttoward.c

@@ -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

+ 2 - 4
src/math/nexttowardf.c

@@ -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;
 }