aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>2013-05-15 08:57:19 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2013-05-15 08:57:19 +0000
commit1dd03b91ccae183b0b313cc0a54953dfc621951a (patch)
tree9e58bebadb6ecee6dc1e3128e5fe17b234d7195b /gcc
parent3b2453a973c7607e64ded18d757c7a4680c07bc2 (diff)
downloadgcc-1dd03b91ccae183b0b313cc0a54953dfc621951a.zip
gcc-1dd03b91ccae183b0b313cc0a54953dfc621951a.tar.gz
gcc-1dd03b91ccae183b0b313cc0a54953dfc621951a.tar.bz2
s390.c (s390_register_move_cost): Don't impose the FPR<->GPR move cost penalty if ldgr/lgdr can be used.
2013-05-15 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> * config/s390/s390.c (s390_register_move_cost): Don't impose the FPR<->GPR move cost penalty if ldgr/lgdr can be used. From-SVN: r198923
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/s390/s390.c12
2 files changed, 12 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aa1f910..3409780 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-05-15 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
+
+ * config/s390/s390.c (s390_register_move_cost): Don't impose the
+ FPR<->GPR move cost penalty if ldgr/lgdr can be used.
+
2013-05-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/57275
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 1578363..30c3490 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -2432,11 +2432,13 @@ static int
s390_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
reg_class_t from, reg_class_t to)
{
-/* On s390, copy between fprs and gprs is expensive. */
- 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)))
+ /* 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))))
return 10;
return 1;