2013-09-06 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Fri, 6 Sep 2013 07:55:35 +0000 (07:55 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 6 Sep 2013 07:55:35 +0000 (07:55 +0000)
* config/s390/s390.md (UNSPEC_FPINT_FLOOR, UNSPEC_FPINT_BTRUNC)
(UNSPEC_FPINT_ROUND, UNSPEC_FPINT_CEIL, UNSPEC_FPINT_NEARBYINT)
(UNSPEC_FPINT_RINT): New constant definitions.
(FPINT, fpint_name, fpint_roundingmode): New integer iterator
definition with 2 attributes.
("<FPINT:fpint_name><BFP:mode>2", "rint<BFP:mode>2")
("<FPINT:fpint_name><DFP:mode>2", "rint<DFP:mode>2"): New pattern
definitions.

2013-09-06  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* gcc.target/s390/nearestint-1.c: New testcase.

From-SVN: r202312

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

index 44ddc1a61f7905d684e7ce1072e23156cea9b6c6..252b2611a4e135c55c3aeb0c4bf020ba4750f2f1 100644 (file)
@@ -1,3 +1,24 @@
+2013-09-06  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.md (UNSPEC_FPINT_FLOOR, UNSPEC_FPINT_BTRUNC)
+       (UNSPEC_FPINT_ROUND, UNSPEC_FPINT_CEIL, UNSPEC_FPINT_NEARBYINT)
+       (UNSPEC_FPINT_RINT): New constant definitions.
+       (FPINT, fpint_name, fpint_roundingmode): New integer iterator
+       definition with 2 attributes.
+       ("<FPINT:fpint_name><BFP:mode>2", "rint<BFP:mode>2")
+       ("<FPINT:fpint_name><DFP:mode>2", "rint<DFP:mode>2"): New pattern
+       definitions.
+
+2013-09-06  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.md: Add "bcr_flush" value to mnemonic
+       attribute.
+       ("mem_thread_fence_1"): Use bcr 14,0 for z196 and later.
+       Set the mnemonic attribute to "bcr_flush".  Set the "z196prop"
+       attribute to "z196_alone".
+       * config/s390/2827.md: Add "bcr_flush" to "ooo_groupalone" and
+       "zEC12_simple".
+
 2013-09-06  Richard Biener  <rguenther@suse.de>
 
        * basic-block.h (class control_dependences): New.
index f4d8836639c3c512d6a1649129f32d1a9b7d55e0..5be7cfaabfbd743d48e808cf655d4836292692d2 100644 (file)
@@ -37,7 +37,7 @@
 
 (define_insn_reservation "zEC12_simple" 1
   (and (eq_attr "cpu" "zEC12")
-       (eq_attr "mnemonic" "ltg,ogrk,lr,lnebr,lghrl,sdbr,x,asi,lhr,sebr,madb,ar,lhrl,clfxtr,llgfr,clghrl,cgr,cli,agrk,ic,adbr,aebr,lrv,clg,cy,cghi,sy,celfbr,seb,clgfr,al,tm,lang,clfebr,lghr,cdb,lpebr,laa,ark,lh,or,icy,xi,msebr,n,llihl,afi,cs,nrk,sth,lgr,l,lcr,stey,xg,crt,slgfr,ny,ld,j,llihh,slgr,clfhsi,slg,lb,lgrl,lrl,llihf,lndbr,llcr,laxg,mvghi,rllg,sdb,xrk,laag,alhsik,algfi,algr,aly,agfi,lrvr,d,crl,llgc,tmhl,algsi,lgh,icmh,clhrl,xgrk,icm,iilf,ork,lbr,cg,ldgr,lgf,iihf,llghr,sg,clfdbr,llgtr,stam,cebr,tmhh,tceb,slgf,basr,lgbr,maebr,lgb,cgfi,aeb,ltebr,lax,clfit,lrvgr,nihl,ni,clfdtr,srdl,mdb,srk,xihf,stgrl,sthrl,algf,ltr,cdlgbr,cgit,ng,lat,llghrl,ltgr,nihh,clgfrl,srlk,maeb,agr,cxlftr,ler,bcr_flush,stcy,cds,clfi,nihf,ly,clt,lgat,alg,lhy,lgfrl,clghsi,clrt,tmll,srlg,tcdb,ay,sty,clr,lgfi,lan,lpdbr,clgt,adb,ahik,sra,algrk,cdfbr,lcebr,clfxbr,msdbr,ceb,clgr,tmy,tmlh,alghsik,lcgr,mvi,cdbr,ltgf,xr,larl,ldr,llgcr,clgrt,clrl,cghsi,cliy,madbr,oy,ogr,llgt,meebr,slr,clgxbr,chi,s,icmy,llc,ngr,clhhsi,ltgfr,llill,lhi,o,meeb,clgdtr,sll,clgrl,clgf,ledbr,cegbr,mviy,algfr,rll,cdlftr,sldl,cdlgtr,lg,niy,st,sgr,ag,le,xgr,cr,stg,llilh,sr,lzer,cdsg,sllk,mdbr,stoc,csg,clgit,chhsi,strl,llilf,lndfr,ngrk,clgebr,clgfi,llgh,mseb,ltdbr,oill,la,llhrl,stc,lghi,oihl,xiy,sllg,llgf,cgrt,ldeb,cl,sl,cdlfbr,oi,oilh,nr,srak,oihh,ear,slgrk,og,c,slgfi,sthy,oilf,oiy,msdb,oihf,a,cfi,lzxr,lzdr,srag,cdgbr,brasl,alr,cgrl,llgfrl,cit,clgxtr,ley,exrl,lcdfr,lay,xilf,lcdbr,alsi,mvhhi,srl,chsi,lgfr,lrvg,cly,sgrk,ahi,celgbr,nill,clgdbr,jg,slrk,lxr,sar,slfi,cpsdr,lcgfr,aghik,nilh,mvhi,lpdfr,xy,alrk,lao,agsi,ldy,nilf,llhr,alfi,laog,sly,aghi,ldebr,bras,srda,cefbr,lt")) "nothing")
+       (eq_attr "mnemonic" "ltg,ogrk,lr,lnebr,lghrl,sdbr,x,asi,lhr,sebr,madb,ar,lhrl,clfxtr,llgfr,clghrl,cgr,cli,agrk,ic,adbr,aebr,lrv,clg,cy,cghi,sy,celfbr,seb,clgfr,al,tm,lang,clfebr,lghr,cdb,lpebr,laa,ark,lh,or,icy,xi,msebr,n,llihl,afi,cs,nrk,sth,lgr,l,lcr,stey,xg,crt,slgfr,ny,ld,j,llihh,slgr,clfhsi,slg,lb,lgrl,lrl,llihf,lndbr,llcr,laxg,mvghi,rllg,sdb,xrk,laag,alhsik,algfi,algr,aly,agfi,lrvr,d,crl,llgc,tmhl,algsi,lgh,icmh,clhrl,xgrk,icm,iilf,ork,lbr,cg,ldgr,lgf,iihf,llghr,sg,clfdbr,llgtr,stam,cebr,tmhh,tceb,slgf,basr,lgbr,maebr,lgb,cgfi,aeb,ltebr,lax,clfit,lrvgr,nihl,ni,clfdtr,srdl,mdb,srk,xihf,stgrl,sthrl,algf,ltr,cdlgbr,cgit,ng,lat,llghrl,ltgr,nihh,clgfrl,srlk,maeb,agr,cxlftr,ler,bcr_flush,stcy,cds,clfi,nihf,ly,clt,lgat,alg,lhy,lgfrl,clghsi,clrt,tmll,srlg,tcdb,ay,sty,clr,lgfi,lan,lpdbr,clgt,adb,ahik,sra,algrk,cdfbr,lcebr,clfxbr,msdbr,ceb,clgr,tmy,tmlh,alghsik,lcgr,mvi,cdbr,ltgf,xr,larl,ldr,llgcr,clgrt,clrl,cghsi,cliy,madbr,oy,ogr,llgt,meebr,slr,clgxbr,chi,s,icmy,llc,ngr,clhhsi,ltgfr,llill,lhi,o,meeb,clgdtr,sll,clgrl,clgf,ledbr,cegbr,mviy,algfr,rll,cdlftr,sldl,cdlgtr,lg,niy,st,sgr,ag,le,xgr,cr,stg,llilh,sr,lzer,cdsg,sllk,mdbr,stoc,csg,clgit,chhsi,strl,llilf,lndfr,ngrk,clgebr,clgfi,llgh,mseb,ltdbr,oill,la,llhrl,stc,lghi,oihl,xiy,sllg,llgf,cgrt,ldeb,cl,sl,cdlfbr,oi,oilh,nr,srak,oihh,ear,slgrk,og,c,slgfi,sthy,oilf,oiy,msdb,oihf,a,cfi,lzxr,lzdr,srag,cdgbr,brasl,alr,cgrl,llgfrl,cit,clgxtr,ley,exrl,lcdfr,lay,xilf,lcdbr,alsi,mvhhi,srl,chsi,lgfr,lrvg,cly,sgrk,ahi,celgbr,nill,clgdbr,jg,slrk,lxr,sar,slfi,cpsdr,lcgfr,aghik,nilh,mvhi,lpdfr,xy,alrk,lao,agsi,ldy,nilf,llhr,alfi,laog,sly,aghi,ldebr,bras,srda,cefbr,lt,fiebra,fidbra,fixbra,fidtr,fixtr")) "nothing")
 
 (define_insn_reservation "zEC12_cgdbr" 2
   (and (eq_attr "cpu" "zEC12")
   (and (eq_attr "cpu" "zEC12")
        (eq_attr "mnemonic" "mh")) "nothing")
 
+(define_insn_reservation "zEC12_fiebra" 6
+  (and (eq_attr "cpu" "zEC12")
+       (eq_attr "mnemonic" "fiebra")) "nothing")
+
+(define_insn_reservation "zEC12_fidbra" 6
+  (and (eq_attr "cpu" "zEC12")
+       (eq_attr "mnemonic" "fidbra")) "nothing")
+
+(define_insn_reservation "zEC12_fixbra" 10
+  (and (eq_attr "cpu" "zEC12")
+       (eq_attr "mnemonic" "fixbra")) "nothing")
+
+(define_insn_reservation "zEC12_fidtr" 6
+  (and (eq_attr "cpu" "zEC12")
+       (eq_attr "mnemonic" "fidtr")) "nothing")
+
+(define_insn_reservation "zEC12_fixtr" 10
+  (and (eq_attr "cpu" "zEC12")
+       (eq_attr "mnemonic" "fixtr")) "nothing")
index d2a744ac63b3ed88464ea6cf7fc2ccb50a7342e1..cf9ef77467567640efc7862d41b5caabbef1c022 100644 (file)
    ; Population Count
    UNSPEC_POPCNT
    UNSPEC_COPYSIGN
+
+   ; Load FP Integer
+   UNSPEC_FPINT_FLOOR
+   UNSPEC_FPINT_BTRUNC
+   UNSPEC_FPINT_ROUND
+   UNSPEC_FPINT_CEIL
+   UNSPEC_FPINT_NEARBYINT
+   UNSPEC_FPINT_RINT
  ])
 
 ;;
 ;; the same template.
 (define_code_iterator SHIFT [ashift lshiftrt])
 
