add FORCE_EVAL macro to evaluate float expr for their side effect
[musl] / src / internal / libm.h
index 67c42b9..a71c4c0 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 {                                                            \
@@ -173,14 +186,6 @@ union lcomplex {
        long double a[2];
 };
 
-// FIXME: move to complex.h ?
-#define creal(z) ((double)(z))
-#define crealf(z) ((float)(z))
-#define creall(z) ((long double)(z))
-#define cimag(z) ((union dcomplex){(z)}.a[1])
-#define cimagf(z) ((union fcomplex){(z)}.a[1])
-#define cimagl(z) ((union lcomplex){(z)}.a[1])
-
 /* x + y*I is not supported properly by gcc */
 #define cpack(x,y) ((union dcomplex){.a={(x),(y)}}.z)
 #define cpackf(x,y) ((union fcomplex){.a={(x),(y)}}.z)