Hi! On Sun, Nov 01, 2020 at 06:32:02PM -0500, Vladimir Makarov wrote: > On 2020-10-30 7:36 p.m., Segher Boessenkool wrote: > >Thanks for the patch! But it has a problem: > > > >>diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md > >>index 67e4f2fd037..78de85ccbbb 100644 > >>--- a/gcc/config/rs6000/vsx.md > >>+++ b/gcc/config/rs6000/vsx.md > >>@@ -3717,7 +3717,7 @@ > >> (vec_select:<VS_scalar> > >> (match_operand:VSX_EXTRACT_I 1 "gpc_reg_operand" "<VSX_EX>,v") > >> (parallel [(match_operand:QI 2 "const_int_operand" "n,n")]))) > >>- (clobber (match_scratch:<VS_scalar> 3 "=<VSX_EX>,&r")) > >>+ (clobber (match_scratch:<VS_scalar> 3 "=*<VSX_EX>,&*r")) > >> (clobber (match_scratch:SI 4 "=X,&r"))] > >> "VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_VEXTRACTUB" > >> "#" > >You add * to both alternatives here? I would expect adding it to only > >the second alternative, does it work better with both? > No. It works the same. When the both alternatives use the hint, the > scratch pseudo got the class ALL_REGS. When only the 2nd use the hint, > the class is VSX_REGS. As I understand now the preferable alternative > is the 1st one (with <VSX> for the scratch). In this case using the > hint only for the 2nd alternative has more sense. > >That also avoids a different problem: *<VSX_EX> won't work as expected. > >'*' in IRA skips one constraint character, but <VSX_EX> can be "wa", a > >two-letter constraint (and we do have an "a" constraint as well, > >something wholly different: "wa" means a VSX register, while "a" is an > >indexed address). > > > > case '*': > > /* Ignore the next letter for this pass. */ > > c = *++p; > > break; > > > > > I see. Thanks for pointing this out. Definitely it is better to use the > hint only for the second alternative ("&*r") then. Is this solution ok > for you?
Yes, certainly. And thanks! (Should "*" be changed so that it skips a whole constraint if it can, instead of only a single char always?) Segher