Hi Mike,

I guess you should CC fortran@gcc.gnu.org as well.

on 2024/7/11 01:25, Michael Meissner wrote:
> If you build a little endian compiler and select a default CPU of power5
> (i.e. --with-cpu=power5), GCC cannot be built.  The reason is that both the
> libgfortran and libstdc++-v3 libraries assume that all little endian powerpc
> builds support IEEE 128-bit floating point.
> 
> However, if the default cpu does not support the VSX instruction set, then we
> cannot build the IEEE 128-bit libraries.  This patch fixes the libgfortran
> library so if the GCC compiler does not support IEEE 128-bit floating point, 
> the
> IEEE 128-bit floating point libraries are not built.  A companion patch will 
> fix
> the libstdc++-v3 library.
> 
> I have built these patches on a little endian system, doing both normal 
> builds,
> and making a build with a power5 default.  There was no regression in the 
> normal
> builds.  I have also built a big endian GCC compiler and there was no 
> regression
> there.  Can I check this patch into the trunk?
> 
> 2024-07-10  Michael Meissner  <meiss...@linux.ibm.com>
> 
> libgfortran/
> 
>       PR target/115800
>       * configure.ac (powerpc64le*-linux*): Check to see that the compiler
>       uses VSX before enabling IEEE 128-bit support.
>       * configure: Regenerate.
>       * kinds-override.h (GFC_REAL_17): Add check for __VSX__.
>       * libgfortran.h (POWER_IEEE128): Likewise.
> 
> ---
>  libgfortran/configure        | 7 +++++--
>  libgfortran/configure.ac     | 3 +++
>  libgfortran/kinds-override.h | 2 +-
>  libgfortran/libgfortran.h    | 2 +-
>  4 files changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/libgfortran/configure b/libgfortran/configure
> index 11a1bc5f070..2708e5c7eca 100755
> --- a/libgfortran/configure
> +++ b/libgfortran/configure
> @@ -5981,6 +5981,9 @@ if test "x$GCC" = "xyes"; then
>  #if __SIZEOF_LONG_DOUBLE__ != 16
>                          #error long double is double
>                          #endif
> +                        #if !defined(__VSX__)
> +                        #error VSX is not available
> +                        #endif

All the touched code cares about type _Float128 which is available only if
TARGET_FLOAT128_TYPE is set (TARGET_FLOAT128_TYPE depends on VSX).  I think
we should check for macro __FLOAT128_TYPE__ instead (we define this macro
when TARGET_FLOAT128_TYPE is set), IMHO it looks more meaningful, this is
similar for libstdc++ sub-patch.

BR,
Kewen

>  int
>  main ()
>  {
> @@ -12847,7 +12850,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 12850 "configure"
> +#line 12853 "configure"
>  #include "confdefs.h"
>  
>  #if HAVE_DLFCN_H
> @@ -12953,7 +12956,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 12956 "configure"
> +#line 12959 "configure"
>  #include "confdefs.h"
>  
>  #if HAVE_DLFCN_H
> diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac
> index cca1ea0ea97..cfaeb9717ab 100644
> --- a/libgfortran/configure.ac
> +++ b/libgfortran/configure.ac
> @@ -148,6 +148,9 @@ if test "x$GCC" = "xyes"; then
>        AC_PREPROC_IFELSE(
>          [AC_LANG_PROGRAM([[#if __SIZEOF_LONG_DOUBLE__ != 16
>                          #error long double is double
> +                        #endif
> +                        #if !defined(__VSX__)
> +                        #error VSX is not available
>                          #endif]],
>                           [[(void) 0;]])],
>          [AM_FCFLAGS="$AM_FCFLAGS -mabi=ibmlongdouble -mno-gnu-attribute";
> diff --git a/libgfortran/kinds-override.h b/libgfortran/kinds-override.h
> index f6b4956c5ca..51f440e5323 100644
> --- a/libgfortran/kinds-override.h
> +++ b/libgfortran/kinds-override.h
> @@ -30,7 +30,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  
> If not, see
>  #endif
>  
>  /* Keep these conditions on one line so grep can filter it out.  */
> -#if defined(__powerpc64__)  && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  && 
> __SIZEOF_LONG_DOUBLE__ == 16
> +#if defined(__powerpc64__)  && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  && 
> __SIZEOF_LONG_DOUBLE__ == 16 && defined(__VSX__)
>  typedef _Float128 GFC_REAL_17;
>  typedef _Complex _Float128 GFC_COMPLEX_17;
>  #define HAVE_GFC_REAL_17
> diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h
> index 5c59ec26e16..23660335243 100644
> --- a/libgfortran/libgfortran.h
> +++ b/libgfortran/libgfortran.h
> @@ -104,7 +104,7 @@ typedef off_t gfc_offset;
>  #endif
>  
>  #if defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ \
> -    && defined __GLIBC_PREREQ
> +    && defined __GLIBC_PREREQ && defined(__VSX__)
>  #if __GLIBC_PREREQ (2, 32)
>  #define POWER_IEEE128 1
>  #endif


Reply via email to