On Wed, Nov 04, 2020 at 06:13:57PM -0600, Segher Boessenkool wrote:
> Hi!
> 
> On Thu, Oct 22, 2020 at 06:03:46PM -0400, Michael Meissner wrote:
> > To map the scanf functions, <name> is mapped to __isoc99_<name>ieee128.
> 
> Is that correct?  What if you are compiling for c90?

That is the name in GLIBC.

> >     * config/rs6000/rs6000.c (rs6000_mangle_decl_assembler_name): Add
> >     support for mapping built-in function names for long double
> >     built-in functions if long double is IEEE 128-bit.
> 
> "Map the built-in function names" etc.
> 
> > --- a/gcc/config/rs6000/rs6000.c
> > +++ b/gcc/config/rs6000/rs6000.c
> > @@ -26893,56 +26893,127 @@ rs6000_globalize_decl_name (FILE * stream, tree 
> > decl)
> >     library before you can switch the real*16 type at compile time.
> >  
> >     We use the TARGET_MANGLE_DECL_ASSEMBLER_NAME hook to change this name.  
> > We
> > -   only do this if the default is that long double is IBM extended double, 
> > and
> > -   the user asked for IEEE 128-bit.  */
> > +   only do this transformation if the __float128 type is enabled.  This
> > +   prevents us from doing the transformation on older 32-bit ports that 
> > might
> > +   have enabled using IEEE 128-bit floating point as the default long 
> > double
> > +   type.  */
> 
> I don't see why that is the right thing to do?  You'll have exactly
> these same problems on 32-bit!

The comment is refering to the remote possiblity that 32-bit VxWorks was
configured to use IEEE long double as the only long double type.  However, you
had to use several non-default options to do this.  All other historic 32-bit
implementations did not allow IEEE long double.

> 
> Hrm, we talked about that before I guess?  Do you just need to change
> this comment now?
> 
> > +   default:
> > +     break;
> > +   }
> 
> That is useless, just leave it out?  The end of a switch will always
> fall through, and it is normal idiom to use that.

And it will get a warning that some enumeration elements did not have case
elements.

> > +      /* Update the __builtin_*printf && __builtin_*scanf functions.  */
> 
> "and" :-)
> 
> > +     else if (name[len - 1] == 'l')
> > +       {
> > +         bool uses_ieee128_p = false;
> > +         tree type = TREE_TYPE (decl);
> > +         machine_mode ret_mode = TYPE_MODE (type);
> > +
> > +         /* See if the function returns a IEEE 128-bit floating point type 
> > or
> > +            complex type.  */
> > +         if (ret_mode == TFmode || ret_mode == TCmode)
> > +           uses_ieee128_p = true;
> > +         else
> >             {
> > -             machine_mode arg_mode = TYPE_MODE (arg);
> > -             if (arg_mode == TFmode || arg_mode == TCmode)
> > +             function_args_iterator args_iter;
> > +             tree arg;
> 
> (declare that right before the FOREACH)
> 
> > +
> > +             /* See if the function passes a IEEE 128-bit floating point 
> > type
> > +                or complex type.  */
> > +             FOREACH_FUNCTION_ARGS (type, arg, args_iter)
> >                 {
> > -                 uses_ieee128_p = true;
> > -                 break;
> > +                 machine_mode arg_mode = TYPE_MODE (arg);
> > +                 if (arg_mode == TFmode || arg_mode == TCmode)
> > +                   {
> > +                     uses_ieee128_p = true;
> > +                     break;
> > +                   }
> >                 }
> >             }
> 
> There is no point in doing all these early-outs in an initialisation
> function, making it much harder to read :-(
> 
> > +         /* If we passed or returned an IEEE 128-bit floating point type,
> > +            change the name.  Use __<name>ieee128, instead of <name>l.  */
> > +         if (uses_ieee128_p)
> > +           newname = xasprintf ("__%.*sieee128", (int)(len - 1), name);
> 
> (int) (len - 1)
> 
> Please comment what the - 1 does, and/or what this is for at all.  (In
> the code / in a comment, not to me, I figured it out after a while.)

The comment just above the line says what it does.  I.e. it does not copy the
'l' in the name (i.e. sinl).

-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797

Reply via email to