S/390: Rework instruction scheduling.
authorRobin Dapp <rdapp@linux.ibm.com>
Tue, 12 Mar 2019 17:08:27 +0000 (17:08 +0000)
committerRobin Dapp <rdapp@gcc.gnu.org>
Tue, 12 Mar 2019 17:08:27 +0000 (17:08 +0000)
This patch set adds new pipeline descriptions for z13 and z14.  Based
on that, the scoring and some properties are handled differently in
the scheduler hooks.

The patch before (r269620) also belongs to this set but I accidentally
applied it separately.

From-SVN: r269622

gcc/ChangeLog
gcc/config/s390/3906.md [new file with mode: 0644]
gcc/config/s390/s390.c
gcc/config/s390/s390.h
gcc/config/s390/s390.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/memset-1.c

index b39322d5eb05f049ebde88e028243c6bc457ab06..3c2499b0946610c9005beab6da4080b6cc60c239 100644 (file)
@@ -1,3 +1,27 @@
+2019-03-12  Robin Dapp  <rdapp@linux.ibm.com>
+
+       * config/s390/3906.md: New file.
+       * config/s390/s390.c (MAX_SCHED_UNITS): Increase.
+       (LONGRUNNING_THRESHOLD): Remove.
+       (MAX_SCHED_MIX_SCORE): Decrease.
+       (MAX_SCHED_MIX_DISTANCE): Decrease.
+       (s390_bb_fallthru_entry_likely): Assume fallthru for less than likely.
+       (struct s390_sched_state): New struct to hold scheduling state.
+       (S390_SCHED_STATE_NORMAL): Remove.
+       (S390_SCHED_STATE_CRACKED): Remove.
+       (S390_SCHED_ATTR_MASK_GROUPOFTWO): Add.
+       (s390_get_sched_attrmask): Use new attribute.
+       (s390_get_unit_mask): Use new units.
+       (s390_is_fpd): New function.
+       (s390_is_fxd): New function.
+       (s390_is_longrunning): New function.
+       (s390_sched_score): Use new functions.
+       (s390_sched_reorder): Likewise.
+       (s390_sched_variable_issue): Rework and use new functions.
+       (s390_sched_init): Use new functions.
+       * config/s390/s390.h (s390_tune_attr):  Add z14.
+       * config/s390/s390.md: Add z14.
+
 2019-03-12  Robin Dapp  <rdapp@linux.ibm.com>
 
        * config/s390/2964.md: Update pipeline description.
