https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99708
--- Comment #19 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
builddir/gcc/rs6000-builtins.cc:
ibm128_float_type_node,
builddir/gcc/rs6000-builtins.cc: = build_function_type_list
(ibm128_float_type_node,
rs6000-builtin.cc: else if (type_node == ibm128_float_type_node)
rs6000-builtin.cc: ibm128_float_type_node = long_double_type_node;
rs6000-builtin.cc: ibm128_float_type_node = make_node (REAL_TYPE);
rs6000-builtin.cc: TYPE_PRECISION (ibm128_float_type_node) = 128;
rs6000-builtin.cc: SET_TYPE_MODE (ibm128_float_type_node, IFmode);
rs6000-builtin.cc: layout_type (ibm128_float_type_node);
rs6000-builtin.cc: t = build_qualified_type (ibm128_float_type_node,
TYPE_QUAL_CONST);
rs6000-builtin.cc: ptr_ibm128_float_type_node = build_pointer_type (t);
rs6000-builtin.cc: lang_hooks.types.register_builtin_type
(ibm128_float_type_node,
rs6000-builtin.cc: ieee128_float_type_node = long_double_type_node;
rs6000-builtin.cc: ieee128_float_type_node = float128_type_node;
rs6000-builtin.cc: t = build_qualified_type (ieee128_float_type_node,
TYPE_QUAL_CONST);
rs6000-builtin.cc: ptr_ieee128_float_type_node = build_pointer_type (t);
rs6000-builtin.cc: lang_hooks.types.register_builtin_type
(ieee128_float_type_node,
rs6000-builtin.cc: ieee128_float_type_node = ibm128_float_type_node =
long_double_type_node;
rs6000.cc: && ieee128_float_type_node == long_double_type_node)
rs6000.cc: && ibm128_float_type_node == long_double_type_node))
rs6000-c.cc: if (ibm128_float_type_node)
rs6000-c.cc: if (ieee128_float_type_node)
rs6000.h:#define ieee128_float_type_node
(rs6000_builtin_types[RS6000_BTI_ieee128_float])
rs6000.h:#define ibm128_float_type_node
(rs6000_builtin_types[RS6000_BTI_ibm128_float])
rs6000.h:#define ptr_ieee128_float_type_node
(rs6000_builtin_types[RS6000_BTI_ptr_ieee128_float])
rs6000.h:#define ptr_ibm128_float_type_node
(rs6000_builtin_types[RS6000_BTI_ptr_ibm128_float])
I'd guess that else ieee128_float_type_node = ibm128_float_type_node =
long_double_type_node;
is there so that we don't ICE during the builtins creation (we need just
ibm128_float_type_node for it though).
Looking at other uses:
rs6000_type_string does:
else if (type_node == ibm128_float_type_node)
return "__ibm128";
could add type_node && to it. And it also makes me wonder why there is no
ieee128_float_type_node case.
Rest of rs6000-builtin.cc is just the setup and could live without
else ieee128_float_type_node = ibm128_float_type_node = long_double_type_node;
Also, why do we have ptr_*_float_type_node at all when nothing uses those?
rs6000.cc will be fine even with *128_float_type_node NULL,
long_double_type_node is presumably always non-NULL.
rs6000-c.cc is what this PR talks about, so actually needs those to be NULL if
not supported
(but, we still want to move the __SIZEOF_FLOAT128__ handling next to __float128
macro IMNSHO,
if we add also __SIZEOF_IEEE128__ it could stay where __SIZEOF_FLOAT128__ is
defined now).
And finally the generated rs6000-builtins.cc, it does:
tree df_ftype_if_ci
= build_function_type_list (double_type_node,
ibm128_float_type_node,
integer_type_node,
NULL_TREE);
tree if_ftype_df_df
= build_function_type_list (ibm128_float_type_node,
double_type_node,
double_type_node,
NULL_TREE);
rs6000_builtin_info[RS6000_BIF_PACK_IF].fntype
= if_ftype_df_df;
rs6000_builtin_decls[(int)RS6000_BIF_PACK_IF] = t
= add_builtin_function ("__builtin_pack_ibm128",
if_ftype_df_df,
(int)RS6000_BIF_PACK_IF, BUILT_IN_MD,
NULL, NULL_TREE);
TREE_READONLY (t) = 1;
TREE_NOTHROW (t) = 1;
rs6000_builtin_info[RS6000_BIF_UNPACK_IF].fntype
= df_ftype_if_ci;
rs6000_builtin_decls[(int)RS6000_BIF_UNPACK_IF] = t
= add_builtin_function ("__builtin_unpack_ibm128",
df_ftype_if_ci,
(int)RS6000_BIF_UNPACK_IF, BUILT_IN_MD,
NULL, NULL_TREE);
TREE_READONLY (t) = 1;
TREE_NOTHROW (t) = 1;
Unfortunately it is a generated file. Dunno what is best for that,
not registering the builtins at all if ibm128_float_type_node is NULL,
or keep doing what it used to, register those with some other type.