The existing scheduler bypass information for madd on the 74k uses some bits copied from the 24k, and is not quite correct. This patch is based on one originally sent to us by MIPS and has been present in our local source base for years. I've confirmed that we are legally allowed to contribute this to the FSF; ok for mainline?

-Sandra

2012-08-01  Sandra Loosemore  <san...@codesourcery.com>
            Maxim Kuvyrkov  <ma...@codesourcery.com>
            Julian Brown  <jul...@codesourcery.com>
            MIPS Technologies, Inc.
        
        * config/mips/74k.md (r74k_int_mult, r74k_int_madd): Don't use
        mips_linked_madd_p for bypasses.
        (r74k_int_mul3): Use mips_mult_madd_chain_bypass_p for bypass.
        * config/mips/mips.c (mips_mult_madd_chain_bypass_p): New.
        * config/mips/mips-protos.h (mips_mult_madd_chain_bypass_p): Add
        prototype.


Index: gcc/config/mips/74k.md
===================================================================
--- gcc/config/mips/74k.md	(revision 189988)
+++ gcc/config/mips/74k.md	(working copy)
@@ -168,10 +168,11 @@
 ;; mult/madd/msub->int_mfhilo  : 4 cycles (default)
 ;; mult->madd/msub             : 1 cycles
 ;; madd/msub->madd/msub        : 1 cycles
-(define_bypass 1 "r74k_int_mult,r74k_int_mul3" "r74k_int_madd"
-  "mips_linked_madd_p")
-(define_bypass 1 "r74k_int_madd" "r74k_int_madd"
-  "mips_linked_madd_p")
+(define_bypass 1 "r74k_int_mult" "r74k_int_madd")
+(define_bypass 1 "r74k_int_madd" "r74k_int_madd")
+
+(define_bypass 1 "r74k_int_mul3" "r74k_int_madd"
+  "mips_mult_madd_chain_bypass_p")
 
 ;; --------------------------------------------------------------
 ;; Floating Point Instructions
Index: gcc/config/mips/mips-protos.h
===================================================================
--- gcc/config/mips/mips-protos.h	(revision 189988)
+++ gcc/config/mips/mips-protos.h	(working copy)
@@ -296,6 +296,7 @@ extern unsigned int mips_sync_loop_insns
 extern const char *mips_output_division (const char *, rtx *);
 extern unsigned int mips_hard_regno_nregs (int, enum machine_mode);
 extern bool mips_linked_madd_p (rtx, rtx);
+extern bool mips_mult_madd_chain_bypass_p (rtx, rtx);
 extern bool mips_store_data_bypass_p (rtx, rtx);
 extern rtx mips_prefetch_cookie (rtx, rtx);
 
Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c	(revision 189988)
+++ gcc/config/mips/mips.c	(working copy)
@@ -12392,6 +12392,18 @@ mips_linked_madd_p (rtx out_insn, rtx in
   return false;
 }
 
+/* Helper function for 74k; returns true to enable the chained mult/madd
+   bypass.  */
+bool
+mips_mult_madd_chain_bypass_p (rtx out_insn ATTRIBUTE_UNUSED,
+			       rtx in_insn ATTRIBUTE_UNUSED)
+{
+  if (reload_completed)
+    return false;
+  else
+    return true;
+}
+
 /* True if the dependency between OUT_INSN and IN_INSN is on the store
    data rather than the address.  We need this because the cprestore
    pattern is type "store", but is defined using an UNSPEC_VOLATILE,

Reply via email to