diff --git a/gcc/config/s390/3906.md b/gcc/config/s390/3906.md
new file mode 100644 (file)
index 0000000..8cb4565
--- /dev/null
@@ -0,0 +1,282 @@
+;; Scheduling description for z14.
+;;   Copyright (C) 2019 Free Software Foundation, Inc.
+;;   Contributed by Robin Dapp (rdapp@linux.ibm.com)
+
+;; This file is part of GCC.
+
+;; GCC is free software; you can redistribute it and/or modify it under
+;; the terms of the GNU General Public License as published by the Free
+;; Software Foundation; either version 3, or (at your option) any later
+;; version.
+
+;; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+;; WARRANTY; without even the implied warranty of MERCHANTABILITY or
+;; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+;; for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GCC; see the file COPYING3.  If not see
+;; <http://www.gnu.org/licenses/>.
+
+(define_attr "z14_unit_fpd" ""
+(cond [(eq_attr "mnemonic" "ddb,ddbr,deb,debr,dxbr,sqdb,sqdbr,sqeb,\
+sqebr,sqxbr,vfddb,vfdsb,vfsqdb,vfsqsb,wfddb,wfdsb,wfdxb,wfsqdb,wfsqxb")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_unit_fxa" ""
+(cond [(eq_attr "mnemonic" "a,afi,ag,agf,agfi,agfr,agh,aghi,aghik,\
+agr,agrk,ahi,ahik,al,alc,alcg,alcgr,alcr,alfi,alg,algf,algfi,algfr,\
+alghsik,algr,alhsik,alr,alrk,aly,ark,ay,bras,brasl,etnd,exrl,flogr,ic,icm,\
+icmh,icmy,icy,iihf,iilf,ipm,la,larl,lay,lb,lbr,lcgr,lcr,lgb,lgbr,lgf,lgfi,\
+lgfr,lgfrl,lgh,lghi,lghr,lghrl,lgr,lh,lhi,lhr,lhrl,lhy,llcr,llgfr,llghr,\
+llgtr,llhr,llihf,llihh,llihl,llilf,llilh,llill,lngr,lnr,loc,locg,locghi,\
+locgr,lochi,locr,lpgr,lpr,lr,lrv,lrvg,lrvgr,lrvh,lrvr,lt,ltg,ltgf,ltgfr,\
+ltgr,ltr,m,mfy,mg,mgh,mghi,mgrk,mh,mhi,mhy,ml,mlg,mlgr,mlr,mr,ms,msfi,msg,\
+msgf,msgfi,msgfr,msgr,msgrkc,msr,msrkc,msy,n,ng,ngr,ngrk,nihf,nihh,nihl,\
+nilf,nilh,nill,nr,nrk,ny,o,og,ogr,ogrk,oihf,oihh,oihl,oilf,oilh,oill,or,\
+ork,oy,pfpo,popcnt,risbg,risbgn,rll,rllg,s,sg,sgf,sgfr,sgh,sgr,sgrk,sh,\
+shy,sl,slb,slbg,slbgr,slbr,slfi,slg,slgf,slgfi,slgfr,slgr,slgrk,sll,sllg,\
+sllk,slr,slrk,sly,sr,sra,srag,srak,srl,srlg,srlk,sy,x,xg,xgr,xgrk,xihf,\
+xilf,xr,xrk,xy")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_unit_fxb" ""
+(cond [(eq_attr "mnemonic" "agsi,algsi,alsi,asi,b,bc,bcr,bi,br,brcl,\
+c,cfi,cg,cgf,cgfi,cgfr,cgfrl,cgh,cghi,cghrl,cghsi,cgit,cgr,cgrl,cgrt,ch,\
+chi,chrl,chsi,chy,cit,cl,clfhsi,clfi,clfit,clg,clgf,clgfi,clgfr,clgfrl,\
+clghsi,clgit,clgr,clgrl,clgrt,clgt,clhhsi,clhrl,cli,cliy,clm,clmy,clr,clrl,\
+clrt,clt,cly,cr,crl,crt,cy,j,jg,laa,laag,lan,lang,lao,laog,lat,lax,laxg,\
+lcdfr,ldgr,ldr,lgat,lgdr,lndfr,lpdfr,lzdr,lzer,mvghi,mvhhi,mvhi,mvi,mviy,ni,\
+niy,nop,nopr,ntstg,oi,oiy,ppa,st,stc,stcy,std,stdy,ste,stey,stg,stgrl,sth,\
+sthrl,sthy,stoc,stocg,strl,strv,strvg,strvh,sty,tend,tm,tmh,tmhh,tmhl,tml,\
+tmlh,tmll,tmy,vlgvf,vlgvg,vlgvh,vlr,vlvgb,vlvgf,vlvgg,vlvgh,vlvgp,vst,vstl,\
+vstrl,vstrlr,xi,xiy")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_unit_fxd" ""
+(cond [(eq_attr "mnemonic" "dlgr,dlr,dr,dsgfr,dsgr")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_unit_lsu" ""
+(cond [(eq_attr "mnemonic" "a,adb,aeb,ag,agf,agh,agsi,al,alc,alcg,\
+alg,algf,algsi,alsi,aly,asi,ay,c,cdb,cg,cgf,cgfrl,cgh,cghrl,cghsi,cgrl,ch,\
+chrl,chsi,chy,cl,clc,clfhsi,clg,clgf,clgfrl,clghsi,clgrl,clgt,clhhsi,clhrl,\
+cli,cliy,clm,clmy,clrl,clt,cly,crl,cy,ddb,deb,ear,ic,icm,icmh,icmy,icy,l,\
+laa,laag,lan,lang,lao,laog,lat,lax,laxg,lb,lcbb,ld,lde,ldeb,ldy,le,ley,lg,\
+lgat,lgb,lgf,lgfrl,lgh,lghrl,lgrl,lh,lhrl,lhy,llc,llgc,llgf,llgfrl,llgh,\
+llghrl,llgt,llh,llhrl,loc,locg,lrl,lrv,lrvg,lrvh,lt,ltg,ltgf,ly,m,madb,maeb,\
+meeb,mfy,mg,mgh,mh,mhy,ml,mlg,ms,msdb,mseb,msg,msgf,msy,mvghi,mvhhi,mvhi,\
+mvi,mviy,n,ng,ni,niy,ntstg,ny,o,og,oi,oiy,oy,s,sar,sdb,seb,sfpc,sg,sgf,\
+sgh,sh,shy,sl,slb,slbg,slg,slgf,sly,sqdb,sqeb,st,stc,stcy,std,stdy,ste,\
+stey,stg,stgrl,sth,sthrl,sthy,stoc,stocg,strl,strv,strvg,strvh,sty,sy,\
+tabort,tm,tmy,vl,vlbb,vleb,vlef,vleg,vleh,vll,vllezb,vllezf,vllezg,vllezh,\
+vllezlf,vlrepb,vlrepf,vlrepg,vlreph,vlrl,vlrlr,vst,vstl,vstrl,vstrlr,x,xg,xi,\
+xiy,xy")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_unit_vfu" ""
+(cond [(eq_attr "mnemonic" "adb,adbr,adtr,aeb,aebr,axbr,axtr,cdb,\
+cdbr,cdtr,cebr,cpsdr,cxbr,cxtr,ddtr,dxtr,fidbr,fidbra,fidtr,fiebr,fiebra,\
+fixbr,fixbra,fixtr,lcdbr,lcebr,lcxbr,ldeb,ldebr,ldetr,le,ledbr,ledtr,ler,\
+ley,lndbr,lnebr,lnxbr,lpdbr,lpebr,lpxbr,ltdbr,ltebr,ltxbr,ltxtr,lxdb,\
+lxdbr,lxdtr,lxeb,lxebr,madb,madbr,maeb,maebr,mdbr,mdtr,meeb,meebr,msdb,\
+msdbr,mseb,msebr,mxbr,mxtr,sdb,sdbr,sdtr,seb,sebr,sxbr,sxtr,tcdb,tceb,tcxb,\
+tdcdt,tdcet,tdcxt,vab,vaccb,vacccq,vaccf,vaccg,vacch,vaccq,vacq,vaf,vag,vah,\
+vaq,vavgb,vavgf,vavgg,vavgh,vavglb,vavglf,vavglg,vavglh,vbperm,vcdgb,\
+vcdlgb,vceqb,vceqbs,vceqf,vceqfs,vceqg,vceqgs,vceqh,vceqhs,vcgdb,vchb,vchbs,\
+vchf,vchfs,vchg,vchgs,vchh,vchhs,vchlb,vchlbs,vchlf,vchlfs,vchlg,vchlgs,\
+vchlh,vchlhs,vcksm,vclgdb,vclzf,vctzb,vctzf,vctzg,vctzh,verimb,verimf,\
+verimg,verimh,verllb,verllf,verllg,verllh,verllvb,verllvf,verllvg,verllvh,\
+veslb,veslf,veslg,veslh,veslvb,veslvf,veslvg,veslvh,vesrab,vesraf,vesrag,\
+vesrah,vesravb,vesravf,vesravg,vesravh,vesrlb,vesrlf,vesrlg,vesrlh,vesrlvb,\
+vesrlvf,vesrlvg,vesrlvh,vfadb,vfasb,vfcedb,vfcedbs,vfcesb,vfcesbs,vfchdb,\
+vfchdbs,vfchedb,vfchedbs,vfchesb,vfchesbs,vfchsb,vfchsbs,vfeeb,vfeef,vfeeh,\
+vfeezbs,vfeezhs,vfeneb,vfenef,vfeneh,vfenezb,vfenezf,vfenezh,vfidb,vfisb,\
+vflcdb,vflcsb,vflndb,vflnsb,vflpdb,vfmadb,vfmasb,vfmaxdb,vfmaxsb,vfmdb,\
+vfmindb,vfminsb,vfmsb,vfmsdb,vfmssb,vfnmadb,vfnmsdb,vfnmssb,vfsdb,vfssb,\
+vftcidb,vftcisb,vgbm,vgfmab,vgfmaf,vgfmag,vgfmah,vgfmb,vgfmf,vgfmg,vgfmh,vgm,\
+vgmb,vgmf,vgmg,vgmh,vistrb,vistrbs,vistrf,vistrfs,vistrh,vlcb,vlcf,vlcg,\
+vlch,vldeb,vleb,vledb,vlef,vleg,vleh,vleib,vleif,vleig,vleih,vlpb,vlpf,\
+vlpg,vlph,vmaeb,vmaef,vmaeh,vmahb,vmahf,vmahh,vmalb,vmaleb,vmalef,vmaleh,\
+vmalf,vmalhb,vmalhf,vmalhh,vmalhw,vmalob,vmalof,vmaloh,vmaob,vmaof,vmaoh,\
+vmeb,vmef,vmeh,vmhb,vmhf,vmhh,vmlb,vmleb,vmlef,vmleh,vmlf,vmlhb,vmlhf,\
+vmlhh,vmlhw,vmlob,vmlof,vmloh,vmnb,vmnf,vmng,vmnh,vmnlb,vmnlf,vmnlg,vmnlh,\
+vmob,vmof,vmoh,vmrhb,vmrhf,vmrhg,vmrhh,vmrlb,vmrlf,vmrlg,vmrlh,vmxb,vmxf,\
+vmxg,vmxh,vn,vnc,vnn,vno,vnot,vnx,vo,voc,vone,vpdi,vperm,vpkf,vpkg,vpkh,\
+vpklsf,vpklsfs,vpklsg,vpklsgs,vpklsh,vpklshs,vpksf,vpksfs,vpksg,vpksgs,vpksh,\
+vpkshs,vpopct,vpopctb,vpopctf,vpopctg,vpopcth,vrepb,vrepf,vrepg,vreph,vrepib,\
+vrepif,vrepig,vrepih,vsb,vsbiq,vscbib,vscbif,vscbig,vscbih,vscbiq,vsegb,\
+vsegf,vsegh,vsel,vsf,vsg,vsh,vsl,vslb,vsldb,vsq,vsra,vsrab,vsrl,vsrlb,vsumb,\
+vsumgf,vsumgh,vsumh,vsumqf,vsumqg,vtm,vuphb,vuphf,vuphh,vuplb,vuplf,vuplhb,\
+vuplhf,vuplhh,vuplhw,vupllb,vupllf,vupllh,vx,vzero,wcdgb,wcdlgb,wcgdb,wclgdb,\
+wfadb,wfasb,wfaxb,wfcdb,wfcedb,wfcesb,wfcexbs,wfchdb,wfchedb,wfchesb,\
+wfchexb,wfchexbs,wfchsb,wfchxb,wfchxbs,wfcsb,wfisb,wfixb,wflcdb,wflcsb,wflcxb,\
+wflld,wflndb,wflnsb,wflnxb,wflpdb,wflpsb,wflpxb,wfmadb,wfmasb,wfmaxb,\
+wfmaxxb,wfmdb,wfminxb,wfmsb,wfmsdb,wfmssb,wfmsxb,wfmxb,wfnmaxb,wfnmsxb,wfsdb,\
+wfssb,wfsxb,wldeb,wledb")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_cracked" ""
+(cond [(eq_attr "mnemonic" "bas,basr,cdfbr,cdftr,cdgbr,cdgtr,cdlfbr,\
+cdlftr,cdlgbr,cdlgtr,cefbr,cegbr,celfbr,celgbr,cfdbr,cfebr,cfxbr,cgdbr,cgdtr,\
+cgebr,cgxbr,cgxtr,chhsi,clfdbr,clfebr,clfxbr,clfxtr,clgdbr,clgdtr,clgebr,\
+clgxbr,clgxtr,cs,csg,csy,d,efpc,ex,lcgfr,lngfr,lpgfr,lpq,lxr,lzxr,rxsbg,stpq,\
+vgef,vgeg,vscef,vsceg,vsteb")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_expanded" ""
+(cond [(eq_attr "mnemonic" "cds,cdsg,cdsy,cxfbr,cxftr,cxgbr,cxgtr,\
+cxlftr,cxlgbr,cxlgtr,dl,dlg,dsg,dsgf,lam,lm,lmg,lmy,sldl,srda,srdl,stam,stm,\
+stmg,stmy,tbegin,tbeginc")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_groupalone" ""
+(cond [(eq_attr "mnemonic" "alc,alcg,alcgr,alcr,axbr,axtr,clc,cxbr,\
+cxtr,dlgr,dlr,dr,dsgfr,dsgr,dxbr,dxtr,fixbr,fixbra,fixtr,flogr,lcxbr,lnxbr,\
+lpxbr,ltxbr,ltxtr,lxdb,lxdbr,lxdtr,lxeb,lxebr,m,madb,maeb,maebr,mfy,mg,mgrk,\
+ml,mlg,mlgr,mlr,mr,msdb,mseb,msebr,mvc,mxbr,mxtr,oc,ppa,sfpc,slb,slbg,\
+slbgr,slbr,sqxbr,sxbr,sxtr,tabort,tcxb,tdcxt,tend,xc")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_endgroup" ""
+(cond [(eq_attr "mnemonic" "bras,brasl,exrl,ipm")
+ (const_int 1)] (const_int 0)))
+
+(define_attr "z14_groupoftwo" ""
+(cond [(eq_attr "mnemonic" "vacccq,vacq,vfmadb,vfmasb,vfmsdb,vfmssb,\
+vfnmadb,vfnmsdb,vfnmssb,vgfmab,vgfmaf,vgfmag,vgfmah,vmaeb,vmaef,vmaeh,vmahb,\
+vmahf,vmahh,vmalb,vmaleb,vmalef,vmaleh,vmalf,vmalhb,vmalhf,vmalhh,vmalhw,\
+vmalob,vmalof,vmaloh,vmaob,vmaof,vmaoh,vperm,vsbiq,vsel,wfmadb,wfmasb,wfmaxb,\
+wfmsdb,wfmssb,wfmsxb,wfnmaxb,wfnmsxb")
+ (const_int 1)] (const_int 0)))
+
+(define_insn_reservation "z14_0" 0
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "a,afi,ag,agfi,aghi,aghik,agr,agrk,ahi,ahik,al,\
+alfi,alg,algf,algfi,algfr,alghsik,algr,alhsik,alr,alrk,aly,ark,ay,b,bc,bcr,\
+bi,br,bras,brasl,brcl,c,cfi,cg,cgfi,cghi,cghsi,cgit,cgr,cgrl,cgrt,chi,\
+chsi,cit,cl,clfhsi,clfi,clfit,clg,clgf,clgfi,clgfr,clgfrl,clghsi,clgit,\
+clgr,clgrl,clgrt,clgt,clhhsi,clhrl,cli,cliy,clr,clrl,clrt,clt,cly,cr,crl,\
+crt,cy,etnd,exrl,ic,icm,icmh,icmy,icy,iihf,iilf,j,jg,la,larl,lat,lay,lb,\
+lbr,lcdfr,lcgr,lcr,ldgr,ldr,lgat,lgb,lgbr,lgf,lgfi,lgfr,lgfrl,lgh,lghi,\
+lghr,lghrl,lgr,lh,lhi,lhr,lhrl,lhy,llcr,llgfr,llghr,llgtr,llhr,llihf,llihh,\
+llihl,llilf,llilh,llill,lndfr,lngr,lnr,lpdfr,lpgr,lpr,lr,lrv,lrvg,lrvgr,\
+lrvh,lrvr,lt,ltg,ltgf,ltgfr,ltgr,ltr,lzdr,lzer,n,ng,ngr,ngrk,nihf,nihh,\
+nihl,nilf,nilh,nill,nop,nopr,nr,nrk,ny,o,og,ogr,ogrk,oihf,oihh,oihl,oilf,\
+oilh,oill,or,ork,oy,pfpo,risbg,risbgn,rll,rllg,rnsbg,rosbg,s,sg,sgr,sgrk,\
+sl,sldl,slfi,slg,slgf,slgfi,slgfr,slgr,slgrk,sll,sllg,sllk,slr,slrk,sly,\
+sr,sra,srag,srak,srda,srdl,srl,srlg,srlk,sy,tm,tmh,tmhh,tmhl,tml,tmlh,\
+tmll,tmy,vlr,vlvgb,vlvgf,vlvgg,vlvgh,x,xg,xgr,xgrk,xihf,xilf,xr,xrk,xy")) "nothing")
+
+(define_insn_reservation "z14_1" 1
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "agf,agfr,agh,agsi,algsi,alsi,asi,cgf,cgfr,cgfrl,\
+cgh,cghrl,ch,chrl,chy,clm,clmy,cpsdr,laa,laag,lan,lang,lao,laog,lax,laxg,\
+le,ler,ley,loc,locg,locghi,locgr,lochi,locr,mvghi,mvhhi,mvhi,mvi,mviy,ni,\
+niy,ntstg,oi,oiy,sgf,sgfr,sgh,sh,shy,st,stc,stcy,stg,stgrl,sth,sthrl,sthy,\
+stoc,stocg,strl,strv,strvg,strvh,sty,vab,vaccb,vacccq,vaccf,vaccg,vacch,\
+vaccq,vacq,vaf,vag,vah,vaq,vavgb,vavgf,vavgg,vavgh,vavglb,vavglf,vavglg,\
+vavglh,vbperm,vceqb,vceqf,vceqg,vceqh,vchb,vchf,vchg,vchh,vchlb,vchlf,vchlg,\
+vchlh,vclzf,vctzb,vctzf,vctzg,vctzh,verimb,verimf,verimg,verimh,verllb,\
+verllf,verllg,verllh,verllvb,verllvf,verllvg,verllvh,veslb,veslf,veslg,veslh,\
+veslvb,veslvf,veslvg,veslvh,vesrab,vesraf,vesrag,vesrah,vesravb,vesravf,\
+vesravg,vesravh,vesrlb,vesrlf,vesrlg,vesrlh,vesrlvb,vesrlvf,vesrlvg,vesrlvh,\
+vfcedb,vfcesb,vfchdb,vfchedb,vfchesb,vfchsb,vflcdb,vflcsb,vflndb,vflnsb,\
+vflpdb,vfmaxdb,vfmaxsb,vfmindb,vfminsb,vgbm,vgm,vgmb,vgmf,vgmg,vgmh,vlcb,\
+vlcf,vlcg,vlch,vleb,vlef,vleg,vleh,vleib,vleif,vleig,vleih,vlpb,vlpf,vlpg,\
+vlph,vmnb,vmnf,vmng,vmnh,vmnlb,vmnlf,vmnlg,vmnlh,vmrhb,vmrhf,vmrhg,vmrhh,\
+vmrlb,vmrlf,vmrlg,vmrlh,vmxb,vmxf,vmxg,vmxh,vn,vnc,vnn,vno,vnot,vnx,vo,voc,\
+vone,vpdi,vperm,vpkf,vpkg,vpkh,vpklsf,vpklsg,vpklsh,vpksf,vpksg,vpksh,\
+vpopct,vpopctb,vpopctf,vpopctg,vpopcth,vrepb,vrepf,vrepg,vreph,vrepib,vrepif,\
+vrepig,vrepih,vsb,vsbiq,vscbib,vscbif,vscbig,vscbih,vscbiq,vsegb,vsegf,vsegh,\
+vsel,vsf,vsg,vsh,vsl,vslb,vsldb,vsq,vsra,vsrab,vsrl,vsrlb,vuphb,vuphf,\
+vuphh,vuplb,vuplf,vuplhb,vuplhf,vuplhh,vuplhw,vupllb,vupllf,vupllh,vx,vzero,\
+wfcedb,wfcesb,wfchdb,wfchedb,wfchesb,wfchexb,wfchsb,wfchxb,wflcdb,wflcsb,\
+wflcxb,wflndb,wflnsb,wflnxb,wflpdb,wflpsb,wflpxb,wfmaxxb,wfminxb,xi,xiy")) "nothing")
+
+(define_insn_reservation "z14_2" 2
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "cdb,cdbr,cebr,ear,ipm,l,lcbb,lcdbr,lcebr,ld,lde,\
+ldy,lg,lgdr,lgrl,llc,llgc,llgf,llgfrl,llgh,llghrl,llgt,llh,llhrl,lm,lmg,\
+lmy,lndbr,lnebr,lpdbr,lpebr,lrl,ltdbr,ltebr,ly,popcnt,sar,tcdb,tceb,\
+vceqbs,vceqfs,vceqgs,vceqhs,vchbs,vchfs,vchgs,vchhs,vchlbs,vchlfs,vchlgs,\
+vchlhs,vfcedbs,vfcesbs,vfchdbs,vfchedbs,vfchesbs,vfchsbs,vfeeb,vfeef,vfeeh,\
+vfeneb,vfenef,vfeneh,vfenezb,vfenezf,vfenezh,vftcidb,vftcisb,vistrb,vistrf,\
+vistrh,vlgvf,vlgvg,vlgvh,vllezb,vllezf,vllezg,vllezh,vllezlf,vlrepb,vlrepf,\
+vlrepg,vlreph,vlrl,vlvgp,vpklsfs,vpklsgs,vpklshs,vpksfs,vpksgs,vpkshs,wfcdb,\
+wfcexbs,wfchexbs,wfchxbs,wfcsb")) "nothing")
+
+(define_insn_reservation "z14_3" 3
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "cds,cdsy,mgh,mghi,mh,mhi,mhy,std,stdy,ste,stey,\
+vcksm,vfeezbs,vfeezhs,vgfmab,vgfmaf,vgfmag,vgfmah,vgfmb,vgfmf,vgfmg,vgfmh,\
+vistrbs,vistrfs,vl,vlbb,vll,vlrlr,vmaeb,vmaef,vmaeh,vmahb,vmahf,vmahh,vmalb,\
+vmaleb,vmalef,vmaleh,vmalf,vmalhb,vmalhf,vmalhh,vmalhw,vmalob,vmalof,vmaloh,\
+vmaob,vmaof,vmaoh,vmeb,vmef,vmeh,vmhb,vmhf,vmhh,vmlb,vmleb,vmlef,vmleh,vmlf,\
+vmlhb,vmlhf,vmlhh,vmlhw,vmlob,vmlof,vmloh,vmob,vmof,vmoh,vsumb,vsumgf,\
+vsumgh,vsumh,vsumqf,vsumqg,vtm")) "nothing")
+
+(define_insn_reservation "z14_4" 4
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "bas,basr,chhsi,clc,ex,lam,lcgfr,lngfr,lpgfr,lxr,\
+lzxr,ms,msfi,msgf,msgfi,msgfr,msr,msy,mvc,oc,ppa,rxsbg,tabort,tbegin,\
+tbeginc,tend,vst,vstl,vstrl,vstrlr,xc")) "nothing")
+
+(define_insn_reservation "z14_5" 5
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "alc,alcg,alcgr,alcr,cs,csg,csy,msrkc,slb,slbg,\
+slbgr,slbr,stm,stmg,stmy")) "nothing")
+
+(define_insn_reservation "z14_6" 6
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "adb,adbr,aeb,aebr,fidbr,fidbra,fiebr,fiebra,\
+ldeb,ldebr,ledbr,madbr,mdbr,meeb,meebr,msdbr,msg,msgr,sdb,sdbr,seb,sebr,\
+sfpc,vcdgb,vcdlgb,vcgdb,vclgdb,vfadb,vfidb,vfmadb,vfmdb,vfmsdb,vfnmadb,\
+vfnmsdb,vfsdb,vldeb,vledb,wcdgb,wcdlgb,wcgdb,wclgdb,wfadb,wfasb,wfisb,wfmadb,\
+wfmasb,wfmdb,wfmsb,wfmsdb,wfmssb,wfsdb,wfssb,wldeb,wledb")) "nothing")
+
+(define_insn_reservation "z14_7" 7
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "adtr,cdtr,fidtr,ldetr,msgrkc,sdtr,tdcdt,tdcet,\
+vfasb,vfisb,vfmasb,vfmsb,vfmssb,vfnmssb,vfssb,vgef,vgeg,wflld")) "nothing")
+
+(define_insn_reservation "z14_8" 8
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "cdsg,flogr,lpq,stpq,vsteb")) "nothing")
+
+(define_insn_reservation "z14_9" 9
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "cxfbr,cxgbr,cxlgbr,m,mfy,ml,mlr,mr,stam,wfaxb,\
+wfixb,wfsxb")) "nothing")
+
+(define_insn_reservation "z14_10" 10
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "cdfbr,cdgbr,cdlfbr,cdlgbr,cefbr,cegbr,celfbr,\
+celgbr,madb,maeb,maebr,msdb,mseb,msebr,vscef,vsceg")) "nothing")
+
+(define_insn_reservation "z14_11" 11
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "lxdb,lxdbr,lxeb,lxebr,mg,mgrk,mlg,mlgr")) "nothing")
+
+(define_insn_reservation "z14_12" 12
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "cfdbr,cfebr,cgdbr,cgebr,clfdbr,clfebr,clgdbr,\
+clgebr,cxbr,cxtr,tcxb,tdcxt")) "nothing")
+
+(define_insn_reservation "z14_13" 13
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "axbr,axtr,fixbr,fixbra,fixtr,lcxbr,lnxbr,lpxbr,\
+ltxbr,ltxtr,lxdtr,sxbr,sxtr")) "nothing")
+
+(define_insn_reservation "z14_14" 14
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "cfxbr,cgxbr,clfxbr,clgxbr,ledtr")) "nothing")
+
+(define_insn_reservation "z14_20" 20
+  (and (eq_attr "cpu" "z14")
+(eq_attr "mnemonic" "cdftr,cdgtr,cdlftr,cdlgtr,cgdtr,cgxtr,clfxtr,\
+clgdtr,clgxtr,cxftr,cxgtr,cxlftr,cxlgtr,d,ddb,ddbr,ddtr,deb,debr,dl,dlg,dlgr,\
+dlr,dr,dsg,dsgf,dsgfr,dsgr,dxbr,dxtr,efpc,mdtr,mxbr,mxtr,sqdb,sqdbr,sqeb,\
+sqebr,sqxbr,vfddb,vfdsb,vfsqdb,vfsqsb,wfddb,wfdsb,wfdxb,wfmaxb,wfmsxb,wfmxb,\
+wfnmaxb,wfnmsxb,wfsqdb,wfsqxb")) "nothing")
+
index 6ee5a6e5337f34b068ceec78e63152d2f04a053e..70a7034c300bb66e9df5977cc6913b85ca46cc7b 100644 (file)
@@ -344,28 +344,26 @@ extern int reload_completed;
 
 /* Kept up to date using the SCHED_VARIABLE_ISSUE hook.  */
 static rtx_insn *last_scheduled_insn;
