]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390.c (s390_register_move_cost): Increase costs for FPR->GPR moves.
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Tue, 27 Jan 2015 15:32:38 +0000 (15:32 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Tue, 27 Jan 2015 15:32:38 +0000 (15:32 +0000)
2015-01-27  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* config/s390/s390.c (s390_register_move_cost): Increase costs for
FPR->GPR moves.

From-SVN: r220173

gcc/ChangeLog
gcc/config/s390/s390.c

index 49dee667ef2ffe1b633fce13105f00eb44b50cb2..54aef604a755cf5699a50f7a8a7adc9d0a1d55b7 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-27  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.c (s390_register_move_cost): Increase costs for
+       FPR->GPR moves.
+
 2015-01-26  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index 866de858cf04d4e294dea059a30f8fa318892e00..d41819cb8110a47f22dd69b2958e92ca7b577456 100644 (file)
@@ -2384,16 +2384,29 @@ s390_float_const_zero_p (rtx value)
 /* Implement TARGET_REGISTER_MOVE_COST.  */
 
 static int
-s390_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
+s390_register_move_cost (enum machine_mode mode,
                          reg_class_t from, reg_class_t to)
 {
-  /* On s390, copy between fprs and gprs is expensive as long as no
-     ldgr/lgdr can be used.  */
-  if ((!TARGET_Z10 || GET_MODE_SIZE (mode) != 8)
-      && ((reg_classes_intersect_p (from, GENERAL_REGS)
-          && reg_classes_intersect_p (to, FP_REGS))
-         || (reg_classes_intersect_p (from, FP_REGS)
-             && reg_classes_intersect_p (to, GENERAL_REGS))))
+  /* On s390, copy between fprs and gprs is expensive.  */
+
+  /* It becomes somewhat faster having ldgr/lgdr.  */
+  if (TARGET_Z10 && GET_MODE_SIZE (mode) == 8)
+    {
+      /* ldgr is single cycle. */
+      if (reg_classes_intersect_p (from, GENERAL_REGS)
+         && reg_classes_intersect_p (to, FP_REGS))
+       return 1;
+      /* lgdr needs 3 cycles. */
+      if (reg_classes_intersect_p (to, GENERAL_REGS)
+         && reg_classes_intersect_p (from, FP_REGS))
+       return 3;
+    }
+
+  /* Otherwise copying is done via memory.  */
+  if ((reg_classes_intersect_p (from, GENERAL_REGS)
+       && reg_classes_intersect_p (to, FP_REGS))
+      || (reg_classes_intersect_p (from, FP_REGS)
+         && reg_classes_intersect_p (to, GENERAL_REGS)))
     return 10;
 
   return 1;