aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meissner <meissner@linux.vnet.ibm.com>2018-01-11 23:31:09 +0000
committerMichael Meissner <meissner@gcc.gnu.org>2018-01-11 23:31:09 +0000
commit8c7a27d566e7144451d1f0eb79d6b5866035995f (patch)
tree866629ef524c5989733eec997136715953b1a31e
parent02a03501e439cd92b741034c32ce7238a927dff1 (diff)
downloadgcc-8c7a27d566e7144451d1f0eb79d6b5866035995f.zip
gcc-8c7a27d566e7144451d1f0eb79d6b5866035995f.tar.gz
gcc-8c7a27d566e7144451d1f0eb79d6b5866035995f.tar.bz2
configure.ac (--with-long-double-format): Add support for the configuration option to change the default long double...
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
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/config.gcc8
-rw-r--r--gcc/config/rs6000/rs6000-c.c13
-rwxr-xr-xgcc/configure47
-rw-r--r--gcc/configure.ac37
5 files changed, 113 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 70abf60c..b04df1c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 4ef52ce..3a6d523 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -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*-*-*)
diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c
index 7a6954a..b7693d0 100644
--- a/gcc/config/rs6000/rs6000-c.c
+++ b/gcc/config/rs6000/rs6000-c.c
@@ -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__");
}
diff --git a/gcc/configure b/gcc/configure
index 39eb3c8..376d341 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -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
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 3395ada..6d645fe 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -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