This patch is next in my series of patches to enable us to configure the long double type on PowerPC systems. This patch is only about the configuration option. A future patch will contain the multilib support.
This patch needs the previous patch I submitted today (January 10th, 2018) applied before it will work. https://gcc.gnu.org/ml/gcc-patches/2018-01/msg00806.html I built a bootstrap configuratrion on a little endian power8 system using the --with-long-double-format-ibm option and it passed with no regressions. I also built a non-bootstrap version using --with-long-double-format-ieee and I verified that it defaulted to IEEE 128-bit for long double. Can I check this patch into the trunk once the previous patch has been checked in? 2018-01-10 Michael Meissner <meiss...@linux.vnet.ibm.com> * configure.ac (--with-long-double-format): Add support for the configuration option to change the default long double format on PowerPC systems. * config.gcc (powerpc*-linux*-*): Likewise. * configure: Regenerate. * config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): If long double is IEEE, define __KC__ and __KF__ to allow floatn.h to be used without modification. -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.vnet.ibm.com, phone: +1 (978) 899-4797
Index: gcc/configure.ac =================================================================== --- gcc/configure.ac (revision 256356) +++ gcc/configure.ac (working copy) @@ -5885,6 +5885,43 @@ if test x$gcc_cv_target_ldbl128 = xyes; [Define if TFmode long double should be the default]) fi +# Check if TFmode long double target should use the IBM extended double or IEEE +# 128-bit floating point formats if long doubles are 128-bits long. The long +# double type can only be switched on powerpc64 bit Linux systems where VSX is +# supported. Other PowerPC systems do not build the IEEE 128-bit emulator in +# liggcc. +AC_ARG_WITH([long-double-format], + [AS_HELP_STRING([--with-long-double-format={ieee,ibm}] + [Specify whether PowerPC long double uses IEEE or IBM format])],[ +case x"$target:$with_long_double_format" in + xpowerpc64le-*-linux*:ieee | xpowerpc64le-*-linux*:ibm) + : + ;; + xpowerpc64-*-linux*:ieee | xpowerpc64-*-linux*:*:ibm) + # IEEE 128-bit emulationr is only built on 64-bit VSX Linux systems + case "$with_cpu" in + power7 | power8 | power9 | power1*) + : + ;; + *) + AC_MSG_ERROR([Configuration option --with-long-double-format is only \ +supported if the default cpu is power7 or newer]) + with_long_double_format="" + ;; + esac + ;; + xpowerpc64*-*-linux*:*) + AC_MSG_ERROR([--with-long-double-format argument should be ibm or ieee]) + with_long_double_format="" + ;; + *) + AC_MSG_ERROR([Configure option --with-long-double-format is only supported \ +on 64-bit PowerPC VSX Linux systems]) + with_long_double_format="" + ;; +esac], + []) + # Check if the target LIBC supports exporting the AT_PLATFORM and AT_HWCAP # values in the TCB. Currently, only GLIBC 2.23 and later support this. gcc_cv_libc_provides_hwcap_in_tcb=no Index: gcc/configure =================================================================== --- gcc/configure (revision 256356) +++ gcc/configure (working copy) @@ -945,6 +945,7 @@ enable_linker_build_id enable_libssp enable_default_ssp with_long_double_128 +with_long_double_format with_gc with_system_zlib enable_maintainer_mode @@ -1738,6 +1739,9 @@ Optional Packages: --with-glibc-version=M.N assume GCC used with glibc version M.N or later --with-long-double-128 use 128-bit long double by default + --with-long-double-format={ieee,ibm} + Specify whether PowerPC long double uses IEEE or IBM format + --with-gc={page,zone} this option is not supported anymore. It used to choose the garbage collection mechanism to use with the compiler @@ -18442,7 +18446,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18445 "configure" +#line 18449 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18548,7 +18552,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18551 "configure" +#line 18555 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -29185,6 +29189,45 @@ $as_echo "#define TARGET_DEFAULT_LONG_DO fi +# Check if TFmode long double target should use the IBM extended double or IEEE +# 128-bit floating point formats if long doubles are 128-bits long. The long +# double type can only be switched on powerpc64 bit Linux systems where VSX is +# supported. Other PowerPC systems do not build the IEEE 128-bit emulator in +# liggcc. + +# Check whether --with-long-double-format was given. +if test "${with_long_double_format+set}" = set; then : + withval=$with_long_double_format; +case x"$target:$with_long_double_format" in + xpowerpc64le-*-linux*:ieee | xpowerpc64le-*-linux*:ibm) + : + ;; + xpowerpc64-*-linux*:ieee | xpowerpc64-*-linux*:*:ibm) + # IEEE 128-bit emulationr is only built on 64-bit VSX Linux systems + case "$with_cpu" in + power7 | power8 | power9 | power1*) + : + ;; + *) + as_fn_error "Configuration option --with-long-double-format is only \ +supported if the default cpu is power7 or newer" "$LINENO" 5 + with_long_double_format="" + ;; + esac + ;; + xpowerpc64*-*-linux*:*) + as_fn_error "--with-long-double-format argument should be ibm or ieee" "$LINENO" 5 + with_long_double_format="" + ;; + *) + as_fn_error "Configure option --with-long-double-format is only supported \ +on 64-bit PowerPC VSX Linux systems" "$LINENO" 5 + with_long_double_format="" + ;; +esac +fi + + # Check if the target LIBC supports exporting the AT_PLATFORM and AT_HWCAP # values in the TCB. Currently, only GLIBC 2.23 and later support this. gcc_cv_libc_provides_hwcap_in_tcb=no Index: gcc/config.gcc =================================================================== --- gcc/config.gcc (revision 256356) +++ gcc/config.gcc (working copy) @@ -4400,6 +4400,14 @@ case "${target}" in exit 1 fi fi + + # Set up the default long double format if the user changed it. + if test x$with_long_double_format = xieee; then + tm_defines="${tm_defines} TARGET_IEEEQUAD_DEFAULT=1" + + elif test x$with_long_double_format = xibm; then + tm_defines="${tm_defines} TARGET_IEEEQUAD_DEFAULT=0" + fi ;; s390*-*-*) Index: gcc/config/rs6000/rs6000-c.c =================================================================== --- gcc/config/rs6000/rs6000-c.c (revision 256356) +++ gcc/config/rs6000/rs6000-c.c (working copy) @@ -708,7 +708,18 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfi builtin_define ("__LONGDOUBLE128"); if (TARGET_IEEEQUAD) - builtin_define ("__LONG_DOUBLE_IEEE128__"); + { + /* Older versions of GLIBC used __attribute__((__KC__)) to create the + IEEE 128-bit floating point complex type for C++ (which does not + support _Float128 _Complex). If the default for long double is + IEEE 128-bit mode, the library would need to use + __attribute__((__TC__)) instead. Defining __KF__ and __KC__ + is a stop-gap to build with the older libraries, until we + get an updated library. */ + builtin_define ("__LONG_DOUBLE_IEEE128__"); + builtin_define ("__KF__=__TF__"); + builtin_define ("__KC__=__TC__"); + } else builtin_define ("__LONG_DOUBLE_IBM128__"); }