Of course it would be helpful, if I included the patch: 2018-01-12 Michael Meissner <meiss...@linux.vnet.ibm.com>
* config.gcc (powerpc*-linux*-*): Add support for 64-bit little endian Linux systems to optionally enable multilibs for selecting the long double type if the user configured an explicit type. * config/rs6000/rs6000.h (TARGET_IEEEQUAD_MULTILIB): Indicate we have no long double multilibs if not defined. * config/rs6000/rs6000.c (rs6000_option_override_internal): Do not warn if the user used -mabi={ieee,ibm}longdouble and we built multilibs for long double. * config/rs6000/linux64.h (MULTILIB_DEFAULTS_IEEE): Define as the appropriate multilib option. (MULTILIB_DEFAULTS): Add MULTILIB_DEFAULTS_IEEE to the default multilib options. * config/rs6000/t-ldouble-linux64le-ibm: New configuration files for building long double multilibs. * config/rs6000/t-ldouble-linux64le-ieee: Likewise. -- 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/config.gcc =================================================================== --- gcc/config.gcc (revision 256552) +++ gcc/config.gcc (working copy) @@ -4408,6 +4408,16 @@ case "${target}" in elif test x$with_long_double_format = xibm; then tm_defines="${tm_defines} TARGET_IEEEQUAD_DEFAULT=0" fi + + case "${target}:${enable_multilib}:${with_long_double_format}" in + powerpc64le*:yes:ieee | powerpc64le*:yes:ibm) + tm_defines="${tm_defines} TARGET_IEEEQUAD_MULTILIB=1" + tmake_file="${tmake_file} rs6000/t-ldouble-linux64le-${with_long_double_format}" + ;; + *) + : + ;; + esac ;; s390*-*-*) Index: gcc/config/rs6000/rs6000.h =================================================================== --- gcc/config/rs6000/rs6000.h (revision 256552) +++ gcc/config/rs6000/rs6000.h (working copy) @@ -564,6 +564,12 @@ extern int rs6000_vector_align[]; #define TARGET_ALTIVEC_ABI rs6000_altivec_abi #define TARGET_LDBRX (TARGET_POPCNTD || rs6000_cpu == PROCESSOR_CELL) +/* Define as 1 if we support multilibs for switching long double between IEEE + 128-bit floating point and IBM extended double. */ +#ifndef TARGET_IEEEQUAD_MULTILIB +#define TARGET_IEEEQUAD_MULTILIB 0 +#endif + /* ISA 2.01 allowed FCFID to be done in 32-bit, previously it was 64-bit only. Enable 32-bit fcfid's on any of the switches for newer ISA machines or XILINX. */ Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 256552) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -4600,11 +4600,15 @@ rs6000_option_override_internal (bool gl systems will also set long double to be IEEE 128-bit. AIX and Darwin explicitly redefine TARGET_IEEEQUAD and TARGET_IEEEQUAD_DEFAULT to 0, so those systems will not pick up this default. Warn if the user changes the - default unless -Wno-psabi. */ + default unless either the user used the -Wno-psabi option, or the compiler + was built to enable multilibs to switch between the two long double + types. */ if (!global_options_set.x_rs6000_ieeequad) rs6000_ieeequad = TARGET_IEEEQUAD_DEFAULT; - else if (rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT && TARGET_LONG_DOUBLE_128) + else if (!TARGET_IEEEQUAD_MULTILIB + && rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT + && TARGET_LONG_DOUBLE_128) { static bool warned_change_long_double; if (!warned_change_long_double) Index: gcc/config/rs6000/linux64.h =================================================================== --- gcc/config/rs6000/linux64.h (revision 256552) +++ gcc/config/rs6000/linux64.h (working copy) @@ -245,11 +245,18 @@ extern int dot_symbols; #define DYNAMIC_LINKER_PREFIX "" #endif -#undef MULTILIB_DEFAULTS +#if TARGET_IEEEQUAD_DEFAULT +#define MULTILIB_DEFAULTS_IEEE "mabi=ieeelongdouble" + +#else /* TARGET_IEEEQUAD_DEFAULT. */ +#define MULTILIB_DEFAULTS_IEEE "mabi=ibmlongdouble" +#endif /* TARGET_IEEEQUAD_DEFAULT. */ + +#undef MULTILIB_DEFAULTS #if DEFAULT_ARCH64_P -#define MULTILIB_DEFAULTS { "m64" } +#define MULTILIB_DEFAULTS { "m64", MULTILIB_DEFAULTS_IEEE } #else -#define MULTILIB_DEFAULTS { "m32" } +#define MULTILIB_DEFAULTS { "m32", MULTILIB_DEFAULTS_IEEE } #endif /* Split stack is only supported for 64 bit, and requires glibc >= 2.18. */ Index: gcc/config/rs6000/t-ldouble-linux64le-ibm =================================================================== --- gcc/config/rs6000/t-ldouble-linux64le-ibm (nonexistent) +++ gcc/config/rs6000/t-ldouble-linux64le-ibm (working copy) @@ -0,0 +1,26 @@ +# Long double multilib libraries for PowerPC 64-bit little endian systems using +# IBM extended double as the long double type. +# +# Copyright (C) 2018 Free Software Foundation, Inc. +# +# This file is part of GCC. +# +# GCC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GCC 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +MULTILIB_OPTIONS += mabi=ieeelongdouble/mabi=ibmlongdouble +MULTILIB_DIRNAMES += ieee128 ibm128 +MULTILIB_OSDIRNAMES += mabi.ibmlongdouble=../lib64$(call if_multiarch,:powerpc64-linux-gnu) \ + mabi.ieeelongdouble=../lib64/ieee128$(call if_multiarch,:powerpc64-linux-gnu) \ + ../lib64$(call if_multiarch,:powerpc64-linux-gnu) Index: gcc/config/rs6000/t-ldouble-linux64le-ieee =================================================================== --- gcc/config/rs6000/t-ldouble-linux64le-ieee (nonexistent) +++ gcc/config/rs6000/t-ldouble-linux64le-ieee (working copy) @@ -0,0 +1,26 @@ +# Long double multilib libraries for PowerPC 64-bit little endian systems using +# IEEE 128-bit floating point as the long double type. +# +# Copyright (C) 2018 Free Software Foundation, Inc. +# +# This file is part of GCC. +# +# GCC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GCC 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +MULTILIB_OPTIONS += mabi=ieeelongdouble/mabi=ibmlongdouble +MULTILIB_DIRNAMES += ieee128 ibm128 +MULTILIB_OSDIRNAMES += mabi.ibmlongdouble=../lib64/ibm128$(call if_multiarch,:powerpc64-linux-gnu) \ + mabi.ieeelongdouble=../lib64$(call if_multiarch,:powerpc64-linux-gnu) \ + ../lib64$(call if_multiarch,:powerpc64-linux-gnu)