i386: Add FMV support for avx10.2 and apxf

Message ID 20260603081245.3365457-1-hongyu.wang@intel.com
State New
Headers
Series i386: Add FMV support for avx10.2 and apxf |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-aarch64-bootstrap success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed

Commit Message

Hongyu Wang June 3, 2026, 8:12 a.m. UTC
  Hi,

This patch adds function multiversioning priority for avx10.2 
and apxf features, also add P_PROC_AVX10_2 for processors 
like diamondrapids and novalake that supports these.

The priority order is:
  P_AVX10_1 < P_PROC_AVX10_1 < P_AVX10_2 < P_APX_F < P_PROC_AVX10_2

Bootstrapped & regtested under x86_64-pc-linux-gnu{-m32,}.

Ok for trunk?

gcc/ChangeLog:

	* common/config/i386/i386-cpuinfo.h (enum feature_priority):
	Add P_AVX10_2, P_APX_F, P_PROC_AVX10_2.
	* common/config/i386/i386-isas.h: Set P_AVX10_2 for avx10.2
	and P_APX_F for apxf.
	* common/config/i386/i386-common.cc (processor_alias_table):
	Use P_PROC_AVX10_2 for diamondrapids and novalake.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/mvc18.c: New test for target_clones with
	avx10.2, apxf, and arch=diamondrapids/novalake.
---
 gcc/common/config/i386/i386-common.cc |  4 ++--
 gcc/common/config/i386/i386-cpuinfo.h |  3 +++
 gcc/common/config/i386/i386-isas.h    |  4 ++--
 gcc/testsuite/gcc.target/i386/mvc18.c | 16 ++++++++++++++++
 4 files changed, 23 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/mvc18.c
  

Comments

Hongtao Liu June 8, 2026, 7:18 a.m. UTC | #1
On Wed, Jun 3, 2026 at 4:13 PM Hongyu Wang <hongyu.wang@intel.com> wrote:
>
> Hi,
>
> This patch adds function multiversioning priority for avx10.2
> and apxf features, also add P_PROC_AVX10_2 for processors
> like diamondrapids and novalake that supports these.
>
> The priority order is:
>   P_AVX10_1 < P_PROC_AVX10_1 < P_AVX10_2 < P_APX_F < P_PROC_AVX10_2
>
> Bootstrapped & regtested under x86_64-pc-linux-gnu{-m32,}.
>
> Ok for trunk?
Ok.

