This is necessary to prevent reload assuming that a direct FP->FPMR move
is valid.

Bootstrapped and regression tested; ok for master?

gcc/ChangeLog:

        * config/aarch64/aarch64.cc (aarch64_register_move_cost):
        Increase costs involving MOVEABLE_SYSREGS.


diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 
c03ca2c24ed702803989024193dae07155445978..73a555d61cfb4c150cb5a0e7b9d09f3075f0c0b4
 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -15500,6 +15500,12 @@ aarch64_register_move_cost (machine_mode mode,
                                reg_class_contents[FFR_REGS]))
     return 80;
 
+  /* Moves to/from sysregs are expensive, and must go via GPR.  */
+  if (from == MOVEABLE_SYSREGS)
+    return 80 + aarch64_register_move_cost (mode, GENERAL_REGS, to);
+  if (to == MOVEABLE_SYSREGS)
+    return 80 + aarch64_register_move_cost (mode, from, GENERAL_REGS);
+
   /* Moving between GPR and stack cost is the same as GP2GP.  */
   if ((from == GENERAL_REGS && to == STACK_REG)
       || (to == GENERAL_REGS && from == STACK_REG))

Reply via email to