https://gcc.gnu.org/g:5816726d26832b3d0f3a87f06b4b3e38982ce89c
commit 5816726d26832b3d0f3a87f06b4b3e38982ce89c Author: Michael Meissner <meiss...@linux.ibm.com> Date: Mon May 20 16:38:25 2024 -0400 Add -mmfspr 2024-05-20 Michael Meissner <meiss...@linux.ibm.com> gcc/ * config/rs6000/rs6000-cpus.def (POWERPC_MASKS): Add -mmfspr. * config/rs6000/rs6000.cc (rs6000_register_move_cost): If -mmfspr, make moves from CTR more expensive. (rs6000_opt_masks): Add -mmfspr. * config/rs6000/rs6000.opt (-mmfspr): New option. Diff: --- gcc/config/rs6000/rs6000-cpus.def | 1 + gcc/config/rs6000/rs6000.cc | 12 ++++++++++++ gcc/config/rs6000/rs6000.opt | 4 ++++ 3 files changed, 17 insertions(+) diff --git a/gcc/config/rs6000/rs6000-cpus.def b/gcc/config/rs6000/rs6000-cpus.def index 6fcbcbdadef7..47aca85aa4bc 100644 --- a/gcc/config/rs6000/rs6000-cpus.def +++ b/gcc/config/rs6000/rs6000-cpus.def @@ -136,6 +136,7 @@ | OPTION_MASK_INTSPR \ | OPTION_MASK_ISEL \ | OPTION_MASK_MFCRF \ + | OPTION_MASK_MFSPR \ | OPTION_MASK_MMA \ | OPTION_MASK_MODULO \ | OPTION_MASK_MULHW \ diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 7d5b94cda101..ce1a49abe598 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -22807,6 +22807,17 @@ rs6000_register_move_cost (machine_mode mode, ret = 2 * hard_regno_nregs (reg, mode); } + /* Make moves from the CTR register more expensive so that the register + allocator does not think of these registers are useful for saving + results. */ + else if (TARGET_MFSPR + && reg_classes_intersect_p (to, GENERAL_REGS) + && reg_classes_intersect_p (from, CTR_REGS)) + { + rclass = from; + ret = 32; + } + /* Moves from/to GENERAL_REGS. */ else if ((rclass = from, reg_classes_intersect_p (to, GENERAL_REGS)) || (rclass = to, reg_classes_intersect_p (from, GENERAL_REGS))) @@ -24491,6 +24502,7 @@ static struct rs6000_opt_mask const rs6000_opt_masks[] = { "isel", OPTION_MASK_ISEL, false, true }, { "mfcrf", OPTION_MASK_MFCRF, false, true }, { "mfpgpr", 0, false, true }, + { "mfspr", OPTION_MASK_MFSPR, false, true }, { "mma", OPTION_MASK_MMA, false, true }, { "modulo", OPTION_MASK_MODULO, false, true }, { "mulhw", OPTION_MASK_MULHW, false, true }, diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt index 2f3970b664cc..d45746bc24f4 100644 --- a/gcc/config/rs6000/rs6000.opt +++ b/gcc/config/rs6000/rs6000.opt @@ -634,6 +634,10 @@ mintspr Target Undocumented Mask(INTSPR) Var(rs6000_isa_flags) Disallow (allow) non-integer types in SPR registers. +mmfspr +Target Undocumented Mask(MFSPR) Var(rs6000_isa_flags) +Disallow (allow) non-integer types in SPR registers. + ; Documented parameters -param=rs6000-vect-unroll-limit=