X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Finternal%2Flibm.h;h=46c4b56451aa32fd70929628fc4687552f71ae6a;hp=021c4e2a3ab0c37ca392517ccac3a5a4739656ab;hb=8bb181622222f2ee3462c8b021bcae4fcdbbd37a;hpb=b69f695acedd4ce2798ef9ea28d834ceccc789bd diff --git a/src/internal/libm.h b/src/internal/libm.h index 021c4e2a..46c4b564 100644 --- a/src/internal/libm.h +++ b/src/internal/libm.h @@ -20,6 +20,8 @@ #include "longdbl.h" +#include "libc.h" + union fshape { float value; uint32_t bits; @@ -30,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 { \ @@ -133,54 +148,32 @@ float __tandf(double,int); float __expo2f(float); float complex __ldexp_cexpf(float complex,int); +int __rem_pio2l(long double, long double *); long double __sinl(long double, long double, int); long double __cosl(long double, long double); long double __tanl(long double, long double, int); /* polynomial evaluation */ -long double __polevll(long double, long double *, int); -long double __p1evll(long double, long double *, int); +long double __polevll(long double, const long double *, int); +long double __p1evll(long double, const long double *, int); -// FIXME: not needed when -fexcess-precision=standard is supported (>=gcc4.5) -/* - * Attempt to get strict C99 semantics for assignment with non-C99 compilers. - */ -#if 1 +#if 0 +/* Attempt to get strict C99 semantics for assignment with non-C99 compilers. */ #define STRICT_ASSIGN(type, lval, rval) do { \ volatile type __v = (rval); \ (lval) = __v; \ } while (0) #else +/* Should work with -fexcess-precision=standard (>=gcc-4.5) or -ffloat-store */ #define STRICT_ASSIGN(type, lval, rval) ((lval) = (type)(rval)) #endif - /* complex */ -union dcomplex { - double complex z; - double a[2]; -}; -union fcomplex { - float complex z; - float a[2]; -}; -union lcomplex { - long double complex z; - 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) -#define cpackl(x,y) ((union lcomplex){.a={(x),(y)}}.z) +#ifndef CMPLX +#define CMPLX(x, y) __CMPLX(x, y, double) +#define CMPLXF(x, y) __CMPLX(x, y, float) +#define CMPLXL(x, y) __CMPLX(x, y, long double) +#endif #endif