On Wed, May 27, 2026 at 4:50 PM Hongyu Wang <[email protected]> wrote:
>
> Hi,
>
> Microbenchmark performance on NovaLake/DiamondRapids shows no benefit
> from SETcc.ZU encoding on these cores.  Add X86_TUNE_DISABLE_SETZUCC
> to suppress setzucc generation for DMR/NVL while keeping it enabled
> for other APX-capable targets.
>
> Bootstrapped && regtested on x86_64-pc-linux-gnu{-m32,}.
>
> Ok for trunk/backport to gcc16?
Ok.

>
> gcc/ChangeLog:
>
>         * config/i386/x86-tune.def (X86_TUNE_DISABLE_SETZUCC): New.
>         Enable for m_DIAMONDRAPIDS | m_NOVALAKE.
>         * config/i386/i386.h (TARGET_DISABLE_SETZUCC): New define.
>         * config/i386/i386.md (*setcc_<mode>_zu): Guard with
>         TARGET_APX_ZU && !TARGET_DISABLE_SETZUCC.
>         (*setcc_di_1, *setcc_<mode>_1_movzbl): Guard with
>         (!TARGET_APX_ZU || TARGET_DISABLE_SETZUCC).
>         (*setcc_qi, *setcc_qi_slp): Emit setzucc only when
>         TARGET_APX_ZU && !TARGET_DISABLE_SETZUCC.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.target/i386/apx-zu-4.c: New test.
> ---
>  gcc/config/i386/i386.h                   |  3 ++-
>  gcc/config/i386/i386.md                  | 12 +++++++-----
>  gcc/config/i386/x86-tune.def             |  4 ++++
>  gcc/testsuite/gcc.target/i386/apx-zu-4.c |  5 +++++
>  4 files changed, 18 insertions(+), 6 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/apx-zu-4.c
>
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index ac3f2213e78..3b0ccc66127 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -511,7 +511,8 @@ extern unsigned char ix86_tune_features[X86_TUNE_LAST];
>         ix86_tune_features[X86_TUNE_ALIGN_TIGHT_LOOPS]
>  #define TARGET_SSE_REDUCTION_PREFER_PSHUF \
>         ix86_tune_features[X86_TUNE_SSE_REDUCTION_PREFER_PSHUF]
> -
> +#define TARGET_DISABLE_SETZUCC \
> +       ix86_tune_features[X86_TUNE_DISABLE_SETZUCC]
>
>  /* Feature tests against the various architecture variations.  */
>  enum ix86_arch_indices {
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index 063e14cb2c1..fb77b4a006c 100644
> --- a/gcc/config/i386/i386.md
> +++ b/gcc/config/i386/i386.md
> @@ -19722,7 +19722,7 @@ (define_insn "*setcc_<mode>_zu"
>    [(set (match_operand:SWI248 0 "register_operand" "=r")
>         (match_operator:SWI248 1 "ix86_comparison_operator"
>           [(reg FLAGS_REG) (const_int 0)]))]
> -  "TARGET_APX_ZU"
> +  "TARGET_APX_ZU && !TARGET_DISABLE_SETZUCC"
>    "setzu%C1\t%b0"
>    [(set_attr "type" "setcc")])
>
> @@ -19730,7 +19730,8 @@ (define_insn_and_split "*setcc_di_1"
>    [(set (match_operand:DI 0 "register_operand" "=q")
>         (match_operator:DI 1 "ix86_comparison_operator"
>           [(reg FLAGS_REG) (const_int 0)]))]
> -  "!TARGET_APX_ZU && TARGET_64BIT && !TARGET_PARTIAL_REG_STALL"
> +  "(!TARGET_APX_ZU || TARGET_DISABLE_SETZUCC)
> +   && TARGET_64BIT && !TARGET_PARTIAL_REG_STALL"
>    "#"
>    "&& reload_completed"
>    [(set (match_dup 2) (match_dup 1))
> @@ -19763,7 +19764,7 @@ (define_insn_and_split "*setcc_<mode>_1_movzbl"
>    [(set (match_operand:SWI24 0 "register_operand" "=q")
>         (match_operator:SWI24 1 "ix86_comparison_operator"
>           [(reg FLAGS_REG) (const_int 0)]))]
> -  "!TARGET_APX_ZU && !TARGET_PARTIAL_REG_STALL
> +  "(!TARGET_APX_ZU || TARGET_DISABLE_SETZUCC) && !TARGET_PARTIAL_REG_STALL
>     && (!TARGET_ZERO_EXTEND_WITH_AND || optimize_function_for_size_p (cfun))"
>    "#"
>    "&& reload_completed"
> @@ -19782,7 +19783,8 @@ (define_insn "*setcc_qi"
>    ""
>  {
>    if (REG_P (operands[0])
> -      && TARGET_APX_ZU)
> +      && TARGET_APX_ZU
> +      && !TARGET_DISABLE_SETZUCC)
>      return "setzu%C1\t%0";
>    else
>      return "set%C1\t%0";
> @@ -19796,7 +19798,7 @@ (define_insn "*setcc_qi_slp"
>           [(reg FLAGS_REG) (const_int 0)]))]
>    ""
>  {
> -  if (TARGET_APX_ZU)
> +  if (TARGET_APX_ZU && !TARGET_DISABLE_SETZUCC)
>      return "setzu%C1\t%0";
>    else
>      return "set%C1\t%0";
> diff --git a/gcc/config/i386/x86-tune.def b/gcc/config/i386/x86-tune.def
> index 202b38ad50b..cfbd56f88d9 100644
> --- a/gcc/config/i386/x86-tune.def
> +++ b/gcc/config/i386/x86-tune.def
> @@ -401,6 +401,10 @@ DEF_TUNE (X86_TUNE_AVOID_MFENCE, "avoid_mfence",
>  DEF_TUNE (X86_TUNE_EXPAND_ABS, "expand_abs",
>           m_CORE_ALL | m_SILVERMONT | m_GOLDMONT | m_GOLDMONT_PLUS | 
> m_ZHAOXIN)
>
> +/* X86_TUNE_DISABLE_SETZUCC: Disable SETcc with ZU suffix. */
> +DEF_TUNE (X86_TUNE_DISABLE_SETZUCC, "disable_setzucc",
> +         m_DIAMONDRAPIDS | m_NOVALAKE)
> +
>  
> /*****************************************************************************/
>  /* 387 instruction selection tuning                                          
> */
>  
> /*****************************************************************************/
> diff --git a/gcc/testsuite/gcc.target/i386/apx-zu-4.c 
> b/gcc/testsuite/gcc.target/i386/apx-zu-4.c
> new file mode 100644
> index 00000000000..0c8625792a9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/apx-zu-4.c
> @@ -0,0 +1,5 @@
> +/* { dg-do compile { target { ! ia32 } } } */
> +/* { dg-options "-mapxf -march=x86-64 -O2 -mtune-ctrl=disable_setzucc" } */
> +/* { dg-final { scan-assembler-not "setzu" } } */
> +
> +#include "apx-zu-3.c"
> --
> 2.31.1
>


-- 
BR,
Hongtao

Reply via email to