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: [PATCH v3 4/8] float128: Add public _Float128 declarations to libm.


On Tue, 9 May 2017 22:56:22 +0000
Joseph Myers <joseph@codesourcery.com> wrote:

> On Tue, 9 May 2017, Gabriel F. T. Gomes wrote:
>
> > --- /dev/null
> > +++ b/sysdeps/powerpc/powerpc64le/bits/floatn-compat.h  
> 
> GCC supports a range of multilib configurations with both BE and LE 
> libraries for powerpc64.
> 
> In such configurations, the same headers are shared between multilibs.  So 
> you can't have a separate version of an installed header for powerpc64le.  
> Instead, you need to have one header with appropriate preprocessor 
> conditionals that express that _Float128 is supported for powerpc64le, but 
> not for BE.  And it would go in sysdeps/powerpc so all powerpc 
> configurations get that same header installed.

OK.

> Or maybe nothing actually requires bits/floatn.h and bits/floatn-compat.h 
> to be separate and all the definitions should just go in bits/floatn.h 
> unless and until there are two architectures that need different versions 
> of one of the headers but the same version of the other.  That would avoid 
> various places needing to #include bits/floatn-compat.h, and avoid the 
> need to get includes in the correct order.

With bits/floatn.h moved from sysdeps/powerpc/powerpc64le to
sysdeps/powerpc (as explained above), merging bits/floatn-compat.h into
bits/floatn.h means that the workarounds for old compilers will be visible
in the headers for powerpc and powerpc64 installations.  That doesn't mean
that the workarounds will be defined (since they'll be inside #if
clauses).  Is that visibility a problem?

> > diff --git a/sysdeps/powerpc/powerpc64le/bits/floatn-compat.h b/sysdeps/powerpc/powerpc64le/bits/floatn-compat.h  
> 
> I think this file would better be in one of the patches actually adding 
> support on powerpc rather than in the present series, but I may as well 
> review the contents now.

Since I moved this change to a future patch.  I attached the file here in
case you want to comment at this time.
/* Macros to control TS 18661-3 glibc features on powerpc.
   Copyright (C) 2016 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
#include <bits/libc-header-start.h>

/* Defined to 1 if the current compiler invocation provides a
   floating-point type with the IEEE 754 binary128 format, and this glibc
   includes corresponding *f128 interfaces for it.  */
#if defined _ARCH_PWR8 && defined __LITTLE_ENDIAN__ && (_CALL_ELF == 2) \
    && defined __FLOAT128__
# define __HAVE_FLOAT128 1
#else
# define __HAVE_FLOAT128 0
#endif

/* Defined to 1 if __HAVE_FLOAT128 is 1 and the type is ABI-distinct
   from the default float, double and long double types in this glibc.  */
#if __HAVE_FLOAT128
# define __HAVE_DISTINCT_FLOAT128 1
#else
# define __HAVE_DISTINCT_FLOAT128 0
#endif

/* Defined to concatenate the literal suffix to be used with _Float128
   types, if __HAVE_FLOAT128 is 1. */
#if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0)
/* The literal suffix (f128) exist for powerpc only since GCC 7.0.  */
#  define __f128(x) x##q
# else
#  define __f128(x) x##f128
# endif
#endif

/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1.  */
#if __HAVE_FLOAT128
# if !__GNUC_PREREQ (7, 0)
/* Add a typedef for older GCC compilers which don't natively support
   _Complex _Float128.  */
typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__KC__)));
#  define __CFLOAT128 __cfloat128
# else
#  define __CFLOAT128 _Complex _Float128
# endif
#endif

/* The remaining of this file provides support for older compilers.  */
#if __HAVE_FLOAT128

/* The type _Float128 exist for powerpc only since GCC 7.0.  */
# if !__GNUC_PREREQ (7, 0)
typedef __float128 _Float128;
# endif

/* Builtin __builtin_huge_valf128 doesn't exist before GCC 7.0.  */
# if !__GNUC_PREREQ (7, 0)
#  define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ())
# endif

/* The following builtins (suffixed with 'q') are available in GCC >= 6.2,
   which is the minimum version required for float128 support on powerpc64le.
   Since GCC 7.0 the builtins suffixed with f128 are also available, then
   there is no need to redefined them.  */
# if !__GNUC_PREREQ (7, 0)
#  define __builtin_copysignf128 __builtin_copysignq
#  define __builtin_fabsf128 __builtin_fabsq
#  define __builtin_inff128 __builtin_infq
#  define __builtin_nanf128 __builtin_nanq
#  define __builtin_nansf128 __builtin_nansq
# endif

#endif

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