configure.ac (--with-long-double-format): Add support for the configuration option...
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Thu, 11 Jan 2018 23:31:09 +0000 (23:31 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Thu, 11 Jan 2018 23:31:09 +0000 (23:31 +0000)
2018-01-11  Michael Meissner  <meissner@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.

From-SVN: r256558

gcc/ChangeLog
gcc/config.gcc
gcc/config/rs6000/rs6000-c.c
gcc/configure
gcc/configure.ac

index 70abf60ce84c235d1cc6e6f8e2567d9b9219aff0..b04df1cf4764c84147e96e6412a9af464f848140 100644 (file)
@@ -1,3 +1,14 @@
+2018-01-11  Michael Meissner  <meissner@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.
+
 2018-01-11  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * config/rs6000/rs6000-builtin.def (BU_P7_MISC_X): New #define.
index 4ef52ce8b74a7c2380377e46b8911d0a137c2e7f..3a6d52318a54a162e35ea9e1202f59ca1b9dda3d 100644 (file)
@@ -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 7a6954a02c7f32d5d4d6d2ad8cc51e7995f1bf3b..b7693d088095babf4270637e9b339fa2f04f2606 100644 (file)
@@ -708,7 +708,18 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile)
       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__");
     }
index 39eb3c829307f4f38b434262f4cbc723d18a1d34..376d34107628878130902a5bd072335d1bc4e8a1 100755 (executable)
@@ -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_DOUBLE_128 1" >>confdefs.h
 
 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
+# libgcc.
+
+# Check whether --with-long-double-format was given.
+if test "${with_long_double_format+set}" = set; then :
+  withval=$with_long_double_format;
+case "$target:$with_long_double_format" in
+  powerpc64le-*-linux*:ieee | powerpc64le-*-linux*:ibm)
+    :
+    ;;
+  powerpc64-*-linux*:ieee | powerpc64-*-linux*:ibm)
+    # IEEE 128-bit emulation 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 3395ada1bdcd814f83e2f276429e63a54f1c83c8..6d645fe54123668326e019234dfec669601a1013 100644 (file)
@@ -5885,6 +5885,43 @@ if test x$gcc_cv_target_ldbl128 = xyes; then
            [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
+# libgcc.
+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 "$target:$with_long_double_format" in
+  powerpc64le-*-linux*:ieee | powerpc64le-*-linux*:ibm)
+    :
+    ;;
+  powerpc64-*-linux*:ieee | powerpc64-*-linux*:ibm)
+    # IEEE 128-bit emulation 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