rs6000.c (rs6000_reassociation_width): Add function for TARGET_SCHED_REASSOCIATION_WI...
authorAaron Sawdey <acsawdey@linux.vnet.ibm.com>
Mon, 9 May 2016 16:56:30 +0000 (16:56 +0000)
committerAaron Sawdey <acsawdey@gcc.gnu.org>
Mon, 9 May 2016 16:56:30 +0000 (11:56 -0500)
        * config/rs6000/rs6000.c (rs6000_reassociation_width): Add
        function for TARGET_SCHED_REASSOCIATION_WIDTH to enable
        parallel reassociation for power8 and forward.

From-SVN: r236043

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 007ae87711c1847b37e0784e625551fc7808768e..0cd95344f1bd0529b0e9e1069af6705a96ee8007 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-04  Aaron Sawdey  <acsawdey@linux.vnet.ibm.com>
+
+        * config/rs6000/rs6000.c (rs6000_reassociation_width): Add
+        function for TARGET_SCHED_REASSOCIATION_WIDTH to enable
+        parallel reassociation for power8 and forward.
+
 2016-05-09  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (absneg splitters with general regs): Use
index 368fec2b3c857bf98ee0ef38b616d36c776a4075..34495f3c99d0c41e9d47d68e6314553f1c52afcd 100644 (file)
@@ -1755,6 +1755,9 @@ static const struct attribute_spec rs6000_attribute_table[] =
 #undef TARGET_CONDITIONAL_REGISTER_USAGE
 #define TARGET_CONDITIONAL_REGISTER_USAGE rs6000_conditional_register_usage
 
+#undef TARGET_SCHED_REASSOCIATION_WIDTH
+#define TARGET_SCHED_REASSOCIATION_WIDTH rs6000_reassociation_width
+
 #undef TARGET_TRAMPOLINE_INIT
 #define TARGET_TRAMPOLINE_INIT rs6000_trampoline_init
 
@@ -8633,6 +8636,40 @@ rs6000_offsettable_memref_p (rtx op, machine_mode reg_mode)
                                             true, worst_case);
 }
 
+/* Determine the reassociation width to be used in reassociate_bb.
+   This takes into account how many parallel operations we
+   can actually do of a given type, and also the latency.
+   P8:
+     int add/sub 6/cycle     
+         mul 2/cycle
+     vect add/sub/mul 2/cycle
+     fp   add/sub/mul 2/cycle
+     dfp  1/cycle
+*/
+static int
+rs6000_reassociation_width (unsigned int opc ATTRIBUTE_UNUSED,
+                            enum machine_mode mode)
+{
+  switch (rs6000_cpu)
+    {
+    case PROCESSOR_POWER8:
+    case PROCESSOR_POWER9:
+      if (DECIMAL_FLOAT_MODE_P (mode))
+       return 1;
+      if (VECTOR_MODE_P (mode))
+       return 4;
+      if (INTEGRAL_MODE_P (mode)) 
+       return opc == MULT_EXPR ? 4 : 6;
+      if (FLOAT_MODE_P (mode))
+       return 4;
+      break;
+    default:
+      break;
+    }
+  return 1;
+}
+
 /* Change register usage conditional on target flags.  */
 static void
 rs6000_conditional_register_usage (void)