This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] cygwin: Fix lrint{f, l} to return a 64 bit long on x86_64


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=e4094e49c10dba19e4c2f9fa390b12473f017c42

commit e4094e49c10dba19e4c2f9fa390b12473f017c42
Author: Corinna Vinschen <corinna@vinschen.de>
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 <corinna@vinschen.de>

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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]