https://gcc.gnu.org/g:84becba734412efd2da9a75c859d2d776ab25666
commit 84becba734412efd2da9a75c859d2d776ab25666 Author: Michael Meissner <meiss...@linux.ibm.com> Date: Tue May 14 13:44:45 2024 -0400 Add -mintspr. Default -mtar for power10, not power9. 2024-05-14 Michael Meissner <meiss...@linux.ibm.com> * config/rs6000/rs6000-cpus.def (ISA_2_7_MASKS_SERVER): Don't set TAR options here. (OTHER_POWER10_MASKS): Set TAR options here. Add -mintspr. (POWERPC_MASKS): Add -mintspr. * config/rs6000/rs6000.cc (rs6000_hard_regno_mode_ok_uncached): Add support for -mintspr. (rs6000_option_override_internal): Require -mcpu=power9 or -mcpu=power10 to use -mtar. (rs6000_opt_masks): Add -mmfspr and -mintspr. * config/rs6000/rs6000.opt (-mintspr): New option. Diff: --- gcc/config/rs6000/rs6000-cpus.def | 15 ++++++++++----- gcc/config/rs6000/rs6000.cc | 19 ++++++++++++++++--- gcc/config/rs6000/rs6000.opt | 4 ++++ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/gcc/config/rs6000/rs6000-cpus.def b/gcc/config/rs6000/rs6000-cpus.def index f53bd3e7dcba..46e26b0df5ec 100644 --- a/gcc/config/rs6000/rs6000-cpus.def +++ b/gcc/config/rs6000/rs6000-cpus.def @@ -51,19 +51,20 @@ | OPTION_MASK_P8_VECTOR \ | OPTION_MASK_CRYPTO \ | OPTION_MASK_EFFICIENT_UNALIGNED_VSX \ - | OPTION_MASK_MFSPR \ | OPTION_MASK_QUAD_MEMORY \ - | OPTION_MASK_QUAD_MEMORY_ATOMIC \ - | OPTION_MASK_TAR) + | OPTION_MASK_QUAD_MEMORY_ATOMIC) /* ISA masks setting fusion options. */ #define OTHER_FUSION_MASKS (OPTION_MASK_P8_FUSION \ | OPTION_MASK_P8_FUSION_SIGN) /* Add ISEL back into ISA 3.0, since it is supposed to be a win. Do not add - FLOAT128_HW here until we are ready to make -mfloat128 on by default. */ + FLOAT128_HW here until we are ready to make -mfloat128 on by default. While + ISA 2.07 (power9) supports the TAR register, don't enable it here, because + it doesn't seem to help. */ #define ISA_3_0_MASKS_SERVER ((ISA_2_7_MASKS_SERVER \ | OPTION_MASK_ISEL \ + | OPTION_MASK_MFSPR \ | OPTION_MASK_MODULO \ | OPTION_MASK_P9_MINMAX \ | OPTION_MASK_P9_MISC \ @@ -80,9 +81,12 @@ /* We comment out PCREL_OPT here to disable it by default because SPEC2017 performance was degraded by it. */ #define OTHER_POWER10_MASKS (OPTION_MASK_MMA \ + | OPTION_MASK_INTSPR \ + | OPTION_MASK_MFSPR \ | OPTION_MASK_PCREL \ /* | OPTION_MASK_PCREL_OPT */ \ - | OPTION_MASK_PREFIXED) + | OPTION_MASK_PREFIXED \ + | OPTION_MASK_TAR) #define ISA_3_1_MASKS_SERVER (ISA_3_0_MASKS_SERVER \ | OPTION_MASK_POWER10 \ @@ -135,6 +139,7 @@ | OPTION_MASK_POWER11 \ | OPTION_MASK_P10_FUSION \ | OPTION_MASK_HTM \ + | OPTION_MASK_INTSPR \ | OPTION_MASK_ISEL \ | OPTION_MASK_MFCRF \ | OPTION_MASK_MFSPR \ diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 6bfcfdfb22c5..7f4ee65c42c4 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -1930,8 +1930,8 @@ rs6000_hard_regno_mode_ok_uncached (int regno, machine_mode mode) if (CR_REGNO_P (regno)) return GET_MODE_CLASS (mode) == MODE_CC; - /* Limit SPR registers to integer modes that can fit in a single register. - Do not allow complex modes or modes that need sign/zero extension. */ + /* If desired, limit SPR registers to integer modes that can fit in a single + register. Do not allow complex modes. */ switch (regno) { case LR_REGNO: @@ -1940,7 +1940,9 @@ rs6000_hard_regno_mode_ok_uncached (int regno, machine_mode mode) case VRSAVE_REGNO: case VSCR_REGNO: case CA_REGNO: - return (orig_mode == Pmode || orig_mode == SImode); + return (GET_MODE_SIZE (mode) <= GET_MODE_SIZE (Pmode) + && !COMPLEX_MODE_P (orig_mode) + && (!TARGET_INTSPR || SCALAR_INT_MODE_P (mode))); default: break; @@ -4216,6 +4218,15 @@ rs6000_option_override_internal (bool global_init_p) rs6000_isa_flags &= ~OPTION_MASK_FLOAT128_HW; } + /* If -mtar, make sure we have at least a power9. */ + if (TARGET_TAR && !TARGET_P9_MISC) + { + if ((rs6000_isa_flags_explicit & OPTION_MASK_TAR) != 0) + error ("%qs requires %qs", "-mtar", "-mcpu=power9"); + + rs6000_isa_flags &= ~OPTION_MASK_TAR; + } + /* Enable -mprefixed by default on power10 systems. */ if (TARGET_POWER10 && (rs6000_isa_flags_explicit & OPTION_MASK_PREFIXED) == 0) rs6000_isa_flags |= OPTION_MASK_PREFIXED; @@ -24514,9 +24525,11 @@ static struct rs6000_opt_mask const rs6000_opt_masks[] = { "power11", OPTION_MASK_POWER11, false, false }, { "hard-dfp", OPTION_MASK_DFP, false, true }, { "htm", OPTION_MASK_HTM, false, true }, + { "intspr", OPTION_MASK_INTSPR, false, true }, { "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 8b21865f9831..9e9efa60bea5 100644 --- a/gcc/config/rs6000/rs6000.opt +++ b/gcc/config/rs6000/rs6000.opt @@ -615,6 +615,10 @@ mmfspr Target Undocumented Mask(MFSPR) Var(rs6000_isa_flags) Generate (do not generate) code making move from SPR register expensive. +mintspr +Target Undocumented Mask(INTSPR) Var(rs6000_isa_flags) +Require (disallow) SPR registers to hold only integer modes and not floating point modes. + mrelative-jumptables Target Undocumented Var(rs6000_relative_jumptables) Init(1) Save