]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
mips.md (define_attr accum_in): New instruction attribute.
authorMaxim Kuvyrkov <mkuvyrkov@gcc.gnu.org>
Wed, 15 Aug 2012 05:56:08 +0000 (05:56 +0000)
committerMaxim Kuvyrkov <mkuvyrkov@gcc.gnu.org>
Wed, 15 Aug 2012 05:56:08 +0000 (05:56 +0000)
* config/mips/mips.md (define_attr accum_in): New instruction attribute.
Set it for imadd and fmadd patterns.
* config/mips/mips.c (mips_linked_madd_p): Use accum_in to extract
accumulator register.

From-SVN: r190406

gcc/config/mips/mips.c
gcc/config/mips/mips.md

index 3688136fb8460c162803af7737a09d1ab69529e4..a8b702de14d21991e53c6255443518c92c31aa88 100644 (file)
@@ -12372,25 +12372,24 @@ mips_output_division (const char *division, rtx *operands)
 bool
 mips_linked_madd_p (rtx out_insn, rtx in_insn)
 {
-  rtx x;
+  enum attr_accum_in accum_in;
+  int accum_in_opnum;
+  rtx accum_in_op;
 
-  x = single_set (in_insn);
-  if (x == 0)
+  if (recog_memoized (in_insn) < 0)
     return false;
 
-  x = SET_SRC (x);
+  accum_in = get_attr_accum_in (in_insn);
+  if (accum_in == ACCUM_IN_NONE)
+    return false;
 
-  if (GET_CODE (x) == PLUS
-      && GET_CODE (XEXP (x, 0)) == MULT
-      && reg_set_p (XEXP (x, 1), out_insn))
-    return true;
+  accum_in_opnum = accum_in - ACCUM_IN_0;
 
-  if (GET_CODE (x) == MINUS
-      && GET_CODE (XEXP (x, 1)) == MULT
-      && reg_set_p (XEXP (x, 0), out_insn))
-    return true;
+  extract_insn (in_insn);
+  gcc_assert (accum_in_opnum < recog_data.n_operands);
+  accum_in_op = recog_data.operand[accum_in_opnum];
 
-  return false;
+  return reg_set_p (accum_in_op, out_insn);
 }
 
 /* True if the dependency between OUT_INSN and IN_INSN is on the store
index 759958ba460b4ed10751e3d6ac206922efa372f6..9022b0a964eb74d38405bd066a1330f98576c1f2 100644 (file)
 ;; "11" specifies MEMMODEL_ACQUIRE.
 (define_attr "sync_memmodel" "" (const_int 10))
 
+;; Accumulator operand for madd patterns.
+(define_attr "accum_in" "none,0,1,2,3,4,5" (const_string "none"))
 
 ;; Classification of each insn.
 ;; branch      conditional branch
     madd\t%1,%2
     #"
   [(set_attr "type"    "imadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode"    "SI")
    (set_attr "length"  "4,8")])
 
     madd\t%0,%1,%2
     #"
   [(set_attr "type"    "imadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode"    "SI")
    (set_attr "length"  "4,4,8")])
 
     return "%[macc\t%@,%1,%2%]";
 }
   [(set_attr "type" "imadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "SI")])
 
 (define_insn "*msac"
     return "msac\t$0,%2,%3";
 }
   [(set_attr "type"     "imadd")
+   (set_attr "accum_in"        "1")
    (set_attr "mode"     "SI")])
 
 ;; An msac-like instruction implemented using negation and a macc.
        (clobber (match_dup 4))])]
   ""
   [(set_attr "type"     "imadd")
+   (set_attr "accum_in"        "1")
    (set_attr "length"  "8")])
 
 ;; Patterns generated by the define_peephole2 below.
   "ISA_HAS_MACC && reload_completed"
   "macc\t%3,%1,%2"
   [(set_attr "type"    "imadd")
+   (set_attr "accum_in"        "0")
    (set_attr "mode"    "SI")])
 
 (define_insn "*msac2"
   "ISA_HAS_MSAC && reload_completed"
   "msac\t%3,%1,%2"
   [(set_attr "type"    "imadd")
+   (set_attr "accum_in"        "0")
    (set_attr "mode"    "SI")])
 
 ;; Convert macc $0,<r1>,<r2> & mflo <r3> into macc <r3>,<r1>,<r2>
    msub\t%2,%3
    #"
   [(set_attr "type"     "imadd")
+   (set_attr "accum_in"        "1")
    (set_attr "mode"     "SI")
    (set_attr "length"   "4,8")])
 
     return "msac<u>\t$0,%1,%2";
 }
   [(set_attr "type" "imadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "SI")])
 
 ;; _highpart patterns
   "TARGET_MAD"
   "mad\t%1,%2"
   [(set_attr "type"    "imadd")
+   (set_attr "accum_in"        "0")
    (set_attr "mode"    "SI")])
 
 ;; See the comment above <u>msubsidi4 for the relationship between
     return "%[macc<u>\t%@,%1,%2%]";
 }
   [(set_attr "type" "imadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "SI")])
 
 ;; Floating point multiply accumulate instructions.
   "ISA_HAS_FP_MADD4_MSUB4 && TARGET_FUSED_MADD"
   "madd.<fmt>\t%0,%3,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*madd3<mode>"
   "ISA_HAS_FP_MADD3_MSUB3 && TARGET_FUSED_MADD"
   "madd.<fmt>\t%0,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*msub4<mode>"
   "ISA_HAS_FP_MADD4_MSUB4 && TARGET_FUSED_MADD"
   "msub.<fmt>\t%0,%3,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*msub3<mode>"
   "ISA_HAS_FP_MADD3_MSUB3 && TARGET_FUSED_MADD"
   "msub.<fmt>\t%0,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*nmadd4<mode>"
    && !HONOR_NANS (<MODE>mode)"
   "nmadd.<fmt>\t%0,%3,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*nmadd3<mode>"
    && !HONOR_NANS (<MODE>mode)"
   "nmadd.<fmt>\t%0,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*nmadd4<mode>_fastmath"
    && !HONOR_NANS (<MODE>mode)"
   "nmadd.<fmt>\t%0,%3,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*nmadd3<mode>_fastmath"
    && !HONOR_NANS (<MODE>mode)"
   "nmadd.<fmt>\t%0,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "3")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*nmsub4<mode>"
    && !HONOR_NANS (<MODE>mode)"
   "nmsub.<fmt>\t%0,%1,%2,%3"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "1")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*nmsub3<mode>"
    && !HONOR_NANS (<MODE>mode)"
   "nmsub.<fmt>\t%0,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "1")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*nmsub4<mode>_fastmath"
    && !HONOR_NANS (<MODE>mode)"
   "nmsub.<fmt>\t%0,%1,%2,%3"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "1")
    (set_attr "mode" "<UNITMODE>")])
 
 (define_insn "*nmsub3<mode>_fastmath"
    && !HONOR_NANS (<MODE>mode)"
   "nmsub.<fmt>\t%0,%1,%2"
   [(set_attr "type" "fmadd")
+   (set_attr "accum_in"        "1")
    (set_attr "mode" "<UNITMODE>")])
 
 ;;