Patchwork [ARM,1/5] Add ffmas and ffmad type attribute

login
register
mail settings
Submitter Greta Yorsh
Date Jan. 25, 2013, 6:21 p.m.
Message ID <000601cdfb28$c57cb380$50761a80$@yorsh@arm.com>
Download mbox | patch
Permalink /patch/215820/
State New
Headers show

Comments

Greta Yorsh - Jan. 25, 2013, 6:21 p.m.
Fused and not fused multiply and accumulated operations may have different
timing characteristics, for example in Cortex-A7. Currently, the compiler
captures all of these operations using the same "type" attribute fmac.

This patch adds a new "type" attribute ffma to separate fused operations
from other fmac operations, for both single and double precision floating
point. The patch also updates existing pipeline descriptions to use both
fmac and ffma whenever fmac was used, so that the generated code remains
unaffected.

A subsequent patch for Cortex-A7 pipeline description takes advantage of the
distinction between fused and other mac operations.

gcc/

2013-01-03  Greta Yorsh  <Greta.Yorsh@arm.com>

        * config/arm/arm.md (type): Add ffmas and ffmad to "type" attribute.
        * config/arm/vfp.md (fma,fmsub,fnmsub,fnmadd): Change type
        from fmac to ffma.
        * config/arm/vfp11.md (vfp_farith): Use ffmas.
        (vfp_fmul): Use ffmad.
        * config/arm/cortex-r4f.md (cortex_r4_fmacs): Use ffmas.
        (cortex_r4_fmacd): Use ffmad.
        * config/arm/cortex-m4-fpu.md (cortex_m4_fmacs): Use ffmas.
        * config/arm/cortex-a9.md (cortex_a9_fmacs):  Use ffmas.
        (cortex_a9_fmacd): Use ffmad.
        * config/arm/cortex-a8-neon.md (cortex_a8_vfp_macs): Use ffmas.
        (cortex_a8_vfp_macd): Use ffmad.
        * config/arm/cortex-a5.md (cortex_a5_fpmacs): Use ffmas.
        (cortex_a5_fpmacd): Use ffmad.
        * config/arm/cortex-a15-neon.md (cortex_a15_vfp_macs) Use ffmas.
        (cortex_a15_vfp_macd): Use ffmad.
        * config/arm/arm1020e.md (v10_fmul): Use ffmas and ffmad.
Ramana Radhakrishnan - Jan. 29, 2013, 5:46 p.m.
> gcc/
>
> 2013-01-03  Greta Yorsh  <Greta.Yorsh@arm.com>
>
>          * config/arm/arm.md (type): Add ffmas and ffmad to "type" attribute.
>          * config/arm/vfp.md (fma,fmsub,fnmsub,fnmadd): Change type
>          from fmac to ffma.
>          * config/arm/vfp11.md (vfp_farith): Use ffmas.
>          (vfp_fmul): Use ffmad.
>          * config/arm/cortex-r4f.md (cortex_r4_fmacs): Use ffmas.
>          (cortex_r4_fmacd): Use ffmad.
>          * config/arm/cortex-m4-fpu.md (cortex_m4_fmacs): Use ffmas.
>          * config/arm/cortex-a9.md (cortex_a9_fmacs):  Use ffmas.
>          (cortex_a9_fmacd): Use ffmad.
>          * config/arm/cortex-a8-neon.md (cortex_a8_vfp_macs): Use ffmas.
>          (cortex_a8_vfp_macd): Use ffmad.
>          * config/arm/cortex-a5.md (cortex_a5_fpmacs): Use ffmas.
>          (cortex_a5_fpmacd): Use ffmad.
>          * config/arm/cortex-a15-neon.md (cortex_a15_vfp_macs) Use ffmas.
>          (cortex_a15_vfp_macd): Use ffmad.
>          * config/arm/arm1020e.md (v10_fmul): Use ffmas and ffmad.
>


This is ok as it is only a tuning change.

Ramana

Patch

diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 6b8e9a75fa4ca7f4f09ae34f5b69c1b71044f9d8..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -284,6 +284,8 @@  (define_attr "type"
   fmuld,\
   fmacs,\
   fmacd,\
+  ffmas,\
+  ffmad,\
   f_rints,\
   f_rintd,\
   f_flag,\
diff --git a/gcc/config/arm/arm1020e.md b/gcc/config/arm/arm1020e.md
index 9a41d30573605d845385e79966737f44ee61e168..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/arm1020e.md
+++ b/gcc/config/arm/arm1020e.md
@@ -284,7 +284,7 @@  (define_insn_reservation "v10_cvt" 5
 
 (define_insn_reservation "v10_fmul" 6
  (and (eq_attr "vfp10" "yes")
-      (eq_attr "type" "fmuls,fmacs,fmuld,fmacd"))
+      (eq_attr "type" "fmuls,fmacs,ffmas,fmuld,fmacd,ffmad"))
  "1020a_e+v10_fmac*2")
 
 (define_insn_reservation "v10_fdivs" 18
diff --git a/gcc/config/arm/cortex-a15-neon.md b/gcc/config/arm/cortex-a15-neon.md
index afb67a587526fae8145a8474871cc1d4fbe7e3c9..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/cortex-a15-neon.md
+++ b/gcc/config/arm/cortex-a15-neon.md
@@ -505,12 +505,12 @@  (define_insn_reservation "cortex_a15_vfp
 
 (define_insn_reservation "cortex_a15_vfp_macs" 6
   (and (eq_attr "tune" "cortexa15")
-       (eq_attr "type" "fmacs"))
+       (eq_attr "type" "fmacs,ffmas"))
   "ca15_issue1,ca15_cx_vfp")
 
 (define_insn_reservation "cortex_a15_vfp_macd" 11
   (and (eq_attr "tune" "cortexa15")
-       (eq_attr "type" "fmacd"))
+       (eq_attr "type" "fmacd,ffmad"))
   "ca15_issue2,ca15_cx_vfp*2")
 
 (define_insn_reservation "cortex_a15_vfp_cvt" 6
diff --git a/gcc/config/arm/cortex-a5.md b/gcc/config/arm/cortex-a5.md
index 2b5abe524a63a6c90fc3da1b255b163d44c1455b..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/cortex-a5.md
+++ b/gcc/config/arm/cortex-a5.md
@@ -185,7 +185,7 @@  (define_insn_reservation "cortex_a5_fpmu
 
 (define_insn_reservation "cortex_a5_fpmacs" 8
   (and (eq_attr "tune" "cortexa5")
-       (eq_attr "type" "fmacs"))
+       (eq_attr "type" "fmacs,ffmas"))
   "cortex_a5_ex1+cortex_a5_fpmul_pipe, nothing*3, cortex_a5_fpadd_pipe")
 
 ;; Non-multiply instructions can issue in the middle two instructions of a
@@ -201,7 +201,7 @@  (define_insn_reservation "cortex_a5_fpmu
 
 (define_insn_reservation "cortex_a5_fpmacd" 11
   (and (eq_attr "tune" "cortexa5")
-       (eq_attr "type" "fmacd"))
+       (eq_attr "type" "fmacd,ffmad"))
   "cortex_a5_ex1+cortex_a5_fpmul_pipe, cortex_a5_fpmul_pipe*2,\
    cortex_a5_ex1+cortex_a5_fpmul_pipe, nothing*3, cortex_a5_fpadd_pipe")
 
diff --git a/gcc/config/arm/cortex-a8-neon.md b/gcc/config/arm/cortex-a8-neon.md
index 03f52b2df8a99ea709ac42cabcc32de587ac403f..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/cortex-a8-neon.md
+++ b/gcc/config/arm/cortex-a8-neon.md
@@ -149,12 +149,12 @@  (define_insn_reservation "cortex_a8_vfp_
 
 (define_insn_reservation "cortex_a8_vfp_macs" 21
   (and (eq_attr "tune" "cortexa8")
-       (eq_attr "type" "fmacs"))
+       (eq_attr "type" "fmacs,ffmas"))
   "cortex_a8_vfp,cortex_a8_vfplite*20")
 
 (define_insn_reservation "cortex_a8_vfp_macd" 26
   (and (eq_attr "tune" "cortexa8")
-       (eq_attr "type" "fmacd"))
+       (eq_attr "type" "fmacd,ffmad"))
   "cortex_a8_vfp,cortex_a8_vfplite*25")
 
 (define_insn_reservation "cortex_a8_vfp_divs" 37
diff --git a/gcc/config/arm/cortex-a9.md b/gcc/config/arm/cortex-a9.md
index f1bd7cfa91a5875069fcdf14da230112eb28d32e..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/cortex-a9.md
+++ b/gcc/config/arm/cortex-a9.md
@@ -203,7 +203,7 @@  (define_insn_reservation "cortex_a9_call
 ;; Pipeline   Instruction Classification.
 ;; FPS - fcpys, ffariths, ffarithd,r_2_f,f_2_r
 ;; FP_ADD   - fadds, faddd, fcmps (1)
-;; FPMUL   - fmul{s,d}, fmac{s,d}
+;; FPMUL   - fmul{s,d}, fmac{s,d}, ffma{s,d}
 ;; FPDIV - fdiv{s,d}
 (define_cpu_unit "ca9fps" "cortex_a9")
 (define_cpu_unit "ca9fp_add1, ca9fp_add2, ca9fp_add3, ca9fp_add4" "cortex_a9")
@@ -253,12 +253,12 @@  (define_insn_reservation "cortex_a9_fmul
 
 (define_insn_reservation "cortex_a9_fmacs" 8
   (and (eq_attr "tune" "cortexa9")
-       (eq_attr "type" "fmacs"))
+       (eq_attr "type" "fmacs,ffmas"))
   "ca9fmuls, ca9fp_add")
 
 (define_insn_reservation "cortex_a9_fmacd" 9
   (and (eq_attr "tune" "cortexa9")
-       (eq_attr "type" "fmacd"))
+       (eq_attr "type" "fmacd,ffmad"))
   "ca9fmuld, ca9fp_add")
 
 ;; Division pipeline description.
diff --git a/gcc/config/arm/cortex-m4-fpu.md b/gcc/config/arm/cortex-m4-fpu.md
index 6fd5faf74ee6336c7cc865946bf2db5d2bcc14cb..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/cortex-m4-fpu.md
+++ b/gcc/config/arm/cortex-m4-fpu.md
@@ -46,7 +46,7 @@  (define_insn_reservation "cortex_m4_fmul
 
 (define_insn_reservation "cortex_m4_fmacs" 4
   (and (eq_attr "tune" "cortexm4")
-       (eq_attr "type" "fmacs"))
+       (eq_attr "type" "fmacs,ffmas"))
   "cortex_m4_ex_v*3")
 
 (define_insn_reservation "cortex_m4_ffariths" 1
diff --git a/gcc/config/arm/cortex-r4f.md b/gcc/config/arm/cortex-r4f.md
index 8982bc068eb3f5276d50a4871bfa28b73bd1f31a..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/cortex-r4f.md
+++ b/gcc/config/arm/cortex-r4f.md
@@ -63,7 +63,7 @@  (define_insn_reservation "cortex_r4_fari
 
 (define_insn_reservation "cortex_r4_fmacs" 6
  (and (eq_attr "tune_cortexr4" "yes")
-      (eq_attr "type" "fmacs"))
+      (eq_attr "type" "fmacs,ffmas"))
  "(cortex_r4_issue_a+cortex_r4_v1)|(cortex_r4_issue_b+cortex_r4_vmla)")
 
 (define_insn_reservation "cortex_r4_fdivs" 17
@@ -119,7 +119,7 @@  (define_bypass 16 "cortex_r4_fdivs"
 
 (define_insn_reservation "cortex_r4_fmacd" 20
  (and (eq_attr "tune_cortexr4" "yes")
-      (eq_attr "type" "fmacd"))
+      (eq_attr "type" "fmacd,ffmad"))
  "cortex_r4_single_issue*13")
 
 (define_insn_reservation "cortex_r4_farith" 10
diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md
index a5c461df36f9dd6613a03d5d68d58dab851252ba..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/vfp.md
+++ b/gcc/config/arm/vfp.md
@@ -33,6 +33,8 @@ 
 ;; fmuld	Double precision multiply.
 ;; fmacs	Single precision multiply-accumulate.
 ;; fmacd	Double precision multiply-accumulate.
+;; ffmas	Single precision fused multiply-accumulate.
+;; ffmad	Double precision fused multiply-accumulate.
 ;; fdivs	Single precision sqrt or division.
 ;; fdivd	Double precision sqrt or division.
 ;; f_flag	fmstat operation
@@ -910,7 +912,7 @@  (define_insn "fma<SDF:mode>4"
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA"
   "vfma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
   [(set_attr "predicable" "yes")
-   (set_attr "type" "fmac<vfp_type>")]
+   (set_attr "type" "ffma<vfp_type>")]
 )
 
 (define_insn "*fmsub<SDF:mode>4"
@@ -922,7 +924,7 @@  (define_insn "*fmsub<SDF:mode>4"
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA"
   "vfms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
   [(set_attr "predicable" "yes")
-   (set_attr "type" "fmac<vfp_type>")]
+   (set_attr "type" "ffma<vfp_type>")]
 )
 
 (define_insn "*fnmsub<SDF:mode>4"
@@ -933,7 +935,7 @@  (define_insn "*fnmsub<SDF:mode>4"
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA"
   "vfnms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
   [(set_attr "predicable" "yes")
-   (set_attr "type" "fmac<vfp_type>")]
+   (set_attr "type" "ffma<vfp_type>")]
 )
 
 (define_insn "*fnmadd<SDF:mode>4"
@@ -945,7 +947,7 @@  (define_insn "*fnmadd<SDF:mode>4"
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA"
   "vfnma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
   [(set_attr "predicable" "yes")
-   (set_attr "type" "fmac<vfp_type>")]
+   (set_attr "type" "ffma<vfp_type>")]
 )
 
 
diff --git a/gcc/config/arm/vfp11.md b/gcc/config/arm/vfp11.md
index 8f863fd70cd0a5124675bac8211249fb3db7170e..0000000000000000000000000000000000000000 100644
--- a/gcc/config/arm/vfp11.md
+++ b/gcc/config/arm/vfp11.md
@@ -56,12 +56,12 @@  (define_insn_reservation "vfp_ffarith" 4
 
 (define_insn_reservation "vfp_farith" 8
  (and (eq_attr "generic_vfp" "yes")
-      (eq_attr "type" "fadds,faddd,fconsts,fconstd,f_cvt,fmuls,fmacs"))
+      (eq_attr "type" "fadds,faddd,fconsts,fconstd,f_cvt,fmuls,fmacs,ffmas"))
  "fmac")
 
 (define_insn_reservation "vfp_fmul" 9
  (and (eq_attr "generic_vfp" "yes")
-      (eq_attr "type" "fmuld,fmacd"))
+      (eq_attr "type" "fmuld,fmacd,ffmad"))
  "fmac*2")
 
 (define_insn_reservation "vfp_fdivs" 19