https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=e4094e49c10dba19e4c2f9fa390b12473f017c42
commit e4094e49c10dba19e4c2f9fa390b12473f017c42 Author: Corinna Vinschen <[email protected]> Date: Wed Jun 7 11:03:16 2017 +0200 cygwin: Fix lrint{f,l} to return a 64 bit long on x86_64 Mingw-w64 (where the code has been taken from) has 4 byte longs independently of the architecture but x86_64 Cygwin has 64 bit longs. So use fistpll instead of fistpl on x86_64 Cygwin. Signed-off-by: Corinna Vinschen <[email protected]> Diff: --- winsup/cygwin/math/lrint.c | 4 +++- winsup/cygwin/math/lrintf.c | 4 +++- winsup/cygwin/math/lrintl.c | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/math/lrint.c b/winsup/cygwin/math/lrint.c index 0409da6..0d38107 100644 --- a/winsup/cygwin/math/lrint.c +++ b/winsup/cygwin/math/lrint.c @@ -21,7 +21,9 @@ asm(".def __lrint_internal; .scl 2; .type 32; .endef\n" long lrint (double x) { long retval = 0L; -#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__) +#if defined (__x86_64__) && defined (__CYGWIN__) + __asm__ __volatile__ ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); +#elif defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__) __asm__ __volatile__ ("fistpl %0" : "=m" (retval) : "t" (x) : "st"); #elif defined(__arm__) || defined(_ARM_) retval = __lrint_internal(x); diff --git a/winsup/cygwin/math/lrintf.c b/winsup/cygwin/math/lrintf.c index 2b6d893..9a300e1 100644 --- a/winsup/cygwin/math/lrintf.c +++ b/winsup/cygwin/math/lrintf.c @@ -21,7 +21,9 @@ asm(".def __lrintf_internal; .scl 2; .type 32; .endef\n" long lrintf (float x) { long retval = 0l; -#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__) +#if defined (__x86_64__) && defined (__CYGWIN__) + __asm__ __volatile__ ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); +#elif defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__) __asm__ __volatile__ ("fistpl %0" : "=m" (retval) : "t" (x) : "st"); #elif defined(__arm__) || defined(_ARM_) retval = __lrintf_internal(x); diff --git a/winsup/cygwin/math/lrintl.c b/winsup/cygwin/math/lrintl.c index 94c4e49..c25df92 100644 --- a/winsup/cygwin/math/lrintl.c +++ b/winsup/cygwin/math/lrintl.c @@ -8,7 +8,9 @@ long lrintl (long double x) { long retval = 0l; -#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__) +#if defined (__x86_64__) && defined (__CYGWIN__) + __asm__ __volatile__ ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); +#elif defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__) __asm__ __volatile__ ("fistpl %0" : "=m" (retval) : "t" (x) : "st"); #elif defined(__arm__) || defined(_ARM_) retval = lrint(x);