-#define MAX_SCHED_UNITS 4
-static int last_scheduled_unit_distance[MAX_SCHED_UNITS];
-
 #define NUM_SIDES 2
-static int current_side = 1;
-#define LONGRUNNING_THRESHOLD 20
+
+#define MAX_SCHED_UNITS 4
+static int last_scheduled_unit_distance[MAX_SCHED_UNITS][NUM_SIDES];
 
 /* Estimate of number of cycles a long-running insn occupies an
    execution unit.  */
-static unsigned fxd_longrunning[NUM_SIDES];
-static unsigned fpd_longrunning[NUM_SIDES];
+static int fxd_longrunning[NUM_SIDES];
+static int fpd_longrunning[NUM_SIDES];
 
 /* The maximum score added for an instruction whose unit hasn't been
    in use for MAX_SCHED_MIX_DISTANCE steps.  Increase this value to
    give instruction mix scheduling more priority over instruction
    grouping.  */
-#define MAX_SCHED_MIX_SCORE      8
+#define MAX_SCHED_MIX_SCORE      2
 
 /* The maximum distance up to which individual scores will be
    calculated.  Everything beyond this gives MAX_SCHED_MIX_SCORE.
    Increase this with the OOO windows size of the machine.  */
-#define MAX_SCHED_MIX_DISTANCE 100
+#define MAX_SCHED_MIX_DISTANCE 70
 
 /* Structure used to hold the components of a S/390 memory
    address.  A legitimate address on S/390 is of the general
@@ -14243,7 +14241,7 @@ s390_z10_prevent_earlyload_conflicts (rtx_insn **ready, int *nready_p)
 }
 
 /* Returns TRUE if BB is entered via a fallthru edge and all other
-   incoming edges are less than unlikely.  */
+   incoming edges are less than likely.  */
 static bool
 s390_bb_fallthru_entry_likely (basic_block bb)
 {
@@ -14259,28 +14257,29 @@ s390_bb_fallthru_entry_likely (basic_block bb)
 
   FOR_EACH_EDGE (e, ei, bb->preds)
     if (e != fallthru_edge
-       && e->probability >= profile_probability::unlikely ())
+       && e->probability >= profile_probability::likely ())
       return false;
 
   return true;
 }
 
