This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [COMMITTED] tilegx: enable wordsize-64 support for ieee745 dbl-64.
- From: Chris Metcalf <cmetcalf at ezchip dot com>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: Joseph Myers <joseph at codesourcery dot com>, GNU C Library <libc-alpha at sourceware dot org>
- Date: Tue, 23 Dec 2014 16:39:33 -0500
- Subject: Re: [COMMITTED] tilegx: enable wordsize-64 support for ieee745 dbl-64.
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp dot mailfrom=cmetcalf at ezchip dot com;
- References: <201412231905 dot sBNJ5c3C004622 at farm-0002 dot internal dot tilera dot com> <alpine dot DEB dot 2 dot 10 dot 1412231958370 dot 31777 at digraph dot polyomino dot org dot uk> <5499D4FE dot 8070405 at ezchip dot com> <5499DA84 dot 3010205 at ezchip dot com> <CAMe9rOr2DU5qYDQriF9RvAJCJF_wZ3gzqqHGDZXf+-OZFuJX0g at mail dot gmail dot com>
On 12/23/2014 4:21 PM, H.J. Lu wrote:
On Tue, Dec 23, 2014 at 1:11 PM, Chris Metcalf <cmetcalf@ezchip.com> wrote:
On 12/23/2014 3:47 PM, Chris Metcalf wrote:
On 12/23/2014 3:06 PM, Joseph Myers wrote:
I take it that the ABI on tilegx32 allows the lround alias to llround
No, it doesn't - I missed this possibility.
Actually, it is, of course, a little trickier than that, since
we have to prevent s_llround.c from setting up the alias for
lround() as well. But I think it may make sense to use global
conditional logic to do this. The current users of dbl-64/wordsize-64
are aarch64, alpha, sparc64, and x86_64. So as far as I know, the
question is whether the forthcoming ILP32 version of aarch64 would
benefit from this hack (probably yes) and whether the existing x32
version of x86_64 would (not clear to me, but plausibly better to clean
up the high bits of the returned value).
Please make sure that x32 version is unchanged where
lround is an alias of llround.
How about this version? We only need to #define the symbol for the rare
case of !_LP64, but still using dbl-64/wordsize-64. Not yet tested, so just
hoping for guidance with the model.
By the way, I could simplify the #if/#else body duplication if it's OK to
use an alias as the "source" of another alias, e.g. alias __llround to
__lround, then alias __lround to lround. Is that OK?
diff --git a/sysdeps/tile/sysdep.h b/sysdeps/tile/sysdep.h
index 32aca49ff104..d56566ddcbfd 100644
--- a/sysdeps/tile/sysdep.h
+++ b/sysdeps/tile/sysdep.h
@@ -66,6 +66,10 @@
#define REGSIZE 4
#endif
+/* On tilegx, 32-bit values must have their high 32 bits sign extended;
+ random values are not allowed. */
+#define USE_32BIT_NORMALIZE 1
+
/* Support a limited form of shared assembly between tilepro and tilegx.
The presumption is that LD/ST are used for manipulating registers.
Since opcode parsing is case-insensitive, we don't need to provide
diff --git a/sysdeps/x86_64/x32/sysdep.h b/sysdeps/x86_64/x32/sysdep.h
index 7461827c83a8..c3ebc50be8c4 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 USE_32BIT_NORMALIZE 0
diff --git a/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c b/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c
index da180fef55cf..0cbc2d31588c 100644
--- a/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c
+++ b/sysdeps/ieee754/dbl-64/wordsize-64/s_llround.c
@@ -64,16 +64,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. */
#undef lround
#undef __lround
+/* 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. */
+#if !defined (_LP64) && USE_32BIT_NORMALIZE
+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
--
Chris Metcalf, EZChip Semiconductor
http://www.ezchip.com