-;; This iterator allow r[ox]sbg to be defined with the same template
+;; This iterator allows r[ox]sbg to be defined with the same template
 (define_code_iterator IXOR [ior xor])
 
+;; This iterator is used to expand the patterns for the nearest
+;; integer functions.
+(define_int_iterator FPINT [UNSPEC_FPINT_FLOOR UNSPEC_FPINT_BTRUNC
+                           UNSPEC_FPINT_ROUND UNSPEC_FPINT_CEIL
+                           UNSPEC_FPINT_NEARBYINT])
+(define_int_attr fpint_name [(UNSPEC_FPINT_FLOOR "floor")
+                            (UNSPEC_FPINT_BTRUNC "btrunc")
+                            (UNSPEC_FPINT_ROUND "round")
+                            (UNSPEC_FPINT_CEIL "ceil")
+                            (UNSPEC_FPINT_NEARBYINT "nearbyint")])
+(define_int_attr fpint_roundingmode [(UNSPEC_FPINT_FLOOR "7")
+                                    (UNSPEC_FPINT_BTRUNC "5")
+                                    (UNSPEC_FPINT_ROUND "1")
+                                    (UNSPEC_FPINT_CEIL "6")
+                                    (UNSPEC_FPINT_NEARBYINT "0")])
+
 ;; This iterator and attribute allow to combine most atomic operations.
 (define_code_iterator ATOMIC [and ior xor plus minus mult])
 (define_code_iterator ATOMIC_Z196 [and ior xor plus])
   [(set_attr "op_type" "RRF")
    (set_attr "type"    "fsimptf")])
 