-/* The s390_sched_state variable tracks the state of the current or
-   the last instruction group.
-
-   0,1,2 number of instructions scheduled in the current group
-   3     the last group is complete - normal insns
-   4     the last group was a cracked/expanded insn */
-
-static int s390_sched_state = 0;
+struct s390_sched_state
+{
+  /* Number of insns in the group.  */
+  int group_state;
+  /* Execution side of the group.  */
+  int side;
+  /* Group can only hold two insns.  */
+  bool group_of_two;
+} s390_sched_state;
 
-#define S390_SCHED_STATE_NORMAL  3
-#define S390_SCHED_STATE_CRACKED 4
+static struct s390_sched_state sched_state = {0, 1, false};
 
 #define S390_SCHED_ATTR_MASK_CRACKED    0x1
 #define S390_SCHED_ATTR_MASK_EXPANDED   0x2
 #define S390_SCHED_ATTR_MASK_ENDGROUP   0x4
 #define S390_SCHED_ATTR_MASK_GROUPALONE 0x8
+#define S390_SCHED_ATTR_MASK_GROUPOFTWO 0x10
 
 static unsigned int
 s390_get_sched_attrmask (rtx_insn *insn)
@@ -14300,7 +14299,6 @@ s390_get_sched_attrmask (rtx_insn *insn)
        mask |= S390_SCHED_ATTR_MASK_GROUPALONE;
       break;
     case PROCESSOR_2964_Z13:
-    case PROCESSOR_3906_Z14:
       if (get_attr_z13_cracked (insn))
        mask |= S390_SCHED_ATTR_MASK_CRACKED;
       if (get_attr_z13_expanded (insn))
@@ -14309,6 +14307,20 @@ s390_get_sched_attrmask (rtx_insn *insn)
        mask |= S390_SCHED_ATTR_MASK_ENDGROUP;
       if (get_attr_z13_groupalone (insn))
        mask |= S390_SCHED_ATTR_MASK_GROUPALONE;
+      if (get_attr_z13_groupoftwo (insn))
+       mask |= S390_SCHED_ATTR_MASK_GROUPOFTWO;
+      break;
+    case PROCESSOR_3906_Z14:
+      if (get_attr_z14_cracked (insn))
+       mask |= S390_SCHED_ATTR_MASK_CRACKED;
+      if (get_attr_z14_expanded (insn))
+       mask |= S390_SCHED_ATTR_MASK_EXPANDED;
+      if (get_attr_z14_endgroup (insn))
+       mask |= S390_SCHED_ATTR_MASK_ENDGROUP;
+      if (get_attr_z14_groupalone (insn))
+       mask |= S390_SCHED_ATTR_MASK_GROUPALONE;
+      if (get_attr_z14_groupoftwo (insn))
+       mask |= S390_SCHED_ATTR_MASK_GROUPOFTWO;
       break;
     default:
       gcc_unreachable ();
