math: fix aliasing violation in long double wrappers

modfl and sincosl were passing long double* instead of double*
to the wrapped double precision functions (on archs where long
double and double have the same size).
This is fixed now by using temporaries (this is not optimized
to a single branch so the generated code is a bit bigger).
Found by Morten Welinder.
This commit is contained in:
Szabolcs Nagy 2014-04-11 17:57:30 +02:00
parent 6fbdeff0e5
commit 73c870ed32
2 changed files with 10 additions and 2 deletions

View File

@ -3,7 +3,12 @@
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
long double modfl(long double x, long double *iptr)
{
return modf(x, (double *)iptr);
double d;
long double r;
r = modf(x, &d);
*iptr = d;
return r;
}
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
#if LDBL_MANT_DIG == 64

View File

@ -4,7 +4,10 @@
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
void sincosl(long double x, long double *sin, long double *cos)
{
sincos(x, (double *)sin, (double *)cos);
double sind, cosd;
sincos(x, &sind, &cosd);
*sin = sind;
*cos = cosd;
}
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
void sincosl(long double x, long double *sin, long double *cos)