[AARCH64][5/5] Add macro fusion support for cmp/b.X for ThunderX
authorAndrew Pinski <apinski@cavium.com>
Tue, 9 Dec 2014 17:32:58 +0000 (17:32 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Tue, 9 Dec 2014 17:32:58 +0000 (17:32 +0000)
* config/aarch64/aarch64.c (AARCH64_FUSE_CMP_BRANCH): New define.
(thunderx_tunings): Add AARCH64_FUSE_CMP_BRANCH to fuseable_ops.
(aarch_macro_fusion_pair_p): Handle AARCH64_FUSE_CMP_BRANCH.

From-SVN: r218525

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index 532ac255f0970c094a8a8013435dbdc8238af623..e680ae9404cf8b9e123dbf172b47ed55db72f329 100644 (file)
@@ -1,3 +1,10 @@
+2014-12-09  Andrew Pinski  apinski@cavium.com
+            Kyrylo Tkachov  kyrylo.tkachov@arm.com
+
+       * config/aarch64/aarch64.c (AARCH64_FUSE_CMP_BRANCH): New define.
+       (thunderx_tunings): Add AARCH64_FUSE_CMP_BRANCH to fuseable_ops.
+       (aarch_macro_fusion_pair_p): Handle AARCH64_FUSE_CMP_BRANCH.
+
 2014-12-09  David Malcolm  <dmalcolm@redhat.com>
 
        PR jit/64166
index e682edda86b412b8b4c933fe9cd98ada52145a8f..03f3ac497f89cc208c9d17e011d563069d131241 100644 (file)
@@ -310,6 +310,7 @@ static const struct cpu_vector_cost cortexa57_vector_cost =
 #define AARCH64_FUSE_ADRP_ADD  (1 << 1)
 #define AARCH64_FUSE_MOVK_MOVK (1 << 2)
 #define AARCH64_FUSE_ADRP_LDR  (1 << 3)
+#define AARCH64_FUSE_CMP_BRANCH        (1 << 4)
 
 #if HAVE_DESIGNATED_INITIALIZERS && GCC_VERSION >= 2007
 __extension__
@@ -356,7 +357,7 @@ static const struct tune_params thunderx_tunings =
   &generic_vector_cost,
   NAMED_PARAM (memmov_cost, 6),
   NAMED_PARAM (issue_rate, 2),
-  NAMED_PARAM (fuseable_ops, AARCH64_FUSE_NOTHING)
+  NAMED_PARAM (fuseable_ops, AARCH64_FUSE_CMP_BRANCH)
 };
 
 /* A processor implementing AArch64.  */
@@ -10379,6 +10380,20 @@ aarch_macro_fusion_pair_p (rtx_insn *prev, rtx_insn *curr)
         }
     }
 
+  if ((aarch64_tune_params->fuseable_ops & AARCH64_FUSE_CMP_BRANCH)
+      && any_condjump_p (curr))
+    {
+      enum attr_type prev_type = get_attr_type (prev);
+
+      /* FIXME: this misses some which is considered simple arthematic
+         instructions for ThunderX.  Simple shifts are missed here.  */
+      if (prev_type == TYPE_ALUS_SREG
+          || prev_type == TYPE_ALUS_IMM
+          || prev_type == TYPE_LOGICS_REG
+          || prev_type == TYPE_LOGICS_IMM)
+        return true;
+    }
+
   return false;
 }