[PATCH] x86: Detect APX_NCI_NDD_NF

"H.J. Lu" <[email protected]>
Newsgroups gmane.comp.lib.glibc.alpha
Message-ID <CAMe9rOqb3ZfwDg4KB7gvC-3Zzqw8hJUFzv2trw9iQieJppjNog@mail.gmail.com>
Detect APX_NCI_NDD_NF specified in Intel APX specification published in
January 2026:

https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html

-- 
H.J.
0001-x86-Detect-APX_NCI_NDD_NF.patch (text/x-patch, 4.7 KB)
From 948bcc5b8d38aa22a100d84b20bb47bef1fb0c87 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Mon, 31 Aug 2026 07:21:12 +0800
Subject: [PATCH] x86: Detect APX_NCI_NDD_NF

Detect APX_NCI_NDD_NF specified in Intel APX specification published in
January 2026:

https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html

Signed-off-by: H.J. Lu <[email protected]>
---
 manual/platform.texi               |  5 +++++
 sysdeps/x86/bits/platform/x86.h    |  9 ++++++++-
 sysdeps/x86/cpu-features.c         | 15 +++++++++++++++
 sysdeps/x86/include/cpu-features.h | 17 ++++++++++++++++-
 sysdeps/x86/tst-get-cpu-features.c |  2 ++
 5 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/manual/platform.texi b/manual/platform.texi
index cb89e4432d..011d3501fb 100644
--- a/manual/platform.texi
+++ b/manual/platform.texi
@@ -217,6 +217,11 @@ The supported processor features are:
 @item
 @code{APX_F} -- The APX instruction extensions.
 
+@item
+@code{APX_NCI_NDD_NF} -- The instruction extensions with APX new
+conditional instructions (NCI), explicit new data destination (NDD)
+controls, and explicit flags suppression (NF).
+
 @item
 @code{ARCH_CAPABILITIES} -- IA32_ARCH_CAPABILITIES MSR.
 
diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
index c646e36b28..7b81a07465 100644
--- a/sysdeps/x86/bits/platform/x86.h
+++ b/sysdeps/x86/bits/platform/x86.h
@@ -32,7 +32,8 @@ enum
   CPUID_INDEX_19,
   CPUID_INDEX_14_ECX_0,
   CPUID_INDEX_24_ECX_0,
-  CPUID_INDEX_24_ECX_1
+  CPUID_INDEX_24_ECX_1,
+  CPUID_INDEX_29_ECX_0
 };
 
 struct cpuid_feature
@@ -345,4 +346,10 @@ enum
 
   x86_cpu_AVX10_V1_AUX		= x86_cpu_index_24_ecx_1_ecx + 2,
   x86_cpu_AVX10_V2_AUX		= x86_cpu_index_24_ecx_1_ecx + 3,
+
+  x86_cpu_index_29_ecx_0_ebx
+    = (CPUID_INDEX_29_ECX_0 * 8 * 4 * sizeof (unsigned int)
+       + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
+
+  x86_cpu_APX_NCI_NDD_NF	= x86_cpu_index_29_ecx_0_ebx,
 };
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index ecbcb3c78b..0b744f95a9 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -288,6 +288,21 @@ update_active (struct cpu_features *cpu_features)
 	    }
 	}
 
+      if (cpu_features->basic.max_cpuid >= 0x29)
+	{
+	  __cpuid_count
+	    (0x29, 0,
+	     cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.eax,
+	     cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.ebx,
+	     cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.ecx,
+	     cpu_features->features[CPUID_INDEX_29_ECX_0].cpuid.edx);
+
+	  if (CPU_FEATURES_CPU_P (cpu_features, APX_F))
+	    {
+	      CPU_FEATURE_SET_ACTIVE (cpu_features, APX_NCI_NDD_NF);
+	    }
+	}
+
       /* Are XTILECFG and XTILEDATA states usable?  */
       if ((xcrlow & (bit_XTILECFG_state | bit_XTILEDATA_state))
 	  == (bit_XTILECFG_state | bit_XTILEDATA_state))
diff --git a/sysdeps/x86/include/cpu-features.h b/sysdeps/x86/include/cpu-features.h
index ec9076e261..bb632d8ce1 100644
--- a/sysdeps/x86/include/cpu-features.h
+++ b/sysdeps/x86/include/cpu-features.h
@@ -29,7 +29,7 @@
 
 enum
 {
-  CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_1 + 1
+  CPUID_INDEX_MAX = CPUID_INDEX_29_ECX_0 + 1
 };
 
 enum
@@ -348,6 +348,11 @@ enum
 #define bit_cpu_AVX10_V1_AUX	(1u << 2)
 #define bit_cpu_AVX10_V2_AUX	(1u << 3)
 
+/* CPUID_INDEX_29_ECX_0.  */
+
+/* EBX.  */
+#define bit_cpu_APX_NCI_NDD_NF	(1u << 0)
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -610,6 +615,11 @@ enum
 #define index_AVX10_V1_AUX	CPUID_INDEX_24_ECX_1
 #define index_AVX10_V2_AUX	CPUID_INDEX_24_ECX_1
 
+/* CPUID_INDEX_29_ECX_0.  */
+
+/* EBX.  */
+#define index_cpu_APX_NCI_NDD_NF CPUID_INDEX_29_ECX_0
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -872,6 +882,11 @@ enum
 #define reg_AVX10_V1_AUX	ecx
 #define reg_AVX10_V2_AUX	ecx
 
+/* CPUID_INDEX_29_ECX_0.  */
+
+/* EBX.  */
+#define reg_APX_NCI_NDD_NF	ebx
+
 /* PREFERRED_FEATURE_INDEX_1.  First define the bitindex values
    sequentially, then define the bit_arch* and index_arch_* lookup
    constants.  */
diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c
index c6af1793fe..83c5cbc29e 100644
--- a/sysdeps/x86/tst-get-cpu-features.c
+++ b/sysdeps/x86/tst-get-cpu-features.c
@@ -224,6 +224,7 @@ do_test (void)
   CHECK_CPU_FEATURE_PRESENT (AESKLE);
   CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
   CHECK_CPU_FEATURE_PRESENT (PTWRITE);
+  CHECK_CPU_FEATURE_PRESENT (APX_NCI_NDD_NF);
 
   printf ("Possible CPU features:\n");
   CHECK_CPU_FEATURE_ACTIVE (SSE3);
@@ -397,6 +398,7 @@ do_test (void)
   CHECK_CPU_FEATURE_ACTIVE (AESKLE);
   CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
   CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
+  CHECK_CPU_FEATURE_ACTIVE (APX_NCI_NDD_NF);
 
   unsigned int version = x86_get_avx10_version ();
   printf ("AVX10 version: %d\n", version);
-- 
2.55.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.