From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1005) id 0694E3858418; Wed, 10 Aug 2022 17:24:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0694E3858418 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/work097)] Revert patch. X-Act-Checkin: gcc X-Git-Author: Michael Meissner X-Git-Refname: refs/users/meissner/heads/work097 X-Git-Oldrev: ce2baf986535c61decacaf23bcfaa6985507b4dc X-Git-Newrev: 8d97984593c8d4321ecc3b1e794612540857b113 Message-Id: <20220810172452.0694E3858418@sourceware.org> Date: Wed, 10 Aug 2022 17:24:52 +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, 10 Aug 2022 17:24:52 -0000 https://gcc.gnu.org/g:8d97984593c8d4321ecc3b1e794612540857b113 commit 8d97984593c8d4321ecc3b1e794612540857b113 Author: Michael Meissner Date: Wed Aug 10 13:23:58 2022 -0400 Revert patch. 2022-08-10 Michael Meissner gcc/ Revert patches. * config/rs6000/rs6000-builtin.cc (rs6000_type_string): Use float128_type_node, not ieee128_float_type_mode. (rs6000_init_builtins): Always use the _Float128 type for the __float128 keyword. Do not use the long double type. (rs6000_expand_builtin): Rework converting KFmode and IFmode built-in functions to TFmode. * config/rs6000/rs6000-c.cc (rs6000_target_modify_macros): Use float128_type_node, not ieee128_float_type_mode. Simplify if statements. (rs6000_cpu_cpp_builtins): Delete ieee128_float_type_mode. * config/rs6000/rs6000.cc (rs6000_libgcc_floating_mode_supported_p): Always use KFmode for _Float128 and __float128. (rs6000_floatn_mode): Likewise. (rs6000_c_mode_for_suffix): Always use KFmode for _Float128 and __float128. Add 'w' and 'W' suffix for __ibm128 constants. * config/rs6000/rs6000.h (RS6000_BTI_ieee128_float): Delete. (ieee128_float_type_node): Likewise. * ChangeLog.meissner: Update. Diff: --- gcc/ChangeLog.meissner | 37 +------- gcc/config/rs6000/rs6000-builtin.cc | 183 +++++++++++++++++++----------------- gcc/config/rs6000/rs6000-c.cc | 16 ++-- gcc/config/rs6000/rs6000.cc | 36 ++++--- gcc/config/rs6000/rs6000.h | 2 + 5 files changed, 131 insertions(+), 143 deletions(-) diff --git a/gcc/ChangeLog.meissner b/gcc/ChangeLog.meissner index c293e41907a..dc7c9c8e599 100644 --- a/gcc/ChangeLog.meissner +++ b/gcc/ChangeLog.meissner @@ -1,39 +1,4 @@ -==================== work097, patch004 - -Use _Float128 type for __float128. - -In the past if the long double type was IEEE 128-bit, the __float128 type would -use the long double type, and TFmode would be used for the mode for both -_Float128 and long double types. - -This patch always uses the _Float128 type for __float128, and it always uses -KFmode for the mode. Right now, a similar change for __ibm128 has not been -made. - -In making these changes, I noticed that there was an internal tree for holding -the __float128 type. This code removes that internal tree variable. - -2022-08-10 Michael Meissner - -gcc/ - - * config/rs6000/rs6000-builtin.cc (rs6000_type_string): Use - float128_type_node, not ieee128_float_type_mode. - (rs6000_init_builtins): Always use the _Float128 type for the __float128 - keyword. Do not use the long double type. - (rs6000_expand_builtin): Rework converting KFmode and IFmode built-in - functions to TFmode. - * config/rs6000/rs6000-c.cc (rs6000_target_modify_macros): Use - float128_type_node, not ieee128_float_type_mode. Simplify if - statements. - (rs6000_cpu_cpp_builtins): Delete ieee128_float_type_mode. - * config/rs6000/rs6000.cc (rs6000_libgcc_floating_mode_supported_p): - Always use KFmode for _Float128 and __float128. - (rs6000_floatn_mode): Likewise. - (rs6000_c_mode_for_suffix): Always use KFmode for _Float128 and - __float128. Add 'w' and 'W' suffix for __ibm128 constants. - * config/rs6000/rs6000.h (RS6000_BTI_ieee128_float): Delete. - (ieee128_float_type_node): Likewise. +==================== work097, patch004 was reverted ==================== work097, patch003 was reverted diff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc index f09e5f684d3..755a6b95db0 100644 --- a/gcc/config/rs6000/rs6000-builtin.cc +++ b/gcc/config/rs6000/rs6000-builtin.cc @@ -434,7 +434,7 @@ const char *rs6000_type_string (tree type_node) return "ss"; else if (type_node == ibm128_float_type_node) return "__ibm128"; - else if (type_node == float128_type_node) + else if (type_node == ieee128_float_type_node) return "__ieee128"; else if (type_node == opaque_V4SI_type_node) return "opaque"; @@ -733,10 +733,16 @@ rs6000_init_builtins (void) if (TARGET_FLOAT128_TYPE) { - t = build_qualified_type (float128_type_node, TYPE_QUAL_CONST); - lang_hooks.types.register_builtin_type (float128_type_node, + if (TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128) + ieee128_float_type_node = long_double_type_node; + else + ieee128_float_type_node = float128_type_node; + t = build_qualified_type (ieee128_float_type_node, TYPE_QUAL_CONST); + lang_hooks.types.register_builtin_type (ieee128_float_type_node, "__ieee128"); } + else + ieee128_float_type_node = NULL_TREE; /* Vector pair and vector quad support. */ vector_pair_type_node = make_node (OPAQUE_TYPE); @@ -3287,89 +3293,78 @@ rs6000_expand_builtin (tree exp, rtx target, rtx /* subtarget */, size_t uns_fcode = (size_t)fcode; enum insn_code icode = rs6000_builtin_info[uns_fcode].icode; - if (TARGET_FLOAT128_TYPE || TARGET_IBM128) - { - bifdata *bifaddr = &rs6000_builtin_info[uns_fcode]; - bool found_tfmode = false; - int nargs = bifaddr->nargs; - for (int i = 0; i < nargs; i++) - { - tree arg = CALL_EXPR_ARG (exp, i); - if (arg != error_mark_node && TYPE_MODE (TREE_TYPE (arg)) == TFmode) - { - found_tfmode = true; - break; - } - } - - /* Map all of the explicit KFmode functions to the TFmode alternate. */ - if (found_tfmode && FLOAT128_IEEE_P (TFmode)) - switch (icode) - { - case CODE_FOR_sqrtkf2_odd: - icode = CODE_FOR_sqrttf2_odd; - break; - case CODE_FOR_trunckfdf2_odd: - icode = CODE_FOR_trunctfdf2_odd; - break; - case CODE_FOR_addkf3_odd: - icode = CODE_FOR_addtf3_odd; - break; - case CODE_FOR_subkf3_odd: - icode = CODE_FOR_subtf3_odd; - break; - case CODE_FOR_mulkf3_odd: - icode = CODE_FOR_multf3_odd; - break; - case CODE_FOR_divkf3_odd: - icode = CODE_FOR_divtf3_odd; - break; - case CODE_FOR_fmakf4_odd: - icode = CODE_FOR_fmatf4_odd; - break; - case CODE_FOR_xsxexpqp_kf: - icode = CODE_FOR_xsxexpqp_tf; - break; - case CODE_FOR_xsxsigqp_kf: - icode = CODE_FOR_xsxsigqp_tf; - break; - case CODE_FOR_xststdcnegqp_kf: - icode = CODE_FOR_xststdcnegqp_tf; - break; - case CODE_FOR_xsiexpqp_kf: - icode = CODE_FOR_xsiexpqp_tf; - break; - case CODE_FOR_xsiexpqpf_kf: - icode = CODE_FOR_xsiexpqpf_tf; - break; - case CODE_FOR_xststdcqp_kf: - icode = CODE_FOR_xststdcqp_tf; - break; - case CODE_FOR_xscmpexpqp_eq_kf: - icode = CODE_FOR_xscmpexpqp_eq_tf; - break; - case CODE_FOR_xscmpexpqp_lt_kf: - icode = CODE_FOR_xscmpexpqp_lt_tf; - break; - case CODE_FOR_xscmpexpqp_gt_kf: - icode = CODE_FOR_xscmpexpqp_gt_tf; - break; - case CODE_FOR_xscmpexpqp_unordered_kf: - icode = CODE_FOR_xscmpexpqp_unordered_tf; - break; - default: - break; - } - - /* Map all of the IFmode builtins to TFmode if long double is IBM. */ - else if (found_tfmode && FLOAT128_IBM_P (TFmode)) - { - if (icode == CODE_FOR_unpackif) - icode = CODE_FOR_unpacktf; - else if (icode == CODE_FOR_packif) - icode = CODE_FOR_packtf; - } - } + /* TODO: The following commentary and code is inherited from the original + builtin processing code. The commentary is a bit confusing, with the + intent being that KFmode is always IEEE-128, IFmode is always IBM + double-double, and TFmode is the current long double. The code is + confusing in that it converts from KFmode to TFmode pattern names, + when the other direction is more intuitive. Try to address this. */ + + /* We have two different modes (KFmode, TFmode) that are the IEEE + 128-bit floating point type, depending on whether long double is the + IBM extended double (KFmode) or long double is IEEE 128-bit (TFmode). + It is simpler if we only define one variant of the built-in function, + and switch the code when defining it, rather than defining two built- + ins and using the overload table in rs6000-c.cc to switch between the + two. If we don't have the proper assembler, don't do this switch + because CODE_FOR_*kf* and CODE_FOR_*tf* will be CODE_FOR_nothing. */ + if (FLOAT128_IEEE_P (TFmode)) + switch (icode) + { + case CODE_FOR_sqrtkf2_odd: + icode = CODE_FOR_sqrttf2_odd; + break; + case CODE_FOR_trunckfdf2_odd: + icode = CODE_FOR_trunctfdf2_odd; + break; + case CODE_FOR_addkf3_odd: + icode = CODE_FOR_addtf3_odd; + break; + case CODE_FOR_subkf3_odd: + icode = CODE_FOR_subtf3_odd; + break; + case CODE_FOR_mulkf3_odd: + icode = CODE_FOR_multf3_odd; + break; + case CODE_FOR_divkf3_odd: + icode = CODE_FOR_divtf3_odd; + break; + case CODE_FOR_fmakf4_odd: + icode = CODE_FOR_fmatf4_odd; + break; + case CODE_FOR_xsxexpqp_kf: + icode = CODE_FOR_xsxexpqp_tf; + break; + case CODE_FOR_xsxsigqp_kf: + icode = CODE_FOR_xsxsigqp_tf; + break; + case CODE_FOR_xststdcnegqp_kf: + icode = CODE_FOR_xststdcnegqp_tf; + break; + case CODE_FOR_xsiexpqp_kf: + icode = CODE_FOR_xsiexpqp_tf; + break; + case CODE_FOR_xsiexpqpf_kf: + icode = CODE_FOR_xsiexpqpf_tf; + break; + case CODE_FOR_xststdcqp_kf: + icode = CODE_FOR_xststdcqp_tf; + break; + case CODE_FOR_xscmpexpqp_eq_kf: + icode = CODE_FOR_xscmpexpqp_eq_tf; + break; + case CODE_FOR_xscmpexpqp_lt_kf: + icode = CODE_FOR_xscmpexpqp_lt_tf; + break; + case CODE_FOR_xscmpexpqp_gt_kf: + icode = CODE_FOR_xscmpexpqp_gt_tf; + break; + case CODE_FOR_xscmpexpqp_unordered_kf: + icode = CODE_FOR_xscmpexpqp_unordered_tf; + break; + default: + break; + } /* In case of "#pragma target" changes, we initialize all builtins but check for actual availability now, during expand time. For @@ -3511,6 +3506,22 @@ rs6000_expand_builtin (tree exp, rtx target, rtx /* subtarget */, gcc_unreachable (); } + if (bif_is_ibm128 (*bifaddr) && TARGET_LONG_DOUBLE_128 && !TARGET_IEEEQUAD) + { + if (fcode == RS6000_BIF_PACK_IF) + { + icode = CODE_FOR_packtf; + fcode = RS6000_BIF_PACK_TF; + uns_fcode = (size_t) fcode; + } + else if (fcode == RS6000_BIF_UNPACK_IF) + { + icode = CODE_FOR_unpacktf; + fcode = RS6000_BIF_UNPACK_TF; + uns_fcode = (size_t) fcode; + } + } + /* TRUE iff the built-in function returns void. */ bool void_func = TREE_TYPE (TREE_TYPE (fndecl)) == void_type_node; /* Position of first argument (0 for void-returning functions, else 1). */ diff --git a/gcc/config/rs6000/rs6000-c.cc b/gcc/config/rs6000/rs6000-c.cc index d0c4e0fca87..11de8389fd6 100644 --- a/gcc/config/rs6000/rs6000-c.cc +++ b/gcc/config/rs6000/rs6000-c.cc @@ -578,15 +578,13 @@ rs6000_target_modify_macros (bool define_p, HOST_WIDE_INT flags) { rs6000_define_or_undefine_macro (define_p, "__FLOAT128__"); if (define_p) - { - rs6000_define_or_undefine_macro (true, "__float128=__ieee128"); - rs6000_define_or_undefine_macro (true, "__SIZEOF_FLOAT128__=16"); - } + rs6000_define_or_undefine_macro (true, "__float128=__ieee128"); else - { - rs6000_define_or_undefine_macro (false, "__float128"); - rs6000_define_or_undefine_macro (false, "__SIZEOF_FLOAT128__"); - } + rs6000_define_or_undefine_macro (false, "__float128"); + if (ieee128_float_type_node && define_p) + rs6000_define_or_undefine_macro (true, "__SIZEOF_FLOAT128__=16"); + else + rs6000_define_or_undefine_macro (false, "__SIZEOF_FLOAT128__"); } /* OPTION_MASK_FLOAT128_HARDWARE can be turned on if -mcpu=power9 is used or via the target attribute/pragma. */ @@ -626,7 +624,7 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile) builtin_define ("__FLOAT128_TYPE__"); if (ibm128_float_type_node) builtin_define ("__SIZEOF_IBM128__=16"); - if (TARGET_FLOAT128_KEYWORD) + if (ieee128_float_type_node) builtin_define ("__SIZEOF_IEEE128__=16"); #ifdef TARGET_LIBC_PROVIDES_HWCAP_IN_TCB builtin_define ("__BUILTIN_CPU_SUPPORTS__"); diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index c63c1ac173c..eddf8c8afe7 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -23678,14 +23678,14 @@ rs6000_eh_return_filter_mode (void) return TARGET_32BIT ? SImode : word_mode; } -/* Target hook for translate_mode_attribute. In the past, we used to convert - KFmode and KCmode to TFmode and TCmode if long double is IEEE 128-bit. We - no longer do this because we always use the standard float128_type_node for - __float128, and we no longer try to use the long double type. */ +/* Target hook for translate_mode_attribute. */ static machine_mode rs6000_translate_mode_attribute (machine_mode mode) { - if (FLOAT128_IBM_P (mode) && ibm128_float_type_node == long_double_type_node) + if ((FLOAT128_IEEE_P (mode) + && ieee128_float_type_node == long_double_type_node) + || (FLOAT128_IBM_P (mode) + && ibm128_float_type_node == long_double_type_node)) return COMPLEX_MODE_P (mode) ? E_TCmode : E_TFmode; return mode; } @@ -23724,8 +23724,13 @@ rs6000_libgcc_floating_mode_supported_p (scalar_float_mode mode) case E_TFmode: return true; + /* We only return true for KFmode if IEEE 128-bit types are supported, and + if long double does not use the IEEE 128-bit format. If long double + uses the IEEE 128-bit format, it will use TFmode and not KFmode. + Because the code will not use KFmode in that case, there will be aborts + because it can't find KFmode in the Floatn types. */ case E_KFmode: - return TARGET_FLOAT128_TYPE; + return TARGET_FLOAT128_TYPE && !TARGET_IEEEQUAD; default: return false; @@ -23759,7 +23764,7 @@ rs6000_floatn_mode (int n, bool extended) case 64: if (TARGET_FLOAT128_TYPE) - return KFmode; + return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode; else return opt_scalar_float_mode (); @@ -23783,7 +23788,7 @@ rs6000_floatn_mode (int n, bool extended) case 128: if (TARGET_FLOAT128_TYPE) - return KFmode; + return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode; else return opt_scalar_float_mode (); @@ -23798,11 +23803,18 @@ rs6000_floatn_mode (int n, bool extended) static machine_mode rs6000_c_mode_for_suffix (char suffix) { - if (TARGET_FLOAT128_TYPE && (suffix == 'q' || suffix == 'Q')) - return KFmode; + if (TARGET_FLOAT128_TYPE) + { + if (suffix == 'q' || suffix == 'Q') + return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode; - if (TARGET_IBM128 && (suffix == 'w' || suffix == 'W')) - return FLOAT128_IBM_P (TFmode) ? TFmode : IFmode; + /* At the moment, we are not defining a suffix for IBM extended double. + If/when the default for -mabi=ieeelongdouble is changed, and we want + to support __ibm128 constants in legacy library code, we may need to + re-evalaute this decision. Currently, c-lex.cc only supports 'w' and + 'q' as machine dependent suffixes. The x86_64 port uses 'w' for + __float80 constants. */ + } return VOIDmode; } diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 4a1f6875747..f58f5f3f355 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -2268,6 +2268,7 @@ enum rs6000_builtin_type_index RS6000_BTI_dfloat64, /* dfloat64_type_node */ RS6000_BTI_dfloat128, /* dfloat128_type_node */ RS6000_BTI_void, /* void_type_node */ + RS6000_BTI_ieee128_float, /* ieee 128-bit floating point */ RS6000_BTI_ibm128_float, /* IBM 128-bit floating point */ RS6000_BTI_const_str, /* pointer to const char * */ RS6000_BTI_vector_pair, /* unsigned 256-bit types (vector pair). */ @@ -2362,6 +2363,7 @@ enum rs6000_builtin_type_index #define dfloat64_type_internal_node (rs6000_builtin_types[RS6000_BTI_dfloat64]) #define dfloat128_type_internal_node (rs6000_builtin_types[RS6000_BTI_dfloat128]) #define void_type_internal_node (rs6000_builtin_types[RS6000_BTI_void]) +#define ieee128_float_type_node (rs6000_builtin_types[RS6000_BTI_ieee128_float]) #define ibm128_float_type_node (rs6000_builtin_types[RS6000_BTI_ibm128_float]) #define const_str_type_node (rs6000_builtin_types[RS6000_BTI_const_str]) #define vector_pair_type_node (rs6000_builtin_types[RS6000_BTI_vector_pair])