Hi Mike,

This should be a standalone patch, not "1 of 2". The patch to use vector 
pair load/store should be a separate patch.


On 25/11/25 1:50 pm, Michael Meissner wrote:
> This patch adds support for a new PowerPC cpu (future).
> 
> The intention of this patch is to provide a testing platform for features that
> may be added to future PowerPC server systems.  However, these features are 
> not
> officially part of the PowerPC architecture, and they may be changed before 
> they
> are incorporated into future platforms.
> 
> If the features provided by -mcpu=future are incorporated into an official
> PowerPC server, this option will be renamed to the official name for that
> platform.

Imho, we should reword the commit message, perhaps something like:
This patch adds support for the option -mcpu=future. This enables
future enhancements to GCC for supporting upcoming PowerPC processors.

> 
> The version 8 patches were here:
>  * https://gcc.gnu.org/pipermail/gcc-patches/2025-November/700537.html
> 
> In particular, this patch answers questions from Surya Kumari Jangala:
>  * https://gcc.gnu.org/pipermail/gcc-patches/2025-November/701351.html
> 
> Here are the changes I made to the V8 patch.
> 
> I added a commit log message in the first patch.
> 
> I changed macros to macro in the ChangeLog message.
> 
> I added an entry for the cpu=future entry in rs6000-cpus.def.  The
> entry was actually there but in the wrong place, and I rewrote the
> message.
> 
> I simplified the ChangeLog message for PROCESSOR_FUTURE.
> 
> I added a ChangeLog message for rs6000.cc.
> 
> In terms of:
> 
>     > @@ -24463,6 +24465,7 @@ static struct rs6000_opt_mask const 
> rs6000_opt_masks[] =
>     >    { "float128",                        OPTION_MASK_FLOAT128_KEYWORD,   
> false, true  },
>     >    { "float128-hardware",       OPTION_MASK_FLOAT128_HW,        false, 
> true  },
>     >    { "fprnd",                   OPTION_MASK_FPRND,              false, 
> true  },
>     > +  { "future",                  OPTION_MASK_FUTURE,             false, 
> false },
> 
>     The last entry should be 'true'. And better to have this entry after the 
> entry for
>     Power 11, so that t will be simpler when we replace 'future' with the new 
> future 
>     processor's name.
> 
> Historically the entries were alphabetical, but I moved it to be after
> power11.  However, I kept the last entry (valid_target) to be "false"
> (just like it is for "power11").
> 
> The rs6000_opt_masks table has two functions.  The first function is to
> print out the options that are set with -mdebug=reg.  That function
> does not check valid_target.
> 
> The section function is whether the target attribute and target pragma
> support allows the user to change that option.  If valid_target is
> false, it will not allow the user to set this option.  I.e. if they
> want to enable future, they have to use cpu=future.
> 
> I removed the verbage about what -mcpu=future is for in the texinfo
> files, but I left the line saying future is a valid -mcpu= option.
> 
> Can I check this patch into the GCC trunk?  I have built bootstrap
> builds on both a little endian Power10 system and a big endian Power9
> system and there were no regressions.  On the little endian Power10
> system, I built the last run using the --with-cpu=future configuration
> option.
> 
> 2025-11-25  Michael Meissner  <[email protected]>
> 
> gcc/
> 
>       * config.gcc (powerpc*-*-*): Add support for -mcpu=future.
>       * config/rs6000/aix71.h (ASM_CPU_SPEC): Add support for -mcpu=future.
>       * config/rs6000/aix72.h (ASM_CPU_SPEC): Likewise.
>       * config/rs6000/aix73.h (ASM_CPU_SPEC): Likewise.
>       * config/rs6000/rs6000-c.cc (rs6000_target_modify_macros): Define
>       _ARCH_FUTURE if -mcpu=future.
>       * config/rs6000/rs6000-cpus.def (FUTURE_MASKS_SERVER): New macro.
>       (POWERPC_MASKS): Add OPTION_MASK_FUTURE.
>       (rs6000_cpu_opt_value): New entry for 'future' via the RS6000_CPU macro.
>       * config/rs6000/rs6000-opts.h (PROCESSOR_FUTURE): New macro.
>       * config/rs6000/rs6000-tables.opt: Regenerate.
>       * config/rs6000/rs6000.cc (rs6000_machine_from_flags) If -mcpu=future,
>       set the .machine directive to "future".
>       (rs6000_opt_masks): Add support for showing -mfuture if the -mdebug=reg
>       debugging option is used.