@@ -14324,7 +14336,6 @@ s390_get_unit_mask (rtx_insn *insn, int *units)
   switch (s390_tune)
     {
     case PROCESSOR_2964_Z13:
-    case PROCESSOR_3906_Z14:
       *units = 4;
       if (get_attr_z13_unit_lsu (insn))
        mask |= 1 << 0;
@@ -14335,22 +14346,62 @@ s390_get_unit_mask (rtx_insn *insn, int *units)
       if (get_attr_z13_unit_vfu (insn))
        mask |= 1 << 3;
       break;
+    case PROCESSOR_3906_Z14:
+      *units = 4;
+      if (get_attr_z14_unit_lsu (insn))
+       mask |= 1 << 0;
+      if (get_attr_z14_unit_fxa (insn))
+       mask |= 1 << 1;
+      if (get_attr_z14_unit_fxb (insn))
+       mask |= 1 << 2;
+      if (get_attr_z14_unit_vfu (insn))
+       mask |= 1 << 3;
+      break;
     default:
       gcc_unreachable ();
     }
   return mask;
 }
 
+static bool
+s390_is_fpd (rtx_insn *insn)
+{
+  if (insn == NULL_RTX)
+    return false;
+
+  return get_attr_z13_unit_fpd (insn) || get_attr_z14_unit_fpd (insn);
+}
+
+static bool
+s390_is_fxd (rtx_insn *insn)
+{
+  if (insn == NULL_RTX)
+    return false;
+
+  return get_attr_z13_unit_fxd (insn) || get_attr_z14_unit_fxd (insn);
+}
+
+/* Returns TRUE if INSN is a long-running instruction.  */
+static bool
+s390_is_longrunning (rtx_insn *insn)
+{
+  if (insn == NULL_RTX)
+    return false;
+
+  return s390_is_fxd (insn) || s390_is_fpd (insn);
+}
+
+
 /* Return the scheduling score for INSN.  The higher the score the
    better.  The score is calculated from the OOO scheduling attributes
-   of INSN and the scheduling state s390_sched_state.  */
+   of INSN and the scheduling state sched_state.  */
 static int
 s390_sched_score (rtx_insn *insn)
 {
   unsigned int mask = s390_get_sched_attrmask (insn);
   int score = 0;
 
-  switch (s390_sched_state)
+  switch (sched_state.group_state)
     {
     case 0:
       /* Try to put insns into the first slot which would otherwise
@@ -14360,7 +14411,7 @@ s390_sched_score (rtx_insn *insn)
        score += 5;
       if ((mask & S390_SCHED_ATTR_MASK_GROUPALONE) != 0)
        score += 10;
-      /* fallthrough */
+      break;
     case 1:
       /* Prefer not cracked insns while trying to put together a
         group.  */
@@ -14370,6 +14421,11 @@ s390_sched_score (rtx_insn *insn)
        score += 10;
       if ((mask & S390_SCHED_ATTR_MASK_ENDGROUP) == 0)
        score += 5;
+      /* If we are in a group of two already, try to schedule another
+        group-of-two insn to avoid shortening another group.  */
+      if (sched_state.group_of_two
+         && (mask & S390_SCHED_ATTR_MASK_GROUPOFTWO) != 0)
+       score += 15;
       break;
     case 2:
       /* Prefer not cracked insns while trying to put together a
@@ -14381,21 +14437,10 @@ s390_sched_score (rtx_insn *insn)
       /* Prefer endgroup insns in the last slot.  */
       if ((mask & S390_SCHED_ATTR_MASK_ENDGROUP) != 0)
        score += 10;
-      break;
-    case S390_SCHED_STATE_NORMAL:
-      /* Prefer not cracked insns if the last was not cracked.  */
-      if ((mask & S390_SCHED_ATTR_MASK_CRACKED) == 0
-         && (mask & S390_SCHED_ATTR_MASK_EXPANDED) == 0)
-       score += 5;
-      if ((mask & S390_SCHED_ATTR_MASK_GROUPALONE) != 0)
-       score += 10;
-      break;
-    case S390_SCHED_STATE_CRACKED:
-      /* Try to keep cracked insns together to prevent them from
-        interrupting groups.  */
-      if ((mask & S390_SCHED_ATTR_MASK_CRACKED) != 0
-         || (mask & S390_SCHED_ATTR_MASK_EXPANDED) != 0)
-       score += 5;
+      /* Try to avoid group-of-two insns in the last slot as they will
+        shorten this group as well as the next one.  */
+      if ((mask & S390_SCHED_ATTR_MASK_GROUPOFTWO) != 0)
+       score = MAX (0, score - 15);
       break;
     }
 
@@ -14413,23 +14458,37 @@ s390_sched_score (rtx_insn *insn)
         CPU.  */
       for (i = 0; i < units; i++, m <<= 1)
        if (m & unit_mask)
-         score += (last_scheduled_unit_distance[i] * MAX_SCHED_MIX_SCORE /
-                   MAX_SCHED_MIX_DISTANCE);
-
-      unsigned latency = insn_default_latency (insn);
+         score += (last_scheduled_unit_distance[i][sched_state.side]
+             * MAX_SCHED_MIX_SCORE / MAX_SCHED_MIX_DISTANCE);
 
-      int other_side = 1 - current_side;
+      int other_side = 1 - sched_state.side;
 
       /* Try to delay long-running insns when side is busy.  */
-      if (latency > LONGRUNNING_THRESHOLD)
+      if (s390_is_longrunning (insn))
        {
-         if (get_attr_z13_unit_fxu (insn) && fxd_longrunning[current_side]
-             && fxd_longrunning[other_side] <= fxd_longrunning[current_side])
-           score = MAX (0, score - 10);
+         if (s390_is_fxd (insn))
+           {
+             if (fxd_longrunning[sched_state.side]
+                 && fxd_longrunning[other_side]
+                 <= fxd_longrunning[sched_state.side])
+               score = MAX (0, score - 10);
+
+             else if (fxd_longrunning[other_side]
+                 >= fxd_longrunning[sched_state.side])
+               score += 10;
+           }
 
-         if (get_attr_z13_unit_vfu (insn) && fpd_longrunning[current_side]
-             && fpd_longrunning[other_side] <= fpd_longrunning[current_side])
-           score = MAX (0, score - 10);
+         if (s390_is_fpd (insn))
+           {
+             if (fpd_longrunning[sched_state.side]
+                 && fpd_longrunning[other_side]
+                 <= fpd_longrunning[sched_state.side])
+               score = MAX (0, score - 10);
+
+             else if (fpd_longrunning[other_side]
+                 >= fpd_longrunning[sched_state.side])
+               score += 10;
+           }
        }
     }
 
