On Tue, Sep 17, 2024 at 02:33:09AM -0500, Segher Boessenkool wrote:
> Hi!
> 
> On Mon, Sep 16, 2024 at 11:40:45PM -0400, Michael Meissner wrote:
> > With this patch, GCC now realizes that the vector shift instructions will 
> > look
> > at the bottom 6 bits for the shift count, and it can use either a VSPLTISW 
> > or
> > XXSPLTIB instruction to load the shift count.
> 
> Do we do something like this for integer shift instructions already?

We didn't previously, so shifts greater than 15 required 3 instructions
(because we needed 2 instructions to load and splat the value since we couldn't
use VSPLTIS{B,H,W}.  This patch fixes those shifts as well.

I.e. for:

        typedef vector int vi32_t;

        vi32_t
        shiftra_test32_29 (vi32_t a)
        {
          vui32_t x = {29, 29, 29, 29};
          return (vi32_t) vec_vsraw (a, x);
        }

Previously we generated:

        xxspltib 32,29
        vextsb2w 0,0
        vsraw 2,2,0
        blr

Now we generate:

        xxspltib 32,29
        vsraw 2,2,0
        blr

> > +  operands[4] = ((GET_CODE (operands[2]) == CONST_VECTOR)
> > +            ? CONST_VECTOR_ELT (operands[2], 0)
> > +            : XEXP (operands[2], 0));
> 
> Useless parens are useless, please lose them?

Done.

> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/powerpc/pr89213.c
> > @@ -0,0 +1,106 @@
> > +/* { dg-do compile { target { lp64 } } } */
> 
> Why only on 64-bit systems?  Does it fail with -m32?  Why / how?
> 
> With that, okay for trunk.  Thanks!

After testing, it works on 32-bit systems as well, and I removed the 64-bit
target requirement.

I have committed the patch with the 2 changes (lose the extra parenthesis and
allow the test on 32-bit).

-- 
Michael Meissner, IBM
PO Box 98, Ayer, Massachusetts, USA, 01432
email: meiss...@linux.ibm.com

Reply via email to