This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH], Set PowerPC .gnu_attribute for long double use if no call
- From: Michael Meissner <meissner at linux dot vnet dot ibm dot com>
- To: Segher Boessenkool <segher at kernel dot crashing dot org>
- Cc: Michael Meissner <meissner at linux dot vnet dot ibm dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>, David Edelsohn <dje dot gcc at gmail dot com>, Bill Schmidt <wschmidt at linux dot vnet dot ibm dot com>
- Date: Wed, 17 Jan 2018 18:23:16 -0500
- Subject: Re: [PATCH], Set PowerPC .gnu_attribute for long double use if no call
- Authentication-results: sourceware.org; auth=none
- References: <20180111181105.GA20208@ibm-tiger.the-meissners.org> <20180112172103.GH21977@gate.crashing.org>
On Fri, Jan 12, 2018 at 11:21:04AM -0600, Segher Boessenkool wrote:
> On Thu, Jan 11, 2018 at 01:11:05PM -0500, Michael Meissner wrote:
> > In working on the transition of PowerPC long double from using the IBM extended
> > double format to IEEE 128-bit floating point, I noticed that the long double
> > .gnu_attribute (#4) was not set if the compiler can handle long double directly
> > without doing the call to an emulator, such as using IEEE 128-bit floating
> > point on an ISA 3.0 (power9) 64-bit system. This patch sets the attribute if
> > there is a move of the appropriate type. I only check TF/TCmode for the normal
> > case, and DF/DCmode for -mlong-double-64, since IFmode is used for __ibm128
> > when long double is IEEE and KFmode is used for __float128 when long double is
> > IEEE.
> >
> > I have checked this on a little endian power8 system with bootstrap and make
> > check. There were no regressions, and I verified that the three new tests are
> > run and pass. Can I check this into the trunk?
>
> > [gcc]
> > 2018-01-11 Michael Meissner <meissner@linux.vnet.ibm.com>
> >
> > (rs6000_emit_move): If we load or store a long double type, set
> > the flags for noting the default long double type, even if we
> > don't pass or return a long double type.
> >
> > [gcc/testsuite]
> > 2018-01-11 Michael Meissner <meissner@linux.vnet.ibm.com>
> >
> > * gcc.target/powerpc/gnuattr1.c: New test to make sure we set the
> > appropriate .gnu_attribute for the long double type, if we use the
> > long double type, but do not generate any calls.
> > * gcc.target/powerpc/gnuattr2.c: Likewise.
> > * gcc.target/powerpc/gnuattr3.c: Likewise.
>
>
> > + if (rs6000_gnu_attr
> > + && ((HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT))
>
> One pair of parens is enough ;-)
>
> > + && ((TARGET_LONG_DOUBLE_128
> > + && (mode == TFmode || mode == TCmode))
> > + || (!TARGET_LONG_DOUBLE_128
> > + && (mode == DFmode || mode == DCmode))))
>
> It's easier to read if you join these lines pairwise:
>
> > + && ((TARGET_LONG_DOUBLE_128 && (mode == TFmode || mode == TCmode))
> > + || (!TARGET_LONG_DOUBLE_128 && (mode == DFmode || mode == DCmode))))
>
> Or maybe something with ?:, or break the statement into multiple.
>
> Okay for trunk if you make it a bit more readable :-) Thanks,
This is what I just checked in:
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c (revision 256810)
+++ gcc/config/rs6000/rs6000.c (working copy)
@@ -10493,6 +10493,23 @@ rs6000_emit_move (rtx dest, rtx source,
gcc_unreachable ();
}
+#ifdef HAVE_AS_GNU_ATTRIBUTE
+ /* If we use a long double type, set the flags in .gnu_attribute that say
+ what the long double type is. This is to allow the linker's warning
+ message for the wrong long double to be useful, even if the function does
+ not do a call (for example, doing a 128-bit add on power9 if the long
+ double type is IEEE 128-bit. Do not set this if __ibm128 or __floa128 are
+ used if they aren't the default long dobule type. */
+ if (rs6000_gnu_attr && (HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE || TARGET_64BIT))
+ {
+ if (TARGET_LONG_DOUBLE_128 && (mode == TFmode || mode == TCmode))
+ rs6000_passes_float = rs6000_passes_long_double = true;
+
+ else if (!TARGET_LONG_DOUBLE_128 && (mode == DFmode || mode == DCmode))
+ rs6000_passes_float = rs6000_passes_long_double = true;
+ }
+#endif
+
/* See if we need to special case SImode/SFmode SUBREG moves. */
if ((mode == SImode || mode == SFmode) && SUBREG_P (source)
&& rs6000_emit_move_si_sf_subreg (dest, source, mode))
--
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797