On Thu, Dec 31, 2015 at 08:29:58PM +0000, Joseph Myers wrote:
> On Tue, 29 Dec 2015, Michael Meissner wrote:
>
> > +/* __eqkf2 returns 0 if equal, or 1 if not equal or NaN. */
> > +CMPtype
> > +__eqkf2_hw (TFtype a, TFtype b)
> > +{
> > + return (__builtin_isunordered (a, b) || (a != b)) ? 1 : 0;
>
> This is more complicated than necessary. "return a != b;" will suffice.
Ok. I will change this.
> > +/* __gekf2 returns -1 if a < b, 0 if a == b, +1 if a > b, or -2 if NaN. */
> > +CMPtype
> > +__gekf2_hw (TFtype a, TFtype b)
> > +{
> > + if (__builtin_isunordered (a, b))
> > + return -2;
> > +
> > + else if (a < b)
> > + return -1;
>
> The __builtin_isunordered check should come after the < check, so that the
> "invalid" exception gets raised for quiet NaN arguments.
>
> > +/* __lekf2 returns -1 if a < b, 0 if a == b, +1 if a > b, or +2 if NaN. */
> > +CMPtype
> > +__lekf2_hw (TFtype a, TFtype b)
> > +{
> > + if (__builtin_isunordered (a, b))
> > + return 2;
> > +
> > + else if (a < b)
> > + return -1;
>
> Likewise.
Ok. I will change these.
> > + char *p = (char *) getauxval (AT_PLATFORM);
>
> glibc deliberately exports __getauxval at a public symbol version, so you
> can do this in a namespace-clean way.
Ok. I will change this. The getauxval call by the way is only a temporary
measure until the support for __builtin_cpu_supports is added to the PowerPC.
> > +CMPtype __eqkf2 (TFtype, TFtype)
> > + __attribute__ ((__ifunc__ ("__eqkf2_resolve")));
> > +
> > +CMPtype __gekf2 (TFtype, TFtype)
> > + __attribute__ ((__ifunc__ ("__gekf2_resolve")));
> > +
> > +CMPtype __lekf2 (TFtype, TFtype)
> > + __attribute__ ((__ifunc__ ("__lekf2_resolve")));
>
> Don't you need to arrange __nekf2, __gtkf2, __ltkf2 aliases to these
> resolvers (the semantics mean they don't need to be separate functions,
> but the entry points need to be there given the optabs the back end sets
> up)?
Because of default conversions we cannot allow the normal optab mechanism to be
used for IEEE 128-bit floating point emulation. This is due to the fact that
if you have a __float128 comparison, the compiler will see if a larger type can
do the comparison, and in this case, the larger type is TFmode (i.e. IBM
extended double using the current defaults).
Instead rs6000_generate_compare generates the calls, and it does not use
the alternate names. I can easily put in the resolver calls as well for the
alternate names just in case somebody hand crafts a call to __nekf3.
>
> > +#ifdef _ARCH_PPC64
> > +TItype_ppc __fixkfti (TFtype)
> > + __attribute__ ((__ifunc__ ("__fixkfti_resolve")));
> > +
> > +UTItype_ppc __fixunskfti (TFtype)
> > + __attribute__ ((__ifunc__ ("__fixunskfti_resolve")));
> > +
> > +TFtype __floattikf (TItype_ppc)
> > + __attribute__ ((__ifunc__ ("__floattikf_resolve")));
> > +
> > +TFtype __floatuntikf (UTItype_ppc)
> > + __attribute__ ((__ifunc__ ("__floatuntikf_resolve")));
> > +#endif
>
> I don't see the point of using ifuncs that just always return the software
> version. You might as well just give the software version the appropriate
> function name directly, and add ifuncs later if adding a version using
> hardware arithmetic (e.g. doing something like the libgcc2.c functions
> with hardware conversions to/from DImode).
I'll think about it. At some point, I was hoping to have implementations for
ISA 3.0. However, there is not an ISA 3.0 instruction that converts from
128-bit integer to 128-bit floating point or vice versa.
>
> > +#define ISA_BIT(x) (1 << (63 - x))
>
> As far as I can see, my previous comment still applies: this part of the
> sfp-machine.h changes needs to be under some appropriate conditional so
> that it only applies when building the KFmode functions, not for 32-bit
> soft-float / e500 libgcc builds.
Agreed. I will fix this.
--
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: [email protected], phone: +1 (978) 899-4797