+; Binary Floating Point - load fp integer
+
+; Expanders for: floor, btrunc, round, ceil, and nearbyint
+; For all of them the inexact exceptions are suppressed.
+
+; fiebra, fidbra, fixbra
+(define_insn "<FPINT:fpint_name><BFP:mode>2"
+  [(set (match_operand:BFP 0 "register_operand" "=f")
+       (unspec:BFP [(match_operand:BFP 1 "register_operand" "f")]
+                   FPINT))]
+  "TARGET_Z196"
+  "fi<BFP:xde>bra\t%0,<FPINT:fpint_roundingmode>,%1,4"
+  [(set_attr "op_type"   "RRF")
+   (set_attr "type"      "fsimp<BFP:mode>")])
+
+; rint is supposed to raise an inexact exception so we can use the
+; older instructions.
+
+; fiebr, fidbr, fixbr
+(define_insn "rint<BFP:mode>2"
+  [(set (match_operand:BFP 0 "register_operand" "=f")
+       (unspec:BFP [(match_operand:BFP 1 "register_operand" "f")]
+                   UNSPEC_FPINT_RINT))]
+  ""
+  "fi<BFP:xde>br\t%0,0,%1"
+  [(set_attr "op_type"   "RRF")
+   (set_attr "type"      "fsimp<BFP:mode>")])
+
+
+; Decimal Floating Point - load fp integer
+
+; fidtr, fixtr
+(define_insn "<FPINT:fpint_name><DFP:mode>2"
+  [(set (match_operand:DFP 0 "register_operand" "=f")
+       (unspec:DFP [(match_operand:DFP 1 "register_operand" "f")]
+                   FPINT))]
+  "TARGET_HARD_DFP"
+  "fi<DFP:xde>tr\t%0,<FPINT:fpint_roundingmode>,%1,4"
+  [(set_attr "op_type"   "RRF")
+   (set_attr "type"      "fsimp<DFP:mode>")])
+
+; fidtr, fixtr
+(define_insn "rint<DFP:mode>2"
+  [(set (match_operand:DFP 0 "register_operand" "=f")
+       (unspec:DFP [(match_operand:DFP 1 "register_operand" "f")]
+                   UNSPEC_FPINT_RINT))]
+  "TARGET_HARD_DFP"
+  "fi<DFP:xde>tr\t%0,0,%1,0"
+  [(set_attr "op_type"   "RRF")
+   (set_attr "type"      "fsimp<DFP:mode>")])
+
+;
 ; Binary <-> Decimal floating point trunc patterns
 ;
 
