On Fri, Jul 26, 2019 at 11:20:27AM +0800, Kewen.Lin wrote:
> on 2019/7/25 下午9:49, Segher Boessenkool wrote:
> > "vrlv2di_and" is an a bit unhappy name, we have a "vrlv" intruction.
> > Just something like "rotatev2di_something", maybe?
> > 
> > Do we have something similar for non-rotate vector shifts, already?  We
> > probably should, so please keep that in mind for naming things.
> > 
> > "vrlv2di_and" sounds like you first do the rotate, and then on what
> > that results in you do the and.  And that is what the pattern does,
> > too.  But this is wrong: it should mask off all but the lower bits
> > of operand 2, instead.
> 
> You are right, the name matches the pattern but not what we want.
> How about the name trunc_vrl<mode>, first do the truncation on the
> operand 2 then do the vector rotation.  I didn't find any existing
> shifts with the similar pattern.

vector.md has define_expand "vrotl<mode>3".  Can you use that one
directly?

> > All the patterns can be merged into one (using some code_iterator).  That
> > can be a later improvement.
> 
> I guess you mean mode_attr?

code iterator, mode iterator, what's the difference ;-)  (Yup you're right
of course).

> I did try to merge them since they look tedious.  But the mode_attr can't
> contain either "[" or "(" inside, it seems can't be used for different const 
> vector mappings.  Really appreciate that if you can show me some examples.

You might need to define a new predicate?  I'll have a look later.

> >> +;; Return 1 if op is a vector register that operates on integer vectors
> >> +;; or if op is a const vector with integer vector modes.
> >> +(define_predicate "vint_reg_or_const_vector"
> >> +  (match_code "reg,subreg,const_vector")
> 
> > Hrm, I don't like this name very much.  Why is just vint_operand not
> > enough for what you use this for?
> 
> vint_operand isn't enough since the expander legalizes the const vector into
> vector register, I'm unable to get the feeder (const vector) of the input 
> register operand.

Hrm.  Ideally you wouldn't expand to such very specific patterns in the
first place.

> > Why do you have to emit as the "and" form here?  Emitting the "bare"
> > rotate should work just as well here?
> 
> Yes, the emitted insn is exactly the same.
> 
> It follows Jakub's suggestion via
> https://gcc.gnu.org/ml/gcc-patches/2019-07/msg01159.html
> 
> Append one explicit AND to indicate the truncation for the case 
> !SHIFT_COUNT_TRUNCATED.  (sorry if the previous pattern misled.)

This is rs6000-specific code.  We always have !SHIFT_COUNT_TRUNCATED, but
we *do* in all cases have similar effects (it just differs per mode and
on the exact operation exactly how many bits are masked).

> >> +/* { dg-options "-O3" } */
> >> +/* { dg-require-effective-target powerpc_vsx_ok } */
> > 
> >> +/* { dg-final { scan-assembler {\mvrld\M} } } */
> >> +/* { dg-final { scan-assembler {\mvrlw\M} } } */
> >> +/* { dg-final { scan-assembler {\mvrlh\M} } } */
> >> +/* { dg-final { scan-assembler {\mvrlb\M} } } */
> > 
> > You need to generate code for whatever cpu introduced those insns,
> > if you expect those to be generated ;-)
> > 
> > vsx_ok isn't needed.
> > 
> 
> Thanks for catching, update it with altivec_ok in new patch.
> I think we can still have this guard?  since those instructions 
> origin from isa 2.03. 

The ISA doc says "2.03" for the altivec insns, because that was the first
ISA version that describes altivec.  Before this it was a separate doc;
altivec is as old as ISA 1.xx.

vrld needs power8, as you discovered.  That means you need to have two
testcases, one you compile with -mdejagnu-cpu=power8, one without.


Segher

Reply via email to