diff --git a/ChangeLog b/ChangeLog index 0e6e224927..123b0b28fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2015-01-05 Chris Metcalf + + * sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c [!defined _LP64 + && REGISTER_CAST_INT32_TO_INT64]: Provide explicit lround() + function with cast from llround(). + * sysdeps/tile/sysdep.h (REGISTER_CAST_INT32_TO_INT64): Define. + * sysdeps/x86_64/x32/sysdep.h (REGISTER_CAST_INT32_TO_INT64): + Define. + 2015-01-05 Joseph Myers [BZ #17793] diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c index 885260163e..8bb52524b7 100644 --- a/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c +++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c @@ -21,6 +21,7 @@ #define __lround __hidden___lround #include +#include #include @@ -64,16 +65,31 @@ __llround (double x) weak_alias (__llround, llround) #ifdef NO_LONG_DOUBLE -strong_alias (__llround, __lroundl) -weak_alias (__llround, lroundl) -#endif - -/* long has the same width as long long on 64-bit machines. */ -#undef lround -#undef __lround -strong_alias (__llround, __lround) -weak_alias (__llround, lround) -#ifdef NO_LONG_DOUBLE strong_alias (__llround, __llroundl) weak_alias (__llround, llroundl) #endif + +/* long has the same width as long long on LP64 machines, so use an alias. + If building for ILP32 on a machine with 64-bit registers, however, + use a cast if necessary. */ +#undef lround +#undef __lround +#if !defined (_LP64) && REGISTER_CAST_INT32_TO_INT64 +long int +__lround (double x) +{ + return __llround (x); +} +weak_alias (__lround, lround) +# ifdef NO_LONG_DOUBLE +strong_alias (__lround, __lroundl) +weak_alias (__lround, lroundl) +# endif +#else +strong_alias (__llround, __lround) +weak_alias (__llround, lround) +# ifdef NO_LONG_DOUBLE +strong_alias (__llround, __lroundl) +weak_alias (__llround, lroundl) +# endif +#endif diff --git a/sysdeps/tile/sysdep.h b/sysdeps/tile/sysdep.h index ead9dba0b4..7b3d8739d2 100644 --- a/sysdeps/tile/sysdep.h +++ b/sysdeps/tile/sysdep.h @@ -108,3 +108,7 @@ #endif #endif /* __ASSEMBLER__ */ + +/* On tilegx, 32-bit values must have their high 32 bits sign extended; + random values are not allowed. */ +#define REGISTER_CAST_INT32_TO_INT64 1 diff --git a/sysdeps/x86_64/x32/sysdep.h b/sysdeps/x86_64/x32/sysdep.h index 9b8700522f..0cbc1a083f 100644 --- a/sysdeps/x86_64/x32/sysdep.h +++ b/sysdeps/x86_64/x32/sysdep.h @@ -90,3 +90,7 @@ # define R15_LP "r15d" #endif /* __ASSEMBLER__ */ + +/* On x32, it is not required to normalize a 64-bit value before using + it as a 32-bit value. */ +#define REGISTER_CAST_INT32_TO_INT64 0