index 3700847f09e683fab19a99499d56fc300cd1a324..4773d7815b3a5943c44b660ac937b2c1b3420f53 100644 (file)
@@ -1,3 +1,7 @@
+2013-09-06  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * gcc.target/s390/nearestint-1.c: New testcase.
+
 2013-09-06  Joern Rennecke  <joern.rennecke@embecosm.com>
            Vineet Gupta  <Vineet.Gupta@synopsys.com>
 
diff --git a/gcc/testsuite/gcc.target/s390/nearestint-1.c b/gcc/testsuite/gcc.target/s390/nearestint-1.c
new file mode 100644 (file)
index 0000000..1d9a753
--- /dev/null
@@ -0,0 +1,48 @@
+/* Since z196 the nearest integer functions can be expanded to single
+   instructions.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=z196 -mzarch" } */
+
+extern float ceilf (float x);
+extern double ceil (double x);
+extern long double ceill (long double x);
+extern float floorf (float x);
+extern double floor (double x);
+extern long double floorl (long double x);
+extern float truncf (float x);
+extern double trunc (double x);
+extern long double truncl (long double x);
+extern float nearbyintf (float x);
+extern double nearbyint (double x);
+extern long double nearbyintl (long double x);
+extern float rintf (float x);
+extern double rint (double x);
+extern long double rintl (long double x);
+
+float my_ceilf (float x) { return ceilf (x); }
+double my_ceil (double x) { return ceil (x); }
+long double my_ceill (long double x) { return ceill (x); }
+
+float my_floorf (float x) { return floorf (x); }
+double my_floor (double x) { return floor (x); }
+long double my_floorl (long double x) { return floorl (x); }
+
+float my_truncf (float x) { return truncf (x); }
+double my_trunc (double x) { return trunc (x); }
+long double my_truncl (long double x) { return truncl (x); }
+
+float my_nearbyintf (float x) { return nearbyintf (x); }
+double my_nearbyint (double x) { return nearbyint (x); }
+long double my_nearbyintl (long double x) { return nearbyintl (x); }
+
+float my_rintf (float x) { return rintf (x); }
+double my_rint (double x) { return rint (x); }
+long double my_rintl (long double x) { return rintl (x); }
+
+/* { dg-final { scan-assembler-times "fiebr\t" 1 } } */
+/* { dg-final { scan-assembler-times "fidbr\t" 1 } } */
+/* { dg-final { scan-assembler-times "fixbr\t" 1 } } */
+/* { dg-final { scan-assembler-times "fiebra\t" 4 } } */
+/* { dg-final { scan-assembler-times "fidbra\t" 4 } } */
+/* { dg-final { scan-assembler-times "fixbra\t" 4 } } */