@@ -14500,7 +14559,7 @@ s390_sched_reorder (FILE *file, int verbose,
       if (verbose > 5)
        {
          fprintf (file, "ready list ooo attributes - sched state: %d\n",
-                  s390_sched_state);
+                  sched_state.group_state);
 
          for (i = last_index; i >= 0; i--)
            {
@@ -14551,7 +14610,7 @@ s390_sched_variable_issue (FILE *file, int verbose, rtx_insn *insn, int more)
 {
   last_scheduled_insn = insn;
 
-  bool starts_group = false;
+  bool ends_group = false;
 
   if (s390_tune >= PROCESSOR_2827_ZEC12
       && reload_completed
@@ -14559,37 +14618,31 @@ s390_sched_variable_issue (FILE *file, int verbose, rtx_insn *insn, int more)
     {
       unsigned int mask = s390_get_sched_attrmask (insn);
 
-      if ((mask & S390_SCHED_ATTR_MASK_CRACKED) != 0
-         || (mask & S390_SCHED_ATTR_MASK_EXPANDED) != 0
-         || (mask & S390_SCHED_ATTR_MASK_GROUPALONE) != 0)
-       starts_group = true;
+      if ((mask & S390_SCHED_ATTR_MASK_GROUPOFTWO) != 0)
+       sched_state.group_of_two = true;
 
-      if ((mask & S390_SCHED_ATTR_MASK_CRACKED) != 0
-         || (mask & S390_SCHED_ATTR_MASK_EXPANDED) != 0)
-       s390_sched_state = S390_SCHED_STATE_CRACKED;
-      else if ((mask & S390_SCHED_ATTR_MASK_ENDGROUP) != 0
-              || (mask & S390_SCHED_ATTR_MASK_GROUPALONE) != 0)
-       s390_sched_state = S390_SCHED_STATE_NORMAL;
-      else
+      /* If this is a group-of-two insn, we actually ended the last group
+        and this insn is the first one of the new group.  */
+      if (sched_state.group_state == 2 && sched_state.group_of_two)
        {
-         /* Only normal insns are left (mask == 0).  */
-         switch (s390_sched_state)
-           {
-           case 0:
-             starts_group = true;
-             /* fallthrough */
-           case 1:
-           case 2:
-             s390_sched_state++;
-             break;
-           case S390_SCHED_STATE_NORMAL:
-             starts_group = true;
-             s390_sched_state = 1;
-             break;
-           case S390_SCHED_STATE_CRACKED:
-             s390_sched_state = S390_SCHED_STATE_NORMAL;
-             break;
-           }
+         sched_state.side = sched_state.side ? 0 : 1;
+         sched_state.group_state = 0;
+       }
+
+      /* Longrunning and side bookkeeping.  */
+      for (int i = 0; i < 2; i++)
+       {
+         fxd_longrunning[i] = MAX (0, fxd_longrunning[i] - 1);
+         fpd_longrunning[i] = MAX (0, fpd_longrunning[i] - 1);
+       }
+
+      unsigned latency = insn_default_latency (insn);
+      if (s390_is_longrunning (insn))
+       {
+         if (s390_is_fxd (insn))
+           fxd_longrunning[sched_state.side] = latency;
+         else
+           fpd_longrunning[sched_state.side] = latency;
        }
 
       if (s390_tune >= PROCESSOR_2964_Z13)
@@ -14602,30 +14655,40 @@ s390_sched_variable_issue (FILE *file, int verbose, rtx_insn *insn, int more)
 
          for (i = 0; i < units; i++, m <<= 1)
            if (m & unit_mask)
-             last_scheduled_unit_distance[i] = 0;
-           else if (last_scheduled_unit_distance[i] < MAX_SCHED_MIX_DISTANCE)
-             last_scheduled_unit_distance[i]++;
+             last_scheduled_unit_distance[i][sched_state.side] = 0;
+           else if (last_scheduled_unit_distance[i][sched_state.side]
+               < MAX_SCHED_MIX_DISTANCE)
+             last_scheduled_unit_distance[i][sched_state.side]++;
        }
 
-      /* If this insn started a new group, the side flipped.  */
-      if (starts_group)
-       current_side = current_side ? 0 : 1;
-
-      for (int i = 0; i < 2; i++)
+      if ((mask & S390_SCHED_ATTR_MASK_CRACKED) != 0
+         || (mask & S390_SCHED_ATTR_MASK_EXPANDED) != 0
+         || (mask & S390_SCHED_ATTR_MASK_GROUPALONE) != 0
+         || (mask & S390_SCHED_ATTR_MASK_ENDGROUP) != 0)
        {
-         if (fxd_longrunning[i] >= 1)
-           fxd_longrunning[i] -= 1;
-         if (fpd_longrunning[i] >= 1)
-           fpd_longrunning[i] -= 1;
+         sched_state.group_state = 0;
+         ends_group = true;
        }
-
-      unsigned latency = insn_default_latency (insn);
-      if (latency > LONGRUNNING_THRESHOLD)
+      else
        {
-         if (get_attr_z13_unit_fxu (insn))
-           fxd_longrunning[current_side] = latency;
-         else
-           fpd_longrunning[current_side] = latency;
+         switch (sched_state.group_state)
+           {
+           case 0:
+             sched_state.group_state++;
+             break;
+           case 1:
+             sched_state.group_state++;
+             if (sched_state.group_of_two)
+               {
+                 sched_state.group_state = 0;
+                 ends_group = true;
+               }
+             break;
+           case 2:
+             sched_state.group_state++;
+             ends_group = true;
+             break;
+           }
        }
 
       if (verbose > 5)
@@ -14654,7 +14717,7 @@ s390_sched_variable_issue (FILE *file, int verbose, rtx_insn *insn, int more)
                  fprintf (file, " %d", j);
              fprintf (file, ")");
            }
-         fprintf (file, " sched state: %d\n", s390_sched_state);
+         fprintf (file, " sched state: %d\n", sched_state.group_state);
 
          if (s390_tune >= PROCESSOR_2964_Z13)
            {
@@ -14662,12 +14725,21 @@ s390_sched_variable_issue (FILE *file, int verbose, rtx_insn *insn, int more)
 
              s390_get_unit_mask (insn, &units);
 
-             fprintf (file, ";;\t\tBACKEND: units unused for: ");
+             fprintf (file, ";;\t\tBACKEND: units on this side unused for: ");
              for (j = 0; j < units; j++)
-               fprintf (file, "%d:%d ", j, last_scheduled_unit_distance[j]);
+               fprintf (file, "%d:%d ", j,
+                   last_scheduled_unit_distance[j][sched_state.side]);
              fprintf (file, "\n");
            }
        }
+
+      /* If this insn ended a group, the next will be on the other side.  */
+      if (ends_group)
+       {
+         sched_state.group_state = 0;
+         sched_state.side = sched_state.side ? 0 : 1;
+         sched_state.group_of_two = false;
+       }
     }
 
   if (GET_CODE (PATTERN (insn)) != USE
@@ -14682,13 +14754,10 @@ s390_sched_init (FILE *file ATTRIBUTE_UNUSED,
                 int verbose ATTRIBUTE_UNUSED,
                 int max_ready ATTRIBUTE_UNUSED)
 {
-  last_scheduled_insn = NULL;
-  memset (last_scheduled_unit_distance, 0, MAX_SCHED_UNITS * sizeof (int));
-
   /* If the next basic block is most likely entered via a fallthru edge
      we keep the last sched state.  Otherwise we start a new group.
      The scheduler traverses basic blocks in "instruction stream" ordering
-     so if we see a fallthru edge here, s390_sched_state will be of its
+     so if we see a fallthru edge here, sched_state will be of its
      source block.
 
      current_sched_info->prev_head is the insn before the first insn of the
@@ -14698,7 +14767,13 @@ s390_sched_init (FILE *file ATTRIBUTE_UNUSED,
     ? NEXT_INSN (current_sched_info->prev_head) : NULL;
   basic_block bb = insn ? BLOCK_FOR_INSN (insn) : NULL;
   if (s390_tune < PROCESSOR_2964_Z13 || !s390_bb_fallthru_entry_likely (bb))
-    s390_sched_state = 0;
+    {
+      last_scheduled_insn = NULL;
+      memset (last_scheduled_unit_distance, 0,
+         MAX_SCHED_UNITS * NUM_SIDES * sizeof (int));
+      sched_state.group_state = 0;
+      sched_state.group_of_two = false;
+    }
 }
 
 /* This target hook implementation for TARGET_LOOP_UNROLL_ADJUST calculates
index 3ea7c3801f5f16348196797b6202e8720758ab55..fcb85d653a25d75f06dd18652cdd91a50930bfd3 100644 (file)
@@ -44,7 +44,7 @@ enum processor_flags
 
 /* This is necessary to avoid a warning about comparing different enum
    types.  */
-#define s390_tune_attr ((enum attr_cpu)(s390_tune > PROCESSOR_2964_Z13 ? PROCESSOR_2964_Z13 : s390_tune ))
+#define s390_tune_attr ((enum attr_cpu)(s390_tune > PROCESSOR_3906_Z14 ? PROCESSOR_3906_Z14 : s390_tune ))
 
 /* These flags indicate that the generated code should run on a cpu
    providing the respective hardware facility regardless of the
index f1404ad5f017d66836940015cd918f82a7be28d1..b455b638134e6bf1a832415535f1da53c04d9f8c 100644 (file)
 ;; Pipeline description for z13
 (include "2964.md")
 
+;; Pipeline description for z14
+(include "3906.md")
+
 ;; Predicates
 (include "predicates.md")
 
index bf50d9d2cb67dbc30b1261ef874fe02744c0827f..a640b6a643b35ff33a9e33af0606083a51c87e04 100644 (file)
@@ -1,3 +1,7 @@
+2019-03-12  Robin Dapp  <rdapp@linux.ibm.com>
+
+       * gcc.target/s390/memset-1.c: Adapt test case for new scheduling.
+
 2019-03-12  Martin Liska  <mliska@suse.cz>
 
        * gfortran.dg/abstract_type_3.f03: Amend test-case scan
index 3e201df1aede491bbfde4dfde6132b50d87a6883..9463a77208b2d67fa55961cdf43e35f789bf740c 100644 (file)
@@ -74,7 +74,7 @@ void
   return __builtin_memset (s, c, 1029);
 }
 
-/* 2 stc 1 stcy 3 mvc - displacement overflow after the first */
+/* 3 stc 3 mvc - displacement overflow after the first */
 void
 *memset10(void *s, int c)
 {
@@ -172,6 +172,6 @@ void
 /* { dg-final { scan-assembler-times "mvi\\s" 1 } } */
 /* { dg-final { scan-assembler-times "mvc\\s" 20 } } */
 /* { dg-final { scan-assembler-times "xc\\s" 28 } } */
-/* { dg-final { scan-assembler-times "stc\\s" 21 } } */
-/* { dg-final { scan-assembler-times "stcy\\s" 1 } } */
+/* { dg-final { scan-assembler-times "stc\\s" 22 } } */
+/* { dg-final { scan-assembler-times "stcy\\s" 0 } } */
 /* { dg-final { scan-assembler-times "pfd\\s" 2 } } */