>
> gcc/ChangeLog:
>
>         * common/config/i386/i386-cpuinfo.h (enum feature_priority):
>         Add P_AVX10_2, P_APX_F, P_PROC_AVX10_2.
>         * common/config/i386/i386-isas.h: Set P_AVX10_2 for avx10.2
>         and P_APX_F for apxf.
>         * common/config/i386/i386-common.cc (processor_alias_table):
>         Use P_PROC_AVX10_2 for diamondrapids and novalake.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.target/i386/mvc18.c: New test for target_clones with
>         avx10.2, apxf, and arch=diamondrapids/novalake.
> ---
>  gcc/common/config/i386/i386-common.cc |  4 ++--
>  gcc/common/config/i386/i386-cpuinfo.h |  3 +++
>  gcc/common/config/i386/i386-isas.h    |  4 ++--
>  gcc/testsuite/gcc.target/i386/mvc18.c | 16 ++++++++++++++++
>  4 files changed, 23 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/mvc18.c
>
> diff --git a/gcc/common/config/i386/i386-common.cc b/gcc/common/config/i386/i386-common.cc
> index 1dd9819c309..395dc5acd60 100644
> --- a/gcc/common/config/i386/i386-common.cc
> +++ b/gcc/common/config/i386/i386-common.cc
> @@ -2327,11 +2327,11 @@ const pta processor_alias_table[] =
>    {"pantherlake", PROCESSOR_PANTHERLAKE, CPU_HASWELL, PTA_PANTHERLAKE,
>      M_CPU_SUBTYPE (INTEL_COREI7_PANTHERLAKE), P_PROC_AVX2},
>    {"diamondrapids", PROCESSOR_DIAMONDRAPIDS, CPU_HASWELL, PTA_DIAMONDRAPIDS,
> -    M_CPU_SUBTYPE (INTEL_COREI7_DIAMONDRAPIDS), P_PROC_AVX10_1},
> +    M_CPU_SUBTYPE (INTEL_COREI7_DIAMONDRAPIDS), P_PROC_AVX10_2},
>    {"wildcatlake", PROCESSOR_PANTHERLAKE, CPU_HASWELL, PTA_PANTHERLAKE,
>      M_CPU_SUBTYPE (INTEL_COREI7_PANTHERLAKE), P_PROC_AVX2},
>    {"novalake", PROCESSOR_NOVALAKE, CPU_HASWELL, PTA_NOVALAKE,
> -    M_CPU_SUBTYPE (INTEL_COREI7_NOVALAKE), P_PROC_AVX10_1},
> +    M_CPU_SUBTYPE (INTEL_COREI7_NOVALAKE), P_PROC_AVX10_2},
>    {"bonnell", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL,
>      M_CPU_TYPE (INTEL_BONNELL), P_PROC_SSSE3},
>    {"atom", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL,
> diff --git a/gcc/common/config/i386/i386-cpuinfo.h b/gcc/common/config/i386/i386-cpuinfo.h
> index 5407d9d9eba..098f81274ad 100644
> --- a/gcc/common/config/i386/i386-cpuinfo.h
> +++ b/gcc/common/config/i386/i386-cpuinfo.h
> @@ -157,6 +157,9 @@ enum feature_priority
>    P_X86_64_V4,
>    P_AVX10_1 = 34,
>    P_PROC_AVX10_1,
> +  P_AVX10_2,
> +  P_APX_F,
> +  P_PROC_AVX10_2,
>    P_PROC_DYNAMIC
>  };
>
> diff --git a/gcc/common/config/i386/i386-isas.h b/gcc/common/config/i386/i386-isas.h
> index a6a736e9983..62973b15f0f 100644
> --- a/gcc/common/config/i386/i386-isas.h
> +++ b/gcc/common/config/i386/i386-isas.h
> @@ -181,10 +181,10 @@ ISA_NAMES_TABLE_START
>    ISA_NAMES_TABLE_ENTRY("sm3", FEATURE_SM3, P_NONE, "-msm3")
>    ISA_NAMES_TABLE_ENTRY("sha512", FEATURE_SHA512, P_NONE, "-msha512")
>    ISA_NAMES_TABLE_ENTRY("sm4", FEATURE_SM4, P_NONE, "-msm4")
> -  ISA_NAMES_TABLE_ENTRY("apxf", FEATURE_APX_F, P_NONE, "-mapxf")
> +  ISA_NAMES_TABLE_ENTRY("apxf", FEATURE_APX_F, P_APX_F, "-mapxf")
>    ISA_NAMES_TABLE_ENTRY("usermsr", FEATURE_USER_MSR, P_NONE, "-musermsr")
>    ISA_NAMES_TABLE_ENTRY("avx10.1", FEATURE_AVX10_1, P_AVX10_1, "-mavx10.1")
> -  ISA_NAMES_TABLE_ENTRY("avx10.2", FEATURE_AVX10_2, P_NONE, "-mavx10.2")
> +  ISA_NAMES_TABLE_ENTRY("avx10.2", FEATURE_AVX10_2, P_AVX10_2, "-mavx10.2")
>    ISA_NAMES_TABLE_ENTRY("amx-avx512", FEATURE_AMX_AVX512, P_NONE,
>                         "-mamx-avx512")
>    ISA_NAMES_TABLE_ENTRY("amx-tf32", FEATURE_AMX_TF32, P_NONE, "-mamx-tf32")
> diff --git a/gcc/testsuite/gcc.target/i386/mvc18.c b/gcc/testsuite/gcc.target/i386/mvc18.c
> new file mode 100644
> index 00000000000..0d78381677b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/mvc18.c
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +/* { dg-require-ifunc "" } */
> +
> +/* { dg-final { scan-assembler "foo\.avx10_2\[,@\]" } } */
> +/* { dg-final { scan-assembler "foo\.apxf\[,@\]" } } */
> +/* { dg-final { scan-assembler "foo\.arch_diamondrapids\[,@\]" } } */
> +/* { dg-final { scan-assembler "foo\.arch_novalake\[,@\]" } } */
> +
> +__attribute__((target_clones("avx10.2","apxf","arch=diamondrapids",
> +                            "arch=novalake","default")))
> +int foo ();
> +
> +int main()
> +{
> +  return foo();
> +}
> --
> 2.31.1
>
  

Patch