Here, we can just say:
(rs6000_opt_masks): Add entry for "future"

>       * config/rs6000/rs6000.h (ASM_CPU_SPEC): Add support for -mcpu=future.
>       * config/rs6000/rs6000.opt (-mfuture): New option.
>       * doc/invoke.texi (IBM RS/6000 and PowerPC Options): Document
>       -mcpu=future.
> 
> gcc/testsuite/
> 
>       * gcc.target/powerpc/future-1.c: New test.
>       * gcc.target/powerpc/future-2.c: Likewise.
> ---
>  gcc/config.gcc                              |  4 ++--
>  gcc/config/rs6000/aix71.h                   |  1 +
>  gcc/config/rs6000/aix72.h                   |  1 +
>  gcc/config/rs6000/aix73.h                   |  1 +
>  gcc/config/rs6000/rs6000-c.cc               |  2 ++
>  gcc/config/rs6000/rs6000-cpus.def           |  6 ++++++
>  gcc/config/rs6000/rs6000-opts.h             |  2 ++
>  gcc/config/rs6000/rs6000-tables.opt         |  3 +++
>  gcc/config/rs6000/rs6000.cc                 |  3 +++
>  gcc/config/rs6000/rs6000.h                  |  1 +
>  gcc/config/rs6000/rs6000.opt                |  5 +++++
>  gcc/doc/invoke.texi                         |  2 +-
>  gcc/testsuite/gcc.target/powerpc/future-1.c | 13 +++++++++++
>  gcc/testsuite/gcc.target/powerpc/future-2.c | 24 +++++++++++++++++++++
>  14 files changed, 65 insertions(+), 3 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/future-1.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/future-2.c
> 
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 0947d6317de..c83d8126006 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -543,7 +543,7 @@ powerpc*-*-*)
>       extra_headers="${extra_headers} ppu_intrinsics.h spu2vmx.h vec_types.h 
> si2vmx.h"
>       extra_headers="${extra_headers} amo.h"
>       case x$with_cpu in
> -         
> xpowerpc64|xdefault64|x6[23]0|x970|xG5|xpower[3456789]|xpower1[01]|xpower6x|xrs64a|xcell|xa2|xe500mc64|xe5500|xe6500)
> +         
> xpowerpc64|xdefault64|x6[23]0|x970|xG5|xpower[3456789]|xpower1[01]|xpower6x|xrs64a|xcell|xa2|xe500mc64|xe5500|xe6500|xfuture)
>               cpu_is_64bit=yes
>               ;;
>       esac
> @@ -5748,7 +5748,7 @@ case "${target}" in
>                               tm_defines="${tm_defines} CONFIG_PPC405CR"
>                               eval "with_$which=405"
>                               ;;
> -                     "" | common | native \
> +                     "" | common | native | future \
>                       | power[3456789] | power1[01] | power5+ | power6x \
>                       | powerpc | powerpc64 | powerpc64le \
>                       | rs64 \
> diff --git a/gcc/config/rs6000/aix71.h b/gcc/config/rs6000/aix71.h
> index 2b21dd7cd1e..77651f5ea30 100644
> --- a/gcc/config/rs6000/aix71.h
> +++ b/gcc/config/rs6000/aix71.h
> @@ -79,6 +79,7 @@ do {                                                        
>                 \
>  #undef ASM_CPU_SPEC
>  #define ASM_CPU_SPEC \
>  "%{mcpu=native: %(asm_cpu_native); \
> +  mcpu=future: -mfuture; \
>    mcpu=power11: -mpwr11; \
>    mcpu=power10: -mpwr10; \
>    mcpu=power9: -mpwr9; \
> diff --git a/gcc/config/rs6000/aix72.h b/gcc/config/rs6000/aix72.h
> index 53c0bde5ad4..652f60c7f49 100644
> --- a/gcc/config/rs6000/aix72.h
> +++ b/gcc/config/rs6000/aix72.h
> @@ -79,6 +79,7 @@ do {                                                        
>                 \
>  #undef ASM_CPU_SPEC
>  #define ASM_CPU_SPEC \
>  "%{mcpu=native: %(asm_cpu_native); \
> +  mcpu=future: -mfuture; \
>    mcpu=power11: -mpwr11; \
>    mcpu=power10: -mpwr10; \
>    mcpu=power9: -mpwr9; \
> diff --git a/gcc/config/rs6000/aix73.h b/gcc/config/rs6000/aix73.h
> index c7639368a26..3c66ac1d917 100644
> --- a/gcc/config/rs6000/aix73.h
> +++ b/gcc/config/rs6000/aix73.h
> @@ -79,6 +79,7 @@ do {                                                        
>                 \
>  #undef ASM_CPU_SPEC
>  #define ASM_CPU_SPEC \
>  "%{mcpu=native: %(asm_cpu_native); \
> +  mcpu=future: -mfuture; \
>    mcpu=power11: -mpwr11; \
>    mcpu=power10: -mpwr10; \
>    mcpu=power9: -mpwr9; \
> diff --git a/gcc/config/rs6000/rs6000-c.cc b/gcc/config/rs6000/rs6000-c.cc
> index d3b0a566821..6757a2477ad 100644
> --- a/gcc/config/rs6000/rs6000-c.cc
> +++ b/gcc/config/rs6000/rs6000-c.cc
> @@ -437,6 +437,8 @@ rs6000_target_modify_macros (bool define_p, HOST_WIDE_INT 
> flags)
>      rs6000_define_or_undefine_macro (define_p, "_ARCH_PWR10");
>    if ((flags & OPTION_MASK_POWER11) != 0)
>      rs6000_define_or_undefine_macro (define_p, "_ARCH_PWR11");
> +  if ((flags & OPTION_MASK_FUTURE) != 0)
> +    rs6000_define_or_undefine_macro (define_p, "_ARCH_FUTURE");
>    if ((flags & OPTION_MASK_SOFT_FLOAT) != 0)
>      rs6000_define_or_undefine_macro (define_p, "_SOFT_FLOAT");
>    if ((flags & OPTION_MASK_RECIP_PRECISION) != 0)
> diff --git a/gcc/config/rs6000/rs6000-cpus.def 
> b/gcc/config/rs6000/rs6000-cpus.def
> index 4a1037616d7..18547d82811 100644
> --- a/gcc/config/rs6000/rs6000-cpus.def
> +++ b/gcc/config/rs6000/rs6000-cpus.def
> @@ -83,6 +83,10 @@
>  #define POWER11_MASKS_SERVER (ISA_3_1_MASKS_SERVER                   \
>                             | OPTION_MASK_POWER11)
>  
> +/* -mcpu=future flags.  */
> +#define FUTURE_MASKS_SERVER  (POWER11_MASKS_SERVER                   \
> +                              | OPTION_MASK_FUTURE)
> +
>  /* Flags that need to be turned off if -mno-vsx.  */
>  #define OTHER_VSX_VECTOR_MASKS       (OPTION_MASK_EFFICIENT_UNALIGNED_VSX    
> \
>                                | OPTION_MASK_FLOAT128_KEYWORD         \
> @@ -119,6 +123,7 @@
>                                | OPTION_MASK_FLOAT128_HW              \
>                                | OPTION_MASK_FLOAT128_KEYWORD         \
>                                | OPTION_MASK_FPRND                    \
> +                              | OPTION_MASK_FUTURE                   \
>                                | OPTION_MASK_POWER10                  \
>                                | OPTION_MASK_POWER11                  \
>                                | OPTION_MASK_P10_FUSION               \
> @@ -255,3 +260,4 @@ RS6000_CPU ("powerpc64", PROCESSOR_POWERPC64, 
> OPTION_MASK_PPC_GFXOPT
>  RS6000_CPU ("powerpc64le", PROCESSOR_POWER8, MASK_POWERPC64
>           | ISA_2_7_MASKS_SERVER | OPTION_MASK_HTM)
>  RS6000_CPU ("rs64", PROCESSOR_RS64A, OPTION_MASK_PPC_GFXOPT | MASK_POWERPC64)
> +RS6000_CPU ("future", PROCESSOR_FUTURE, MASK_POWERPC64 | FUTURE_MASKS_SERVER)

Please add this entry after the entry for "power11".

> diff --git a/gcc/config/rs6000/rs6000-opts.h b/gcc/config/rs6000/rs6000-opts.h
> index c31d2975f04..e13ba2ba527 100644
> --- a/gcc/config/rs6000/rs6000-opts.h
> +++ b/gcc/config/rs6000/rs6000-opts.h
> @@ -71,6 +71,8 @@ enum processor_type
>     PROCESSOR_TITAN
>  };
>  
> +/* For now, just use power11 as the base processor for -mcpu=future.  */
> +#define PROCESSOR_FUTURE     PROCESSOR_POWER11
>  
>  /* Types of costly dependences.  */
>  enum rs6000_dependence_cost
> diff --git a/gcc/config/rs6000/rs6000-tables.opt 
> b/gcc/config/rs6000/rs6000-tables.opt
> index f5bbed5ea74..9e68c5a66e1 100644
> --- a/gcc/config/rs6000/rs6000-tables.opt
> +++ b/gcc/config/rs6000/rs6000-tables.opt
> @@ -200,3 +200,6 @@ Enum(rs6000_cpu_opt_value) String(powerpc64le) Value(56)
>  EnumValue
>  Enum(rs6000_cpu_opt_value) String(rs64) Value(57)
>  
> +EnumValue
> +Enum(rs6000_cpu_opt_value) String(future) Value(58)

It would be better to create this entry after power11 so that it will be simpler
when we replace 'future' with the new future processor's name.

-Surya

> +
> diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
> index 1d5cd25c0f0..2cf9a97f497 100644
> --- a/gcc/config/rs6000/rs6000.cc
> +++ b/gcc/config/rs6000/rs6000.cc
> @@ -5913,6 +5913,8 @@ rs6000_machine_from_flags (void)
>    flags &= ~(OPTION_MASK_PPC_GFXOPT | OPTION_MASK_PPC_GPOPT | 
> OPTION_MASK_ISEL
>            | OPTION_MASK_ALTIVEC);
>  
> +  if ((flags & (FUTURE_MASKS_SERVER & ~POWER11_MASKS_SERVER)) != 0)
> +    return "future";
>    if ((flags & (POWER11_MASKS_SERVER & ~ISA_3_1_MASKS_SERVER)) != 0)
>      return "power11";
>    if ((flags & (ISA_3_1_MASKS_SERVER & ~ISA_3_0_MASKS_SERVER)) != 0)
> @@ -24465,6 +24467,7 @@ static struct rs6000_opt_mask const 
> rs6000_opt_masks[] =
>    { "fprnd",                 OPTION_MASK_FPRND,              false, true  },
>    { "power10",                       OPTION_MASK_POWER10,            false, 
> true  },
>    { "power11",                       OPTION_MASK_POWER11,            false, 
> false },
> +  { "future",                        OPTION_MASK_FUTURE,             false, 
> false },
>    { "hard-dfp",                      OPTION_MASK_DFP,                false, 
> true  },
>    { "htm",                   OPTION_MASK_HTM,                false, true  },
>    { "isel",                  OPTION_MASK_ISEL,               false, true  },
> diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
> index db6112a09e1..76c6cd1ab8e 100644
> --- a/gcc/config/rs6000/rs6000.h
> +++ b/gcc/config/rs6000/rs6000.h
> @@ -101,6 +101,7 @@
>     you make changes here, make them also there.  */
>  #define ASM_CPU_SPEC \
>  "%{mcpu=native: %(asm_cpu_native); \
> +  mcpu=future: -mfuture; \
>    mcpu=power11: -mpower11; \
>    mcpu=power10: -mpower10; \
>    mcpu=power9: -mpower9; \
> diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
> index 88cf16ca581..b53d480bf54 100644
> --- a/gcc/config/rs6000/rs6000.opt
> +++ b/gcc/config/rs6000/rs6000.opt
> @@ -595,6 +595,11 @@ Target Undocumented Mask(POWER10) Var(rs6000_isa_flags) 
> WarnRemoved
>  mpower11
>  Target Undocumented Mask(POWER11) Var(rs6000_isa_flags) WarnRemoved
>  
> +;; Potential future machine
> +mfuture
> +Target Undocumented Mask(FUTURE) Var(rs6000_isa_flags) Warn(Do not use 
> %<-mfuture>, use %<-mcpu=future>)
> +Generate (do not generate) potential future instructions.
> +
>  mprefixed
>  Target Mask(PREFIXED) Var(rs6000_isa_flags)
>  Generate (do not generate) prefixed memory instructions.
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index b1e6d703702..b11f3963833 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -32328,7 +32328,7 @@ Supported values for @var{cpu_type} are @samp{401}, 
> @samp{403},
>  @samp{titan}, @samp{power3}, @samp{power4}, @samp{power5}, @samp{power5+},
>  @samp{power6}, @samp{power6x}, @samp{power7}, @samp{power8},
>  @samp{power9}, @samp{power10}, @samp{power11}, @samp{powerpc}, 
> @samp{powerpc64},
> -@samp{powerpc64le}, @samp{rs64}, and @samp{native}.
> +@samp{powerpc64le}, @samp{rs64}, @samp{future}, and @samp{native}.
>  
>  @option{-mcpu=powerpc}, @option{-mcpu=powerpc64}, and
>  @option{-mcpu=powerpc64le} specify pure 32-bit PowerPC (either
> diff --git a/gcc/testsuite/gcc.target/powerpc/future-1.c 
> b/gcc/testsuite/gcc.target/powerpc/future-1.c
> new file mode 100644
> index 00000000000..7bd8e5ddbd0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/future-1.c
> @@ -0,0 +1,13 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future -O2" } */
> +
> +/* Basic check to see if the compiler supports -mcpu=future and if it defines
> +   _ARCH_FUTURE.  */
> +
> +#ifndef _ARCH_FUTURE
> +#error "-mcpu=future is not supported"
> +#endif
> +
> +void foo (void)
> +{
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/future-2.c 
> b/gcc/testsuite/gcc.target/powerpc/future-2.c
> new file mode 100644
> index 00000000000..5552cefa3c2
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/future-2.c
> @@ -0,0 +1,24 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +/* Check if we can set the future target via a target attribute.  */
> +
> +__attribute__((__target__("cpu=power9")))
> +void foo_p9 (void)
> +{
> +}
> +
> +__attribute__((__target__("cpu=power10")))
> +void foo_p10 (void)
> +{
> +}
> +
> +__attribute__((__target__("cpu=power11")))
> +void foo_p11 (void)
> +{
> +}
> +
> +__attribute__((__target__("cpu=future")))
> +void foo_future (void)
> +{
> +}

Reply via email to