public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Michael Meissner <meissner@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/meissner/heads/work055)] Allow __ibm128 on older PowerPC systems. Date: Wed, 9 Jun 2021 03:55:37 +0000 (GMT) [thread overview] Message-ID: <20210609035539.D65963851C02@sourceware.org> (raw) https://gcc.gnu.org/g:ad321e958af8fdc97986dd3e4191a34835c26da8 commit ad321e958af8fdc97986dd3e4191a34835c26da8 Author: Michael Meissner <meissner@linux.ibm.com> Date: Tue Jun 8 23:55:17 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. gcc/ 2021-06-09 Michael Meissner <meissner@linux.ibm.com> * 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/ 2021-06-09 Michael Meissner <meissner@linux.ibm.com> * 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 609bebdfd74..6d82ed224fb 100644 --- a/gcc/config/rs6000/rs6000-builtin.def +++ b/gcc/config/rs6000/rs6000-builtin.def @@ -796,13 +796,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 b4e13af4dc6..01e907cd3ea 100644 --- a/gcc/config/rs6000/rs6000-call.c +++ b/gcc/config/rs6000/rs6000-call.c @@ -11515,8 +11515,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", @@ -13211,7 +13211,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; @@ -13225,7 +13225,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 @@ -13236,7 +13242,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 411e7539019..b31bfb7163c 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -3427,7 +3427,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)); @@ -24162,7 +24162,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 a5f7b1d78c2..7131de609e3 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_<xxx> instead of MASK_<xxx>. For now map OPTION_MASK_<xxx> back into MASK_<xxx>. */ @@ -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 @@ -2340,7 +2346,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 {
reply other threads:[~2021-06-09 3:55 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210609035539.D65963851C02@sourceware.org \ --to=meissner@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).