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))