From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1005) id E2ED1385BF9B; Wed, 7 Jul 2021 21:19:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E2ED1385BF9B Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Michael Meissner To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/meissner/heads/work059)] Allow __ibm128 on older PowerPC systems. X-Act-Checkin: gcc X-Git-Author: Michael Meissner X-Git-Refname: refs/users/meissner/heads/work059 X-Git-Oldrev: 86c036b6f4f6208d4b3d6857bb9532d6c21a68f9 X-Git-Newrev: cf476e7f7dd0a55503605825d5bbd8fc2453fecf Message-Id: <20210707211920.E2ED1385BF9B@sourceware.org> Date: Wed, 7 Jul 2021 21:19:20 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Jul 2021 21:19:21 -0000 https://gcc.gnu.org/g:cf476e7f7dd0a55503605825d5bbd8fc2453fecf commit cf476e7f7dd0a55503605825d5bbd8fc2453fecf Author: Michael Meissner Date: Wed Jul 7 17:19:03 2021 -0400 Allow __ibm128 on older PowerPC systems. On January 8th, 2018, I added code to ibm-ldouble.c to use the built-in function __builtin_pack_ibm128 if long double is IEEE 128-bit and continue to use __builtin_pack_longdouble if long double is IBM extended double. This code was needed because __builtin_pack_ibm128 is not available unless the __ibm128 keyword is availabe. In the current code, __ibm128 is only enabled if we have support for both IBM and IEEE 128-bit long double. Segher suggested that instead I should make __ibm128, __builtin_pack_ibm128, and __builtin_unpack_ibm128 available on older systems that don't support IEEE 128-bit floating point but does support the IBM extended double floating point. This patch changes the code so that __ibm128 is now exported if either long double uses the IBM extended double format, or IEEE 128-bit floating point is available. I changed the internal built-in types from float128 to ibm128, since the only built-in functions that use this are __builtin_pack_ibm128 and __builtin_unpack_ibm128, and the new name matches the function. In addition, this patch changes the function within libgcc that handles IBM long double to use the __builtin_pack_ibm128 function. 2021-07-07 Michael Meissner gcc/ * config/rs6000/rs6000-builtin.def (BU_IBM128_2): Rename RS6000_BTM_IBM128 from RS6000_BTM_FLOAT128. * config/rs6000/rs6000-call.c (rs6000_invalid_builtin): Update error message for __ibm128 built-in functions. (rs6000_init_builtins): Create the __ibm128 keyword on older systems where long double uses the IBM extended double format, even if they don't support IEEE 128-bit floating point. * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Rename RS6000_BTM_IBM128 from RS6000_BTM_FLOAT128. (rs6000_builtin_mask_names): Rename RS6000_BTM_IBM128 from RS6000_BTM_FLOAT128. * config/rs6000/rs6000.h (TARGET_IBM128): New macro. (RS6000_BTM_IBM128): Rename from RS6000_BTM_FLOAT128. (RS6000_BTM_COMMON): Rename RS6000_BTM_IBM128 from RS6000_BTM_FLOAT128. libgcc/ * config/rs6000/ibm-ldouble.c (pack_ldouble): Use __builtin_pack_ibm128 instead of __builtin_pack_longdouble. Diff: --- gcc/config/rs6000/rs6000-builtin.def | 5 ++--- gcc/config/rs6000/rs6000-call.c | 14 ++++++++++---- gcc/config/rs6000/rs6000.c | 4 ++-- gcc/config/rs6000/rs6000.h | 12 +++++++++--- libgcc/config/rs6000/ibm-ldouble.c | 4 ++-- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/gcc/config/rs6000/rs6000-builtin.def b/gcc/config/rs6000/rs6000-builtin.def index 6270444ef70..61112a27ef4 100644 --- a/gcc/config/rs6000/rs6000-builtin.def +++ b/gcc/config/rs6000/rs6000-builtin.def @@ -815,13 +815,12 @@ | RS6000_BTC_BINARY), \ CODE_FOR_ ## ICODE) /* ICODE */ -/* 128-bit __ibm128 floating point builtins (use -mfloat128 to indicate that - __ibm128 is available). */ +/* 128-bit __ibm128 floating point builtins. */ #define BU_IBM128_2(ENUM, NAME, ATTR, ICODE) \ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ "__builtin_" NAME, /* NAME */ \ (RS6000_BTM_HARD_FLOAT /* MASK */ \ - | RS6000_BTM_FLOAT128), \ + | RS6000_BTM_IBM128), \ (RS6000_BTC_ ## ATTR /* ATTR */ \ | RS6000_BTC_BINARY), \ CODE_FOR_ ## ICODE) /* ICODE */ diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c index 904e104c058..73e36ffcb39 100644 --- a/gcc/config/rs6000/rs6000-call.c +++ b/gcc/config/rs6000/rs6000-call.c @@ -11652,8 +11652,8 @@ rs6000_invalid_builtin (enum rs6000_builtins fncode) error ("%qs requires the %qs option", name, "-mhard-float"); else if ((fnmask & RS6000_BTM_FLOAT128_HW) != 0) error ("%qs requires ISA 3.0 IEEE 128-bit floating point", name); - else if ((fnmask & RS6000_BTM_FLOAT128) != 0) - error ("%qs requires the %qs option", name, "%<-mfloat128%>"); + else if ((fnmask & RS6000_BTM_IBM128) != 0) + error ("%qs requires the IBM 128-bit floating point", name); else if ((fnmask & (RS6000_BTM_POPCNTD | RS6000_BTM_POWERPC64)) == (RS6000_BTM_POPCNTD | RS6000_BTM_POWERPC64)) error ("%qs requires the %qs (or newer), and %qs or %qs options", @@ -13382,7 +13382,7 @@ rs6000_init_builtins (void) For IEEE 128-bit floating point, always create the type __ieee128. If the user used -mfloat128, rs6000-c.c will create a define from __float128 to __ieee128. */ - if (TARGET_FLOAT128_TYPE) + if (TARGET_IBM128) { if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128) ibm128_float_type_node = long_double_type_node; @@ -13396,7 +13396,13 @@ rs6000_init_builtins (void) lang_hooks.types.register_builtin_type (ibm128_float_type_node, "__ibm128"); + } + + else + ibm128_float_type_node = long_double_type_node; + if (TARGET_FLOAT128_TYPE) + { if (TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128) ieee128_float_type_node = long_double_type_node; else @@ -13407,7 +13413,7 @@ rs6000_init_builtins (void) } else - ieee128_float_type_node = ibm128_float_type_node = long_double_type_node; + ieee128_float_type_node = long_double_type_node; /* Vector pair and vector quad support. */ if (TARGET_EXTRA_BUILTINS) diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index de11de5e079..7f7ed48852a 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -3428,7 +3428,7 @@ rs6000_builtin_mask_calculate (void) | ((TARGET_LONG_DOUBLE_128 && TARGET_HARD_FLOAT && !TARGET_IEEEQUAD) ? RS6000_BTM_LDBL128 : 0) - | ((TARGET_FLOAT128_TYPE) ? RS6000_BTM_FLOAT128 : 0) + | ((TARGET_IBM128) ? RS6000_BTM_IBM128 : 0) | ((TARGET_FLOAT128_HW) ? RS6000_BTM_FLOAT128_HW : 0) | ((TARGET_MMA) ? RS6000_BTM_MMA : 0) | ((TARGET_POWER10) ? RS6000_BTM_P10 : 0)); @@ -24163,7 +24163,7 @@ static struct rs6000_opt_mask const rs6000_builtin_mask_names[] = { "hard-float", RS6000_BTM_HARD_FLOAT, false, false }, { "long-double-128", RS6000_BTM_LDBL128, false, false }, { "powerpc64", RS6000_BTM_POWERPC64, false, false }, - { "float128", RS6000_BTM_FLOAT128, false, false }, + { "ibm128", RS6000_BTM_IBM128, false, false }, { "float128-hw", RS6000_BTM_FLOAT128_HW,false, false }, { "mma", RS6000_BTM_MMA, false, false }, { "power10", RS6000_BTM_P10, false, false }, diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 4ca6372435d..c5f38f26649 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -504,6 +504,12 @@ extern int rs6000_vector_align[]; #define TARGET_MINMAX (TARGET_HARD_FLOAT && TARGET_PPC_GFXOPT \ && (TARGET_P9_MINMAX || !flag_trapping_math)) +/* Whether the '__ibm128' keywork is enabled. We enable __ibm128 either if the + IEEE 128-bit floating point support is enabled or if the long double support + uses the 128-bit IBM extended double format. */ +#define TARGET_IBM128 (TARGET_FLOAT128_TYPE \ + || (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128)) + /* In switching from using target_flags to using rs6000_isa_flags, the options machinery creates OPTION_MASK_ instead of MASK_. For now map OPTION_MASK_ back into MASK_. */ @@ -2294,7 +2300,7 @@ extern int frame_pointer_needed; #define RS6000_BTC_SAT RS6000_BTC_MISC /* saturate sets VSCR. */ /* Builtin targets. For now, we reuse the masks for those options that are in - target flags, and pick a random bit for ldbl128, which isn't in + target flags, and pick a random bit for ldbl128 and ibm128, which aren't in target_flags. */ #define RS6000_BTM_ALWAYS 0 /* Always enabled. */ #define RS6000_BTM_ALTIVEC MASK_ALTIVEC /* VMX/altivec vectors. */ @@ -2316,7 +2322,7 @@ extern int frame_pointer_needed; #define RS6000_BTM_LDBL128 MASK_MULTIPLE /* 128-bit long double. */ #define RS6000_BTM_64BIT MASK_64BIT /* 64-bit addressing. */ #define RS6000_BTM_POWERPC64 MASK_POWERPC64 /* 64-bit registers. */ -#define RS6000_BTM_FLOAT128 MASK_FLOAT128_KEYWORD /* IEEE 128-bit float. */ +#define RS6000_BTM_IBM128 MASK_FLOAT128_KEYWORD /* __ibm128 keyword. */ #define RS6000_BTM_FLOAT128_HW MASK_FLOAT128_HW /* IEEE 128-bit float h/w. */ #define RS6000_BTM_MMA MASK_MMA /* ISA 3.1 MMA. */ #define RS6000_BTM_P10 MASK_POWER10 @@ -2339,7 +2345,7 @@ extern int frame_pointer_needed; | RS6000_BTM_HARD_FLOAT \ | RS6000_BTM_LDBL128 \ | RS6000_BTM_POWERPC64 \ - | RS6000_BTM_FLOAT128 \ + | RS6000_BTM_IBM128 \ | RS6000_BTM_FLOAT128_HW \ | RS6000_BTM_MMA \ | RS6000_BTM_P10) diff --git a/libgcc/config/rs6000/ibm-ldouble.c b/libgcc/config/rs6000/ibm-ldouble.c index 4c13453f975..92b4b4c583d 100644 --- a/libgcc/config/rs6000/ibm-ldouble.c +++ b/libgcc/config/rs6000/ibm-ldouble.c @@ -102,9 +102,9 @@ __asm__ (".symver __gcc_qadd,_xlqadd@GCC_3.4\n\t" static inline IBM128_TYPE pack_ldouble (double dh, double dl) { -#if defined (__LONG_DOUBLE_128__) && defined (__LONG_DOUBLE_IBM128__) \ +#if defined (__LONG_DOUBLE_128__) \ && !(defined (_SOFT_FLOAT) || defined (__NO_FPRS__)) - return __builtin_pack_longdouble (dh, dl); + return __builtin_pack_ibm128 (dh, dl); #else union {