[PATCH] PR target/79004, Fix char/short -> _Float128 on PowerPC -mcpu=power9
Michael Meissner
meissner@linux.vnet.ibm.com
Wed Jan 18 01:00:00 GMT 2017
On Wed, Jan 11, 2017 at 04:39:19PM -0600, Segher Boessenkool wrote:
> On Mon, Jan 09, 2017 at 07:32:27PM -0500, Michael Meissner wrote:
> > This patch fixes PR target/79004 by eliminating the optimization of avoiding
> > direct move if we are converting an 8/16-bit integer value from memory to IEEE
> > 128-bit floating point.
> >
> > I opened a new bug (PR target/79038) to address the underlying issue that the
> > IEEE 128-bit floating point integer conversions were written before small
> > integers were allowed in the traditional Altivec registers. This meant that we
> > had to use UNSPEC and explicit temporaries to get the integers into the
> > appropriate registers.
> >
> > I have tested this bug by doing a bootstrap build and make check on a little
> > endian power8 system and using an assembler that knows about ISA 3.0
> > instructions. I added a new test to verify the results. Can I check this into
> > the trunk? This is not an issue on GCC 6.x.
>
> Okay, thanks! Two comments:
>
> > +/* { dg-final { scan-assembler-not " bl __" } } */
> > +/* { dg-final { scan-assembler "xscvdpqp" } } */
> > +/* { dg-final { scan-assembler "xscvqpdp" } } */
>
> This line always matches if ...
>
> > +/* { dg-final { scan-assembler "xscvqpdpo" } } */
>
> ... this one does. I recommend \m \M .
>
> > +/* { dg-final { scan-assembler "xscvqpsdz" } } */
> > +/* { dg-final { scan-assembler "xscvqpswz" } } */
> > +/* { dg-final { scan-assembler "xscvsdqp" } } */
> > +/* { dg-final { scan-assembler "xscvudqp" } } */
> > +/* { dg-final { scan-assembler "lxsd" } } */
> > +/* { dg-final { scan-assembler "lxsiwax" } } */
> > +/* { dg-final { scan-assembler "lxsiwzx" } } */
> > +/* { dg-final { scan-assembler "lxssp" } } */
> > +/* { dg-final { scan-assembler "stxsd" } } */
> > +/* { dg-final { scan-assembler "stxsiwx" } } */
> > +/* { dg-final { scan-assembler "stxssp" } } */
>
> There are many more than 14 instructions generated; maybe you want
> scan-assembler-times?
It turns out the testcase I submitted for pr79004 failed, since I had the wrong
syntax for \m and \M (you need to use {\m...\M} not "\m...\M". I also forgot
to add -mfloat128. I committed this patch as obvious:
2017-01-17 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/79004
* gcc.target/powerpc/pr79004.c: Add -mfloat128 to the test
options. Fix up the syntax for using \m and \M.
--
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
-------------- next part --------------
Index: gcc/testsuite/gcc.target/powerpc/pr79004.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/pr79004.c (revision 244555)
+++ gcc/testsuite/gcc.target/powerpc/pr79004.c (working copy)
@@ -1,7 +1,7 @@
/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
/* { dg-require-effective-target powerpc_p9vector_ok } */
/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
-/* { dg-options "-mcpu=power9 -O2" } */
+/* { dg-options "-mcpu=power9 -O2 -mfloat128" } */
#include <math.h>
@@ -101,18 +101,18 @@
void to_uns_int_store_n (TYPE a, unsigned int *p, long n) { p[n] = (unsigned int)a; }
void to_uns_long_store_n (TYPE a, unsigned long *p, long n) { p[n] = (unsigned long)a; }
-/* { dg-final { scan-assembler-not "\mbl __" } } */
-/* { dg-final { scan-assembler "\mxscvdpqp\M" } } */
-/* { dg-final { scan-assembler "\mxscvqpdp\M" } } */
-/* { dg-final { scan-assembler "\mxscvqpdpo\M" } } */
-/* { dg-final { scan-assembler "\mxscvqpsdz\M" } } */
-/* { dg-final { scan-assembler "\mxscvqpswz\M" } } */
-/* { dg-final { scan-assembler "\mxscvsdqp\M" } } */
-/* { dg-final { scan-assembler "\mxscvudqp\M" } } */
-/* { dg-final { scan-assembler "\mlxsd\M" } } */
-/* { dg-final { scan-assembler "\mlxsiwax\M" } } */
-/* { dg-final { scan-assembler "\mlxsiwzx\M" } } */
-/* { dg-final { scan-assembler "\mlxssp\M" } } */
-/* { dg-final { scan-assembler "\mstxsd\M" } } */
-/* { dg-final { scan-assembler "\mstxsiwx\M" } } */
-/* { dg-final { scan-assembler "\mstxssp\M" } } */
+/* { dg-final { scan-assembler-not {\mbl __} } } */
+/* { dg-final { scan-assembler {\mxscvdpqp\M} } } */
+/* { dg-final { scan-assembler {\mxscvqpdp\M} } } */
+/* { dg-final { scan-assembler {\mxscvqpdpo\M} } } */
+/* { dg-final { scan-assembler {\mxscvqpsdz\M} } } */
+/* { dg-final { scan-assembler {\mxscvqpswz\M} } } */
+/* { dg-final { scan-assembler {\mxscvsdqp\M} } } */
+/* { dg-final { scan-assembler {\mxscvudqp\M} } } */
+/* { dg-final { scan-assembler {\mlxsd\M} } } */
+/* { dg-final { scan-assembler {\mlxsiwax\M} } } */
+/* { dg-final { scan-assembler {\mlxsiwzx\M} } } */
+/* { dg-final { scan-assembler {\mlxssp\M} } } */
+/* { dg-final { scan-assembler {\mstxsd\M} } } */
+/* { dg-final { scan-assembler {\mstxsiwx\M} } } */
+/* { dg-final { scan-assembler {\mstxssp\M} } } */
More information about the Gcc-patches
mailing list