optimize signbit macro
[musl] / include / math.h
index 9c06c96..ff62cb7 100644 (file)
@@ -41,8 +41,11 @@ int __fpclassify(double);
 int __fpclassifyf(float);
 int __fpclassifyl(long double);
 
-#define __FLOAT_BITS(f) (((union { float __f; __uint32_t __i; }){ (f) }).__i)
-#define __DOUBLE_BITS(f) (((union { double __f; __uint64_t __i; }){ (f) }).__i)
+union __float_repr { float __f; __uint32_t __i; };
+union __double_repr { double __f; __uint64_t __i; };
+
+#define __FLOAT_BITS(f) (((union __float_repr){ (float)(f) }).__i)
+#define __DOUBLE_BITS(f) (((union __double_repr){ (double)(f) }).__i)
 
 #define fpclassify(x) ( \
        sizeof(x) == sizeof(float) ? __fpclassifyf(x) : \
@@ -74,8 +77,8 @@ int __signbitf(float);
 int __signbitl(long double);
 
 #define signbit(x) ( \
-       sizeof(x) == sizeof(float) ? !!(__FLOAT_BITS(x) & 0x80000000) : \
-       sizeof(x) == sizeof(double) ? !!(__DOUBLE_BITS(x) & (__uint64_t)1<<63) : \
+       sizeof(x) == sizeof(float) ? (int)(__FLOAT_BITS(x)>>31) : \
+       sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS(x)>>63) : \
        __signbitl(x) )
 
 #define isunordered(x,y) (isnan((x)) ? ((void)(y),1) : isnan((y)))
@@ -345,10 +348,6 @@ long double truncl(long double);
 
 extern int signgam;
 
-double      gamma(double);
-float       gammaf(float);
-long double gammal(long double);
-
 double      j0(double);
 double      j1(double);
 double      jn(int, double);
@@ -367,6 +366,10 @@ void        sincos(double, double*, double*);
 void        sincosf(float, float*, float*);
 void        sincosl(long double, long double*, long double*);
 
+double      gamma(double);
+float       gammaf(float);
+long double gammal(long double);
+
 double      lgamma_r(double, int*);
 float       lgammaf_r(float, int*);
 long double lgammal_r(long double, int*);