aboutsummaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2017-06-07 11:03:16 +0200
committerCorinna Vinschen <corinna@vinschen.de>2017-06-07 11:03:16 +0200
commite4094e49c10dba19e4c2f9fa390b12473f017c42 (patch)
tree87ce00dc3fbb93b8053acfca31a1b1d6488dfd8e /winsup
parent163066a1a5fec04b3b05d44955fe1b07c0391f1c (diff)
downloadnewlib-e4094e49c10dba19e4c2f9fa390b12473f017c42.zip
newlib-e4094e49c10dba19e4c2f9fa390b12473f017c42.tar.gz
newlib-e4094e49c10dba19e4c2f9fa390b12473f017c42.tar.bz2
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>
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/math/lrint.c4
-rw-r--r--winsup/cygwin/math/lrintf.c4
-rw-r--r--winsup/cygwin/math/lrintl.c4
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);