[PATCH], PowerPC: Use <math>f128 for long double built-ins if we have changed to use IEEE 128-bit floating point
Michael Meissner
meissner@linux.ibm.com
Tue Oct 23 22:26:00 GMT 2018
On Tue, Oct 23, 2018 at 04:18:55PM -0500, Segher Boessenkool wrote:
> Hi Mike,
>
> On Tue, Oct 23, 2018 at 04:12:11PM -0400, Michael Meissner wrote:
> > This patch changes the name used by the <math>l built-in functions that return
> > or are passed long double if the long double type is changed from the current
> > IBM long double format to the IEEE 128-bit format.
> >
> > I have done a bootstrap and make check with no regressions on a little endian
> > power8 system. Is it ok to check into the trunk? This will need to be back
> > ported to the GCC 8.x branch.
>
> Could you test it on the usual assortment of systems instead of just one?
> BE 7 and 8, LE 8 and 9. Or wait for possible fallout :-)
Ok.
> A backport to 8 is wanted yes, but please wait as usual. It's fine after
> a week or so of no problems.
Yep.
>
> > +/* On 64-bit Linux and Freebsd systems, possibly switch the long double library
> > + function names from <foo>l to <foo>f128 if the default long double type is
> > + IEEE 128-bit. Typically, with the C and C++ languages, the standard math.h
> > + include file switches the names on systems that support long double as IEEE
> > + 128-bit, but that doesn't work if the user uses __builtin_<foo>l directly or
> > + if they use Fortran. Use the TARGET_MANGLE_DECL_ASSEMBLER_NAME hook to
> > + change this name. We only do this if the default is long double is not IEEE
> > + 128-bit, and the user asked for IEEE 128-bit. */
>
> s/default is/default/
>
> Does this need some synchronisation with the libm headers? I guess things
> will just work out, but it is desirable if libm stops doing this with
> compilers that have this change?
It should just work out assuming you are using a recent enough GLIBC. The
patch is more for when you aren't using headers.
> > +static tree
> > +rs6000_mangle_decl_assembler_name (tree decl, tree id)
> > +{
> > + if (!TARGET_IEEEQUAD_DEFAULT && TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
>
> Write this is in the opposite order?
> if (TARGET_LONG_DOUBLE_128 && TARGET_IEEEQUAD && !TARGET_IEEEQUAD_DEFAULT
Because !TARGET_IEEEQUAD_DEFAULT is a constant test. If you are on a system
that defaults to IEEE 128-bit, the whole code gets deleted. I would hope the
tests still get deleted if it occurs later in the test, but I tend to put the
things that can be optimized at compile time first.
> > + {
> > + size_t len = IDENTIFIER_LENGTH (id);
> > + const char *name = IDENTIFIER_POINTER (id);
> > +
> > + if (name[len-1] == 'l')
> > + {
> > + bool has_long_double_p = false;
> > + tree type = TREE_TYPE (decl);
> > + machine_mode ret_mode = TYPE_MODE (type);
> > +
> > + /* See if the function returns long double or long double
> > + complex. */
> > + if (ret_mode == TFmode || ret_mode == TCmode)
> > + has_long_double_p = true;
>
> This comment is a bit misleading I think? The code checks if it is the
> same mode as would be used for long double, not if that is the actual
> asked-for type. The code is fine AFAICS, the comment isn't so great
> though.
Well the long double type is 'TFmode'. Though _Float128 does get mapped to
TFmode instead of KFmode also. But explicit f128 built-ins won't go through
here, since they don't end in 'l'. I'm just trying to avoid things like CLZL
that take long arguments and not long double.
> > + else
> > + {
> > + function_args_iterator args_iter;
> > + tree arg;
> > +
> > + /* See if we have a long double or long double complex
> > + argument. */
>
> And same here.
>
> > + FOREACH_FUNCTION_ARGS (type, arg, args_iter)
> > + {
> > + machine_mode arg_mode = TYPE_MODE (arg);
> > + if (arg_mode == TFmode || arg_mode == TCmode)
> > + {
> > + has_long_double_p = true;
> > + break;
> > + }
> > + }
> > + }
> > +
> > + /* If we have long double, change the name. */
>
> And this.
>
> > + if (has_long_double_p)
> > + {
> > + char *name2 = (char *) alloca (len + 4);
> > + memcpy (name2, name, len-1);
>
> len - 1
Ok.
> Okay for trunk with those things fixed. Thanks!
>
>
> Segher
>
--
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.ibm.com, phone: +1 (978) 899-4797
More information about the Gcc-patches
mailing list