On Thu, 2020-04-09 at 05:16 -0400, Michael Meissner via Gcc-patches wrote: > Backport PR target/93932 (variable vec_extract) to GCC 9 > > This patch backports the fix for PR target/93932 from the current > master branch > to GCC 9. The patch for the master branch had to be adjusted due to > using > different constraints (GCC 10 uses the enabled attribute to eliminate > alternatives, while GCC 9 uses special constraints). I have tested > this on a > little endian power8 system running Linux. The bootstrap and make > check had no > regressions. > > This patch does fix the following test cases on power8 code: > gcc.target/powerpc/fold-vec-extract-double.p8.c > gcc.target/powerpc/fold-vec-extract-longlong.p8.c > gcc.target/powerpc/fold-vec-extract-longlong.p9.c > > Can I check this patch into the gcc 9 branch?
LGTM. This patch matches almost identically with what went into Mainline. Exception to identical are two parts; 1 - A constraint change "v"/"wk" that exists in 9 versus mainline, (ok) 2 - The testcase changes, which are referenced in the provided description. (and pass now, which is ++ok). :-) Thanks -Will > > > 2020-04-09 Michael Meissner <meiss...@linux.ibm.com> > > Back port from trunk > 2020-02-26 Michael Meissner <meiss...@linux.ibm.com> > > PR target/93932 > * config/rs6000/vsx.md (vsx_extract_<mode>_var, VSX_D > iterator): > Split the insn into two parts. This insn only does variable > extract from a register. > (vsx_extract_<mode>_var_load, VSX_D iterator): New insn, do > variable extract from memory. > (vsx_extract_v4sf_var): Split the insn into two parts. This > insn > only does variable extract from a register. > (vsx_extract_v4sf_var_load): New insn, do variable extract from > memory. > (vsx_extract_<mode>_var, VSX_EXTRACT_I iterator): Split the > insn > into two parts. This insn only does variable extract from a > register. > (vsx_extract_<mode>_var_load, VSX_EXTRACT_I iterator): New > insn, > do variable extract from memory. > > --- /tmp/t3Q8FG_vsx.md 2020-04-09 02:18:54.436474001 -0500 > +++ gcc/config/rs6000/vsx.md 2020-04-09 02:03:31.998405325 -0500 > @@ -3292,14 +3292,14 @@ (define_insn "vsx_vslo_<mode>" > "vslo %0,%1,%2" > [(set_attr "type" "vecperm")]) > > -;; Variable V2DI/V2DF extract > +;; Variable V2DI/V2DF extract from a register > (define_insn_and_split "vsx_extract_<mode>_var" > - [(set (match_operand:<VS_scalar> 0 "gpc_reg_operand" "=v,<VSa>,r") > - (unspec:<VS_scalar> [(match_operand:VSX_D 1 "input_operand" > "v,m,m") > - (match_operand:DI 2 "gpc_reg_operand" > "r,r,r")] > + [(set (match_operand:<VS_scalar> 0 "gpc_reg_operand" "=v") > + (unspec:<VS_scalar> [(match_operand:VSX_D 1 "gpc_reg_operand" > "v") > + (match_operand:DI 2 "gpc_reg_operand" > "r")] > UNSPEC_VSX_EXTRACT)) > - (clobber (match_scratch:DI 3 "=r,&b,&b")) > - (clobber (match_scratch:V2DI 4 "=&v,X,X"))] > + (clobber (match_scratch:DI 3 "=r")) > + (clobber (match_scratch:V2DI 4 "=&v"))] > "VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_DIRECT_MOVE_64BIT" > "#" > "&& reload_completed" > @@ -3310,6 +3310,23 @@ (define_insn_and_split "vsx_extract_<mod > DONE; > }) > > +;; Variable V2DI/V2DF extract from memory > +(define_insn_and_split "*vsx_extract_<mode>_var_load" > + [(set (match_operand:<VS_scalar> 0 "gpc_reg_operand" "=wa,r") > + (unspec:<VS_scalar> [(match_operand:VSX_D 1 "memory_operand" > "Q,Q") > + (match_operand:DI 2 "gpc_reg_operand" > "r,r")] > + UNSPEC_VSX_EXTRACT)) > + (clobber (match_scratch:DI 3 "=&b,&b"))] > + "VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_DIRECT_MOVE_64BIT" > + "#" > + "&& reload_completed" > + [(set (match_dup 0) (match_dup 4))] > +{ > + operands[4] = rs6000_adjust_vec_address (operands[0], operands[1], > operands[2], > + operands[3], > <VS_scalar>mode); > +} > + [(set_attr "type" "fpload,load")]) > + > ;; Extract a SF element from V4SF > (define_insn_and_split "vsx_extract_v4sf" > [(set (match_operand:SF 0 "vsx_register_operand" "=ww") > @@ -3361,14 +3378,14 @@ (define_insn_and_split "*vsx_extract_v4s > [(set_attr "type" "fpload,fpload,fpload,load") > (set_attr "length" "8")]) > > -;; Variable V4SF extract > +;; Variable V4SF extract from a register > (define_insn_and_split "vsx_extract_v4sf_var" > - [(set (match_operand:SF 0 "gpc_reg_operand" "=ww,ww,?r") > - (unspec:SF [(match_operand:V4SF 1 "input_operand" "v,m,m") > - (match_operand:DI 2 "gpc_reg_operand" "r,r,r")] > + [(set (match_operand:SF 0 "gpc_reg_operand" "=wa") > + (unspec:SF [(match_operand:V4SF 1 "gpc_reg_operand" "v") > + (match_operand:DI 2 "gpc_reg_operand" "r")] > UNSPEC_VSX_EXTRACT)) > - (clobber (match_scratch:DI 3 "=r,&b,&b")) > - (clobber (match_scratch:V2DI 4 "=&v,X,X"))] > + (clobber (match_scratch:DI 3 "=r")) > + (clobber (match_scratch:V2DI 4 "=&v"))] > "VECTOR_MEM_VSX_P (V4SFmode) && TARGET_DIRECT_MOVE_64BIT" > "#" > "&& reload_completed" > @@ -3379,6 +3396,23 @@ (define_insn_and_split "vsx_extract_v4sf > DONE; > }) > > +;; Variable V4SF extract from memory > +(define_insn_and_split "*vsx_extract_v4sf_var_load" > + [(set (match_operand:SF 0 "gpc_reg_operand" "=wa,?r") > + (unspec:SF [(match_operand:V4SF 1 "memory_operand" "Q,Q") > + (match_operand:DI 2 "gpc_reg_operand" "r,r")] > + UNSPEC_VSX_EXTRACT)) > + (clobber (match_scratch:DI 3 "=&b,&b"))] > + "VECTOR_MEM_VSX_P (V4SFmode) && TARGET_DIRECT_MOVE_64BIT" > + "#" > + "&& reload_completed" > + [(set (match_dup 0) (match_dup 4))] > +{ > + operands[4] = rs6000_adjust_vec_address (operands[0], operands[1], > operands[2], > + operands[3], SFmode); > +} > + [(set_attr "type" "fpload,load")]) > + > ;; Expand the builtin form of xxpermdi to canonical rtl. > (define_expand "vsx_xxpermdi_<mode>" > [(match_operand:VSX_L 0 "vsx_register_operand") > @@ -3720,15 +3754,15 @@ (define_insn_and_split "*vsx_extract_<mo > [(set_attr "type" "load") > (set_attr "length" "8")]) > > -;; Variable V16QI/V8HI/V4SI extract > +;; Variable V16QI/V8HI/V4SI extract from a register > (define_insn_and_split "vsx_extract_<mode>_var" > - [(set (match_operand:<VS_scalar> 0 "gpc_reg_operand" "=r,r,r") > + [(set (match_operand:<VS_scalar> 0 "gpc_reg_operand" "=r,r") > (unspec:<VS_scalar> > - [(match_operand:VSX_EXTRACT_I 1 "input_operand" "wK,v,m") > - (match_operand:DI 2 "gpc_reg_operand" "r,r,r")] > + [(match_operand:VSX_EXTRACT_I 1 "gpc_reg_operand" "wK,v") > + (match_operand:DI 2 "gpc_reg_operand" "r,r")] > UNSPEC_VSX_EXTRACT)) > - (clobber (match_scratch:DI 3 "=r,r,&b")) > - (clobber (match_scratch:V2DI 4 "=X,&v,X"))] > + (clobber (match_scratch:DI 3 "=r,r")) > + (clobber (match_scratch:V2DI 4 "=X,&v"))] > "VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_DIRECT_MOVE_64BIT" > "#" > "&& reload_completed" > @@ -3739,6 +3773,24 @@ (define_insn_and_split "vsx_extract_<mod > DONE; > }) > > +;; Variable V16QI/V8HI/V4SI extract from memory > +(define_insn_and_split "*vsx_extract_<mode>_var_load" > + [(set (match_operand:<VS_scalar> 0 "gpc_reg_operand" "=r") > + (unspec:<VS_scalar> > + [(match_operand:VSX_EXTRACT_I 1 "memory_operand" "Q") > + (match_operand:DI 2 "gpc_reg_operand" "r")] > + UNSPEC_VSX_EXTRACT)) > + (clobber (match_scratch:DI 3 "=&b"))] > + "VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_DIRECT_MOVE_64BIT" > + "#" > + "&& reload_completed" > + [(set (match_dup 0) (match_dup 4))] > +{ > + operands[4] = rs6000_adjust_vec_address (operands[0], operands[1], > operands[2], > + operands[3], > <VS_scalar>mode); > +} > + [(set_attr "type" "load")]) > + > (define_insn_and_split "*vsx_extract_<mode>_<VS_scalar>mode_var" > [(set (match_operand:<VS_scalar> 0 "gpc_reg_operand" "=r,r,r") > (zero_extend:<VS_scalar> >