This is the mail archive of the libc-alpha@sourceware.org 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 Tue, Dec 23, 2014 at 1:39 PM, Chris Metcalf <cmetcalf@ezchip.com> wrote:
> 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
>

You can provide a safe default and let x32 override it.

-- 
H.J.


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