about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c28
-rw-r--r--sysdeps/tile/sysdep.h4
-rw-r--r--sysdeps/x86_64/x32/sysdep.h4
4 files changed, 39 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 0e6e224927..123b0b28fc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2015-01-05  Chris Metcalf  <cmetcalf@ezchip.com>
+
+	* 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  <joseph@codesourcery.com>
 
 	[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 <math.h>
+#include <sysdep.h>
 
 #include <math_private.h>
 
@@ -64,16 +65,31 @@ __llround (double x)
 
 weak_alias (__llround, llround)
 #ifdef NO_LONG_DOUBLE
-strong_alias (__llround, __lroundl)
-weak_alias (__llround, lroundl)
+strong_alias (__llround, __llroundl)
+weak_alias (__llround, llroundl)
 #endif
 
-/* long has the same width as long long on 64-bit machines.  */
+/* 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, __llroundl)
-weak_alias (__llround, llroundl)
+# 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