[gcc(refs/users/meissner/heads/work097)] Use _Float128 type for __float128.
Michael Meissner
meissner@gcc.gnu.org
Wed Aug 10 07:03:17 GMT 2022
https://gcc.gnu.org/g:c5e4e6f80824b6a07a257f68433bb53d85a26447
commit c5e4e6f80824b6a07a257f68433bb53d85a26447
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Wed Aug 10 03:02:29 2022 -0400
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 <meissner@linux.ibm.com>
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.
Diff:
---
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 -
4 files changed, 107 insertions(+), 130 deletions(-)
diff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc
index 755a6b95db0..f09e5f684d3 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 == ieee128_float_type_node)
+ else if (type_node == float128_type_node)
return "__ieee128";
else if (type_node == opaque_V4SI_type_node)
return "opaque";
@@ -733,16 +733,10 @@ rs6000_init_builtins (void)
if (TARGET_FLOAT128_TYPE)
{
- 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,
+ t = build_qualified_type (float128_type_node, TYPE_QUAL_CONST);
+ lang_hooks.types.register_builtin_type (float128_type_node,
"__ieee128");
}
- else
- ieee128_float_type_node = NULL_TREE;
/* Vector pair and vector quad support. */
vector_pair_type_node = make_node (OPAQUE_TYPE);
@@ -3293,78 +3287,89 @@ 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;
- /* 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;
- }
+ 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;
+ }
+ }
/* In case of "#pragma target" changes, we initialize all builtins
but check for actual availability now, during expand time. For
@@ -3506,22 +3511,6 @@ 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 11de8389fd6..d0c4e0fca87 100644
--- a/gcc/config/rs6000/rs6000-c.cc
+++ b/gcc/config/rs6000/rs6000-c.cc
@@ -578,13 +578,15 @@ 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");
- else
- rs6000_define_or_undefine_macro (false, "__float128");
- if (ieee128_float_type_node && define_p)
- rs6000_define_or_undefine_macro (true, "__SIZEOF_FLOAT128__=16");
+ {
+ rs6000_define_or_undefine_macro (true, "__float128=__ieee128");
+ rs6000_define_or_undefine_macro (true, "__SIZEOF_FLOAT128__=16");
+ }
else
- rs6000_define_or_undefine_macro (false, "__SIZEOF_FLOAT128__");
+ {
+ rs6000_define_or_undefine_macro (false, "__float128");
+ 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. */
@@ -624,7 +626,7 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile)
builtin_define ("__FLOAT128_TYPE__");
if (ibm128_float_type_node)
builtin_define ("__SIZEOF_IBM128__=16");
- if (ieee128_float_type_node)
+ if (TARGET_FLOAT128_KEYWORD)
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 eddf8c8afe7..c63c1ac173c 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. */
+/* 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. */
static machine_mode
rs6000_translate_mode_attribute (machine_mode mode)
{
- 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))
+ if (FLOAT128_IBM_P (mode) && ibm128_float_type_node == long_double_type_node)
return COMPLEX_MODE_P (mode) ? E_TCmode : E_TFmode;
return mode;
}
@@ -23724,13 +23724,8 @@ 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 && !TARGET_IEEEQUAD;
+ return TARGET_FLOAT128_TYPE;
default:
return false;
@@ -23764,7 +23759,7 @@ rs6000_floatn_mode (int n, bool extended)
case 64:
if (TARGET_FLOAT128_TYPE)
- return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode;
+ return KFmode;
else
return opt_scalar_float_mode ();
@@ -23788,7 +23783,7 @@ rs6000_floatn_mode (int n, bool extended)
case 128:
if (TARGET_FLOAT128_TYPE)
- return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode;
+ return KFmode;
else
return opt_scalar_float_mode ();
@@ -23803,18 +23798,11 @@ rs6000_floatn_mode (int n, bool extended)
static machine_mode
rs6000_c_mode_for_suffix (char suffix)
{
- if (TARGET_FLOAT128_TYPE)
- {
- if (suffix == 'q' || suffix == 'Q')
- return (FLOAT128_IEEE_P (TFmode)) ? TFmode : KFmode;
+ if (TARGET_FLOAT128_TYPE && (suffix == 'q' || suffix == 'Q'))
+ return KFmode;
- /* 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. */
- }
+ if (TARGET_IBM128 && (suffix == 'w' || suffix == 'W'))
+ return FLOAT128_IBM_P (TFmode) ? TFmode : IFmode;
return VOIDmode;
}
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index f58f5f3f355..4a1f6875747 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -2268,7 +2268,6 @@ 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). */
@@ -2363,7 +2362,6 @@ 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])
More information about the Gcc-cvs
mailing list