On Tue, Jan 25, 2022 at 02:24:34PM -0500, Jason Merrill wrote:
> > +  machine_mode mode, fmode;
> > +  if (TREE_CODE (type) == COMPLEX_TYPE)
> > +    mode = TYPE_MODE (TREE_TYPE (type));
> > +  else
> > +    mode = TYPE_MODE (type);
> > +  if (known_eq (GET_MODE_SIZE (mode), 16) && !MODE_COMPOSITE_P (mode))
> > +    FOR_EACH_MODE_IN_CLASS (fmode, MODE_FLOAT)
> > +      if (known_eq (GET_MODE_SIZE (fmode), 16)
> > +          && MODE_COMPOSITE_P (fmode))
> > +   {
> > +     if (type == long_double_type_node)
> > +       {
> > +         if (float128_type_node
> > +             && (TYPE_MODE (float128_type_node)
> > +                 == TYPE_MODE (type)))
> > +           return float128_type_node;
> > +         return NULL_TREE;
> > +       }
> > +     for (int i = 0; i < NUM_FLOATN_NX_TYPES; i++)
> > +       if (COMPLEX_FLOATN_NX_TYPE_NODE (i) != NULL_TREE
> > +           && (TYPE_MODE (COMPLEX_FLOATN_NX_TYPE_NODE (i))
> > +               == TYPE_MODE (type)))
> > +         return COMPLEX_FLOATN_NX_TYPE_NODE (i);
> > +   }
> 
> Do we really need this loop to determine if the target supports two
> different long doubles?  This seems like a complicated way of saying
> "if this is IEEE 128-bit long double and the target also supports IBM double
> double", return _Float128."

The outermost if and FOR_EACH_MODE_IN_CLASS in it are checking if it is
essentially ppc64le-linux with -mabi=ieeelongdouble, i.e. whether long double
is non-composite 16-byte and the target supports at least one composite
16-byte mode.
The inner loop is because we don't have a complex_float128_type_node macro,
so it needs to be found by iteration or hardcoding which entry it is
(it iterates over those 6 entries for complex _Float{32,64,128}{,x}).

        Jakub

Reply via email to