diff --git a/gcc/common/config/i386/i386-common.cc b/gcc/common/config/i386/i386-common.cc
index 1dd9819c309..395dc5acd60 100644
--- a/gcc/common/config/i386/i386-common.cc
+++ b/gcc/common/config/i386/i386-common.cc
@@ -2327,11 +2327,11 @@  const pta processor_alias_table[] =
   {"pantherlake", PROCESSOR_PANTHERLAKE, CPU_HASWELL, PTA_PANTHERLAKE,
     M_CPU_SUBTYPE (INTEL_COREI7_PANTHERLAKE), P_PROC_AVX2},
   {"diamondrapids", PROCESSOR_DIAMONDRAPIDS, CPU_HASWELL, PTA_DIAMONDRAPIDS,
-    M_CPU_SUBTYPE (INTEL_COREI7_DIAMONDRAPIDS), P_PROC_AVX10_1},
+    M_CPU_SUBTYPE (INTEL_COREI7_DIAMONDRAPIDS), P_PROC_AVX10_2},
   {"wildcatlake", PROCESSOR_PANTHERLAKE, CPU_HASWELL, PTA_PANTHERLAKE,
     M_CPU_SUBTYPE (INTEL_COREI7_PANTHERLAKE), P_PROC_AVX2},
   {"novalake", PROCESSOR_NOVALAKE, CPU_HASWELL, PTA_NOVALAKE,
-    M_CPU_SUBTYPE (INTEL_COREI7_NOVALAKE), P_PROC_AVX10_1},
+    M_CPU_SUBTYPE (INTEL_COREI7_NOVALAKE), P_PROC_AVX10_2},
   {"bonnell", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL,
     M_CPU_TYPE (INTEL_BONNELL), P_PROC_SSSE3},
   {"atom", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL,
diff --git a/gcc/common/config/i386/i386-cpuinfo.h b/gcc/common/config/i386/i386-cpuinfo.h
index 5407d9d9eba..098f81274ad 100644
--- a/gcc/common/config/i386/i386-cpuinfo.h
+++ b/gcc/common/config/i386/i386-cpuinfo.h
@@ -157,6 +157,9 @@  enum feature_priority
   P_X86_64_V4,
   P_AVX10_1 = 34,
   P_PROC_AVX10_1,
+  P_AVX10_2,
+  P_APX_F,
+  P_PROC_AVX10_2,
   P_PROC_DYNAMIC
 };
 
diff --git a/gcc/common/config/i386/i386-isas.h b/gcc/common/config/i386/i386-isas.h
index a6a736e9983..62973b15f0f 100644
--- a/gcc/common/config/i386/i386-isas.h
+++ b/gcc/common/config/i386/i386-isas.h
@@ -181,10 +181,10 @@  ISA_NAMES_TABLE_START
   ISA_NAMES_TABLE_ENTRY("sm3", FEATURE_SM3, P_NONE, "-msm3")
   ISA_NAMES_TABLE_ENTRY("sha512", FEATURE_SHA512, P_NONE, "-msha512")
   ISA_NAMES_TABLE_ENTRY("sm4", FEATURE_SM4, P_NONE, "-msm4")
-  ISA_NAMES_TABLE_ENTRY("apxf", FEATURE_APX_F, P_NONE, "-mapxf")
+  ISA_NAMES_TABLE_ENTRY("apxf", FEATURE_APX_F, P_APX_F, "-mapxf")
   ISA_NAMES_TABLE_ENTRY("usermsr", FEATURE_USER_MSR, P_NONE, "-musermsr")
   ISA_NAMES_TABLE_ENTRY("avx10.1", FEATURE_AVX10_1, P_AVX10_1, "-mavx10.1")
-  ISA_NAMES_TABLE_ENTRY("avx10.2", FEATURE_AVX10_2, P_NONE, "-mavx10.2")
+  ISA_NAMES_TABLE_ENTRY("avx10.2", FEATURE_AVX10_2, P_AVX10_2, "-mavx10.2")
   ISA_NAMES_TABLE_ENTRY("amx-avx512", FEATURE_AMX_AVX512, P_NONE,
 			"-mamx-avx512")
   ISA_NAMES_TABLE_ENTRY("amx-tf32", FEATURE_AMX_TF32, P_NONE, "-mamx-tf32")
diff --git a/gcc/testsuite/gcc.target/i386/mvc18.c b/gcc/testsuite/gcc.target/i386/mvc18.c
new file mode 100644
index 00000000000..0d78381677b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/mvc18.c
@@ -0,0 +1,16 @@ 
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+
+/* { dg-final { scan-assembler "foo\.avx10_2\[,@\]" } } */
+/* { dg-final { scan-assembler "foo\.apxf\[,@\]" } } */
+/* { dg-final { scan-assembler "foo\.arch_diamondrapids\[,@\]" } } */
+/* { dg-final { scan-assembler "foo\.arch_novalake\[,@\]" } } */
+
+__attribute__((target_clones("avx10.2","apxf","arch=diamondrapids",
+			     "arch=novalake","default")))
+int foo ();
+
+int main()
+{
+  return foo();
+}