This is the mail archive of the mailing list for the glibc 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]

Re: [COMMITTED] tilegx: enable wordsize-64 support for ieee745 dbl-64.

On 12/23/2014 4:21 PM, H.J. Lu wrote:
On Tue, Dec 23, 2014 at 1:11 PM, Chris Metcalf <> 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

+/* 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)
-strong_alias (__llround, __lroundl)
-weak_alias (__llround, lroundl)
+strong_alias (__llround, __llroundl)
+weak_alias (__llround, llroundl)

-/* 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)
+strong_alias (__lround, __lroundl)
+weak_alias (__lround, lroundl)
+# endif
 strong_alias (__llround, __lround)
 weak_alias (__llround, lround)
-strong_alias (__llround, __llroundl)
-weak_alias (__llround, llroundl)
+strong_alias (__llround, __lroundl)
+weak_alias (__llround, lroundl)
+# endif

Chris Metcalf, EZChip Semiconductor

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