public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v1] x86: Add support for AVX10 version and vec size in cpu-features
@ 2023-08-24 18:48 Noah Goldstein
  2023-08-24 19:01 ` H.J. Lu
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Noah Goldstein @ 2023-08-24 18:48 UTC (permalink / raw)
  To: libc-alpha; +Cc: goldstein.w.n, hjl.tools, carlos

This commit add support for the new AVX10 cpu features:
https://cdrdv2-public.intel.com/784267/355989-intel-avx10-spec.pdf

We add checks for:
    - `AVX10`: Check if AVX10 is present.
    - `AVX10_V{1..255}`: Check if a given version is active.
    - `AVX10_{X,Y,Z}MM`: Check if a given vec class has AVX10 support.

The version checks are not ideal, the reason for the reason for this
is the version information in AVX10 is encoded as complete a byte
value, but the `CPU_FEATURES` interface is only able to query bools.

To get around this, we add a feature for each possible version value
(starting at 1 as there is no AVX10 version 0).

`make check` passes and cpuid output was checked against GNR/DMR on an
emulator.
---
 manual/platform.texi               |  28 +++
 sysdeps/x86/bits/platform/x86.h    | 281 ++++++++++++++++++++++++++++-
 sysdeps/x86/cpu-features.c         |  25 +++
 sysdeps/x86/include/cpu-features.h |  27 ++-
 sysdeps/x86/sys/platform/x86.h     |  40 ++++
 sysdeps/x86/tst-get-cpu-features.c | 263 +++++++++++++++++++++++++++
 6 files changed, 661 insertions(+), 3 deletions(-)

diff --git a/manual/platform.texi b/manual/platform.texi
index 2a2d557067..99dc57b568 100644
--- a/manual/platform.texi
+++ b/manual/platform.texi
@@ -222,6 +222,22 @@ Leaf (EAX = 23H).
 @item
 @code{AVX} -- The AVX instruction extensions.
 
+@item
+@code{AVX10} -- The AVX10 instruction extensions.
+
+@item
+@code{AVX10_XMM} -- Whether AVX10 includes xmm registers.
+
+@item
+@code{AVX10_YMM} -- Whether AVX10 includes ymm registers.
+
+@item
+@code{AVX10_ZMM} -- Whether AVX10 includes zmm registers.
+
+@item
+@code{AVX10_V1}..@code{AVX10_V255} -- Whether AVX10 supports a given
+version.
+
 @item
 @code{AVX2} -- The AVX2 instruction extensions.
 
@@ -760,3 +776,15 @@ avx_active (void)
   return CPU_FEATURE_ACTIVE (AVX);
 @}
 @end smallexample
+
+You could query @code{AVX10} version number with:
+
+@smallexample
+#include <sys/platform/x86.h>
+
+int
+has_avx10_version1 (void)
+@{
+  return CPU_FEATURE_ACTIVE (AVX10_V1); // Up to AVX10_V255
+@}
+@end smallexample
diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
index 88ca071aa7..777fb6ce18 100644
--- a/sysdeps/x86/bits/platform/x86.h
+++ b/sysdeps/x86/bits/platform/x86.h
@@ -30,7 +30,8 @@ enum
   CPUID_INDEX_80000008,
   CPUID_INDEX_7_ECX_1,
   CPUID_INDEX_19,
-  CPUID_INDEX_14_ECX_0
+  CPUID_INDEX_14_ECX_0,
+  CPUID_INDEX_24_ECX_0
 };
 
 struct cpuid_feature
@@ -312,6 +313,7 @@ enum
   x86_cpu_AVX_NE_CONVERT	= x86_cpu_index_7_ecx_1_edx + 5,
   x86_cpu_AMX_COMPLEX		= x86_cpu_index_7_ecx_1_edx + 8,
   x86_cpu_PREFETCHI		= x86_cpu_index_7_ecx_1_edx + 14,
+  x86_cpu_AVX10			= x86_cpu_index_7_ecx_1_edx + 19,
   x86_cpu_APX_F			= x86_cpu_index_7_ecx_1_edx + 21,
 
   x86_cpu_index_19_ebx
@@ -325,5 +327,280 @@ enum
     = (CPUID_INDEX_14_ECX_0 * 8 * 4 * sizeof (unsigned int)
        + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
 
-  x86_cpu_PTWRITE		= x86_cpu_index_14_ecx_0_ebx + 4
+  x86_cpu_PTWRITE		= x86_cpu_index_14_ecx_0_ebx + 4,
+
+  x86_cpu_index_24_ecx_0_ebx
+    = (CPUID_INDEX_24_ECX_0 * 8 * 4 * sizeof (unsigned int)
+       + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
+
+  x86_cpu_AVX10_XMM = x86_cpu_index_24_ecx_0_ebx + 16,
+  x86_cpu_AVX10_YMM = x86_cpu_index_24_ecx_0_ebx + 17,
+  x86_cpu_AVX10_ZMM = x86_cpu_index_24_ecx_0_ebx + 18,
+
+/* AVX10 version information is handled differently from all other CPUID
+   related logic.  Rather than being encoded in cpuid as discrete booleans, the
+   AVX10 version is encoded is a full byte that represents the version number
+   (greater than or equal to 1).  Since the CPUID API is only able to handle
+   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
+   by the user and have special logic in `x86_cpu_{present,active}`.  This is
+   unpleasant on our end, but is the only way to make the existing API also
+   support version queries.  */
+
+  /* All 1s should never be a value feature index.  */
+  x86_cpu_AVX10_V255 = ~0,
+  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
+  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
+  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
+  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,
+  x86_cpu_AVX10_V250 = x86_cpu_AVX10_V251 - 1,
+  x86_cpu_AVX10_V249 = x86_cpu_AVX10_V250 - 1,
+  x86_cpu_AVX10_V248 = x86_cpu_AVX10_V249 - 1,
+  x86_cpu_AVX10_V247 = x86_cpu_AVX10_V248 - 1,
+  x86_cpu_AVX10_V246 = x86_cpu_AVX10_V247 - 1,
+  x86_cpu_AVX10_V245 = x86_cpu_AVX10_V246 - 1,
+  x86_cpu_AVX10_V244 = x86_cpu_AVX10_V245 - 1,
+  x86_cpu_AVX10_V243 = x86_cpu_AVX10_V244 - 1,
+  x86_cpu_AVX10_V242 = x86_cpu_AVX10_V243 - 1,
+  x86_cpu_AVX10_V241 = x86_cpu_AVX10_V242 - 1,
+  x86_cpu_AVX10_V240 = x86_cpu_AVX10_V241 - 1,
+  x86_cpu_AVX10_V239 = x86_cpu_AVX10_V240 - 1,
+  x86_cpu_AVX10_V238 = x86_cpu_AVX10_V239 - 1,
+  x86_cpu_AVX10_V237 = x86_cpu_AVX10_V238 - 1,
+  x86_cpu_AVX10_V236 = x86_cpu_AVX10_V237 - 1,
+  x86_cpu_AVX10_V235 = x86_cpu_AVX10_V236 - 1,
+  x86_cpu_AVX10_V234 = x86_cpu_AVX10_V235 - 1,
+  x86_cpu_AVX10_V233 = x86_cpu_AVX10_V234 - 1,
+  x86_cpu_AVX10_V232 = x86_cpu_AVX10_V233 - 1,
+  x86_cpu_AVX10_V231 = x86_cpu_AVX10_V232 - 1,
+  x86_cpu_AVX10_V230 = x86_cpu_AVX10_V231 - 1,
+  x86_cpu_AVX10_V229 = x86_cpu_AVX10_V230 - 1,
+  x86_cpu_AVX10_V228 = x86_cpu_AVX10_V229 - 1,
+  x86_cpu_AVX10_V227 = x86_cpu_AVX10_V228 - 1,
+  x86_cpu_AVX10_V226 = x86_cpu_AVX10_V227 - 1,
+  x86_cpu_AVX10_V225 = x86_cpu_AVX10_V226 - 1,
+  x86_cpu_AVX10_V224 = x86_cpu_AVX10_V225 - 1,
+  x86_cpu_AVX10_V223 = x86_cpu_AVX10_V224 - 1,
+  x86_cpu_AVX10_V222 = x86_cpu_AVX10_V223 - 1,
+  x86_cpu_AVX10_V221 = x86_cpu_AVX10_V222 - 1,
+  x86_cpu_AVX10_V220 = x86_cpu_AVX10_V221 - 1,
+  x86_cpu_AVX10_V219 = x86_cpu_AVX10_V220 - 1,
+  x86_cpu_AVX10_V218 = x86_cpu_AVX10_V219 - 1,
+  x86_cpu_AVX10_V217 = x86_cpu_AVX10_V218 - 1,
+  x86_cpu_AVX10_V216 = x86_cpu_AVX10_V217 - 1,
+  x86_cpu_AVX10_V215 = x86_cpu_AVX10_V216 - 1,
+  x86_cpu_AVX10_V214 = x86_cpu_AVX10_V215 - 1,
+  x86_cpu_AVX10_V213 = x86_cpu_AVX10_V214 - 1,
+  x86_cpu_AVX10_V212 = x86_cpu_AVX10_V213 - 1,
+  x86_cpu_AVX10_V211 = x86_cpu_AVX10_V212 - 1,
+  x86_cpu_AVX10_V210 = x86_cpu_AVX10_V211 - 1,
+  x86_cpu_AVX10_V209 = x86_cpu_AVX10_V210 - 1,
+  x86_cpu_AVX10_V208 = x86_cpu_AVX10_V209 - 1,
+  x86_cpu_AVX10_V207 = x86_cpu_AVX10_V208 - 1,
+  x86_cpu_AVX10_V206 = x86_cpu_AVX10_V207 - 1,
+  x86_cpu_AVX10_V205 = x86_cpu_AVX10_V206 - 1,
+  x86_cpu_AVX10_V204 = x86_cpu_AVX10_V205 - 1,
+  x86_cpu_AVX10_V203 = x86_cpu_AVX10_V204 - 1,
+  x86_cpu_AVX10_V202 = x86_cpu_AVX10_V203 - 1,
+  x86_cpu_AVX10_V201 = x86_cpu_AVX10_V202 - 1,
+  x86_cpu_AVX10_V200 = x86_cpu_AVX10_V201 - 1,
+  x86_cpu_AVX10_V199 = x86_cpu_AVX10_V200 - 1,
+  x86_cpu_AVX10_V198 = x86_cpu_AVX10_V199 - 1,
+  x86_cpu_AVX10_V197 = x86_cpu_AVX10_V198 - 1,
+  x86_cpu_AVX10_V196 = x86_cpu_AVX10_V197 - 1,
+  x86_cpu_AVX10_V195 = x86_cpu_AVX10_V196 - 1,
+  x86_cpu_AVX10_V194 = x86_cpu_AVX10_V195 - 1,
+  x86_cpu_AVX10_V193 = x86_cpu_AVX10_V194 - 1,
+  x86_cpu_AVX10_V192 = x86_cpu_AVX10_V193 - 1,
+  x86_cpu_AVX10_V191 = x86_cpu_AVX10_V192 - 1,
+  x86_cpu_AVX10_V190 = x86_cpu_AVX10_V191 - 1,
+  x86_cpu_AVX10_V189 = x86_cpu_AVX10_V190 - 1,
+  x86_cpu_AVX10_V188 = x86_cpu_AVX10_V189 - 1,
+  x86_cpu_AVX10_V187 = x86_cpu_AVX10_V188 - 1,
+  x86_cpu_AVX10_V186 = x86_cpu_AVX10_V187 - 1,
+  x86_cpu_AVX10_V185 = x86_cpu_AVX10_V186 - 1,
+  x86_cpu_AVX10_V184 = x86_cpu_AVX10_V185 - 1,
+  x86_cpu_AVX10_V183 = x86_cpu_AVX10_V184 - 1,
+  x86_cpu_AVX10_V182 = x86_cpu_AVX10_V183 - 1,
+  x86_cpu_AVX10_V181 = x86_cpu_AVX10_V182 - 1,
+  x86_cpu_AVX10_V180 = x86_cpu_AVX10_V181 - 1,
+  x86_cpu_AVX10_V179 = x86_cpu_AVX10_V180 - 1,
+  x86_cpu_AVX10_V178 = x86_cpu_AVX10_V179 - 1,
+  x86_cpu_AVX10_V177 = x86_cpu_AVX10_V178 - 1,
+  x86_cpu_AVX10_V176 = x86_cpu_AVX10_V177 - 1,
+  x86_cpu_AVX10_V175 = x86_cpu_AVX10_V176 - 1,
+  x86_cpu_AVX10_V174 = x86_cpu_AVX10_V175 - 1,
+  x86_cpu_AVX10_V173 = x86_cpu_AVX10_V174 - 1,
+  x86_cpu_AVX10_V172 = x86_cpu_AVX10_V173 - 1,
+  x86_cpu_AVX10_V171 = x86_cpu_AVX10_V172 - 1,
+  x86_cpu_AVX10_V170 = x86_cpu_AVX10_V171 - 1,
+  x86_cpu_AVX10_V169 = x86_cpu_AVX10_V170 - 1,
+  x86_cpu_AVX10_V168 = x86_cpu_AVX10_V169 - 1,
+  x86_cpu_AVX10_V167 = x86_cpu_AVX10_V168 - 1,
+  x86_cpu_AVX10_V166 = x86_cpu_AVX10_V167 - 1,
+  x86_cpu_AVX10_V165 = x86_cpu_AVX10_V166 - 1,
+  x86_cpu_AVX10_V164 = x86_cpu_AVX10_V165 - 1,
+  x86_cpu_AVX10_V163 = x86_cpu_AVX10_V164 - 1,
+  x86_cpu_AVX10_V162 = x86_cpu_AVX10_V163 - 1,
+  x86_cpu_AVX10_V161 = x86_cpu_AVX10_V162 - 1,
+  x86_cpu_AVX10_V160 = x86_cpu_AVX10_V161 - 1,
+  x86_cpu_AVX10_V159 = x86_cpu_AVX10_V160 - 1,
+  x86_cpu_AVX10_V158 = x86_cpu_AVX10_V159 - 1,
+  x86_cpu_AVX10_V157 = x86_cpu_AVX10_V158 - 1,
+  x86_cpu_AVX10_V156 = x86_cpu_AVX10_V157 - 1,
+  x86_cpu_AVX10_V155 = x86_cpu_AVX10_V156 - 1,
+  x86_cpu_AVX10_V154 = x86_cpu_AVX10_V155 - 1,
+  x86_cpu_AVX10_V153 = x86_cpu_AVX10_V154 - 1,
+  x86_cpu_AVX10_V152 = x86_cpu_AVX10_V153 - 1,
+  x86_cpu_AVX10_V151 = x86_cpu_AVX10_V152 - 1,
+  x86_cpu_AVX10_V150 = x86_cpu_AVX10_V151 - 1,
+  x86_cpu_AVX10_V149 = x86_cpu_AVX10_V150 - 1,
+  x86_cpu_AVX10_V148 = x86_cpu_AVX10_V149 - 1,
+  x86_cpu_AVX10_V147 = x86_cpu_AVX10_V148 - 1,
+  x86_cpu_AVX10_V146 = x86_cpu_AVX10_V147 - 1,
+  x86_cpu_AVX10_V145 = x86_cpu_AVX10_V146 - 1,
+  x86_cpu_AVX10_V144 = x86_cpu_AVX10_V145 - 1,
+  x86_cpu_AVX10_V143 = x86_cpu_AVX10_V144 - 1,
+  x86_cpu_AVX10_V142 = x86_cpu_AVX10_V143 - 1,
+  x86_cpu_AVX10_V141 = x86_cpu_AVX10_V142 - 1,
+  x86_cpu_AVX10_V140 = x86_cpu_AVX10_V141 - 1,
+  x86_cpu_AVX10_V139 = x86_cpu_AVX10_V140 - 1,
+  x86_cpu_AVX10_V138 = x86_cpu_AVX10_V139 - 1,
+  x86_cpu_AVX10_V137 = x86_cpu_AVX10_V138 - 1,
+  x86_cpu_AVX10_V136 = x86_cpu_AVX10_V137 - 1,
+  x86_cpu_AVX10_V135 = x86_cpu_AVX10_V136 - 1,
+  x86_cpu_AVX10_V134 = x86_cpu_AVX10_V135 - 1,
+  x86_cpu_AVX10_V133 = x86_cpu_AVX10_V134 - 1,
+  x86_cpu_AVX10_V132 = x86_cpu_AVX10_V133 - 1,
+  x86_cpu_AVX10_V131 = x86_cpu_AVX10_V132 - 1,
+  x86_cpu_AVX10_V130 = x86_cpu_AVX10_V131 - 1,
+  x86_cpu_AVX10_V129 = x86_cpu_AVX10_V130 - 1,
+  x86_cpu_AVX10_V128 = x86_cpu_AVX10_V129 - 1,
+  x86_cpu_AVX10_V127 = x86_cpu_AVX10_V128 - 1,
+  x86_cpu_AVX10_V126 = x86_cpu_AVX10_V127 - 1,
+  x86_cpu_AVX10_V125 = x86_cpu_AVX10_V126 - 1,
+  x86_cpu_AVX10_V124 = x86_cpu_AVX10_V125 - 1,
+  x86_cpu_AVX10_V123 = x86_cpu_AVX10_V124 - 1,
+  x86_cpu_AVX10_V122 = x86_cpu_AVX10_V123 - 1,
+  x86_cpu_AVX10_V121 = x86_cpu_AVX10_V122 - 1,
+  x86_cpu_AVX10_V120 = x86_cpu_AVX10_V121 - 1,
+  x86_cpu_AVX10_V119 = x86_cpu_AVX10_V120 - 1,
+  x86_cpu_AVX10_V118 = x86_cpu_AVX10_V119 - 1,
+  x86_cpu_AVX10_V117 = x86_cpu_AVX10_V118 - 1,
+  x86_cpu_AVX10_V116 = x86_cpu_AVX10_V117 - 1,
+  x86_cpu_AVX10_V115 = x86_cpu_AVX10_V116 - 1,
+  x86_cpu_AVX10_V114 = x86_cpu_AVX10_V115 - 1,
+  x86_cpu_AVX10_V113 = x86_cpu_AVX10_V114 - 1,
+  x86_cpu_AVX10_V112 = x86_cpu_AVX10_V113 - 1,
+  x86_cpu_AVX10_V111 = x86_cpu_AVX10_V112 - 1,
+  x86_cpu_AVX10_V110 = x86_cpu_AVX10_V111 - 1,
+  x86_cpu_AVX10_V109 = x86_cpu_AVX10_V110 - 1,
+  x86_cpu_AVX10_V108 = x86_cpu_AVX10_V109 - 1,
+  x86_cpu_AVX10_V107 = x86_cpu_AVX10_V108 - 1,
+  x86_cpu_AVX10_V106 = x86_cpu_AVX10_V107 - 1,
+  x86_cpu_AVX10_V105 = x86_cpu_AVX10_V106 - 1,
+  x86_cpu_AVX10_V104 = x86_cpu_AVX10_V105 - 1,
+  x86_cpu_AVX10_V103 = x86_cpu_AVX10_V104 - 1,
+  x86_cpu_AVX10_V102 = x86_cpu_AVX10_V103 - 1,
+  x86_cpu_AVX10_V101 = x86_cpu_AVX10_V102 - 1,
+  x86_cpu_AVX10_V100 = x86_cpu_AVX10_V101 - 1,
+  x86_cpu_AVX10_V99 = x86_cpu_AVX10_V100 - 1,
+  x86_cpu_AVX10_V98 = x86_cpu_AVX10_V99 - 1,
+  x86_cpu_AVX10_V97 = x86_cpu_AVX10_V98 - 1,
+  x86_cpu_AVX10_V96 = x86_cpu_AVX10_V97 - 1,
+  x86_cpu_AVX10_V95 = x86_cpu_AVX10_V96 - 1,
+  x86_cpu_AVX10_V94 = x86_cpu_AVX10_V95 - 1,
+  x86_cpu_AVX10_V93 = x86_cpu_AVX10_V94 - 1,
+  x86_cpu_AVX10_V92 = x86_cpu_AVX10_V93 - 1,
+  x86_cpu_AVX10_V91 = x86_cpu_AVX10_V92 - 1,
+  x86_cpu_AVX10_V90 = x86_cpu_AVX10_V91 - 1,
+  x86_cpu_AVX10_V89 = x86_cpu_AVX10_V90 - 1,
+  x86_cpu_AVX10_V88 = x86_cpu_AVX10_V89 - 1,
+  x86_cpu_AVX10_V87 = x86_cpu_AVX10_V88 - 1,
+  x86_cpu_AVX10_V86 = x86_cpu_AVX10_V87 - 1,
+  x86_cpu_AVX10_V85 = x86_cpu_AVX10_V86 - 1,
+  x86_cpu_AVX10_V84 = x86_cpu_AVX10_V85 - 1,
+  x86_cpu_AVX10_V83 = x86_cpu_AVX10_V84 - 1,
+  x86_cpu_AVX10_V82 = x86_cpu_AVX10_V83 - 1,
+  x86_cpu_AVX10_V81 = x86_cpu_AVX10_V82 - 1,
+  x86_cpu_AVX10_V80 = x86_cpu_AVX10_V81 - 1,
+  x86_cpu_AVX10_V79 = x86_cpu_AVX10_V80 - 1,
+  x86_cpu_AVX10_V78 = x86_cpu_AVX10_V79 - 1,
+  x86_cpu_AVX10_V77 = x86_cpu_AVX10_V78 - 1,
+  x86_cpu_AVX10_V76 = x86_cpu_AVX10_V77 - 1,
+  x86_cpu_AVX10_V75 = x86_cpu_AVX10_V76 - 1,
+  x86_cpu_AVX10_V74 = x86_cpu_AVX10_V75 - 1,
+  x86_cpu_AVX10_V73 = x86_cpu_AVX10_V74 - 1,
+  x86_cpu_AVX10_V72 = x86_cpu_AVX10_V73 - 1,
+  x86_cpu_AVX10_V71 = x86_cpu_AVX10_V72 - 1,
+  x86_cpu_AVX10_V70 = x86_cpu_AVX10_V71 - 1,
+  x86_cpu_AVX10_V69 = x86_cpu_AVX10_V70 - 1,
+  x86_cpu_AVX10_V68 = x86_cpu_AVX10_V69 - 1,
+  x86_cpu_AVX10_V67 = x86_cpu_AVX10_V68 - 1,
+  x86_cpu_AVX10_V66 = x86_cpu_AVX10_V67 - 1,
+  x86_cpu_AVX10_V65 = x86_cpu_AVX10_V66 - 1,
+  x86_cpu_AVX10_V64 = x86_cpu_AVX10_V65 - 1,
+  x86_cpu_AVX10_V63 = x86_cpu_AVX10_V64 - 1,
+  x86_cpu_AVX10_V62 = x86_cpu_AVX10_V63 - 1,
+  x86_cpu_AVX10_V61 = x86_cpu_AVX10_V62 - 1,
+  x86_cpu_AVX10_V60 = x86_cpu_AVX10_V61 - 1,
+  x86_cpu_AVX10_V59 = x86_cpu_AVX10_V60 - 1,
+  x86_cpu_AVX10_V58 = x86_cpu_AVX10_V59 - 1,
+  x86_cpu_AVX10_V57 = x86_cpu_AVX10_V58 - 1,
+  x86_cpu_AVX10_V56 = x86_cpu_AVX10_V57 - 1,
+  x86_cpu_AVX10_V55 = x86_cpu_AVX10_V56 - 1,
+  x86_cpu_AVX10_V54 = x86_cpu_AVX10_V55 - 1,
+  x86_cpu_AVX10_V53 = x86_cpu_AVX10_V54 - 1,
+  x86_cpu_AVX10_V52 = x86_cpu_AVX10_V53 - 1,
+  x86_cpu_AVX10_V51 = x86_cpu_AVX10_V52 - 1,
+  x86_cpu_AVX10_V50 = x86_cpu_AVX10_V51 - 1,
+  x86_cpu_AVX10_V49 = x86_cpu_AVX10_V50 - 1,
+  x86_cpu_AVX10_V48 = x86_cpu_AVX10_V49 - 1,
+  x86_cpu_AVX10_V47 = x86_cpu_AVX10_V48 - 1,
+  x86_cpu_AVX10_V46 = x86_cpu_AVX10_V47 - 1,
+  x86_cpu_AVX10_V45 = x86_cpu_AVX10_V46 - 1,
+  x86_cpu_AVX10_V44 = x86_cpu_AVX10_V45 - 1,
+  x86_cpu_AVX10_V43 = x86_cpu_AVX10_V44 - 1,
+  x86_cpu_AVX10_V42 = x86_cpu_AVX10_V43 - 1,
+  x86_cpu_AVX10_V41 = x86_cpu_AVX10_V42 - 1,
+  x86_cpu_AVX10_V40 = x86_cpu_AVX10_V41 - 1,
+  x86_cpu_AVX10_V39 = x86_cpu_AVX10_V40 - 1,
+  x86_cpu_AVX10_V38 = x86_cpu_AVX10_V39 - 1,
+  x86_cpu_AVX10_V37 = x86_cpu_AVX10_V38 - 1,
+  x86_cpu_AVX10_V36 = x86_cpu_AVX10_V37 - 1,
+  x86_cpu_AVX10_V35 = x86_cpu_AVX10_V36 - 1,
+  x86_cpu_AVX10_V34 = x86_cpu_AVX10_V35 - 1,
+  x86_cpu_AVX10_V33 = x86_cpu_AVX10_V34 - 1,
+  x86_cpu_AVX10_V32 = x86_cpu_AVX10_V33 - 1,
+  x86_cpu_AVX10_V31 = x86_cpu_AVX10_V32 - 1,
+  x86_cpu_AVX10_V30 = x86_cpu_AVX10_V31 - 1,
+  x86_cpu_AVX10_V29 = x86_cpu_AVX10_V30 - 1,
+  x86_cpu_AVX10_V28 = x86_cpu_AVX10_V29 - 1,
+  x86_cpu_AVX10_V27 = x86_cpu_AVX10_V28 - 1,
+  x86_cpu_AVX10_V26 = x86_cpu_AVX10_V27 - 1,
+  x86_cpu_AVX10_V25 = x86_cpu_AVX10_V26 - 1,
+  x86_cpu_AVX10_V24 = x86_cpu_AVX10_V25 - 1,
+  x86_cpu_AVX10_V23 = x86_cpu_AVX10_V24 - 1,
+  x86_cpu_AVX10_V22 = x86_cpu_AVX10_V23 - 1,
+  x86_cpu_AVX10_V21 = x86_cpu_AVX10_V22 - 1,
+  x86_cpu_AVX10_V20 = x86_cpu_AVX10_V21 - 1,
+  x86_cpu_AVX10_V19 = x86_cpu_AVX10_V20 - 1,
+  x86_cpu_AVX10_V18 = x86_cpu_AVX10_V19 - 1,
+  x86_cpu_AVX10_V17 = x86_cpu_AVX10_V18 - 1,
+  x86_cpu_AVX10_V16 = x86_cpu_AVX10_V17 - 1,
+  x86_cpu_AVX10_V15 = x86_cpu_AVX10_V16 - 1,
+  x86_cpu_AVX10_V14 = x86_cpu_AVX10_V15 - 1,
+  x86_cpu_AVX10_V13 = x86_cpu_AVX10_V14 - 1,
+  x86_cpu_AVX10_V12 = x86_cpu_AVX10_V13 - 1,
+  x86_cpu_AVX10_V11 = x86_cpu_AVX10_V12 - 1,
+  x86_cpu_AVX10_V10 = x86_cpu_AVX10_V11 - 1,
+  x86_cpu_AVX10_V9 = x86_cpu_AVX10_V10 - 1,
+  x86_cpu_AVX10_V8 = x86_cpu_AVX10_V9 - 1,
+  x86_cpu_AVX10_V7 = x86_cpu_AVX10_V8 - 1,
+  x86_cpu_AVX10_V6 = x86_cpu_AVX10_V7 - 1,
+  x86_cpu_AVX10_V5 = x86_cpu_AVX10_V6 - 1,
+  x86_cpu_AVX10_V4 = x86_cpu_AVX10_V5 - 1,
+  x86_cpu_AVX10_V3 = x86_cpu_AVX10_V4 - 1,
+  x86_cpu_AVX10_V2 = x86_cpu_AVX10_V3 - 1,
+  x86_cpu_AVX10_V1 = x86_cpu_AVX10_V2 - 1
+/* x86_cpu_AVX10_V0 is invalid.  */
 };
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index badf088874..b5846bc211 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -115,11 +115,18 @@ update_active (struct cpu_features *cpu_features)
   CPU_FEATURE_SET_ACTIVE (cpu_features, SHSTK);
 #endif
 
+  enum
+  {
+    os_xmm = 1,
+    os_ymm = 2,
+    os_zmm = 4
+  } os_vector_size = os_xmm;
   /* Can we call xgetbv?  */
   if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE))
     {
       unsigned int xcrlow;
       unsigned int xcrhigh;
+      CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10);
       asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0));
       /* Is YMM and XMM state usable?  */
       if ((xcrlow & (bit_YMM_state | bit_XMM_state))
@@ -128,6 +135,7 @@ update_active (struct cpu_features *cpu_features)
 	  /* Determine if AVX is usable.  */
 	  if (CPU_FEATURES_CPU_P (cpu_features, AVX))
 	    {
+          os_vector_size |= os_ymm;
 	      CPU_FEATURE_SET (cpu_features, AVX);
 	      /* The following features depend on AVX being usable.  */
 	      /* Determine if AVX2 is usable.  */
@@ -166,6 +174,7 @@ update_active (struct cpu_features *cpu_features)
 			 | bit_ZMM16_31_state))
 	      == (bit_Opmask_state | bit_ZMM0_15_state | bit_ZMM16_31_state))
 	    {
+	      os_vector_size |= os_zmm;
 	      /* Determine if AVX512F is usable.  */
 	      if (CPU_FEATURES_CPU_P (cpu_features, AVX512F))
 		{
@@ -210,6 +219,22 @@ update_active (struct cpu_features *cpu_features)
 	    }
 	}
 
+      if (CPU_FEATURES_CPU_P (cpu_features, AVX10)
+	  && cpu_features->basic.max_cpuid >= 0x24)
+	{
+	  __cpuid_count (
+	      0x24, 0, cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.eax,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ebx,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ecx,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.edx);
+	  if (os_vector_size & os_xmm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_XMM);
+	  if (os_vector_size & os_ymm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_YMM);
+	  if (os_vector_size & os_zmm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_ZMM);
+	}
+
       /* 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 eb30d342a6..2d7427a6c0 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_14_ECX_0 + 1
+  CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_0 + 1
 };
 
 enum
@@ -319,6 +319,7 @@ enum
 #define bit_cpu_AVX_NE_CONVERT	(1u << 5)
 #define bit_cpu_AMX_COMPLEX	(1u << 8)
 #define bit_cpu_PREFETCHI	(1u << 14)
+#define bit_cpu_AVX10		(1u << 19)
 #define bit_cpu_APX_F		(1u << 21)
 
 /* CPUID_INDEX_19.  */
@@ -332,6 +333,13 @@ enum
 /* EBX.  */
 #define bit_cpu_PTWRITE		(1u << 4)
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define bit_cpu_AVX10_XMM		(1u << 16)
+#define bit_cpu_AVX10_YMM		(1u << 17)
+#define bit_cpu_AVX10_ZMM		(1u << 18)
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -563,6 +571,7 @@ enum
 #define index_cpu_AVX_NE_CONVERT CPUID_INDEX_7_ECX_1
 #define index_cpu_AMX_COMPLEX	CPUID_INDEX_7_ECX_1
 #define index_cpu_PREFETCHI	CPUID_INDEX_7_ECX_1
+#define index_cpu_AVX10		CPUID_INDEX_7_ECX_1
 #define index_cpu_APX_F		CPUID_INDEX_7_ECX_1
 
 /* CPUID_INDEX_19.  */
@@ -576,6 +585,13 @@ enum
 /* EBX.  */
 #define index_cpu_PTWRITE	CPUID_INDEX_14_ECX_0
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define index_cpu_AVX10_XMM	CPUID_INDEX_24_ECX_0
+#define index_cpu_AVX10_YMM	CPUID_INDEX_24_ECX_0
+#define index_cpu_AVX10_ZMM	CPUID_INDEX_24_ECX_0
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -809,6 +825,7 @@ enum
 #define reg_AVX_NE_CONVERT	edx
 #define reg_AMX_COMPLEX		edx
 #define reg_PREFETCHI		edx
+#define reg_AVX10		edx
 #define reg_APX_F		edx
 
 /* CPUID_INDEX_19.  */
@@ -822,6 +839,14 @@ enum
 /* EBX.  */
 #define reg_PTWRITE		ebx
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define reg_AVX10_XMM		ebx
+#define reg_AVX10_YMM		ebx
+#define reg_AVX10_ZMM		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/sys/platform/x86.h b/sysdeps/x86/sys/platform/x86.h
index 1ea2c5fc0b..fa8c7e158d 100644
--- a/sysdeps/x86/sys/platform/x86.h
+++ b/sysdeps/x86/sys/platform/x86.h
@@ -29,9 +29,45 @@ __BEGIN_DECLS
 extern const struct cpuid_feature *__x86_get_cpuid_feature_leaf (unsigned int)
      __attribute__ ((pure));
 
+static __inline__ unsigned int
+x86_cpu_get_avx10_version_number_from_enum (unsigned int __enum)
+{
+  return __enum - x86_cpu_AVX10_V1 + 1;
+}
+
+static __inline__ _Bool
+x86_cpu_is_index_avx10_version_number (unsigned int __index)
+{
+  return __index >= (unsigned int) x86_cpu_AVX10_V1
+	 && __index <= (unsigned int) x86_cpu_AVX10_V255;
+}
+
+static __inline__ unsigned int
+x86_cpu_get_avx10_info (unsigned int __index)
+{
+  const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf (
+      __index / (8 * sizeof (unsigned int) * 4));
+  unsigned int __reg = __index & (8 * sizeof (unsigned int) * 4 - 1);
+  __reg /= 8 * sizeof (unsigned int);
+
+  return __ptr->cpuid_array[__reg];
+}
+
+/* Get AVX10 version number in byte form.  Must check AVX10 active first. Value
+   is in range [1, 255].  */
+static __inline__ unsigned int
+x86_cpu_get_avx10_version_number (void)
+{
+  return x86_cpu_get_avx10_info (x86_cpu_index_24_ecx_0_ebx) & 0xff;
+}
+
 static __inline__ _Bool
 x86_cpu_present (unsigned int __index)
 {
+  if (x86_cpu_is_index_avx10_version_number (__index))
+    return x86_cpu_get_avx10_version_number ()
+	   >= x86_cpu_get_avx10_version_number_from_enum (__index);
+
   const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
     (__index / (8 * sizeof (unsigned int) * 4));
   unsigned int __reg
@@ -45,6 +81,10 @@ x86_cpu_present (unsigned int __index)
 static __inline__ _Bool
 x86_cpu_active (unsigned int __index)
 {
+  if (x86_cpu_is_index_avx10_version_number (__index))
+    return x86_cpu_get_avx10_version_number ()
+	   >= x86_cpu_get_avx10_version_number_from_enum (__index);
+
   const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
     (__index / (8 * sizeof (unsigned int) * 4));
   unsigned int __reg
diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c
index b27fa7324a..53e68431f1 100644
--- a/sysdeps/x86/tst-get-cpu-features.c
+++ b/sysdeps/x86/tst-get-cpu-features.c
@@ -219,6 +219,7 @@ do_test (void)
   CHECK_CPU_FEATURE_PRESENT (AVX_NE_CONVERT);
   CHECK_CPU_FEATURE_PRESENT (AMX_COMPLEX);
   CHECK_CPU_FEATURE_PRESENT (PREFETCHI);
+  CHECK_CPU_FEATURE_PRESENT (AVX10);
   CHECK_CPU_FEATURE_PRESENT (APX_F);
   CHECK_CPU_FEATURE_PRESENT (AESKLE);
   CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
@@ -391,11 +392,273 @@ do_test (void)
   CHECK_CPU_FEATURE_ACTIVE (AVX_NE_CONVERT);
   CHECK_CPU_FEATURE_ACTIVE (AMX_COMPLEX);
   CHECK_CPU_FEATURE_ACTIVE (PREFETCHI);
+  CHECK_CPU_FEATURE_ACTIVE (AVX10);
   CHECK_CPU_FEATURE_ACTIVE (APX_F);
   CHECK_CPU_FEATURE_ACTIVE (AESKLE);
   CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
   CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
 
+  if (CPU_FEATURE_ACTIVE (AVX10))
+    {
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_XMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_YMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_ZMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V1);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V2);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V3);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V4);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V5);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V6);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V7);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V8);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V9);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V10);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V11);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V12);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V13);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V14);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V15);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V16);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V17);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V18);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V19);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V20);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V21);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V22);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V23);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V24);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V25);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V26);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V27);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V28);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V29);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V30);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V31);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V32);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V33);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V34);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V35);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V36);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V37);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V38);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V39);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V40);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V41);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V42);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V43);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V44);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V45);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V46);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V47);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V48);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V49);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V50);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V51);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V52);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V53);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V54);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V55);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V56);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V57);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V58);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V59);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V60);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V61);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V62);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V63);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V64);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V65);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V66);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V67);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V68);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V69);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V70);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V71);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V72);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V73);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V74);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V75);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V76);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V77);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V78);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V79);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V80);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V81);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V82);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V83);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V84);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V85);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V86);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V87);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V88);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V89);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V90);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V91);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V92);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V93);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V94);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V95);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V96);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V97);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V98);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V99);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V100);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V101);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V102);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V103);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V104);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V105);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V106);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V107);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V108);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V109);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V110);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V111);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V112);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V113);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V114);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V115);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V116);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V117);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V118);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V119);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V120);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V121);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V122);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V123);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V124);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V125);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V126);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V127);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V128);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V129);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V130);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V131);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V132);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V133);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V134);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V135);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V136);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V137);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V138);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V139);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V140);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V141);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V142);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V143);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V144);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V145);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V146);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V147);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V148);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V149);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V150);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V151);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V152);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V153);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V154);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V155);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V156);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V157);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V158);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V159);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V160);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V161);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V162);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V163);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V164);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V165);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V166);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V167);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V168);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V169);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V170);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V171);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V172);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V173);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V174);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V175);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V176);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V177);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V178);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V179);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V180);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V181);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V182);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V183);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V184);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V185);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V186);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V187);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V188);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V189);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V190);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V191);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V192);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V193);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V194);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V195);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V196);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V197);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V198);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V199);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V200);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V201);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V202);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V203);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V204);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V205);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V206);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V207);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V208);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V209);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V210);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V211);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V212);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V213);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V214);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V215);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V216);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V217);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V218);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V219);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V220);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V221);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V222);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V223);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V224);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V225);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V226);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V227);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V228);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V229);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V230);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V231);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V232);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V233);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V234);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V235);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V236);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V237);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V238);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V239);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V240);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V241);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V242);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V243);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V244);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V245);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V246);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V247);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V248);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V249);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V250);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V251);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V252);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V253);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V254);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V255);
+    }
   return 0;
 }
 
-- 
2.34.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v1] x86: Add support for AVX10 version and vec size in cpu-features
  2023-08-24 18:48 [PATCH v1] x86: Add support for AVX10 version and vec size in cpu-features Noah Goldstein
@ 2023-08-24 19:01 ` H.J. Lu
  2023-08-24 19:14   ` Noah Goldstein
  2023-08-24 19:14 ` [PATCH v2] " Noah Goldstein
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: H.J. Lu @ 2023-08-24 19:01 UTC (permalink / raw)
  To: Noah Goldstein; +Cc: libc-alpha, carlos

On Thu, Aug 24, 2023 at 11:48 AM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
>
> This commit add support for the new AVX10 cpu features:
> https://cdrdv2-public.intel.com/784267/355989-intel-avx10-spec.pdf
>
> We add checks for:
>     - `AVX10`: Check if AVX10 is present.
>     - `AVX10_V{1..255}`: Check if a given version is active.
>     - `AVX10_{X,Y,Z}MM`: Check if a given vec class has AVX10 support.
>
> The version checks are not ideal, the reason for the reason for this
> is the version information in AVX10 is encoded as complete a byte
> value, but the `CPU_FEATURES` interface is only able to query bools.
>
> To get around this, we add a feature for each possible version value
> (starting at 1 as there is no AVX10 version 0).
>
> `make check` passes and cpuid output was checked against GNR/DMR on an
> emulator.
> ---
>  manual/platform.texi               |  28 +++
>  sysdeps/x86/bits/platform/x86.h    | 281 ++++++++++++++++++++++++++++-
>  sysdeps/x86/cpu-features.c         |  25 +++
>  sysdeps/x86/include/cpu-features.h |  27 ++-
>  sysdeps/x86/sys/platform/x86.h     |  40 ++++
>  sysdeps/x86/tst-get-cpu-features.c | 263 +++++++++++++++++++++++++++
>  6 files changed, 661 insertions(+), 3 deletions(-)
>
> diff --git a/manual/platform.texi b/manual/platform.texi
> index 2a2d557067..99dc57b568 100644
> --- a/manual/platform.texi
> +++ b/manual/platform.texi
> @@ -222,6 +222,22 @@ Leaf (EAX = 23H).
>  @item
>  @code{AVX} -- The AVX instruction extensions.
>
> +@item
> +@code{AVX10} -- The AVX10 instruction extensions.
> +
> +@item
> +@code{AVX10_XMM} -- Whether AVX10 includes xmm registers.
> +
> +@item
> +@code{AVX10_YMM} -- Whether AVX10 includes ymm registers.
> +
> +@item
> +@code{AVX10_ZMM} -- Whether AVX10 includes zmm registers.
> +
> +@item
> +@code{AVX10_V1}..@code{AVX10_V255} -- Whether AVX10 supports a given
> +version.
> +
>  @item
>  @code{AVX2} -- The AVX2 instruction extensions.
>
> @@ -760,3 +776,15 @@ avx_active (void)
>    return CPU_FEATURE_ACTIVE (AVX);
>  @}
>  @end smallexample
> +
> +You could query @code{AVX10} version number with:
> +
> +@smallexample
> +#include <sys/platform/x86.h>
> +
> +int
> +has_avx10_version1 (void)
> +@{
> +  return CPU_FEATURE_ACTIVE (AVX10_V1); // Up to AVX10_V255
> +@}
> +@end smallexample
> diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
> index 88ca071aa7..777fb6ce18 100644
> --- a/sysdeps/x86/bits/platform/x86.h
> +++ b/sysdeps/x86/bits/platform/x86.h
> @@ -30,7 +30,8 @@ enum
>    CPUID_INDEX_80000008,
>    CPUID_INDEX_7_ECX_1,
>    CPUID_INDEX_19,
> -  CPUID_INDEX_14_ECX_0
> +  CPUID_INDEX_14_ECX_0,
> +  CPUID_INDEX_24_ECX_0
>  };
>
>  struct cpuid_feature
> @@ -312,6 +313,7 @@ enum
>    x86_cpu_AVX_NE_CONVERT       = x86_cpu_index_7_ecx_1_edx + 5,
>    x86_cpu_AMX_COMPLEX          = x86_cpu_index_7_ecx_1_edx + 8,
>    x86_cpu_PREFETCHI            = x86_cpu_index_7_ecx_1_edx + 14,
> +  x86_cpu_AVX10                        = x86_cpu_index_7_ecx_1_edx + 19,
>    x86_cpu_APX_F                        = x86_cpu_index_7_ecx_1_edx + 21,
>
>    x86_cpu_index_19_ebx
> @@ -325,5 +327,280 @@ enum
>      = (CPUID_INDEX_14_ECX_0 * 8 * 4 * sizeof (unsigned int)
>         + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
>
> -  x86_cpu_PTWRITE              = x86_cpu_index_14_ecx_0_ebx + 4
> +  x86_cpu_PTWRITE              = x86_cpu_index_14_ecx_0_ebx + 4,
> +
> +  x86_cpu_index_24_ecx_0_ebx
> +    = (CPUID_INDEX_24_ECX_0 * 8 * 4 * sizeof (unsigned int)
> +       + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
> +
> +  x86_cpu_AVX10_XMM = x86_cpu_index_24_ecx_0_ebx + 16,
> +  x86_cpu_AVX10_YMM = x86_cpu_index_24_ecx_0_ebx + 17,
> +  x86_cpu_AVX10_ZMM = x86_cpu_index_24_ecx_0_ebx + 18,
> +
> +/* AVX10 version information is handled differently from all other CPUID
> +   related logic.  Rather than being encoded in cpuid as discrete booleans, the
> +   AVX10 version is encoded is a full byte that represents the version number
> +   (greater than or equal to 1).  Since the CPUID API is only able to handle
> +   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
> +   by the user and have special logic in `x86_cpu_{present,active}`.  This is
> +   unpleasant on our end, but is the only way to make the existing API also
> +   support version queries.  */
> +
> +  /* All 1s should never be a value feature index.  */
> +  x86_cpu_AVX10_V255 = ~0,
> +  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
> +  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
> +  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
> +  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,
> +  x86_cpu_AVX10_V250 = x86_cpu_AVX10_V251 - 1,
> +  x86_cpu_AVX10_V249 = x86_cpu_AVX10_V250 - 1,
> +  x86_cpu_AVX10_V248 = x86_cpu_AVX10_V249 - 1,
> +  x86_cpu_AVX10_V247 = x86_cpu_AVX10_V248 - 1,
> +  x86_cpu_AVX10_V246 = x86_cpu_AVX10_V247 - 1,
> +  x86_cpu_AVX10_V245 = x86_cpu_AVX10_V246 - 1,
> +  x86_cpu_AVX10_V244 = x86_cpu_AVX10_V245 - 1,
> +  x86_cpu_AVX10_V243 = x86_cpu_AVX10_V244 - 1,
> +  x86_cpu_AVX10_V242 = x86_cpu_AVX10_V243 - 1,
> +  x86_cpu_AVX10_V241 = x86_cpu_AVX10_V242 - 1,
> +  x86_cpu_AVX10_V240 = x86_cpu_AVX10_V241 - 1,
> +  x86_cpu_AVX10_V239 = x86_cpu_AVX10_V240 - 1,
> +  x86_cpu_AVX10_V238 = x86_cpu_AVX10_V239 - 1,
> +  x86_cpu_AVX10_V237 = x86_cpu_AVX10_V238 - 1,
> +  x86_cpu_AVX10_V236 = x86_cpu_AVX10_V237 - 1,
> +  x86_cpu_AVX10_V235 = x86_cpu_AVX10_V236 - 1,
> +  x86_cpu_AVX10_V234 = x86_cpu_AVX10_V235 - 1,
> +  x86_cpu_AVX10_V233 = x86_cpu_AVX10_V234 - 1,
> +  x86_cpu_AVX10_V232 = x86_cpu_AVX10_V233 - 1,
> +  x86_cpu_AVX10_V231 = x86_cpu_AVX10_V232 - 1,
> +  x86_cpu_AVX10_V230 = x86_cpu_AVX10_V231 - 1,
> +  x86_cpu_AVX10_V229 = x86_cpu_AVX10_V230 - 1,
> +  x86_cpu_AVX10_V228 = x86_cpu_AVX10_V229 - 1,
> +  x86_cpu_AVX10_V227 = x86_cpu_AVX10_V228 - 1,
> +  x86_cpu_AVX10_V226 = x86_cpu_AVX10_V227 - 1,
> +  x86_cpu_AVX10_V225 = x86_cpu_AVX10_V226 - 1,
> +  x86_cpu_AVX10_V224 = x86_cpu_AVX10_V225 - 1,
> +  x86_cpu_AVX10_V223 = x86_cpu_AVX10_V224 - 1,
> +  x86_cpu_AVX10_V222 = x86_cpu_AVX10_V223 - 1,
> +  x86_cpu_AVX10_V221 = x86_cpu_AVX10_V222 - 1,
> +  x86_cpu_AVX10_V220 = x86_cpu_AVX10_V221 - 1,
> +  x86_cpu_AVX10_V219 = x86_cpu_AVX10_V220 - 1,
> +  x86_cpu_AVX10_V218 = x86_cpu_AVX10_V219 - 1,
> +  x86_cpu_AVX10_V217 = x86_cpu_AVX10_V218 - 1,
> +  x86_cpu_AVX10_V216 = x86_cpu_AVX10_V217 - 1,
> +  x86_cpu_AVX10_V215 = x86_cpu_AVX10_V216 - 1,
> +  x86_cpu_AVX10_V214 = x86_cpu_AVX10_V215 - 1,
> +  x86_cpu_AVX10_V213 = x86_cpu_AVX10_V214 - 1,
> +  x86_cpu_AVX10_V212 = x86_cpu_AVX10_V213 - 1,
> +  x86_cpu_AVX10_V211 = x86_cpu_AVX10_V212 - 1,
> +  x86_cpu_AVX10_V210 = x86_cpu_AVX10_V211 - 1,
> +  x86_cpu_AVX10_V209 = x86_cpu_AVX10_V210 - 1,
> +  x86_cpu_AVX10_V208 = x86_cpu_AVX10_V209 - 1,
> +  x86_cpu_AVX10_V207 = x86_cpu_AVX10_V208 - 1,
> +  x86_cpu_AVX10_V206 = x86_cpu_AVX10_V207 - 1,
> +  x86_cpu_AVX10_V205 = x86_cpu_AVX10_V206 - 1,
> +  x86_cpu_AVX10_V204 = x86_cpu_AVX10_V205 - 1,
> +  x86_cpu_AVX10_V203 = x86_cpu_AVX10_V204 - 1,
> +  x86_cpu_AVX10_V202 = x86_cpu_AVX10_V203 - 1,
> +  x86_cpu_AVX10_V201 = x86_cpu_AVX10_V202 - 1,
> +  x86_cpu_AVX10_V200 = x86_cpu_AVX10_V201 - 1,
> +  x86_cpu_AVX10_V199 = x86_cpu_AVX10_V200 - 1,
> +  x86_cpu_AVX10_V198 = x86_cpu_AVX10_V199 - 1,
> +  x86_cpu_AVX10_V197 = x86_cpu_AVX10_V198 - 1,
> +  x86_cpu_AVX10_V196 = x86_cpu_AVX10_V197 - 1,
> +  x86_cpu_AVX10_V195 = x86_cpu_AVX10_V196 - 1,
> +  x86_cpu_AVX10_V194 = x86_cpu_AVX10_V195 - 1,
> +  x86_cpu_AVX10_V193 = x86_cpu_AVX10_V194 - 1,
> +  x86_cpu_AVX10_V192 = x86_cpu_AVX10_V193 - 1,
> +  x86_cpu_AVX10_V191 = x86_cpu_AVX10_V192 - 1,
> +  x86_cpu_AVX10_V190 = x86_cpu_AVX10_V191 - 1,
> +  x86_cpu_AVX10_V189 = x86_cpu_AVX10_V190 - 1,
> +  x86_cpu_AVX10_V188 = x86_cpu_AVX10_V189 - 1,
> +  x86_cpu_AVX10_V187 = x86_cpu_AVX10_V188 - 1,
> +  x86_cpu_AVX10_V186 = x86_cpu_AVX10_V187 - 1,
> +  x86_cpu_AVX10_V185 = x86_cpu_AVX10_V186 - 1,
> +  x86_cpu_AVX10_V184 = x86_cpu_AVX10_V185 - 1,
> +  x86_cpu_AVX10_V183 = x86_cpu_AVX10_V184 - 1,
> +  x86_cpu_AVX10_V182 = x86_cpu_AVX10_V183 - 1,
> +  x86_cpu_AVX10_V181 = x86_cpu_AVX10_V182 - 1,
> +  x86_cpu_AVX10_V180 = x86_cpu_AVX10_V181 - 1,
> +  x86_cpu_AVX10_V179 = x86_cpu_AVX10_V180 - 1,
> +  x86_cpu_AVX10_V178 = x86_cpu_AVX10_V179 - 1,
> +  x86_cpu_AVX10_V177 = x86_cpu_AVX10_V178 - 1,
> +  x86_cpu_AVX10_V176 = x86_cpu_AVX10_V177 - 1,
> +  x86_cpu_AVX10_V175 = x86_cpu_AVX10_V176 - 1,
> +  x86_cpu_AVX10_V174 = x86_cpu_AVX10_V175 - 1,
> +  x86_cpu_AVX10_V173 = x86_cpu_AVX10_V174 - 1,
> +  x86_cpu_AVX10_V172 = x86_cpu_AVX10_V173 - 1,
> +  x86_cpu_AVX10_V171 = x86_cpu_AVX10_V172 - 1,
> +  x86_cpu_AVX10_V170 = x86_cpu_AVX10_V171 - 1,
> +  x86_cpu_AVX10_V169 = x86_cpu_AVX10_V170 - 1,
> +  x86_cpu_AVX10_V168 = x86_cpu_AVX10_V169 - 1,
> +  x86_cpu_AVX10_V167 = x86_cpu_AVX10_V168 - 1,
> +  x86_cpu_AVX10_V166 = x86_cpu_AVX10_V167 - 1,
> +  x86_cpu_AVX10_V165 = x86_cpu_AVX10_V166 - 1,
> +  x86_cpu_AVX10_V164 = x86_cpu_AVX10_V165 - 1,
> +  x86_cpu_AVX10_V163 = x86_cpu_AVX10_V164 - 1,
> +  x86_cpu_AVX10_V162 = x86_cpu_AVX10_V163 - 1,
> +  x86_cpu_AVX10_V161 = x86_cpu_AVX10_V162 - 1,
> +  x86_cpu_AVX10_V160 = x86_cpu_AVX10_V161 - 1,
> +  x86_cpu_AVX10_V159 = x86_cpu_AVX10_V160 - 1,
> +  x86_cpu_AVX10_V158 = x86_cpu_AVX10_V159 - 1,
> +  x86_cpu_AVX10_V157 = x86_cpu_AVX10_V158 - 1,
> +  x86_cpu_AVX10_V156 = x86_cpu_AVX10_V157 - 1,
> +  x86_cpu_AVX10_V155 = x86_cpu_AVX10_V156 - 1,
> +  x86_cpu_AVX10_V154 = x86_cpu_AVX10_V155 - 1,
> +  x86_cpu_AVX10_V153 = x86_cpu_AVX10_V154 - 1,
> +  x86_cpu_AVX10_V152 = x86_cpu_AVX10_V153 - 1,
> +  x86_cpu_AVX10_V151 = x86_cpu_AVX10_V152 - 1,
> +  x86_cpu_AVX10_V150 = x86_cpu_AVX10_V151 - 1,
> +  x86_cpu_AVX10_V149 = x86_cpu_AVX10_V150 - 1,
> +  x86_cpu_AVX10_V148 = x86_cpu_AVX10_V149 - 1,
> +  x86_cpu_AVX10_V147 = x86_cpu_AVX10_V148 - 1,
> +  x86_cpu_AVX10_V146 = x86_cpu_AVX10_V147 - 1,
> +  x86_cpu_AVX10_V145 = x86_cpu_AVX10_V146 - 1,
> +  x86_cpu_AVX10_V144 = x86_cpu_AVX10_V145 - 1,
> +  x86_cpu_AVX10_V143 = x86_cpu_AVX10_V144 - 1,
> +  x86_cpu_AVX10_V142 = x86_cpu_AVX10_V143 - 1,
> +  x86_cpu_AVX10_V141 = x86_cpu_AVX10_V142 - 1,
> +  x86_cpu_AVX10_V140 = x86_cpu_AVX10_V141 - 1,
> +  x86_cpu_AVX10_V139 = x86_cpu_AVX10_V140 - 1,
> +  x86_cpu_AVX10_V138 = x86_cpu_AVX10_V139 - 1,
> +  x86_cpu_AVX10_V137 = x86_cpu_AVX10_V138 - 1,
> +  x86_cpu_AVX10_V136 = x86_cpu_AVX10_V137 - 1,
> +  x86_cpu_AVX10_V135 = x86_cpu_AVX10_V136 - 1,
> +  x86_cpu_AVX10_V134 = x86_cpu_AVX10_V135 - 1,
> +  x86_cpu_AVX10_V133 = x86_cpu_AVX10_V134 - 1,
> +  x86_cpu_AVX10_V132 = x86_cpu_AVX10_V133 - 1,
> +  x86_cpu_AVX10_V131 = x86_cpu_AVX10_V132 - 1,
> +  x86_cpu_AVX10_V130 = x86_cpu_AVX10_V131 - 1,
> +  x86_cpu_AVX10_V129 = x86_cpu_AVX10_V130 - 1,
> +  x86_cpu_AVX10_V128 = x86_cpu_AVX10_V129 - 1,
> +  x86_cpu_AVX10_V127 = x86_cpu_AVX10_V128 - 1,
> +  x86_cpu_AVX10_V126 = x86_cpu_AVX10_V127 - 1,
> +  x86_cpu_AVX10_V125 = x86_cpu_AVX10_V126 - 1,
> +  x86_cpu_AVX10_V124 = x86_cpu_AVX10_V125 - 1,
> +  x86_cpu_AVX10_V123 = x86_cpu_AVX10_V124 - 1,
> +  x86_cpu_AVX10_V122 = x86_cpu_AVX10_V123 - 1,
> +  x86_cpu_AVX10_V121 = x86_cpu_AVX10_V122 - 1,
> +  x86_cpu_AVX10_V120 = x86_cpu_AVX10_V121 - 1,
> +  x86_cpu_AVX10_V119 = x86_cpu_AVX10_V120 - 1,
> +  x86_cpu_AVX10_V118 = x86_cpu_AVX10_V119 - 1,
> +  x86_cpu_AVX10_V117 = x86_cpu_AVX10_V118 - 1,
> +  x86_cpu_AVX10_V116 = x86_cpu_AVX10_V117 - 1,
> +  x86_cpu_AVX10_V115 = x86_cpu_AVX10_V116 - 1,
> +  x86_cpu_AVX10_V114 = x86_cpu_AVX10_V115 - 1,
> +  x86_cpu_AVX10_V113 = x86_cpu_AVX10_V114 - 1,
> +  x86_cpu_AVX10_V112 = x86_cpu_AVX10_V113 - 1,
> +  x86_cpu_AVX10_V111 = x86_cpu_AVX10_V112 - 1,
> +  x86_cpu_AVX10_V110 = x86_cpu_AVX10_V111 - 1,
> +  x86_cpu_AVX10_V109 = x86_cpu_AVX10_V110 - 1,
> +  x86_cpu_AVX10_V108 = x86_cpu_AVX10_V109 - 1,
> +  x86_cpu_AVX10_V107 = x86_cpu_AVX10_V108 - 1,
> +  x86_cpu_AVX10_V106 = x86_cpu_AVX10_V107 - 1,
> +  x86_cpu_AVX10_V105 = x86_cpu_AVX10_V106 - 1,
> +  x86_cpu_AVX10_V104 = x86_cpu_AVX10_V105 - 1,
> +  x86_cpu_AVX10_V103 = x86_cpu_AVX10_V104 - 1,
> +  x86_cpu_AVX10_V102 = x86_cpu_AVX10_V103 - 1,
> +  x86_cpu_AVX10_V101 = x86_cpu_AVX10_V102 - 1,
> +  x86_cpu_AVX10_V100 = x86_cpu_AVX10_V101 - 1,
> +  x86_cpu_AVX10_V99 = x86_cpu_AVX10_V100 - 1,
> +  x86_cpu_AVX10_V98 = x86_cpu_AVX10_V99 - 1,
> +  x86_cpu_AVX10_V97 = x86_cpu_AVX10_V98 - 1,
> +  x86_cpu_AVX10_V96 = x86_cpu_AVX10_V97 - 1,
> +  x86_cpu_AVX10_V95 = x86_cpu_AVX10_V96 - 1,
> +  x86_cpu_AVX10_V94 = x86_cpu_AVX10_V95 - 1,
> +  x86_cpu_AVX10_V93 = x86_cpu_AVX10_V94 - 1,
> +  x86_cpu_AVX10_V92 = x86_cpu_AVX10_V93 - 1,
> +  x86_cpu_AVX10_V91 = x86_cpu_AVX10_V92 - 1,
> +  x86_cpu_AVX10_V90 = x86_cpu_AVX10_V91 - 1,
> +  x86_cpu_AVX10_V89 = x86_cpu_AVX10_V90 - 1,
> +  x86_cpu_AVX10_V88 = x86_cpu_AVX10_V89 - 1,
> +  x86_cpu_AVX10_V87 = x86_cpu_AVX10_V88 - 1,
> +  x86_cpu_AVX10_V86 = x86_cpu_AVX10_V87 - 1,
> +  x86_cpu_AVX10_V85 = x86_cpu_AVX10_V86 - 1,
> +  x86_cpu_AVX10_V84 = x86_cpu_AVX10_V85 - 1,
> +  x86_cpu_AVX10_V83 = x86_cpu_AVX10_V84 - 1,
> +  x86_cpu_AVX10_V82 = x86_cpu_AVX10_V83 - 1,
> +  x86_cpu_AVX10_V81 = x86_cpu_AVX10_V82 - 1,
> +  x86_cpu_AVX10_V80 = x86_cpu_AVX10_V81 - 1,
> +  x86_cpu_AVX10_V79 = x86_cpu_AVX10_V80 - 1,
> +  x86_cpu_AVX10_V78 = x86_cpu_AVX10_V79 - 1,
> +  x86_cpu_AVX10_V77 = x86_cpu_AVX10_V78 - 1,
> +  x86_cpu_AVX10_V76 = x86_cpu_AVX10_V77 - 1,
> +  x86_cpu_AVX10_V75 = x86_cpu_AVX10_V76 - 1,
> +  x86_cpu_AVX10_V74 = x86_cpu_AVX10_V75 - 1,
> +  x86_cpu_AVX10_V73 = x86_cpu_AVX10_V74 - 1,
> +  x86_cpu_AVX10_V72 = x86_cpu_AVX10_V73 - 1,
> +  x86_cpu_AVX10_V71 = x86_cpu_AVX10_V72 - 1,
> +  x86_cpu_AVX10_V70 = x86_cpu_AVX10_V71 - 1,
> +  x86_cpu_AVX10_V69 = x86_cpu_AVX10_V70 - 1,
> +  x86_cpu_AVX10_V68 = x86_cpu_AVX10_V69 - 1,
> +  x86_cpu_AVX10_V67 = x86_cpu_AVX10_V68 - 1,
> +  x86_cpu_AVX10_V66 = x86_cpu_AVX10_V67 - 1,
> +  x86_cpu_AVX10_V65 = x86_cpu_AVX10_V66 - 1,
> +  x86_cpu_AVX10_V64 = x86_cpu_AVX10_V65 - 1,
> +  x86_cpu_AVX10_V63 = x86_cpu_AVX10_V64 - 1,
> +  x86_cpu_AVX10_V62 = x86_cpu_AVX10_V63 - 1,
> +  x86_cpu_AVX10_V61 = x86_cpu_AVX10_V62 - 1,
> +  x86_cpu_AVX10_V60 = x86_cpu_AVX10_V61 - 1,
> +  x86_cpu_AVX10_V59 = x86_cpu_AVX10_V60 - 1,
> +  x86_cpu_AVX10_V58 = x86_cpu_AVX10_V59 - 1,
> +  x86_cpu_AVX10_V57 = x86_cpu_AVX10_V58 - 1,
> +  x86_cpu_AVX10_V56 = x86_cpu_AVX10_V57 - 1,
> +  x86_cpu_AVX10_V55 = x86_cpu_AVX10_V56 - 1,
> +  x86_cpu_AVX10_V54 = x86_cpu_AVX10_V55 - 1,
> +  x86_cpu_AVX10_V53 = x86_cpu_AVX10_V54 - 1,
> +  x86_cpu_AVX10_V52 = x86_cpu_AVX10_V53 - 1,
> +  x86_cpu_AVX10_V51 = x86_cpu_AVX10_V52 - 1,
> +  x86_cpu_AVX10_V50 = x86_cpu_AVX10_V51 - 1,
> +  x86_cpu_AVX10_V49 = x86_cpu_AVX10_V50 - 1,
> +  x86_cpu_AVX10_V48 = x86_cpu_AVX10_V49 - 1,
> +  x86_cpu_AVX10_V47 = x86_cpu_AVX10_V48 - 1,
> +  x86_cpu_AVX10_V46 = x86_cpu_AVX10_V47 - 1,
> +  x86_cpu_AVX10_V45 = x86_cpu_AVX10_V46 - 1,
> +  x86_cpu_AVX10_V44 = x86_cpu_AVX10_V45 - 1,
> +  x86_cpu_AVX10_V43 = x86_cpu_AVX10_V44 - 1,
> +  x86_cpu_AVX10_V42 = x86_cpu_AVX10_V43 - 1,
> +  x86_cpu_AVX10_V41 = x86_cpu_AVX10_V42 - 1,
> +  x86_cpu_AVX10_V40 = x86_cpu_AVX10_V41 - 1,
> +  x86_cpu_AVX10_V39 = x86_cpu_AVX10_V40 - 1,
> +  x86_cpu_AVX10_V38 = x86_cpu_AVX10_V39 - 1,
> +  x86_cpu_AVX10_V37 = x86_cpu_AVX10_V38 - 1,
> +  x86_cpu_AVX10_V36 = x86_cpu_AVX10_V37 - 1,
> +  x86_cpu_AVX10_V35 = x86_cpu_AVX10_V36 - 1,
> +  x86_cpu_AVX10_V34 = x86_cpu_AVX10_V35 - 1,
> +  x86_cpu_AVX10_V33 = x86_cpu_AVX10_V34 - 1,
> +  x86_cpu_AVX10_V32 = x86_cpu_AVX10_V33 - 1,
> +  x86_cpu_AVX10_V31 = x86_cpu_AVX10_V32 - 1,
> +  x86_cpu_AVX10_V30 = x86_cpu_AVX10_V31 - 1,
> +  x86_cpu_AVX10_V29 = x86_cpu_AVX10_V30 - 1,
> +  x86_cpu_AVX10_V28 = x86_cpu_AVX10_V29 - 1,
> +  x86_cpu_AVX10_V27 = x86_cpu_AVX10_V28 - 1,
> +  x86_cpu_AVX10_V26 = x86_cpu_AVX10_V27 - 1,
> +  x86_cpu_AVX10_V25 = x86_cpu_AVX10_V26 - 1,
> +  x86_cpu_AVX10_V24 = x86_cpu_AVX10_V25 - 1,
> +  x86_cpu_AVX10_V23 = x86_cpu_AVX10_V24 - 1,
> +  x86_cpu_AVX10_V22 = x86_cpu_AVX10_V23 - 1,
> +  x86_cpu_AVX10_V21 = x86_cpu_AVX10_V22 - 1,
> +  x86_cpu_AVX10_V20 = x86_cpu_AVX10_V21 - 1,
> +  x86_cpu_AVX10_V19 = x86_cpu_AVX10_V20 - 1,
> +  x86_cpu_AVX10_V18 = x86_cpu_AVX10_V19 - 1,
> +  x86_cpu_AVX10_V17 = x86_cpu_AVX10_V18 - 1,
> +  x86_cpu_AVX10_V16 = x86_cpu_AVX10_V17 - 1,
> +  x86_cpu_AVX10_V15 = x86_cpu_AVX10_V16 - 1,
> +  x86_cpu_AVX10_V14 = x86_cpu_AVX10_V15 - 1,
> +  x86_cpu_AVX10_V13 = x86_cpu_AVX10_V14 - 1,
> +  x86_cpu_AVX10_V12 = x86_cpu_AVX10_V13 - 1,
> +  x86_cpu_AVX10_V11 = x86_cpu_AVX10_V12 - 1,
> +  x86_cpu_AVX10_V10 = x86_cpu_AVX10_V11 - 1,
> +  x86_cpu_AVX10_V9 = x86_cpu_AVX10_V10 - 1,
> +  x86_cpu_AVX10_V8 = x86_cpu_AVX10_V9 - 1,
> +  x86_cpu_AVX10_V7 = x86_cpu_AVX10_V8 - 1,
> +  x86_cpu_AVX10_V6 = x86_cpu_AVX10_V7 - 1,
> +  x86_cpu_AVX10_V5 = x86_cpu_AVX10_V6 - 1,
> +  x86_cpu_AVX10_V4 = x86_cpu_AVX10_V5 - 1,
> +  x86_cpu_AVX10_V3 = x86_cpu_AVX10_V4 - 1,
> +  x86_cpu_AVX10_V2 = x86_cpu_AVX10_V3 - 1,
> +  x86_cpu_AVX10_V1 = x86_cpu_AVX10_V2 - 1
> +/* x86_cpu_AVX10_V0 is invalid.  */
>  };
> diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
> index badf088874..b5846bc211 100644
> --- a/sysdeps/x86/cpu-features.c
> +++ b/sysdeps/x86/cpu-features.c
> @@ -115,11 +115,18 @@ update_active (struct cpu_features *cpu_features)
>    CPU_FEATURE_SET_ACTIVE (cpu_features, SHSTK);
>  #endif
>
> +  enum
> +  {
> +    os_xmm = 1,
> +    os_ymm = 2,
> +    os_zmm = 4
> +  } os_vector_size = os_xmm;
>    /* Can we call xgetbv?  */
>    if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE))
>      {
>        unsigned int xcrlow;
>        unsigned int xcrhigh;
> +      CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10);
>        asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0));
>        /* Is YMM and XMM state usable?  */
>        if ((xcrlow & (bit_YMM_state | bit_XMM_state))
> @@ -128,6 +135,7 @@ update_active (struct cpu_features *cpu_features)
>           /* Determine if AVX is usable.  */
>           if (CPU_FEATURES_CPU_P (cpu_features, AVX))
>             {
> +          os_vector_size |= os_ymm;

Wrong indentation.

>               CPU_FEATURE_SET (cpu_features, AVX);
>               /* The following features depend on AVX being usable.  */
>               /* Determine if AVX2 is usable.  */
> @@ -166,6 +174,7 @@ update_active (struct cpu_features *cpu_features)
>                          | bit_ZMM16_31_state))
>               == (bit_Opmask_state | bit_ZMM0_15_state | bit_ZMM16_31_state))
>             {
> +             os_vector_size |= os_zmm;
>               /* Determine if AVX512F is usable.  */
>               if (CPU_FEATURES_CPU_P (cpu_features, AVX512F))
>                 {
> @@ -210,6 +219,22 @@ update_active (struct cpu_features *cpu_features)
>             }
>         }
>
> +      if (CPU_FEATURES_CPU_P (cpu_features, AVX10)
> +         && cpu_features->basic.max_cpuid >= 0x24)
> +       {
> +         __cpuid_count (
> +             0x24, 0, cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.eax,
> +             cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ebx,
> +             cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ecx,
> +             cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.edx);
> +         if (os_vector_size & os_xmm)
> +           CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_XMM);
> +         if (os_vector_size & os_ymm)
> +           CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_YMM);
> +         if (os_vector_size & os_zmm)
> +           CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_ZMM);
> +       }
> +
>        /* 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 eb30d342a6..2d7427a6c0 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_14_ECX_0 + 1
> +  CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_0 + 1
>  };
>
>  enum
> @@ -319,6 +319,7 @@ enum
>  #define bit_cpu_AVX_NE_CONVERT (1u << 5)
>  #define bit_cpu_AMX_COMPLEX    (1u << 8)
>  #define bit_cpu_PREFETCHI      (1u << 14)
> +#define bit_cpu_AVX10          (1u << 19)
>  #define bit_cpu_APX_F          (1u << 21)
>
>  /* CPUID_INDEX_19.  */
> @@ -332,6 +333,13 @@ enum
>  /* EBX.  */
>  #define bit_cpu_PTWRITE                (1u << 4)
>
> +/* CPUID_INDEX_24_ECX_0.  */
> +
> +/* EBX.  */
> +#define bit_cpu_AVX10_XMM              (1u << 16)
> +#define bit_cpu_AVX10_YMM              (1u << 17)
> +#define bit_cpu_AVX10_ZMM              (1u << 18)
> +
>  /* CPUID_INDEX_1.  */
>
>  /* ECX.  */
> @@ -563,6 +571,7 @@ enum
>  #define index_cpu_AVX_NE_CONVERT CPUID_INDEX_7_ECX_1
>  #define index_cpu_AMX_COMPLEX  CPUID_INDEX_7_ECX_1
>  #define index_cpu_PREFETCHI    CPUID_INDEX_7_ECX_1
> +#define index_cpu_AVX10                CPUID_INDEX_7_ECX_1
>  #define index_cpu_APX_F                CPUID_INDEX_7_ECX_1
>
>  /* CPUID_INDEX_19.  */
> @@ -576,6 +585,13 @@ enum
>  /* EBX.  */
>  #define index_cpu_PTWRITE      CPUID_INDEX_14_ECX_0
>
> +/* CPUID_INDEX_24_ECX_0.  */
> +
> +/* EBX.  */
> +#define index_cpu_AVX10_XMM    CPUID_INDEX_24_ECX_0
> +#define index_cpu_AVX10_YMM    CPUID_INDEX_24_ECX_0
> +#define index_cpu_AVX10_ZMM    CPUID_INDEX_24_ECX_0
> +
>  /* CPUID_INDEX_1.  */
>
>  /* ECX.  */
> @@ -809,6 +825,7 @@ enum
>  #define reg_AVX_NE_CONVERT     edx
>  #define reg_AMX_COMPLEX                edx
>  #define reg_PREFETCHI          edx
> +#define reg_AVX10              edx
>  #define reg_APX_F              edx
>
>  /* CPUID_INDEX_19.  */
> @@ -822,6 +839,14 @@ enum
>  /* EBX.  */
>  #define reg_PTWRITE            ebx
>
> +/* CPUID_INDEX_24_ECX_0.  */
> +
> +/* EBX.  */
> +#define reg_AVX10_XMM          ebx
> +#define reg_AVX10_YMM          ebx
> +#define reg_AVX10_ZMM          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/sys/platform/x86.h b/sysdeps/x86/sys/platform/x86.h
> index 1ea2c5fc0b..fa8c7e158d 100644
> --- a/sysdeps/x86/sys/platform/x86.h
> +++ b/sysdeps/x86/sys/platform/x86.h
> @@ -29,9 +29,45 @@ __BEGIN_DECLS
>  extern const struct cpuid_feature *__x86_get_cpuid_feature_leaf (unsigned int)
>       __attribute__ ((pure));
>
> +static __inline__ unsigned int
> +x86_cpu_get_avx10_version_number_from_enum (unsigned int __enum)
> +{
> +  return __enum - x86_cpu_AVX10_V1 + 1;
> +}
> +
> +static __inline__ _Bool
> +x86_cpu_is_index_avx10_version_number (unsigned int __index)
> +{
> +  return __index >= (unsigned int) x86_cpu_AVX10_V1
> +        && __index <= (unsigned int) x86_cpu_AVX10_V255;
> +}
> +
> +static __inline__ unsigned int
> +x86_cpu_get_avx10_info (unsigned int __index)
> +{
> +  const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf (
> +      __index / (8 * sizeof (unsigned int) * 4));
> +  unsigned int __reg = __index & (8 * sizeof (unsigned int) * 4 - 1);
> +  __reg /= 8 * sizeof (unsigned int);
> +
> +  return __ptr->cpuid_array[__reg];
> +}
> +
> +/* Get AVX10 version number in byte form.  Must check AVX10 active first. Value
> +   is in range [1, 255].  */
> +static __inline__ unsigned int
> +x86_cpu_get_avx10_version_number (void)
> +{
> +  return x86_cpu_get_avx10_info (x86_cpu_index_24_ecx_0_ebx) & 0xff;
> +}
> +
>  static __inline__ _Bool
>  x86_cpu_present (unsigned int __index)
>  {
> +  if (x86_cpu_is_index_avx10_version_number (__index))
> +    return x86_cpu_get_avx10_version_number ()
> +          >= x86_cpu_get_avx10_version_number_from_enum (__index);
> +
>    const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
>      (__index / (8 * sizeof (unsigned int) * 4));
>    unsigned int __reg
> @@ -45,6 +81,10 @@ x86_cpu_present (unsigned int __index)
>  static __inline__ _Bool
>  x86_cpu_active (unsigned int __index)
>  {
> +  if (x86_cpu_is_index_avx10_version_number (__index))
> +    return x86_cpu_get_avx10_version_number ()
> +          >= x86_cpu_get_avx10_version_number_from_enum (__index);
> +
>    const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
>      (__index / (8 * sizeof (unsigned int) * 4));
>    unsigned int __reg
> diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c
> index b27fa7324a..53e68431f1 100644
> --- a/sysdeps/x86/tst-get-cpu-features.c
> +++ b/sysdeps/x86/tst-get-cpu-features.c
> @@ -219,6 +219,7 @@ do_test (void)
>    CHECK_CPU_FEATURE_PRESENT (AVX_NE_CONVERT);
>    CHECK_CPU_FEATURE_PRESENT (AMX_COMPLEX);
>    CHECK_CPU_FEATURE_PRESENT (PREFETCHI);
> +  CHECK_CPU_FEATURE_PRESENT (AVX10);
>    CHECK_CPU_FEATURE_PRESENT (APX_F);
>    CHECK_CPU_FEATURE_PRESENT (AESKLE);
>    CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
> @@ -391,11 +392,273 @@ do_test (void)
>    CHECK_CPU_FEATURE_ACTIVE (AVX_NE_CONVERT);
>    CHECK_CPU_FEATURE_ACTIVE (AMX_COMPLEX);
>    CHECK_CPU_FEATURE_ACTIVE (PREFETCHI);
> +  CHECK_CPU_FEATURE_ACTIVE (AVX10);
>    CHECK_CPU_FEATURE_ACTIVE (APX_F);
>    CHECK_CPU_FEATURE_ACTIVE (AESKLE);
>    CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
>    CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
>
> +  if (CPU_FEATURE_ACTIVE (AVX10))
> +    {
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_XMM);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_YMM);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_ZMM);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V1);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V2);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V3);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V4);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V5);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V6);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V7);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V8);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V9);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V10);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V11);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V12);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V13);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V14);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V15);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V16);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V17);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V18);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V19);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V20);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V21);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V22);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V23);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V24);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V25);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V26);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V27);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V28);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V29);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V30);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V31);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V32);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V33);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V34);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V35);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V36);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V37);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V38);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V39);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V40);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V41);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V42);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V43);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V44);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V45);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V46);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V47);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V48);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V49);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V50);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V51);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V52);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V53);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V54);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V55);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V56);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V57);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V58);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V59);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V60);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V61);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V62);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V63);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V64);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V65);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V66);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V67);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V68);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V69);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V70);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V71);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V72);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V73);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V74);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V75);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V76);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V77);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V78);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V79);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V80);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V81);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V82);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V83);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V84);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V85);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V86);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V87);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V88);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V89);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V90);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V91);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V92);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V93);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V94);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V95);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V96);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V97);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V98);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V99);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V100);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V101);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V102);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V103);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V104);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V105);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V106);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V107);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V108);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V109);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V110);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V111);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V112);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V113);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V114);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V115);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V116);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V117);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V118);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V119);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V120);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V121);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V122);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V123);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V124);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V125);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V126);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V127);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V128);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V129);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V130);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V131);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V132);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V133);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V134);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V135);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V136);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V137);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V138);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V139);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V140);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V141);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V142);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V143);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V144);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V145);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V146);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V147);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V148);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V149);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V150);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V151);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V152);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V153);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V154);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V155);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V156);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V157);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V158);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V159);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V160);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V161);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V162);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V163);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V164);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V165);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V166);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V167);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V168);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V169);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V170);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V171);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V172);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V173);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V174);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V175);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V176);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V177);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V178);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V179);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V180);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V181);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V182);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V183);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V184);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V185);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V186);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V187);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V188);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V189);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V190);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V191);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V192);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V193);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V194);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V195);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V196);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V197);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V198);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V199);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V200);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V201);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V202);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V203);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V204);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V205);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V206);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V207);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V208);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V209);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V210);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V211);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V212);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V213);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V214);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V215);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V216);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V217);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V218);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V219);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V220);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V221);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V222);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V223);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V224);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V225);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V226);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V227);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V228);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V229);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V230);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V231);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V232);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V233);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V234);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V235);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V236);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V237);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V238);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V239);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V240);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V241);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V242);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V243);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V244);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V245);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V246);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V247);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V248);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V249);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V250);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V251);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V252);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V253);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V254);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V255);
> +    }
>    return 0;
>  }
>
> --
> 2.34.1
>


-- 
H.J.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2] x86: Add support for AVX10 version and vec size in cpu-features
  2023-08-24 18:48 [PATCH v1] x86: Add support for AVX10 version and vec size in cpu-features Noah Goldstein
  2023-08-24 19:01 ` H.J. Lu
@ 2023-08-24 19:14 ` Noah Goldstein
  2023-08-25  7:12   ` Florian Weimer
  2023-08-24 20:30 ` Noah Goldstein
  2023-09-20 20:44 ` x86: Add support for AVX10 preset " Noah Goldstein
  3 siblings, 1 reply; 12+ messages in thread
From: Noah Goldstein @ 2023-08-24 19:14 UTC (permalink / raw)
  To: libc-alpha; +Cc: goldstein.w.n, hjl.tools, carlos

This commit add support for the new AVX10 cpu features:
https://cdrdv2-public.intel.com/784267/355989-intel-avx10-spec.pdf

We add checks for:
    - `AVX10`: Check if AVX10 is present.
    - `AVX10_V{1..255}`: Check if a given version is active.
    - `AVX10_{X,Y,Z}MM`: Check if a given vec class has AVX10 support.

The version checks are not ideal, the reason for the reason for this
is the version information in AVX10 is encoded as complete a byte
value, but the `CPU_FEATURES` interface is only able to query bools.

To get around this, we add a feature for each possible version value
(starting at 1 as there is no AVX10 version 0).

`make check` passes and cpuid output was checked against GNR/DMR on an
emulator.
---
 manual/platform.texi               |  28 +++
 sysdeps/x86/bits/platform/x86.h    | 281 ++++++++++++++++++++++++++++-
 sysdeps/x86/cpu-features.c         |  25 +++
 sysdeps/x86/include/cpu-features.h |  27 ++-
 sysdeps/x86/sys/platform/x86.h     |  40 ++++
 sysdeps/x86/tst-get-cpu-features.c | 263 +++++++++++++++++++++++++++
 6 files changed, 661 insertions(+), 3 deletions(-)

diff --git a/manual/platform.texi b/manual/platform.texi
index 2a2d557067..99dc57b568 100644
--- a/manual/platform.texi
+++ b/manual/platform.texi
@@ -222,6 +222,22 @@ Leaf (EAX = 23H).
 @item
 @code{AVX} -- The AVX instruction extensions.
 
+@item
+@code{AVX10} -- The AVX10 instruction extensions.
+
+@item
+@code{AVX10_XMM} -- Whether AVX10 includes xmm registers.
+
+@item
+@code{AVX10_YMM} -- Whether AVX10 includes ymm registers.
+
+@item
+@code{AVX10_ZMM} -- Whether AVX10 includes zmm registers.
+
+@item
+@code{AVX10_V1}..@code{AVX10_V255} -- Whether AVX10 supports a given
+version.
+
 @item
 @code{AVX2} -- The AVX2 instruction extensions.
 
@@ -760,3 +776,15 @@ avx_active (void)
   return CPU_FEATURE_ACTIVE (AVX);
 @}
 @end smallexample
+
+You could query @code{AVX10} version number with:
+
+@smallexample
+#include <sys/platform/x86.h>
+
+int
+has_avx10_version1 (void)
+@{
+  return CPU_FEATURE_ACTIVE (AVX10_V1); // Up to AVX10_V255
+@}
+@end smallexample
diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
index 88ca071aa7..777fb6ce18 100644
--- a/sysdeps/x86/bits/platform/x86.h
+++ b/sysdeps/x86/bits/platform/x86.h
@@ -30,7 +30,8 @@ enum
   CPUID_INDEX_80000008,
   CPUID_INDEX_7_ECX_1,
   CPUID_INDEX_19,
-  CPUID_INDEX_14_ECX_0
+  CPUID_INDEX_14_ECX_0,
+  CPUID_INDEX_24_ECX_0
 };
 
 struct cpuid_feature
@@ -312,6 +313,7 @@ enum
   x86_cpu_AVX_NE_CONVERT	= x86_cpu_index_7_ecx_1_edx + 5,
   x86_cpu_AMX_COMPLEX		= x86_cpu_index_7_ecx_1_edx + 8,
   x86_cpu_PREFETCHI		= x86_cpu_index_7_ecx_1_edx + 14,
+  x86_cpu_AVX10			= x86_cpu_index_7_ecx_1_edx + 19,
   x86_cpu_APX_F			= x86_cpu_index_7_ecx_1_edx + 21,
 
   x86_cpu_index_19_ebx
@@ -325,5 +327,280 @@ enum
     = (CPUID_INDEX_14_ECX_0 * 8 * 4 * sizeof (unsigned int)
        + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
 
-  x86_cpu_PTWRITE		= x86_cpu_index_14_ecx_0_ebx + 4
+  x86_cpu_PTWRITE		= x86_cpu_index_14_ecx_0_ebx + 4,
+
+  x86_cpu_index_24_ecx_0_ebx
+    = (CPUID_INDEX_24_ECX_0 * 8 * 4 * sizeof (unsigned int)
+       + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
+
+  x86_cpu_AVX10_XMM = x86_cpu_index_24_ecx_0_ebx + 16,
+  x86_cpu_AVX10_YMM = x86_cpu_index_24_ecx_0_ebx + 17,
+  x86_cpu_AVX10_ZMM = x86_cpu_index_24_ecx_0_ebx + 18,
+
+/* AVX10 version information is handled differently from all other CPUID
+   related logic.  Rather than being encoded in cpuid as discrete booleans, the
+   AVX10 version is encoded is a full byte that represents the version number
+   (greater than or equal to 1).  Since the CPUID API is only able to handle
+   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
+   by the user and have special logic in `x86_cpu_{present,active}`.  This is
+   unpleasant on our end, but is the only way to make the existing API also
+   support version queries.  */
+
+  /* All 1s should never be a value feature index.  */
+  x86_cpu_AVX10_V255 = ~0,
+  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
+  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
+  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
+  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,
+  x86_cpu_AVX10_V250 = x86_cpu_AVX10_V251 - 1,
+  x86_cpu_AVX10_V249 = x86_cpu_AVX10_V250 - 1,
+  x86_cpu_AVX10_V248 = x86_cpu_AVX10_V249 - 1,
+  x86_cpu_AVX10_V247 = x86_cpu_AVX10_V248 - 1,
+  x86_cpu_AVX10_V246 = x86_cpu_AVX10_V247 - 1,
+  x86_cpu_AVX10_V245 = x86_cpu_AVX10_V246 - 1,
+  x86_cpu_AVX10_V244 = x86_cpu_AVX10_V245 - 1,
+  x86_cpu_AVX10_V243 = x86_cpu_AVX10_V244 - 1,
+  x86_cpu_AVX10_V242 = x86_cpu_AVX10_V243 - 1,
+  x86_cpu_AVX10_V241 = x86_cpu_AVX10_V242 - 1,
+  x86_cpu_AVX10_V240 = x86_cpu_AVX10_V241 - 1,
+  x86_cpu_AVX10_V239 = x86_cpu_AVX10_V240 - 1,
+  x86_cpu_AVX10_V238 = x86_cpu_AVX10_V239 - 1,
+  x86_cpu_AVX10_V237 = x86_cpu_AVX10_V238 - 1,
+  x86_cpu_AVX10_V236 = x86_cpu_AVX10_V237 - 1,
+  x86_cpu_AVX10_V235 = x86_cpu_AVX10_V236 - 1,
+  x86_cpu_AVX10_V234 = x86_cpu_AVX10_V235 - 1,
+  x86_cpu_AVX10_V233 = x86_cpu_AVX10_V234 - 1,
+  x86_cpu_AVX10_V232 = x86_cpu_AVX10_V233 - 1,
+  x86_cpu_AVX10_V231 = x86_cpu_AVX10_V232 - 1,
+  x86_cpu_AVX10_V230 = x86_cpu_AVX10_V231 - 1,
+  x86_cpu_AVX10_V229 = x86_cpu_AVX10_V230 - 1,
+  x86_cpu_AVX10_V228 = x86_cpu_AVX10_V229 - 1,
+  x86_cpu_AVX10_V227 = x86_cpu_AVX10_V228 - 1,
+  x86_cpu_AVX10_V226 = x86_cpu_AVX10_V227 - 1,
+  x86_cpu_AVX10_V225 = x86_cpu_AVX10_V226 - 1,
+  x86_cpu_AVX10_V224 = x86_cpu_AVX10_V225 - 1,
+  x86_cpu_AVX10_V223 = x86_cpu_AVX10_V224 - 1,
+  x86_cpu_AVX10_V222 = x86_cpu_AVX10_V223 - 1,
+  x86_cpu_AVX10_V221 = x86_cpu_AVX10_V222 - 1,
+  x86_cpu_AVX10_V220 = x86_cpu_AVX10_V221 - 1,
+  x86_cpu_AVX10_V219 = x86_cpu_AVX10_V220 - 1,
+  x86_cpu_AVX10_V218 = x86_cpu_AVX10_V219 - 1,
+  x86_cpu_AVX10_V217 = x86_cpu_AVX10_V218 - 1,
+  x86_cpu_AVX10_V216 = x86_cpu_AVX10_V217 - 1,
+  x86_cpu_AVX10_V215 = x86_cpu_AVX10_V216 - 1,
+  x86_cpu_AVX10_V214 = x86_cpu_AVX10_V215 - 1,
+  x86_cpu_AVX10_V213 = x86_cpu_AVX10_V214 - 1,
+  x86_cpu_AVX10_V212 = x86_cpu_AVX10_V213 - 1,
+  x86_cpu_AVX10_V211 = x86_cpu_AVX10_V212 - 1,
+  x86_cpu_AVX10_V210 = x86_cpu_AVX10_V211 - 1,
+  x86_cpu_AVX10_V209 = x86_cpu_AVX10_V210 - 1,
+  x86_cpu_AVX10_V208 = x86_cpu_AVX10_V209 - 1,
+  x86_cpu_AVX10_V207 = x86_cpu_AVX10_V208 - 1,
+  x86_cpu_AVX10_V206 = x86_cpu_AVX10_V207 - 1,
+  x86_cpu_AVX10_V205 = x86_cpu_AVX10_V206 - 1,
+  x86_cpu_AVX10_V204 = x86_cpu_AVX10_V205 - 1,
+  x86_cpu_AVX10_V203 = x86_cpu_AVX10_V204 - 1,
+  x86_cpu_AVX10_V202 = x86_cpu_AVX10_V203 - 1,
+  x86_cpu_AVX10_V201 = x86_cpu_AVX10_V202 - 1,
+  x86_cpu_AVX10_V200 = x86_cpu_AVX10_V201 - 1,
+  x86_cpu_AVX10_V199 = x86_cpu_AVX10_V200 - 1,
+  x86_cpu_AVX10_V198 = x86_cpu_AVX10_V199 - 1,
+  x86_cpu_AVX10_V197 = x86_cpu_AVX10_V198 - 1,
+  x86_cpu_AVX10_V196 = x86_cpu_AVX10_V197 - 1,
+  x86_cpu_AVX10_V195 = x86_cpu_AVX10_V196 - 1,
+  x86_cpu_AVX10_V194 = x86_cpu_AVX10_V195 - 1,
+  x86_cpu_AVX10_V193 = x86_cpu_AVX10_V194 - 1,
+  x86_cpu_AVX10_V192 = x86_cpu_AVX10_V193 - 1,
+  x86_cpu_AVX10_V191 = x86_cpu_AVX10_V192 - 1,
+  x86_cpu_AVX10_V190 = x86_cpu_AVX10_V191 - 1,
+  x86_cpu_AVX10_V189 = x86_cpu_AVX10_V190 - 1,
+  x86_cpu_AVX10_V188 = x86_cpu_AVX10_V189 - 1,
+  x86_cpu_AVX10_V187 = x86_cpu_AVX10_V188 - 1,
+  x86_cpu_AVX10_V186 = x86_cpu_AVX10_V187 - 1,
+  x86_cpu_AVX10_V185 = x86_cpu_AVX10_V186 - 1,
+  x86_cpu_AVX10_V184 = x86_cpu_AVX10_V185 - 1,
+  x86_cpu_AVX10_V183 = x86_cpu_AVX10_V184 - 1,
+  x86_cpu_AVX10_V182 = x86_cpu_AVX10_V183 - 1,
+  x86_cpu_AVX10_V181 = x86_cpu_AVX10_V182 - 1,
+  x86_cpu_AVX10_V180 = x86_cpu_AVX10_V181 - 1,
+  x86_cpu_AVX10_V179 = x86_cpu_AVX10_V180 - 1,
+  x86_cpu_AVX10_V178 = x86_cpu_AVX10_V179 - 1,
+  x86_cpu_AVX10_V177 = x86_cpu_AVX10_V178 - 1,
+  x86_cpu_AVX10_V176 = x86_cpu_AVX10_V177 - 1,
+  x86_cpu_AVX10_V175 = x86_cpu_AVX10_V176 - 1,
+  x86_cpu_AVX10_V174 = x86_cpu_AVX10_V175 - 1,
+  x86_cpu_AVX10_V173 = x86_cpu_AVX10_V174 - 1,
+  x86_cpu_AVX10_V172 = x86_cpu_AVX10_V173 - 1,
+  x86_cpu_AVX10_V171 = x86_cpu_AVX10_V172 - 1,
+  x86_cpu_AVX10_V170 = x86_cpu_AVX10_V171 - 1,
+  x86_cpu_AVX10_V169 = x86_cpu_AVX10_V170 - 1,
+  x86_cpu_AVX10_V168 = x86_cpu_AVX10_V169 - 1,
+  x86_cpu_AVX10_V167 = x86_cpu_AVX10_V168 - 1,
+  x86_cpu_AVX10_V166 = x86_cpu_AVX10_V167 - 1,
+  x86_cpu_AVX10_V165 = x86_cpu_AVX10_V166 - 1,
+  x86_cpu_AVX10_V164 = x86_cpu_AVX10_V165 - 1,
+  x86_cpu_AVX10_V163 = x86_cpu_AVX10_V164 - 1,
+  x86_cpu_AVX10_V162 = x86_cpu_AVX10_V163 - 1,
+  x86_cpu_AVX10_V161 = x86_cpu_AVX10_V162 - 1,
+  x86_cpu_AVX10_V160 = x86_cpu_AVX10_V161 - 1,
+  x86_cpu_AVX10_V159 = x86_cpu_AVX10_V160 - 1,
+  x86_cpu_AVX10_V158 = x86_cpu_AVX10_V159 - 1,
+  x86_cpu_AVX10_V157 = x86_cpu_AVX10_V158 - 1,
+  x86_cpu_AVX10_V156 = x86_cpu_AVX10_V157 - 1,
+  x86_cpu_AVX10_V155 = x86_cpu_AVX10_V156 - 1,
+  x86_cpu_AVX10_V154 = x86_cpu_AVX10_V155 - 1,
+  x86_cpu_AVX10_V153 = x86_cpu_AVX10_V154 - 1,
+  x86_cpu_AVX10_V152 = x86_cpu_AVX10_V153 - 1,
+  x86_cpu_AVX10_V151 = x86_cpu_AVX10_V152 - 1,
+  x86_cpu_AVX10_V150 = x86_cpu_AVX10_V151 - 1,
+  x86_cpu_AVX10_V149 = x86_cpu_AVX10_V150 - 1,
+  x86_cpu_AVX10_V148 = x86_cpu_AVX10_V149 - 1,
+  x86_cpu_AVX10_V147 = x86_cpu_AVX10_V148 - 1,
+  x86_cpu_AVX10_V146 = x86_cpu_AVX10_V147 - 1,
+  x86_cpu_AVX10_V145 = x86_cpu_AVX10_V146 - 1,
+  x86_cpu_AVX10_V144 = x86_cpu_AVX10_V145 - 1,
+  x86_cpu_AVX10_V143 = x86_cpu_AVX10_V144 - 1,
+  x86_cpu_AVX10_V142 = x86_cpu_AVX10_V143 - 1,
+  x86_cpu_AVX10_V141 = x86_cpu_AVX10_V142 - 1,
+  x86_cpu_AVX10_V140 = x86_cpu_AVX10_V141 - 1,
+  x86_cpu_AVX10_V139 = x86_cpu_AVX10_V140 - 1,
+  x86_cpu_AVX10_V138 = x86_cpu_AVX10_V139 - 1,
+  x86_cpu_AVX10_V137 = x86_cpu_AVX10_V138 - 1,
+  x86_cpu_AVX10_V136 = x86_cpu_AVX10_V137 - 1,
+  x86_cpu_AVX10_V135 = x86_cpu_AVX10_V136 - 1,
+  x86_cpu_AVX10_V134 = x86_cpu_AVX10_V135 - 1,
+  x86_cpu_AVX10_V133 = x86_cpu_AVX10_V134 - 1,
+  x86_cpu_AVX10_V132 = x86_cpu_AVX10_V133 - 1,
+  x86_cpu_AVX10_V131 = x86_cpu_AVX10_V132 - 1,
+  x86_cpu_AVX10_V130 = x86_cpu_AVX10_V131 - 1,
+  x86_cpu_AVX10_V129 = x86_cpu_AVX10_V130 - 1,
+  x86_cpu_AVX10_V128 = x86_cpu_AVX10_V129 - 1,
+  x86_cpu_AVX10_V127 = x86_cpu_AVX10_V128 - 1,
+  x86_cpu_AVX10_V126 = x86_cpu_AVX10_V127 - 1,
+  x86_cpu_AVX10_V125 = x86_cpu_AVX10_V126 - 1,
+  x86_cpu_AVX10_V124 = x86_cpu_AVX10_V125 - 1,
+  x86_cpu_AVX10_V123 = x86_cpu_AVX10_V124 - 1,
+  x86_cpu_AVX10_V122 = x86_cpu_AVX10_V123 - 1,
+  x86_cpu_AVX10_V121 = x86_cpu_AVX10_V122 - 1,
+  x86_cpu_AVX10_V120 = x86_cpu_AVX10_V121 - 1,
+  x86_cpu_AVX10_V119 = x86_cpu_AVX10_V120 - 1,
+  x86_cpu_AVX10_V118 = x86_cpu_AVX10_V119 - 1,
+  x86_cpu_AVX10_V117 = x86_cpu_AVX10_V118 - 1,
+  x86_cpu_AVX10_V116 = x86_cpu_AVX10_V117 - 1,
+  x86_cpu_AVX10_V115 = x86_cpu_AVX10_V116 - 1,
+  x86_cpu_AVX10_V114 = x86_cpu_AVX10_V115 - 1,
+  x86_cpu_AVX10_V113 = x86_cpu_AVX10_V114 - 1,
+  x86_cpu_AVX10_V112 = x86_cpu_AVX10_V113 - 1,
+  x86_cpu_AVX10_V111 = x86_cpu_AVX10_V112 - 1,
+  x86_cpu_AVX10_V110 = x86_cpu_AVX10_V111 - 1,
+  x86_cpu_AVX10_V109 = x86_cpu_AVX10_V110 - 1,
+  x86_cpu_AVX10_V108 = x86_cpu_AVX10_V109 - 1,
+  x86_cpu_AVX10_V107 = x86_cpu_AVX10_V108 - 1,
+  x86_cpu_AVX10_V106 = x86_cpu_AVX10_V107 - 1,
+  x86_cpu_AVX10_V105 = x86_cpu_AVX10_V106 - 1,
+  x86_cpu_AVX10_V104 = x86_cpu_AVX10_V105 - 1,
+  x86_cpu_AVX10_V103 = x86_cpu_AVX10_V104 - 1,
+  x86_cpu_AVX10_V102 = x86_cpu_AVX10_V103 - 1,
+  x86_cpu_AVX10_V101 = x86_cpu_AVX10_V102 - 1,
+  x86_cpu_AVX10_V100 = x86_cpu_AVX10_V101 - 1,
+  x86_cpu_AVX10_V99 = x86_cpu_AVX10_V100 - 1,
+  x86_cpu_AVX10_V98 = x86_cpu_AVX10_V99 - 1,
+  x86_cpu_AVX10_V97 = x86_cpu_AVX10_V98 - 1,
+  x86_cpu_AVX10_V96 = x86_cpu_AVX10_V97 - 1,
+  x86_cpu_AVX10_V95 = x86_cpu_AVX10_V96 - 1,
+  x86_cpu_AVX10_V94 = x86_cpu_AVX10_V95 - 1,
+  x86_cpu_AVX10_V93 = x86_cpu_AVX10_V94 - 1,
+  x86_cpu_AVX10_V92 = x86_cpu_AVX10_V93 - 1,
+  x86_cpu_AVX10_V91 = x86_cpu_AVX10_V92 - 1,
+  x86_cpu_AVX10_V90 = x86_cpu_AVX10_V91 - 1,
+  x86_cpu_AVX10_V89 = x86_cpu_AVX10_V90 - 1,
+  x86_cpu_AVX10_V88 = x86_cpu_AVX10_V89 - 1,
+  x86_cpu_AVX10_V87 = x86_cpu_AVX10_V88 - 1,
+  x86_cpu_AVX10_V86 = x86_cpu_AVX10_V87 - 1,
+  x86_cpu_AVX10_V85 = x86_cpu_AVX10_V86 - 1,
+  x86_cpu_AVX10_V84 = x86_cpu_AVX10_V85 - 1,
+  x86_cpu_AVX10_V83 = x86_cpu_AVX10_V84 - 1,
+  x86_cpu_AVX10_V82 = x86_cpu_AVX10_V83 - 1,
+  x86_cpu_AVX10_V81 = x86_cpu_AVX10_V82 - 1,
+  x86_cpu_AVX10_V80 = x86_cpu_AVX10_V81 - 1,
+  x86_cpu_AVX10_V79 = x86_cpu_AVX10_V80 - 1,
+  x86_cpu_AVX10_V78 = x86_cpu_AVX10_V79 - 1,
+  x86_cpu_AVX10_V77 = x86_cpu_AVX10_V78 - 1,
+  x86_cpu_AVX10_V76 = x86_cpu_AVX10_V77 - 1,
+  x86_cpu_AVX10_V75 = x86_cpu_AVX10_V76 - 1,
+  x86_cpu_AVX10_V74 = x86_cpu_AVX10_V75 - 1,
+  x86_cpu_AVX10_V73 = x86_cpu_AVX10_V74 - 1,
+  x86_cpu_AVX10_V72 = x86_cpu_AVX10_V73 - 1,
+  x86_cpu_AVX10_V71 = x86_cpu_AVX10_V72 - 1,
+  x86_cpu_AVX10_V70 = x86_cpu_AVX10_V71 - 1,
+  x86_cpu_AVX10_V69 = x86_cpu_AVX10_V70 - 1,
+  x86_cpu_AVX10_V68 = x86_cpu_AVX10_V69 - 1,
+  x86_cpu_AVX10_V67 = x86_cpu_AVX10_V68 - 1,
+  x86_cpu_AVX10_V66 = x86_cpu_AVX10_V67 - 1,
+  x86_cpu_AVX10_V65 = x86_cpu_AVX10_V66 - 1,
+  x86_cpu_AVX10_V64 = x86_cpu_AVX10_V65 - 1,
+  x86_cpu_AVX10_V63 = x86_cpu_AVX10_V64 - 1,
+  x86_cpu_AVX10_V62 = x86_cpu_AVX10_V63 - 1,
+  x86_cpu_AVX10_V61 = x86_cpu_AVX10_V62 - 1,
+  x86_cpu_AVX10_V60 = x86_cpu_AVX10_V61 - 1,
+  x86_cpu_AVX10_V59 = x86_cpu_AVX10_V60 - 1,
+  x86_cpu_AVX10_V58 = x86_cpu_AVX10_V59 - 1,
+  x86_cpu_AVX10_V57 = x86_cpu_AVX10_V58 - 1,
+  x86_cpu_AVX10_V56 = x86_cpu_AVX10_V57 - 1,
+  x86_cpu_AVX10_V55 = x86_cpu_AVX10_V56 - 1,
+  x86_cpu_AVX10_V54 = x86_cpu_AVX10_V55 - 1,
+  x86_cpu_AVX10_V53 = x86_cpu_AVX10_V54 - 1,
+  x86_cpu_AVX10_V52 = x86_cpu_AVX10_V53 - 1,
+  x86_cpu_AVX10_V51 = x86_cpu_AVX10_V52 - 1,
+  x86_cpu_AVX10_V50 = x86_cpu_AVX10_V51 - 1,
+  x86_cpu_AVX10_V49 = x86_cpu_AVX10_V50 - 1,
+  x86_cpu_AVX10_V48 = x86_cpu_AVX10_V49 - 1,
+  x86_cpu_AVX10_V47 = x86_cpu_AVX10_V48 - 1,
+  x86_cpu_AVX10_V46 = x86_cpu_AVX10_V47 - 1,
+  x86_cpu_AVX10_V45 = x86_cpu_AVX10_V46 - 1,
+  x86_cpu_AVX10_V44 = x86_cpu_AVX10_V45 - 1,
+  x86_cpu_AVX10_V43 = x86_cpu_AVX10_V44 - 1,
+  x86_cpu_AVX10_V42 = x86_cpu_AVX10_V43 - 1,
+  x86_cpu_AVX10_V41 = x86_cpu_AVX10_V42 - 1,
+  x86_cpu_AVX10_V40 = x86_cpu_AVX10_V41 - 1,
+  x86_cpu_AVX10_V39 = x86_cpu_AVX10_V40 - 1,
+  x86_cpu_AVX10_V38 = x86_cpu_AVX10_V39 - 1,
+  x86_cpu_AVX10_V37 = x86_cpu_AVX10_V38 - 1,
+  x86_cpu_AVX10_V36 = x86_cpu_AVX10_V37 - 1,
+  x86_cpu_AVX10_V35 = x86_cpu_AVX10_V36 - 1,
+  x86_cpu_AVX10_V34 = x86_cpu_AVX10_V35 - 1,
+  x86_cpu_AVX10_V33 = x86_cpu_AVX10_V34 - 1,
+  x86_cpu_AVX10_V32 = x86_cpu_AVX10_V33 - 1,
+  x86_cpu_AVX10_V31 = x86_cpu_AVX10_V32 - 1,
+  x86_cpu_AVX10_V30 = x86_cpu_AVX10_V31 - 1,
+  x86_cpu_AVX10_V29 = x86_cpu_AVX10_V30 - 1,
+  x86_cpu_AVX10_V28 = x86_cpu_AVX10_V29 - 1,
+  x86_cpu_AVX10_V27 = x86_cpu_AVX10_V28 - 1,
+  x86_cpu_AVX10_V26 = x86_cpu_AVX10_V27 - 1,
+  x86_cpu_AVX10_V25 = x86_cpu_AVX10_V26 - 1,
+  x86_cpu_AVX10_V24 = x86_cpu_AVX10_V25 - 1,
+  x86_cpu_AVX10_V23 = x86_cpu_AVX10_V24 - 1,
+  x86_cpu_AVX10_V22 = x86_cpu_AVX10_V23 - 1,
+  x86_cpu_AVX10_V21 = x86_cpu_AVX10_V22 - 1,
+  x86_cpu_AVX10_V20 = x86_cpu_AVX10_V21 - 1,
+  x86_cpu_AVX10_V19 = x86_cpu_AVX10_V20 - 1,
+  x86_cpu_AVX10_V18 = x86_cpu_AVX10_V19 - 1,
+  x86_cpu_AVX10_V17 = x86_cpu_AVX10_V18 - 1,
+  x86_cpu_AVX10_V16 = x86_cpu_AVX10_V17 - 1,
+  x86_cpu_AVX10_V15 = x86_cpu_AVX10_V16 - 1,
+  x86_cpu_AVX10_V14 = x86_cpu_AVX10_V15 - 1,
+  x86_cpu_AVX10_V13 = x86_cpu_AVX10_V14 - 1,
+  x86_cpu_AVX10_V12 = x86_cpu_AVX10_V13 - 1,
+  x86_cpu_AVX10_V11 = x86_cpu_AVX10_V12 - 1,
+  x86_cpu_AVX10_V10 = x86_cpu_AVX10_V11 - 1,
+  x86_cpu_AVX10_V9 = x86_cpu_AVX10_V10 - 1,
+  x86_cpu_AVX10_V8 = x86_cpu_AVX10_V9 - 1,
+  x86_cpu_AVX10_V7 = x86_cpu_AVX10_V8 - 1,
+  x86_cpu_AVX10_V6 = x86_cpu_AVX10_V7 - 1,
+  x86_cpu_AVX10_V5 = x86_cpu_AVX10_V6 - 1,
+  x86_cpu_AVX10_V4 = x86_cpu_AVX10_V5 - 1,
+  x86_cpu_AVX10_V3 = x86_cpu_AVX10_V4 - 1,
+  x86_cpu_AVX10_V2 = x86_cpu_AVX10_V3 - 1,
+  x86_cpu_AVX10_V1 = x86_cpu_AVX10_V2 - 1
+/* x86_cpu_AVX10_V0 is invalid.  */
 };
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index badf088874..0bf923d48b 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -115,11 +115,18 @@ update_active (struct cpu_features *cpu_features)
   CPU_FEATURE_SET_ACTIVE (cpu_features, SHSTK);
 #endif
 
+  enum
+  {
+    os_xmm = 1,
+    os_ymm = 2,
+    os_zmm = 4
+  } os_vector_size = os_xmm;
   /* Can we call xgetbv?  */
   if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE))
     {
       unsigned int xcrlow;
       unsigned int xcrhigh;
+      CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10);
       asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0));
       /* Is YMM and XMM state usable?  */
       if ((xcrlow & (bit_YMM_state | bit_XMM_state))
@@ -128,6 +135,7 @@ update_active (struct cpu_features *cpu_features)
 	  /* Determine if AVX is usable.  */
 	  if (CPU_FEATURES_CPU_P (cpu_features, AVX))
 	    {
+	      os_vector_size |= os_ymm;
 	      CPU_FEATURE_SET (cpu_features, AVX);
 	      /* The following features depend on AVX being usable.  */
 	      /* Determine if AVX2 is usable.  */
@@ -166,6 +174,7 @@ update_active (struct cpu_features *cpu_features)
 			 | bit_ZMM16_31_state))
 	      == (bit_Opmask_state | bit_ZMM0_15_state | bit_ZMM16_31_state))
 	    {
+	      os_vector_size |= os_zmm;
 	      /* Determine if AVX512F is usable.  */
 	      if (CPU_FEATURES_CPU_P (cpu_features, AVX512F))
 		{
@@ -210,6 +219,22 @@ update_active (struct cpu_features *cpu_features)
 	    }
 	}
 
+      if (CPU_FEATURES_CPU_P (cpu_features, AVX10)
+	  && cpu_features->basic.max_cpuid >= 0x24)
+	{
+	  __cpuid_count (
+	      0x24, 0, cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.eax,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ebx,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ecx,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.edx);
+	  if (os_vector_size & os_xmm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_XMM);
+	  if (os_vector_size & os_ymm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_YMM);
+	  if (os_vector_size & os_zmm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_ZMM);
+	}
+
       /* 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 eb30d342a6..2d7427a6c0 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_14_ECX_0 + 1
+  CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_0 + 1
 };
 
 enum
@@ -319,6 +319,7 @@ enum
 #define bit_cpu_AVX_NE_CONVERT	(1u << 5)
 #define bit_cpu_AMX_COMPLEX	(1u << 8)
 #define bit_cpu_PREFETCHI	(1u << 14)
+#define bit_cpu_AVX10		(1u << 19)
 #define bit_cpu_APX_F		(1u << 21)
 
 /* CPUID_INDEX_19.  */
@@ -332,6 +333,13 @@ enum
 /* EBX.  */
 #define bit_cpu_PTWRITE		(1u << 4)
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define bit_cpu_AVX10_XMM		(1u << 16)
+#define bit_cpu_AVX10_YMM		(1u << 17)
+#define bit_cpu_AVX10_ZMM		(1u << 18)
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -563,6 +571,7 @@ enum
 #define index_cpu_AVX_NE_CONVERT CPUID_INDEX_7_ECX_1
 #define index_cpu_AMX_COMPLEX	CPUID_INDEX_7_ECX_1
 #define index_cpu_PREFETCHI	CPUID_INDEX_7_ECX_1
+#define index_cpu_AVX10		CPUID_INDEX_7_ECX_1
 #define index_cpu_APX_F		CPUID_INDEX_7_ECX_1
 
 /* CPUID_INDEX_19.  */
@@ -576,6 +585,13 @@ enum
 /* EBX.  */
 #define index_cpu_PTWRITE	CPUID_INDEX_14_ECX_0
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define index_cpu_AVX10_XMM	CPUID_INDEX_24_ECX_0
+#define index_cpu_AVX10_YMM	CPUID_INDEX_24_ECX_0
+#define index_cpu_AVX10_ZMM	CPUID_INDEX_24_ECX_0
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -809,6 +825,7 @@ enum
 #define reg_AVX_NE_CONVERT	edx
 #define reg_AMX_COMPLEX		edx
 #define reg_PREFETCHI		edx
+#define reg_AVX10		edx
 #define reg_APX_F		edx
 
 /* CPUID_INDEX_19.  */
@@ -822,6 +839,14 @@ enum
 /* EBX.  */
 #define reg_PTWRITE		ebx
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define reg_AVX10_XMM		ebx
+#define reg_AVX10_YMM		ebx
+#define reg_AVX10_ZMM		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/sys/platform/x86.h b/sysdeps/x86/sys/platform/x86.h
index 1ea2c5fc0b..fa8c7e158d 100644
--- a/sysdeps/x86/sys/platform/x86.h
+++ b/sysdeps/x86/sys/platform/x86.h
@@ -29,9 +29,45 @@ __BEGIN_DECLS
 extern const struct cpuid_feature *__x86_get_cpuid_feature_leaf (unsigned int)
      __attribute__ ((pure));
 
+static __inline__ unsigned int
+x86_cpu_get_avx10_version_number_from_enum (unsigned int __enum)
+{
+  return __enum - x86_cpu_AVX10_V1 + 1;
+}
+
+static __inline__ _Bool
+x86_cpu_is_index_avx10_version_number (unsigned int __index)
+{
+  return __index >= (unsigned int) x86_cpu_AVX10_V1
+	 && __index <= (unsigned int) x86_cpu_AVX10_V255;
+}
+
+static __inline__ unsigned int
+x86_cpu_get_avx10_info (unsigned int __index)
+{
+  const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf (
+      __index / (8 * sizeof (unsigned int) * 4));
+  unsigned int __reg = __index & (8 * sizeof (unsigned int) * 4 - 1);
+  __reg /= 8 * sizeof (unsigned int);
+
+  return __ptr->cpuid_array[__reg];
+}
+
+/* Get AVX10 version number in byte form.  Must check AVX10 active first. Value
+   is in range [1, 255].  */
+static __inline__ unsigned int
+x86_cpu_get_avx10_version_number (void)
+{
+  return x86_cpu_get_avx10_info (x86_cpu_index_24_ecx_0_ebx) & 0xff;
+}
+
 static __inline__ _Bool
 x86_cpu_present (unsigned int __index)
 {
+  if (x86_cpu_is_index_avx10_version_number (__index))
+    return x86_cpu_get_avx10_version_number ()
+	   >= x86_cpu_get_avx10_version_number_from_enum (__index);
+
   const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
     (__index / (8 * sizeof (unsigned int) * 4));
   unsigned int __reg
@@ -45,6 +81,10 @@ x86_cpu_present (unsigned int __index)
 static __inline__ _Bool
 x86_cpu_active (unsigned int __index)
 {
+  if (x86_cpu_is_index_avx10_version_number (__index))
+    return x86_cpu_get_avx10_version_number ()
+	   >= x86_cpu_get_avx10_version_number_from_enum (__index);
+
   const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
     (__index / (8 * sizeof (unsigned int) * 4));
   unsigned int __reg
diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c
index b27fa7324a..53e68431f1 100644
--- a/sysdeps/x86/tst-get-cpu-features.c
+++ b/sysdeps/x86/tst-get-cpu-features.c
@@ -219,6 +219,7 @@ do_test (void)
   CHECK_CPU_FEATURE_PRESENT (AVX_NE_CONVERT);
   CHECK_CPU_FEATURE_PRESENT (AMX_COMPLEX);
   CHECK_CPU_FEATURE_PRESENT (PREFETCHI);
+  CHECK_CPU_FEATURE_PRESENT (AVX10);
   CHECK_CPU_FEATURE_PRESENT (APX_F);
   CHECK_CPU_FEATURE_PRESENT (AESKLE);
   CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
@@ -391,11 +392,273 @@ do_test (void)
   CHECK_CPU_FEATURE_ACTIVE (AVX_NE_CONVERT);
   CHECK_CPU_FEATURE_ACTIVE (AMX_COMPLEX);
   CHECK_CPU_FEATURE_ACTIVE (PREFETCHI);
+  CHECK_CPU_FEATURE_ACTIVE (AVX10);
   CHECK_CPU_FEATURE_ACTIVE (APX_F);
   CHECK_CPU_FEATURE_ACTIVE (AESKLE);
   CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
   CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
 
+  if (CPU_FEATURE_ACTIVE (AVX10))
+    {
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_XMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_YMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_ZMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V1);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V2);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V3);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V4);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V5);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V6);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V7);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V8);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V9);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V10);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V11);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V12);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V13);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V14);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V15);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V16);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V17);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V18);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V19);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V20);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V21);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V22);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V23);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V24);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V25);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V26);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V27);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V28);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V29);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V30);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V31);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V32);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V33);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V34);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V35);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V36);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V37);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V38);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V39);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V40);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V41);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V42);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V43);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V44);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V45);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V46);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V47);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V48);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V49);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V50);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V51);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V52);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V53);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V54);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V55);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V56);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V57);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V58);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V59);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V60);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V61);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V62);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V63);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V64);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V65);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V66);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V67);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V68);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V69);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V70);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V71);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V72);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V73);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V74);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V75);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V76);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V77);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V78);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V79);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V80);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V81);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V82);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V83);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V84);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V85);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V86);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V87);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V88);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V89);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V90);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V91);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V92);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V93);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V94);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V95);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V96);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V97);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V98);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V99);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V100);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V101);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V102);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V103);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V104);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V105);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V106);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V107);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V108);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V109);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V110);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V111);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V112);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V113);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V114);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V115);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V116);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V117);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V118);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V119);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V120);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V121);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V122);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V123);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V124);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V125);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V126);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V127);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V128);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V129);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V130);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V131);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V132);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V133);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V134);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V135);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V136);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V137);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V138);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V139);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V140);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V141);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V142);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V143);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V144);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V145);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V146);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V147);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V148);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V149);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V150);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V151);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V152);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V153);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V154);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V155);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V156);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V157);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V158);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V159);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V160);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V161);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V162);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V163);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V164);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V165);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V166);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V167);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V168);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V169);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V170);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V171);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V172);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V173);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V174);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V175);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V176);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V177);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V178);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V179);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V180);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V181);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V182);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V183);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V184);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V185);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V186);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V187);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V188);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V189);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V190);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V191);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V192);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V193);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V194);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V195);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V196);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V197);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V198);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V199);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V200);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V201);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V202);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V203);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V204);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V205);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V206);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V207);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V208);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V209);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V210);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V211);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V212);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V213);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V214);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V215);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V216);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V217);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V218);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V219);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V220);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V221);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V222);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V223);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V224);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V225);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V226);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V227);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V228);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V229);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V230);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V231);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V232);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V233);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V234);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V235);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V236);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V237);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V238);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V239);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V240);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V241);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V242);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V243);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V244);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V245);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V246);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V247);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V248);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V249);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V250);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V251);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V252);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V253);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V254);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V255);
+    }
   return 0;
 }
 
-- 
2.34.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v1] x86: Add support for AVX10 version and vec size in cpu-features
  2023-08-24 19:01 ` H.J. Lu
@ 2023-08-24 19:14   ` Noah Goldstein
  0 siblings, 0 replies; 12+ messages in thread
From: Noah Goldstein @ 2023-08-24 19:14 UTC (permalink / raw)
  To: H.J. Lu; +Cc: libc-alpha, carlos

On Thu, Aug 24, 2023 at 2:01 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Thu, Aug 24, 2023 at 11:48 AM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
> >
> > This commit add support for the new AVX10 cpu features:
> > https://cdrdv2-public.intel.com/784267/355989-intel-avx10-spec.pdf
> >
> > We add checks for:
> >     - `AVX10`: Check if AVX10 is present.
> >     - `AVX10_V{1..255}`: Check if a given version is active.
> >     - `AVX10_{X,Y,Z}MM`: Check if a given vec class has AVX10 support.
> >
> > The version checks are not ideal, the reason for the reason for this
> > is the version information in AVX10 is encoded as complete a byte
> > value, but the `CPU_FEATURES` interface is only able to query bools.
> >
> > To get around this, we add a feature for each possible version value
> > (starting at 1 as there is no AVX10 version 0).
> >
> > `make check` passes and cpuid output was checked against GNR/DMR on an
> > emulator.
> > ---
> >  manual/platform.texi               |  28 +++
> >  sysdeps/x86/bits/platform/x86.h    | 281 ++++++++++++++++++++++++++++-
> >  sysdeps/x86/cpu-features.c         |  25 +++
> >  sysdeps/x86/include/cpu-features.h |  27 ++-
> >  sysdeps/x86/sys/platform/x86.h     |  40 ++++
> >  sysdeps/x86/tst-get-cpu-features.c | 263 +++++++++++++++++++++++++++
> >  6 files changed, 661 insertions(+), 3 deletions(-)
> >
> > diff --git a/manual/platform.texi b/manual/platform.texi
> > index 2a2d557067..99dc57b568 100644
> > --- a/manual/platform.texi
> > +++ b/manual/platform.texi
> > @@ -222,6 +222,22 @@ Leaf (EAX = 23H).
> >  @item
> >  @code{AVX} -- The AVX instruction extensions.
> >
> > +@item
> > +@code{AVX10} -- The AVX10 instruction extensions.
> > +
> > +@item
> > +@code{AVX10_XMM} -- Whether AVX10 includes xmm registers.
> > +
> > +@item
> > +@code{AVX10_YMM} -- Whether AVX10 includes ymm registers.
> > +
> > +@item
> > +@code{AVX10_ZMM} -- Whether AVX10 includes zmm registers.
> > +
> > +@item
> > +@code{AVX10_V1}..@code{AVX10_V255} -- Whether AVX10 supports a given
> > +version.
> > +
> >  @item
> >  @code{AVX2} -- The AVX2 instruction extensions.
> >
> > @@ -760,3 +776,15 @@ avx_active (void)
> >    return CPU_FEATURE_ACTIVE (AVX);
> >  @}
> >  @end smallexample
> > +
> > +You could query @code{AVX10} version number with:
> > +
> > +@smallexample
> > +#include <sys/platform/x86.h>
> > +
> > +int
> > +has_avx10_version1 (void)
> > +@{
> > +  return CPU_FEATURE_ACTIVE (AVX10_V1); // Up to AVX10_V255
> > +@}
> > +@end smallexample
> > diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
> > index 88ca071aa7..777fb6ce18 100644
> > --- a/sysdeps/x86/bits/platform/x86.h
> > +++ b/sysdeps/x86/bits/platform/x86.h
> > @@ -30,7 +30,8 @@ enum
> >    CPUID_INDEX_80000008,
> >    CPUID_INDEX_7_ECX_1,
> >    CPUID_INDEX_19,
> > -  CPUID_INDEX_14_ECX_0
> > +  CPUID_INDEX_14_ECX_0,
> > +  CPUID_INDEX_24_ECX_0
> >  };
> >
> >  struct cpuid_feature
> > @@ -312,6 +313,7 @@ enum
> >    x86_cpu_AVX_NE_CONVERT       = x86_cpu_index_7_ecx_1_edx + 5,
> >    x86_cpu_AMX_COMPLEX          = x86_cpu_index_7_ecx_1_edx + 8,
> >    x86_cpu_PREFETCHI            = x86_cpu_index_7_ecx_1_edx + 14,
> > +  x86_cpu_AVX10                        = x86_cpu_index_7_ecx_1_edx + 19,
> >    x86_cpu_APX_F                        = x86_cpu_index_7_ecx_1_edx + 21,
> >
> >    x86_cpu_index_19_ebx
> > @@ -325,5 +327,280 @@ enum
> >      = (CPUID_INDEX_14_ECX_0 * 8 * 4 * sizeof (unsigned int)
> >         + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
> >
> > -  x86_cpu_PTWRITE              = x86_cpu_index_14_ecx_0_ebx + 4
> > +  x86_cpu_PTWRITE              = x86_cpu_index_14_ecx_0_ebx + 4,
> > +
> > +  x86_cpu_index_24_ecx_0_ebx
> > +    = (CPUID_INDEX_24_ECX_0 * 8 * 4 * sizeof (unsigned int)
> > +       + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
> > +
> > +  x86_cpu_AVX10_XMM = x86_cpu_index_24_ecx_0_ebx + 16,
> > +  x86_cpu_AVX10_YMM = x86_cpu_index_24_ecx_0_ebx + 17,
> > +  x86_cpu_AVX10_ZMM = x86_cpu_index_24_ecx_0_ebx + 18,
> > +
> > +/* AVX10 version information is handled differently from all other CPUID
> > +   related logic.  Rather than being encoded in cpuid as discrete booleans, the
> > +   AVX10 version is encoded is a full byte that represents the version number
> > +   (greater than or equal to 1).  Since the CPUID API is only able to handle
> > +   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
> > +   by the user and have special logic in `x86_cpu_{present,active}`.  This is
> > +   unpleasant on our end, but is the only way to make the existing API also
> > +   support version queries.  */
> > +
> > +  /* All 1s should never be a value feature index.  */
> > +  x86_cpu_AVX10_V255 = ~0,
> > +  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
> > +  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
> > +  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
> > +  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,
> > +  x86_cpu_AVX10_V250 = x86_cpu_AVX10_V251 - 1,
> > +  x86_cpu_AVX10_V249 = x86_cpu_AVX10_V250 - 1,
> > +  x86_cpu_AVX10_V248 = x86_cpu_AVX10_V249 - 1,
> > +  x86_cpu_AVX10_V247 = x86_cpu_AVX10_V248 - 1,
> > +  x86_cpu_AVX10_V246 = x86_cpu_AVX10_V247 - 1,
> > +  x86_cpu_AVX10_V245 = x86_cpu_AVX10_V246 - 1,
> > +  x86_cpu_AVX10_V244 = x86_cpu_AVX10_V245 - 1,
> > +  x86_cpu_AVX10_V243 = x86_cpu_AVX10_V244 - 1,
> > +  x86_cpu_AVX10_V242 = x86_cpu_AVX10_V243 - 1,
> > +  x86_cpu_AVX10_V241 = x86_cpu_AVX10_V242 - 1,
> > +  x86_cpu_AVX10_V240 = x86_cpu_AVX10_V241 - 1,
> > +  x86_cpu_AVX10_V239 = x86_cpu_AVX10_V240 - 1,
> > +  x86_cpu_AVX10_V238 = x86_cpu_AVX10_V239 - 1,
> > +  x86_cpu_AVX10_V237 = x86_cpu_AVX10_V238 - 1,
> > +  x86_cpu_AVX10_V236 = x86_cpu_AVX10_V237 - 1,
> > +  x86_cpu_AVX10_V235 = x86_cpu_AVX10_V236 - 1,
> > +  x86_cpu_AVX10_V234 = x86_cpu_AVX10_V235 - 1,
> > +  x86_cpu_AVX10_V233 = x86_cpu_AVX10_V234 - 1,
> > +  x86_cpu_AVX10_V232 = x86_cpu_AVX10_V233 - 1,
> > +  x86_cpu_AVX10_V231 = x86_cpu_AVX10_V232 - 1,
> > +  x86_cpu_AVX10_V230 = x86_cpu_AVX10_V231 - 1,
> > +  x86_cpu_AVX10_V229 = x86_cpu_AVX10_V230 - 1,
> > +  x86_cpu_AVX10_V228 = x86_cpu_AVX10_V229 - 1,
> > +  x86_cpu_AVX10_V227 = x86_cpu_AVX10_V228 - 1,
> > +  x86_cpu_AVX10_V226 = x86_cpu_AVX10_V227 - 1,
> > +  x86_cpu_AVX10_V225 = x86_cpu_AVX10_V226 - 1,
> > +  x86_cpu_AVX10_V224 = x86_cpu_AVX10_V225 - 1,
> > +  x86_cpu_AVX10_V223 = x86_cpu_AVX10_V224 - 1,
> > +  x86_cpu_AVX10_V222 = x86_cpu_AVX10_V223 - 1,
> > +  x86_cpu_AVX10_V221 = x86_cpu_AVX10_V222 - 1,
> > +  x86_cpu_AVX10_V220 = x86_cpu_AVX10_V221 - 1,
> > +  x86_cpu_AVX10_V219 = x86_cpu_AVX10_V220 - 1,
> > +  x86_cpu_AVX10_V218 = x86_cpu_AVX10_V219 - 1,
> > +  x86_cpu_AVX10_V217 = x86_cpu_AVX10_V218 - 1,
> > +  x86_cpu_AVX10_V216 = x86_cpu_AVX10_V217 - 1,
> > +  x86_cpu_AVX10_V215 = x86_cpu_AVX10_V216 - 1,
> > +  x86_cpu_AVX10_V214 = x86_cpu_AVX10_V215 - 1,
> > +  x86_cpu_AVX10_V213 = x86_cpu_AVX10_V214 - 1,
> > +  x86_cpu_AVX10_V212 = x86_cpu_AVX10_V213 - 1,
> > +  x86_cpu_AVX10_V211 = x86_cpu_AVX10_V212 - 1,
> > +  x86_cpu_AVX10_V210 = x86_cpu_AVX10_V211 - 1,
> > +  x86_cpu_AVX10_V209 = x86_cpu_AVX10_V210 - 1,
> > +  x86_cpu_AVX10_V208 = x86_cpu_AVX10_V209 - 1,
> > +  x86_cpu_AVX10_V207 = x86_cpu_AVX10_V208 - 1,
> > +  x86_cpu_AVX10_V206 = x86_cpu_AVX10_V207 - 1,
> > +  x86_cpu_AVX10_V205 = x86_cpu_AVX10_V206 - 1,
> > +  x86_cpu_AVX10_V204 = x86_cpu_AVX10_V205 - 1,
> > +  x86_cpu_AVX10_V203 = x86_cpu_AVX10_V204 - 1,
> > +  x86_cpu_AVX10_V202 = x86_cpu_AVX10_V203 - 1,
> > +  x86_cpu_AVX10_V201 = x86_cpu_AVX10_V202 - 1,
> > +  x86_cpu_AVX10_V200 = x86_cpu_AVX10_V201 - 1,
> > +  x86_cpu_AVX10_V199 = x86_cpu_AVX10_V200 - 1,
> > +  x86_cpu_AVX10_V198 = x86_cpu_AVX10_V199 - 1,
> > +  x86_cpu_AVX10_V197 = x86_cpu_AVX10_V198 - 1,
> > +  x86_cpu_AVX10_V196 = x86_cpu_AVX10_V197 - 1,
> > +  x86_cpu_AVX10_V195 = x86_cpu_AVX10_V196 - 1,
> > +  x86_cpu_AVX10_V194 = x86_cpu_AVX10_V195 - 1,
> > +  x86_cpu_AVX10_V193 = x86_cpu_AVX10_V194 - 1,
> > +  x86_cpu_AVX10_V192 = x86_cpu_AVX10_V193 - 1,
> > +  x86_cpu_AVX10_V191 = x86_cpu_AVX10_V192 - 1,
> > +  x86_cpu_AVX10_V190 = x86_cpu_AVX10_V191 - 1,
> > +  x86_cpu_AVX10_V189 = x86_cpu_AVX10_V190 - 1,
> > +  x86_cpu_AVX10_V188 = x86_cpu_AVX10_V189 - 1,
> > +  x86_cpu_AVX10_V187 = x86_cpu_AVX10_V188 - 1,
> > +  x86_cpu_AVX10_V186 = x86_cpu_AVX10_V187 - 1,
> > +  x86_cpu_AVX10_V185 = x86_cpu_AVX10_V186 - 1,
> > +  x86_cpu_AVX10_V184 = x86_cpu_AVX10_V185 - 1,
> > +  x86_cpu_AVX10_V183 = x86_cpu_AVX10_V184 - 1,
> > +  x86_cpu_AVX10_V182 = x86_cpu_AVX10_V183 - 1,
> > +  x86_cpu_AVX10_V181 = x86_cpu_AVX10_V182 - 1,
> > +  x86_cpu_AVX10_V180 = x86_cpu_AVX10_V181 - 1,
> > +  x86_cpu_AVX10_V179 = x86_cpu_AVX10_V180 - 1,
> > +  x86_cpu_AVX10_V178 = x86_cpu_AVX10_V179 - 1,
> > +  x86_cpu_AVX10_V177 = x86_cpu_AVX10_V178 - 1,
> > +  x86_cpu_AVX10_V176 = x86_cpu_AVX10_V177 - 1,
> > +  x86_cpu_AVX10_V175 = x86_cpu_AVX10_V176 - 1,
> > +  x86_cpu_AVX10_V174 = x86_cpu_AVX10_V175 - 1,
> > +  x86_cpu_AVX10_V173 = x86_cpu_AVX10_V174 - 1,
> > +  x86_cpu_AVX10_V172 = x86_cpu_AVX10_V173 - 1,
> > +  x86_cpu_AVX10_V171 = x86_cpu_AVX10_V172 - 1,
> > +  x86_cpu_AVX10_V170 = x86_cpu_AVX10_V171 - 1,
> > +  x86_cpu_AVX10_V169 = x86_cpu_AVX10_V170 - 1,
> > +  x86_cpu_AVX10_V168 = x86_cpu_AVX10_V169 - 1,
> > +  x86_cpu_AVX10_V167 = x86_cpu_AVX10_V168 - 1,
> > +  x86_cpu_AVX10_V166 = x86_cpu_AVX10_V167 - 1,
> > +  x86_cpu_AVX10_V165 = x86_cpu_AVX10_V166 - 1,
> > +  x86_cpu_AVX10_V164 = x86_cpu_AVX10_V165 - 1,
> > +  x86_cpu_AVX10_V163 = x86_cpu_AVX10_V164 - 1,
> > +  x86_cpu_AVX10_V162 = x86_cpu_AVX10_V163 - 1,
> > +  x86_cpu_AVX10_V161 = x86_cpu_AVX10_V162 - 1,
> > +  x86_cpu_AVX10_V160 = x86_cpu_AVX10_V161 - 1,
> > +  x86_cpu_AVX10_V159 = x86_cpu_AVX10_V160 - 1,
> > +  x86_cpu_AVX10_V158 = x86_cpu_AVX10_V159 - 1,
> > +  x86_cpu_AVX10_V157 = x86_cpu_AVX10_V158 - 1,
> > +  x86_cpu_AVX10_V156 = x86_cpu_AVX10_V157 - 1,
> > +  x86_cpu_AVX10_V155 = x86_cpu_AVX10_V156 - 1,
> > +  x86_cpu_AVX10_V154 = x86_cpu_AVX10_V155 - 1,
> > +  x86_cpu_AVX10_V153 = x86_cpu_AVX10_V154 - 1,
> > +  x86_cpu_AVX10_V152 = x86_cpu_AVX10_V153 - 1,
> > +  x86_cpu_AVX10_V151 = x86_cpu_AVX10_V152 - 1,
> > +  x86_cpu_AVX10_V150 = x86_cpu_AVX10_V151 - 1,
> > +  x86_cpu_AVX10_V149 = x86_cpu_AVX10_V150 - 1,
> > +  x86_cpu_AVX10_V148 = x86_cpu_AVX10_V149 - 1,
> > +  x86_cpu_AVX10_V147 = x86_cpu_AVX10_V148 - 1,
> > +  x86_cpu_AVX10_V146 = x86_cpu_AVX10_V147 - 1,
> > +  x86_cpu_AVX10_V145 = x86_cpu_AVX10_V146 - 1,
> > +  x86_cpu_AVX10_V144 = x86_cpu_AVX10_V145 - 1,
> > +  x86_cpu_AVX10_V143 = x86_cpu_AVX10_V144 - 1,
> > +  x86_cpu_AVX10_V142 = x86_cpu_AVX10_V143 - 1,
> > +  x86_cpu_AVX10_V141 = x86_cpu_AVX10_V142 - 1,
> > +  x86_cpu_AVX10_V140 = x86_cpu_AVX10_V141 - 1,
> > +  x86_cpu_AVX10_V139 = x86_cpu_AVX10_V140 - 1,
> > +  x86_cpu_AVX10_V138 = x86_cpu_AVX10_V139 - 1,
> > +  x86_cpu_AVX10_V137 = x86_cpu_AVX10_V138 - 1,
> > +  x86_cpu_AVX10_V136 = x86_cpu_AVX10_V137 - 1,
> > +  x86_cpu_AVX10_V135 = x86_cpu_AVX10_V136 - 1,
> > +  x86_cpu_AVX10_V134 = x86_cpu_AVX10_V135 - 1,
> > +  x86_cpu_AVX10_V133 = x86_cpu_AVX10_V134 - 1,
> > +  x86_cpu_AVX10_V132 = x86_cpu_AVX10_V133 - 1,
> > +  x86_cpu_AVX10_V131 = x86_cpu_AVX10_V132 - 1,
> > +  x86_cpu_AVX10_V130 = x86_cpu_AVX10_V131 - 1,
> > +  x86_cpu_AVX10_V129 = x86_cpu_AVX10_V130 - 1,
> > +  x86_cpu_AVX10_V128 = x86_cpu_AVX10_V129 - 1,
> > +  x86_cpu_AVX10_V127 = x86_cpu_AVX10_V128 - 1,
> > +  x86_cpu_AVX10_V126 = x86_cpu_AVX10_V127 - 1,
> > +  x86_cpu_AVX10_V125 = x86_cpu_AVX10_V126 - 1,
> > +  x86_cpu_AVX10_V124 = x86_cpu_AVX10_V125 - 1,
> > +  x86_cpu_AVX10_V123 = x86_cpu_AVX10_V124 - 1,
> > +  x86_cpu_AVX10_V122 = x86_cpu_AVX10_V123 - 1,
> > +  x86_cpu_AVX10_V121 = x86_cpu_AVX10_V122 - 1,
> > +  x86_cpu_AVX10_V120 = x86_cpu_AVX10_V121 - 1,
> > +  x86_cpu_AVX10_V119 = x86_cpu_AVX10_V120 - 1,
> > +  x86_cpu_AVX10_V118 = x86_cpu_AVX10_V119 - 1,
> > +  x86_cpu_AVX10_V117 = x86_cpu_AVX10_V118 - 1,
> > +  x86_cpu_AVX10_V116 = x86_cpu_AVX10_V117 - 1,
> > +  x86_cpu_AVX10_V115 = x86_cpu_AVX10_V116 - 1,
> > +  x86_cpu_AVX10_V114 = x86_cpu_AVX10_V115 - 1,
> > +  x86_cpu_AVX10_V113 = x86_cpu_AVX10_V114 - 1,
> > +  x86_cpu_AVX10_V112 = x86_cpu_AVX10_V113 - 1,
> > +  x86_cpu_AVX10_V111 = x86_cpu_AVX10_V112 - 1,
> > +  x86_cpu_AVX10_V110 = x86_cpu_AVX10_V111 - 1,
> > +  x86_cpu_AVX10_V109 = x86_cpu_AVX10_V110 - 1,
> > +  x86_cpu_AVX10_V108 = x86_cpu_AVX10_V109 - 1,
> > +  x86_cpu_AVX10_V107 = x86_cpu_AVX10_V108 - 1,
> > +  x86_cpu_AVX10_V106 = x86_cpu_AVX10_V107 - 1,
> > +  x86_cpu_AVX10_V105 = x86_cpu_AVX10_V106 - 1,
> > +  x86_cpu_AVX10_V104 = x86_cpu_AVX10_V105 - 1,
> > +  x86_cpu_AVX10_V103 = x86_cpu_AVX10_V104 - 1,
> > +  x86_cpu_AVX10_V102 = x86_cpu_AVX10_V103 - 1,
> > +  x86_cpu_AVX10_V101 = x86_cpu_AVX10_V102 - 1,
> > +  x86_cpu_AVX10_V100 = x86_cpu_AVX10_V101 - 1,
> > +  x86_cpu_AVX10_V99 = x86_cpu_AVX10_V100 - 1,
> > +  x86_cpu_AVX10_V98 = x86_cpu_AVX10_V99 - 1,
> > +  x86_cpu_AVX10_V97 = x86_cpu_AVX10_V98 - 1,
> > +  x86_cpu_AVX10_V96 = x86_cpu_AVX10_V97 - 1,
> > +  x86_cpu_AVX10_V95 = x86_cpu_AVX10_V96 - 1,
> > +  x86_cpu_AVX10_V94 = x86_cpu_AVX10_V95 - 1,
> > +  x86_cpu_AVX10_V93 = x86_cpu_AVX10_V94 - 1,
> > +  x86_cpu_AVX10_V92 = x86_cpu_AVX10_V93 - 1,
> > +  x86_cpu_AVX10_V91 = x86_cpu_AVX10_V92 - 1,
> > +  x86_cpu_AVX10_V90 = x86_cpu_AVX10_V91 - 1,
> > +  x86_cpu_AVX10_V89 = x86_cpu_AVX10_V90 - 1,
> > +  x86_cpu_AVX10_V88 = x86_cpu_AVX10_V89 - 1,
> > +  x86_cpu_AVX10_V87 = x86_cpu_AVX10_V88 - 1,
> > +  x86_cpu_AVX10_V86 = x86_cpu_AVX10_V87 - 1,
> > +  x86_cpu_AVX10_V85 = x86_cpu_AVX10_V86 - 1,
> > +  x86_cpu_AVX10_V84 = x86_cpu_AVX10_V85 - 1,
> > +  x86_cpu_AVX10_V83 = x86_cpu_AVX10_V84 - 1,
> > +  x86_cpu_AVX10_V82 = x86_cpu_AVX10_V83 - 1,
> > +  x86_cpu_AVX10_V81 = x86_cpu_AVX10_V82 - 1,
> > +  x86_cpu_AVX10_V80 = x86_cpu_AVX10_V81 - 1,
> > +  x86_cpu_AVX10_V79 = x86_cpu_AVX10_V80 - 1,
> > +  x86_cpu_AVX10_V78 = x86_cpu_AVX10_V79 - 1,
> > +  x86_cpu_AVX10_V77 = x86_cpu_AVX10_V78 - 1,
> > +  x86_cpu_AVX10_V76 = x86_cpu_AVX10_V77 - 1,
> > +  x86_cpu_AVX10_V75 = x86_cpu_AVX10_V76 - 1,
> > +  x86_cpu_AVX10_V74 = x86_cpu_AVX10_V75 - 1,
> > +  x86_cpu_AVX10_V73 = x86_cpu_AVX10_V74 - 1,
> > +  x86_cpu_AVX10_V72 = x86_cpu_AVX10_V73 - 1,
> > +  x86_cpu_AVX10_V71 = x86_cpu_AVX10_V72 - 1,
> > +  x86_cpu_AVX10_V70 = x86_cpu_AVX10_V71 - 1,
> > +  x86_cpu_AVX10_V69 = x86_cpu_AVX10_V70 - 1,
> > +  x86_cpu_AVX10_V68 = x86_cpu_AVX10_V69 - 1,
> > +  x86_cpu_AVX10_V67 = x86_cpu_AVX10_V68 - 1,
> > +  x86_cpu_AVX10_V66 = x86_cpu_AVX10_V67 - 1,
> > +  x86_cpu_AVX10_V65 = x86_cpu_AVX10_V66 - 1,
> > +  x86_cpu_AVX10_V64 = x86_cpu_AVX10_V65 - 1,
> > +  x86_cpu_AVX10_V63 = x86_cpu_AVX10_V64 - 1,
> > +  x86_cpu_AVX10_V62 = x86_cpu_AVX10_V63 - 1,
> > +  x86_cpu_AVX10_V61 = x86_cpu_AVX10_V62 - 1,
> > +  x86_cpu_AVX10_V60 = x86_cpu_AVX10_V61 - 1,
> > +  x86_cpu_AVX10_V59 = x86_cpu_AVX10_V60 - 1,
> > +  x86_cpu_AVX10_V58 = x86_cpu_AVX10_V59 - 1,
> > +  x86_cpu_AVX10_V57 = x86_cpu_AVX10_V58 - 1,
> > +  x86_cpu_AVX10_V56 = x86_cpu_AVX10_V57 - 1,
> > +  x86_cpu_AVX10_V55 = x86_cpu_AVX10_V56 - 1,
> > +  x86_cpu_AVX10_V54 = x86_cpu_AVX10_V55 - 1,
> > +  x86_cpu_AVX10_V53 = x86_cpu_AVX10_V54 - 1,
> > +  x86_cpu_AVX10_V52 = x86_cpu_AVX10_V53 - 1,
> > +  x86_cpu_AVX10_V51 = x86_cpu_AVX10_V52 - 1,
> > +  x86_cpu_AVX10_V50 = x86_cpu_AVX10_V51 - 1,
> > +  x86_cpu_AVX10_V49 = x86_cpu_AVX10_V50 - 1,
> > +  x86_cpu_AVX10_V48 = x86_cpu_AVX10_V49 - 1,
> > +  x86_cpu_AVX10_V47 = x86_cpu_AVX10_V48 - 1,
> > +  x86_cpu_AVX10_V46 = x86_cpu_AVX10_V47 - 1,
> > +  x86_cpu_AVX10_V45 = x86_cpu_AVX10_V46 - 1,
> > +  x86_cpu_AVX10_V44 = x86_cpu_AVX10_V45 - 1,
> > +  x86_cpu_AVX10_V43 = x86_cpu_AVX10_V44 - 1,
> > +  x86_cpu_AVX10_V42 = x86_cpu_AVX10_V43 - 1,
> > +  x86_cpu_AVX10_V41 = x86_cpu_AVX10_V42 - 1,
> > +  x86_cpu_AVX10_V40 = x86_cpu_AVX10_V41 - 1,
> > +  x86_cpu_AVX10_V39 = x86_cpu_AVX10_V40 - 1,
> > +  x86_cpu_AVX10_V38 = x86_cpu_AVX10_V39 - 1,
> > +  x86_cpu_AVX10_V37 = x86_cpu_AVX10_V38 - 1,
> > +  x86_cpu_AVX10_V36 = x86_cpu_AVX10_V37 - 1,
> > +  x86_cpu_AVX10_V35 = x86_cpu_AVX10_V36 - 1,
> > +  x86_cpu_AVX10_V34 = x86_cpu_AVX10_V35 - 1,
> > +  x86_cpu_AVX10_V33 = x86_cpu_AVX10_V34 - 1,
> > +  x86_cpu_AVX10_V32 = x86_cpu_AVX10_V33 - 1,
> > +  x86_cpu_AVX10_V31 = x86_cpu_AVX10_V32 - 1,
> > +  x86_cpu_AVX10_V30 = x86_cpu_AVX10_V31 - 1,
> > +  x86_cpu_AVX10_V29 = x86_cpu_AVX10_V30 - 1,
> > +  x86_cpu_AVX10_V28 = x86_cpu_AVX10_V29 - 1,
> > +  x86_cpu_AVX10_V27 = x86_cpu_AVX10_V28 - 1,
> > +  x86_cpu_AVX10_V26 = x86_cpu_AVX10_V27 - 1,
> > +  x86_cpu_AVX10_V25 = x86_cpu_AVX10_V26 - 1,
> > +  x86_cpu_AVX10_V24 = x86_cpu_AVX10_V25 - 1,
> > +  x86_cpu_AVX10_V23 = x86_cpu_AVX10_V24 - 1,
> > +  x86_cpu_AVX10_V22 = x86_cpu_AVX10_V23 - 1,
> > +  x86_cpu_AVX10_V21 = x86_cpu_AVX10_V22 - 1,
> > +  x86_cpu_AVX10_V20 = x86_cpu_AVX10_V21 - 1,
> > +  x86_cpu_AVX10_V19 = x86_cpu_AVX10_V20 - 1,
> > +  x86_cpu_AVX10_V18 = x86_cpu_AVX10_V19 - 1,
> > +  x86_cpu_AVX10_V17 = x86_cpu_AVX10_V18 - 1,
> > +  x86_cpu_AVX10_V16 = x86_cpu_AVX10_V17 - 1,
> > +  x86_cpu_AVX10_V15 = x86_cpu_AVX10_V16 - 1,
> > +  x86_cpu_AVX10_V14 = x86_cpu_AVX10_V15 - 1,
> > +  x86_cpu_AVX10_V13 = x86_cpu_AVX10_V14 - 1,
> > +  x86_cpu_AVX10_V12 = x86_cpu_AVX10_V13 - 1,
> > +  x86_cpu_AVX10_V11 = x86_cpu_AVX10_V12 - 1,
> > +  x86_cpu_AVX10_V10 = x86_cpu_AVX10_V11 - 1,
> > +  x86_cpu_AVX10_V9 = x86_cpu_AVX10_V10 - 1,
> > +  x86_cpu_AVX10_V8 = x86_cpu_AVX10_V9 - 1,
> > +  x86_cpu_AVX10_V7 = x86_cpu_AVX10_V8 - 1,
> > +  x86_cpu_AVX10_V6 = x86_cpu_AVX10_V7 - 1,
> > +  x86_cpu_AVX10_V5 = x86_cpu_AVX10_V6 - 1,
> > +  x86_cpu_AVX10_V4 = x86_cpu_AVX10_V5 - 1,
> > +  x86_cpu_AVX10_V3 = x86_cpu_AVX10_V4 - 1,
> > +  x86_cpu_AVX10_V2 = x86_cpu_AVX10_V3 - 1,
> > +  x86_cpu_AVX10_V1 = x86_cpu_AVX10_V2 - 1
> > +/* x86_cpu_AVX10_V0 is invalid.  */
> >  };
> > diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
> > index badf088874..b5846bc211 100644
> > --- a/sysdeps/x86/cpu-features.c
> > +++ b/sysdeps/x86/cpu-features.c
> > @@ -115,11 +115,18 @@ update_active (struct cpu_features *cpu_features)
> >    CPU_FEATURE_SET_ACTIVE (cpu_features, SHSTK);
> >  #endif
> >
> > +  enum
> > +  {
> > +    os_xmm = 1,
> > +    os_ymm = 2,
> > +    os_zmm = 4
> > +  } os_vector_size = os_xmm;
> >    /* Can we call xgetbv?  */
> >    if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE))
> >      {
> >        unsigned int xcrlow;
> >        unsigned int xcrhigh;
> > +      CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10);
> >        asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0));
> >        /* Is YMM and XMM state usable?  */
> >        if ((xcrlow & (bit_YMM_state | bit_XMM_state))
> > @@ -128,6 +135,7 @@ update_active (struct cpu_features *cpu_features)
> >           /* Determine if AVX is usable.  */
> >           if (CPU_FEATURES_CPU_P (cpu_features, AVX))
> >             {
> > +          os_vector_size |= os_ymm;
>
> Wrong indentation.
>

Fixed.
> >               CPU_FEATURE_SET (cpu_features, AVX);
> >               /* The following features depend on AVX being usable.  */
> >               /* Determine if AVX2 is usable.  */
> > @@ -166,6 +174,7 @@ update_active (struct cpu_features *cpu_features)
> >                          | bit_ZMM16_31_state))
> >               == (bit_Opmask_state | bit_ZMM0_15_state | bit_ZMM16_31_state))
> >             {
> > +             os_vector_size |= os_zmm;
> >               /* Determine if AVX512F is usable.  */
> >               if (CPU_FEATURES_CPU_P (cpu_features, AVX512F))
> >                 {
> > @@ -210,6 +219,22 @@ update_active (struct cpu_features *cpu_features)
> >             }
> >         }
> >
> > +      if (CPU_FEATURES_CPU_P (cpu_features, AVX10)
> > +         && cpu_features->basic.max_cpuid >= 0x24)
> > +       {
> > +         __cpuid_count (
> > +             0x24, 0, cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.eax,
> > +             cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ebx,
> > +             cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ecx,
> > +             cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.edx);
> > +         if (os_vector_size & os_xmm)
> > +           CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_XMM);
> > +         if (os_vector_size & os_ymm)
> > +           CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_YMM);
> > +         if (os_vector_size & os_zmm)
> > +           CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_ZMM);
> > +       }
> > +
> >        /* 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 eb30d342a6..2d7427a6c0 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_14_ECX_0 + 1
> > +  CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_0 + 1
> >  };
> >
> >  enum
> > @@ -319,6 +319,7 @@ enum
> >  #define bit_cpu_AVX_NE_CONVERT (1u << 5)
> >  #define bit_cpu_AMX_COMPLEX    (1u << 8)
> >  #define bit_cpu_PREFETCHI      (1u << 14)
> > +#define bit_cpu_AVX10          (1u << 19)
> >  #define bit_cpu_APX_F          (1u << 21)
> >
> >  /* CPUID_INDEX_19.  */
> > @@ -332,6 +333,13 @@ enum
> >  /* EBX.  */
> >  #define bit_cpu_PTWRITE                (1u << 4)
> >
> > +/* CPUID_INDEX_24_ECX_0.  */
> > +
> > +/* EBX.  */
> > +#define bit_cpu_AVX10_XMM              (1u << 16)
> > +#define bit_cpu_AVX10_YMM              (1u << 17)
> > +#define bit_cpu_AVX10_ZMM              (1u << 18)
> > +
> >  /* CPUID_INDEX_1.  */
> >
> >  /* ECX.  */
> > @@ -563,6 +571,7 @@ enum
> >  #define index_cpu_AVX_NE_CONVERT CPUID_INDEX_7_ECX_1
> >  #define index_cpu_AMX_COMPLEX  CPUID_INDEX_7_ECX_1
> >  #define index_cpu_PREFETCHI    CPUID_INDEX_7_ECX_1
> > +#define index_cpu_AVX10                CPUID_INDEX_7_ECX_1
> >  #define index_cpu_APX_F                CPUID_INDEX_7_ECX_1
> >
> >  /* CPUID_INDEX_19.  */
> > @@ -576,6 +585,13 @@ enum
> >  /* EBX.  */
> >  #define index_cpu_PTWRITE      CPUID_INDEX_14_ECX_0
> >
> > +/* CPUID_INDEX_24_ECX_0.  */
> > +
> > +/* EBX.  */
> > +#define index_cpu_AVX10_XMM    CPUID_INDEX_24_ECX_0
> > +#define index_cpu_AVX10_YMM    CPUID_INDEX_24_ECX_0
> > +#define index_cpu_AVX10_ZMM    CPUID_INDEX_24_ECX_0
> > +
> >  /* CPUID_INDEX_1.  */
> >
> >  /* ECX.  */
> > @@ -809,6 +825,7 @@ enum
> >  #define reg_AVX_NE_CONVERT     edx
> >  #define reg_AMX_COMPLEX                edx
> >  #define reg_PREFETCHI          edx
> > +#define reg_AVX10              edx
> >  #define reg_APX_F              edx
> >
> >  /* CPUID_INDEX_19.  */
> > @@ -822,6 +839,14 @@ enum
> >  /* EBX.  */
> >  #define reg_PTWRITE            ebx
> >
> > +/* CPUID_INDEX_24_ECX_0.  */
> > +
> > +/* EBX.  */
> > +#define reg_AVX10_XMM          ebx
> > +#define reg_AVX10_YMM          ebx
> > +#define reg_AVX10_ZMM          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/sys/platform/x86.h b/sysdeps/x86/sys/platform/x86.h
> > index 1ea2c5fc0b..fa8c7e158d 100644
> > --- a/sysdeps/x86/sys/platform/x86.h
> > +++ b/sysdeps/x86/sys/platform/x86.h
> > @@ -29,9 +29,45 @@ __BEGIN_DECLS
> >  extern const struct cpuid_feature *__x86_get_cpuid_feature_leaf (unsigned int)
> >       __attribute__ ((pure));
> >
> > +static __inline__ unsigned int
> > +x86_cpu_get_avx10_version_number_from_enum (unsigned int __enum)
> > +{
> > +  return __enum - x86_cpu_AVX10_V1 + 1;
> > +}
> > +
> > +static __inline__ _Bool
> > +x86_cpu_is_index_avx10_version_number (unsigned int __index)
> > +{
> > +  return __index >= (unsigned int) x86_cpu_AVX10_V1
> > +        && __index <= (unsigned int) x86_cpu_AVX10_V255;
> > +}
> > +
> > +static __inline__ unsigned int
> > +x86_cpu_get_avx10_info (unsigned int __index)
> > +{
> > +  const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf (
> > +      __index / (8 * sizeof (unsigned int) * 4));
> > +  unsigned int __reg = __index & (8 * sizeof (unsigned int) * 4 - 1);
> > +  __reg /= 8 * sizeof (unsigned int);
> > +
> > +  return __ptr->cpuid_array[__reg];
> > +}
> > +
> > +/* Get AVX10 version number in byte form.  Must check AVX10 active first. Value
> > +   is in range [1, 255].  */
> > +static __inline__ unsigned int
> > +x86_cpu_get_avx10_version_number (void)
> > +{
> > +  return x86_cpu_get_avx10_info (x86_cpu_index_24_ecx_0_ebx) & 0xff;
> > +}
> > +
> >  static __inline__ _Bool
> >  x86_cpu_present (unsigned int __index)
> >  {
> > +  if (x86_cpu_is_index_avx10_version_number (__index))
> > +    return x86_cpu_get_avx10_version_number ()
> > +          >= x86_cpu_get_avx10_version_number_from_enum (__index);
> > +
> >    const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
> >      (__index / (8 * sizeof (unsigned int) * 4));
> >    unsigned int __reg
> > @@ -45,6 +81,10 @@ x86_cpu_present (unsigned int __index)
> >  static __inline__ _Bool
> >  x86_cpu_active (unsigned int __index)
> >  {
> > +  if (x86_cpu_is_index_avx10_version_number (__index))
> > +    return x86_cpu_get_avx10_version_number ()
> > +          >= x86_cpu_get_avx10_version_number_from_enum (__index);
> > +
> >    const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
> >      (__index / (8 * sizeof (unsigned int) * 4));
> >    unsigned int __reg
> > diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c
> > index b27fa7324a..53e68431f1 100644
> > --- a/sysdeps/x86/tst-get-cpu-features.c
> > +++ b/sysdeps/x86/tst-get-cpu-features.c
> > @@ -219,6 +219,7 @@ do_test (void)
> >    CHECK_CPU_FEATURE_PRESENT (AVX_NE_CONVERT);
> >    CHECK_CPU_FEATURE_PRESENT (AMX_COMPLEX);
> >    CHECK_CPU_FEATURE_PRESENT (PREFETCHI);
> > +  CHECK_CPU_FEATURE_PRESENT (AVX10);
> >    CHECK_CPU_FEATURE_PRESENT (APX_F);
> >    CHECK_CPU_FEATURE_PRESENT (AESKLE);
> >    CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
> > @@ -391,11 +392,273 @@ do_test (void)
> >    CHECK_CPU_FEATURE_ACTIVE (AVX_NE_CONVERT);
> >    CHECK_CPU_FEATURE_ACTIVE (AMX_COMPLEX);
> >    CHECK_CPU_FEATURE_ACTIVE (PREFETCHI);
> > +  CHECK_CPU_FEATURE_ACTIVE (AVX10);
> >    CHECK_CPU_FEATURE_ACTIVE (APX_F);
> >    CHECK_CPU_FEATURE_ACTIVE (AESKLE);
> >    CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
> >    CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
> >
> > +  if (CPU_FEATURE_ACTIVE (AVX10))
> > +    {
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_XMM);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_YMM);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_ZMM);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V1);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V2);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V3);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V4);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V5);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V6);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V7);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V8);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V9);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V10);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V11);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V12);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V13);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V14);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V15);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V16);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V17);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V18);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V19);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V20);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V21);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V22);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V23);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V24);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V25);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V26);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V27);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V28);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V29);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V30);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V31);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V32);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V33);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V34);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V35);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V36);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V37);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V38);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V39);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V40);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V41);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V42);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V43);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V44);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V45);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V46);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V47);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V48);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V49);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V50);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V51);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V52);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V53);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V54);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V55);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V56);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V57);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V58);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V59);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V60);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V61);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V62);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V63);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V64);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V65);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V66);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V67);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V68);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V69);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V70);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V71);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V72);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V73);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V74);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V75);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V76);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V77);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V78);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V79);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V80);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V81);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V82);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V83);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V84);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V85);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V86);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V87);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V88);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V89);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V90);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V91);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V92);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V93);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V94);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V95);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V96);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V97);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V98);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V99);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V100);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V101);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V102);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V103);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V104);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V105);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V106);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V107);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V108);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V109);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V110);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V111);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V112);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V113);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V114);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V115);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V116);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V117);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V118);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V119);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V120);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V121);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V122);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V123);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V124);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V125);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V126);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V127);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V128);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V129);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V130);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V131);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V132);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V133);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V134);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V135);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V136);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V137);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V138);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V139);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V140);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V141);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V142);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V143);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V144);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V145);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V146);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V147);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V148);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V149);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V150);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V151);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V152);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V153);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V154);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V155);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V156);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V157);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V158);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V159);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V160);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V161);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V162);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V163);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V164);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V165);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V166);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V167);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V168);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V169);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V170);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V171);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V172);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V173);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V174);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V175);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V176);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V177);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V178);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V179);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V180);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V181);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V182);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V183);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V184);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V185);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V186);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V187);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V188);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V189);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V190);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V191);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V192);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V193);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V194);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V195);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V196);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V197);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V198);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V199);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V200);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V201);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V202);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V203);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V204);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V205);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V206);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V207);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V208);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V209);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V210);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V211);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V212);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V213);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V214);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V215);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V216);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V217);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V218);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V219);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V220);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V221);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V222);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V223);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V224);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V225);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V226);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V227);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V228);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V229);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V230);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V231);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V232);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V233);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V234);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V235);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V236);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V237);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V238);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V239);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V240);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V241);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V242);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V243);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V244);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V245);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V246);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V247);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V248);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V249);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V250);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V251);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V252);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V253);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V254);
> > +      CHECK_CPU_FEATURE_ACTIVE (AVX10_V255);
> > +    }
> >    return 0;
> >  }
> >
> > --
> > 2.34.1
> >
>
>
> --
> H.J.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2] x86: Add support for AVX10 version and vec size in cpu-features
  2023-08-24 18:48 [PATCH v1] x86: Add support for AVX10 version and vec size in cpu-features Noah Goldstein
  2023-08-24 19:01 ` H.J. Lu
  2023-08-24 19:14 ` [PATCH v2] " Noah Goldstein
@ 2023-08-24 20:30 ` Noah Goldstein
  2023-09-20 20:44 ` x86: Add support for AVX10 preset " Noah Goldstein
  3 siblings, 0 replies; 12+ messages in thread
From: Noah Goldstein @ 2023-08-24 20:30 UTC (permalink / raw)
  To: libc-alpha; +Cc: goldstein.w.n, hjl.tools, carlos

This commit add support for the new AVX10 cpu features:
https://cdrdv2-public.intel.com/784267/355989-intel-avx10-spec.pdf

We add checks for:
    - `AVX10`: Check if AVX10 is present.
    - `AVX10_V{1..255}`: Check if a given version is active.
    - `AVX10_{X,Y,Z}MM`: Check if a given vec class has AVX10 support.

The version checks are not ideal, the reason for the reason for this
is the version information in AVX10 is encoded as complete a byte
value, but the `CPU_FEATURES` interface is only able to query bools.

To get around this, we add a feature for each possible version value
(starting at 1 as there is no AVX10 version 0).

`make check` passes and cpuid output was checked against GNR/DMR on an
emulator.
---
 manual/platform.texi               |  28 +++
 sysdeps/x86/bits/platform/x86.h    | 281 ++++++++++++++++++++++++++++-
 sysdeps/x86/cpu-features.c         |  25 +++
 sysdeps/x86/include/cpu-features.h |  27 ++-
 sysdeps/x86/sys/platform/x86.h     |  40 ++++
 sysdeps/x86/tst-get-cpu-features.c | 263 +++++++++++++++++++++++++++
 6 files changed, 661 insertions(+), 3 deletions(-)

diff --git a/manual/platform.texi b/manual/platform.texi
index 2a2d557067..99dc57b568 100644
--- a/manual/platform.texi
+++ b/manual/platform.texi
@@ -222,6 +222,22 @@ Leaf (EAX = 23H).
 @item
 @code{AVX} -- The AVX instruction extensions.
 
+@item
+@code{AVX10} -- The AVX10 instruction extensions.
+
+@item
+@code{AVX10_XMM} -- Whether AVX10 includes xmm registers.
+
+@item
+@code{AVX10_YMM} -- Whether AVX10 includes ymm registers.
+
+@item
+@code{AVX10_ZMM} -- Whether AVX10 includes zmm registers.
+
+@item
+@code{AVX10_V1}..@code{AVX10_V255} -- Whether AVX10 supports a given
+version.
+
 @item
 @code{AVX2} -- The AVX2 instruction extensions.
 
@@ -760,3 +776,15 @@ avx_active (void)
   return CPU_FEATURE_ACTIVE (AVX);
 @}
 @end smallexample
+
+You could query @code{AVX10} version number with:
+
+@smallexample
+#include <sys/platform/x86.h>
+
+int
+has_avx10_version1 (void)
+@{
+  return CPU_FEATURE_ACTIVE (AVX10_V1); // Up to AVX10_V255
+@}
+@end smallexample
diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
index 88ca071aa7..777fb6ce18 100644
--- a/sysdeps/x86/bits/platform/x86.h
+++ b/sysdeps/x86/bits/platform/x86.h
@@ -30,7 +30,8 @@ enum
   CPUID_INDEX_80000008,
   CPUID_INDEX_7_ECX_1,
   CPUID_INDEX_19,
-  CPUID_INDEX_14_ECX_0
+  CPUID_INDEX_14_ECX_0,
+  CPUID_INDEX_24_ECX_0
 };
 
 struct cpuid_feature
@@ -312,6 +313,7 @@ enum
   x86_cpu_AVX_NE_CONVERT	= x86_cpu_index_7_ecx_1_edx + 5,
   x86_cpu_AMX_COMPLEX		= x86_cpu_index_7_ecx_1_edx + 8,
   x86_cpu_PREFETCHI		= x86_cpu_index_7_ecx_1_edx + 14,
+  x86_cpu_AVX10			= x86_cpu_index_7_ecx_1_edx + 19,
   x86_cpu_APX_F			= x86_cpu_index_7_ecx_1_edx + 21,
 
   x86_cpu_index_19_ebx
@@ -325,5 +327,280 @@ enum
     = (CPUID_INDEX_14_ECX_0 * 8 * 4 * sizeof (unsigned int)
        + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
 
-  x86_cpu_PTWRITE		= x86_cpu_index_14_ecx_0_ebx + 4
+  x86_cpu_PTWRITE		= x86_cpu_index_14_ecx_0_ebx + 4,
+
+  x86_cpu_index_24_ecx_0_ebx
+    = (CPUID_INDEX_24_ECX_0 * 8 * 4 * sizeof (unsigned int)
+       + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
+
+  x86_cpu_AVX10_XMM = x86_cpu_index_24_ecx_0_ebx + 16,
+  x86_cpu_AVX10_YMM = x86_cpu_index_24_ecx_0_ebx + 17,
+  x86_cpu_AVX10_ZMM = x86_cpu_index_24_ecx_0_ebx + 18,
+
+/* AVX10 version information is handled differently from all other CPUID
+   related logic.  Rather than being encoded in cpuid as discrete booleans, the
+   AVX10 version is encoded is a full byte that represents the version number
+   (greater than or equal to 1).  Since the CPUID API is only able to handle
+   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
+   by the user and have special logic in `x86_cpu_{present,active}`.  This is
+   unpleasant on our end, but is the only way to make the existing API also
+   support version queries.  */
+
+  /* All 1s should never be a value feature index.  */
+  x86_cpu_AVX10_V255 = ~0,
+  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
+  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
+  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
+  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,
+  x86_cpu_AVX10_V250 = x86_cpu_AVX10_V251 - 1,
+  x86_cpu_AVX10_V249 = x86_cpu_AVX10_V250 - 1,
+  x86_cpu_AVX10_V248 = x86_cpu_AVX10_V249 - 1,
+  x86_cpu_AVX10_V247 = x86_cpu_AVX10_V248 - 1,
+  x86_cpu_AVX10_V246 = x86_cpu_AVX10_V247 - 1,
+  x86_cpu_AVX10_V245 = x86_cpu_AVX10_V246 - 1,
+  x86_cpu_AVX10_V244 = x86_cpu_AVX10_V245 - 1,
+  x86_cpu_AVX10_V243 = x86_cpu_AVX10_V244 - 1,
+  x86_cpu_AVX10_V242 = x86_cpu_AVX10_V243 - 1,
+  x86_cpu_AVX10_V241 = x86_cpu_AVX10_V242 - 1,
+  x86_cpu_AVX10_V240 = x86_cpu_AVX10_V241 - 1,
+  x86_cpu_AVX10_V239 = x86_cpu_AVX10_V240 - 1,
+  x86_cpu_AVX10_V238 = x86_cpu_AVX10_V239 - 1,
+  x86_cpu_AVX10_V237 = x86_cpu_AVX10_V238 - 1,
+  x86_cpu_AVX10_V236 = x86_cpu_AVX10_V237 - 1,
+  x86_cpu_AVX10_V235 = x86_cpu_AVX10_V236 - 1,
+  x86_cpu_AVX10_V234 = x86_cpu_AVX10_V235 - 1,
+  x86_cpu_AVX10_V233 = x86_cpu_AVX10_V234 - 1,
+  x86_cpu_AVX10_V232 = x86_cpu_AVX10_V233 - 1,
+  x86_cpu_AVX10_V231 = x86_cpu_AVX10_V232 - 1,
+  x86_cpu_AVX10_V230 = x86_cpu_AVX10_V231 - 1,
+  x86_cpu_AVX10_V229 = x86_cpu_AVX10_V230 - 1,
+  x86_cpu_AVX10_V228 = x86_cpu_AVX10_V229 - 1,
+  x86_cpu_AVX10_V227 = x86_cpu_AVX10_V228 - 1,
+  x86_cpu_AVX10_V226 = x86_cpu_AVX10_V227 - 1,
+  x86_cpu_AVX10_V225 = x86_cpu_AVX10_V226 - 1,
+  x86_cpu_AVX10_V224 = x86_cpu_AVX10_V225 - 1,
+  x86_cpu_AVX10_V223 = x86_cpu_AVX10_V224 - 1,
+  x86_cpu_AVX10_V222 = x86_cpu_AVX10_V223 - 1,
+  x86_cpu_AVX10_V221 = x86_cpu_AVX10_V222 - 1,
+  x86_cpu_AVX10_V220 = x86_cpu_AVX10_V221 - 1,
+  x86_cpu_AVX10_V219 = x86_cpu_AVX10_V220 - 1,
+  x86_cpu_AVX10_V218 = x86_cpu_AVX10_V219 - 1,
+  x86_cpu_AVX10_V217 = x86_cpu_AVX10_V218 - 1,
+  x86_cpu_AVX10_V216 = x86_cpu_AVX10_V217 - 1,
+  x86_cpu_AVX10_V215 = x86_cpu_AVX10_V216 - 1,
+  x86_cpu_AVX10_V214 = x86_cpu_AVX10_V215 - 1,
+  x86_cpu_AVX10_V213 = x86_cpu_AVX10_V214 - 1,
+  x86_cpu_AVX10_V212 = x86_cpu_AVX10_V213 - 1,
+  x86_cpu_AVX10_V211 = x86_cpu_AVX10_V212 - 1,
+  x86_cpu_AVX10_V210 = x86_cpu_AVX10_V211 - 1,
+  x86_cpu_AVX10_V209 = x86_cpu_AVX10_V210 - 1,
+  x86_cpu_AVX10_V208 = x86_cpu_AVX10_V209 - 1,
+  x86_cpu_AVX10_V207 = x86_cpu_AVX10_V208 - 1,
+  x86_cpu_AVX10_V206 = x86_cpu_AVX10_V207 - 1,
+  x86_cpu_AVX10_V205 = x86_cpu_AVX10_V206 - 1,
+  x86_cpu_AVX10_V204 = x86_cpu_AVX10_V205 - 1,
+  x86_cpu_AVX10_V203 = x86_cpu_AVX10_V204 - 1,
+  x86_cpu_AVX10_V202 = x86_cpu_AVX10_V203 - 1,
+  x86_cpu_AVX10_V201 = x86_cpu_AVX10_V202 - 1,
+  x86_cpu_AVX10_V200 = x86_cpu_AVX10_V201 - 1,
+  x86_cpu_AVX10_V199 = x86_cpu_AVX10_V200 - 1,
+  x86_cpu_AVX10_V198 = x86_cpu_AVX10_V199 - 1,
+  x86_cpu_AVX10_V197 = x86_cpu_AVX10_V198 - 1,
+  x86_cpu_AVX10_V196 = x86_cpu_AVX10_V197 - 1,
+  x86_cpu_AVX10_V195 = x86_cpu_AVX10_V196 - 1,
+  x86_cpu_AVX10_V194 = x86_cpu_AVX10_V195 - 1,
+  x86_cpu_AVX10_V193 = x86_cpu_AVX10_V194 - 1,
+  x86_cpu_AVX10_V192 = x86_cpu_AVX10_V193 - 1,
+  x86_cpu_AVX10_V191 = x86_cpu_AVX10_V192 - 1,
+  x86_cpu_AVX10_V190 = x86_cpu_AVX10_V191 - 1,
+  x86_cpu_AVX10_V189 = x86_cpu_AVX10_V190 - 1,
+  x86_cpu_AVX10_V188 = x86_cpu_AVX10_V189 - 1,
+  x86_cpu_AVX10_V187 = x86_cpu_AVX10_V188 - 1,
+  x86_cpu_AVX10_V186 = x86_cpu_AVX10_V187 - 1,
+  x86_cpu_AVX10_V185 = x86_cpu_AVX10_V186 - 1,
+  x86_cpu_AVX10_V184 = x86_cpu_AVX10_V185 - 1,
+  x86_cpu_AVX10_V183 = x86_cpu_AVX10_V184 - 1,
+  x86_cpu_AVX10_V182 = x86_cpu_AVX10_V183 - 1,
+  x86_cpu_AVX10_V181 = x86_cpu_AVX10_V182 - 1,
+  x86_cpu_AVX10_V180 = x86_cpu_AVX10_V181 - 1,
+  x86_cpu_AVX10_V179 = x86_cpu_AVX10_V180 - 1,
+  x86_cpu_AVX10_V178 = x86_cpu_AVX10_V179 - 1,
+  x86_cpu_AVX10_V177 = x86_cpu_AVX10_V178 - 1,
+  x86_cpu_AVX10_V176 = x86_cpu_AVX10_V177 - 1,
+  x86_cpu_AVX10_V175 = x86_cpu_AVX10_V176 - 1,
+  x86_cpu_AVX10_V174 = x86_cpu_AVX10_V175 - 1,
+  x86_cpu_AVX10_V173 = x86_cpu_AVX10_V174 - 1,
+  x86_cpu_AVX10_V172 = x86_cpu_AVX10_V173 - 1,
+  x86_cpu_AVX10_V171 = x86_cpu_AVX10_V172 - 1,
+  x86_cpu_AVX10_V170 = x86_cpu_AVX10_V171 - 1,
+  x86_cpu_AVX10_V169 = x86_cpu_AVX10_V170 - 1,
+  x86_cpu_AVX10_V168 = x86_cpu_AVX10_V169 - 1,
+  x86_cpu_AVX10_V167 = x86_cpu_AVX10_V168 - 1,
+  x86_cpu_AVX10_V166 = x86_cpu_AVX10_V167 - 1,
+  x86_cpu_AVX10_V165 = x86_cpu_AVX10_V166 - 1,
+  x86_cpu_AVX10_V164 = x86_cpu_AVX10_V165 - 1,
+  x86_cpu_AVX10_V163 = x86_cpu_AVX10_V164 - 1,
+  x86_cpu_AVX10_V162 = x86_cpu_AVX10_V163 - 1,
+  x86_cpu_AVX10_V161 = x86_cpu_AVX10_V162 - 1,
+  x86_cpu_AVX10_V160 = x86_cpu_AVX10_V161 - 1,
+  x86_cpu_AVX10_V159 = x86_cpu_AVX10_V160 - 1,
+  x86_cpu_AVX10_V158 = x86_cpu_AVX10_V159 - 1,
+  x86_cpu_AVX10_V157 = x86_cpu_AVX10_V158 - 1,
+  x86_cpu_AVX10_V156 = x86_cpu_AVX10_V157 - 1,
+  x86_cpu_AVX10_V155 = x86_cpu_AVX10_V156 - 1,
+  x86_cpu_AVX10_V154 = x86_cpu_AVX10_V155 - 1,
+  x86_cpu_AVX10_V153 = x86_cpu_AVX10_V154 - 1,
+  x86_cpu_AVX10_V152 = x86_cpu_AVX10_V153 - 1,
+  x86_cpu_AVX10_V151 = x86_cpu_AVX10_V152 - 1,
+  x86_cpu_AVX10_V150 = x86_cpu_AVX10_V151 - 1,
+  x86_cpu_AVX10_V149 = x86_cpu_AVX10_V150 - 1,
+  x86_cpu_AVX10_V148 = x86_cpu_AVX10_V149 - 1,
+  x86_cpu_AVX10_V147 = x86_cpu_AVX10_V148 - 1,
+  x86_cpu_AVX10_V146 = x86_cpu_AVX10_V147 - 1,
+  x86_cpu_AVX10_V145 = x86_cpu_AVX10_V146 - 1,
+  x86_cpu_AVX10_V144 = x86_cpu_AVX10_V145 - 1,
+  x86_cpu_AVX10_V143 = x86_cpu_AVX10_V144 - 1,
+  x86_cpu_AVX10_V142 = x86_cpu_AVX10_V143 - 1,
+  x86_cpu_AVX10_V141 = x86_cpu_AVX10_V142 - 1,
+  x86_cpu_AVX10_V140 = x86_cpu_AVX10_V141 - 1,
+  x86_cpu_AVX10_V139 = x86_cpu_AVX10_V140 - 1,
+  x86_cpu_AVX10_V138 = x86_cpu_AVX10_V139 - 1,
+  x86_cpu_AVX10_V137 = x86_cpu_AVX10_V138 - 1,
+  x86_cpu_AVX10_V136 = x86_cpu_AVX10_V137 - 1,
+  x86_cpu_AVX10_V135 = x86_cpu_AVX10_V136 - 1,
+  x86_cpu_AVX10_V134 = x86_cpu_AVX10_V135 - 1,
+  x86_cpu_AVX10_V133 = x86_cpu_AVX10_V134 - 1,
+  x86_cpu_AVX10_V132 = x86_cpu_AVX10_V133 - 1,
+  x86_cpu_AVX10_V131 = x86_cpu_AVX10_V132 - 1,
+  x86_cpu_AVX10_V130 = x86_cpu_AVX10_V131 - 1,
+  x86_cpu_AVX10_V129 = x86_cpu_AVX10_V130 - 1,
+  x86_cpu_AVX10_V128 = x86_cpu_AVX10_V129 - 1,
+  x86_cpu_AVX10_V127 = x86_cpu_AVX10_V128 - 1,
+  x86_cpu_AVX10_V126 = x86_cpu_AVX10_V127 - 1,
+  x86_cpu_AVX10_V125 = x86_cpu_AVX10_V126 - 1,
+  x86_cpu_AVX10_V124 = x86_cpu_AVX10_V125 - 1,
+  x86_cpu_AVX10_V123 = x86_cpu_AVX10_V124 - 1,
+  x86_cpu_AVX10_V122 = x86_cpu_AVX10_V123 - 1,
+  x86_cpu_AVX10_V121 = x86_cpu_AVX10_V122 - 1,
+  x86_cpu_AVX10_V120 = x86_cpu_AVX10_V121 - 1,
+  x86_cpu_AVX10_V119 = x86_cpu_AVX10_V120 - 1,
+  x86_cpu_AVX10_V118 = x86_cpu_AVX10_V119 - 1,
+  x86_cpu_AVX10_V117 = x86_cpu_AVX10_V118 - 1,
+  x86_cpu_AVX10_V116 = x86_cpu_AVX10_V117 - 1,
+  x86_cpu_AVX10_V115 = x86_cpu_AVX10_V116 - 1,
+  x86_cpu_AVX10_V114 = x86_cpu_AVX10_V115 - 1,
+  x86_cpu_AVX10_V113 = x86_cpu_AVX10_V114 - 1,
+  x86_cpu_AVX10_V112 = x86_cpu_AVX10_V113 - 1,
+  x86_cpu_AVX10_V111 = x86_cpu_AVX10_V112 - 1,
+  x86_cpu_AVX10_V110 = x86_cpu_AVX10_V111 - 1,
+  x86_cpu_AVX10_V109 = x86_cpu_AVX10_V110 - 1,
+  x86_cpu_AVX10_V108 = x86_cpu_AVX10_V109 - 1,
+  x86_cpu_AVX10_V107 = x86_cpu_AVX10_V108 - 1,
+  x86_cpu_AVX10_V106 = x86_cpu_AVX10_V107 - 1,
+  x86_cpu_AVX10_V105 = x86_cpu_AVX10_V106 - 1,
+  x86_cpu_AVX10_V104 = x86_cpu_AVX10_V105 - 1,
+  x86_cpu_AVX10_V103 = x86_cpu_AVX10_V104 - 1,
+  x86_cpu_AVX10_V102 = x86_cpu_AVX10_V103 - 1,
+  x86_cpu_AVX10_V101 = x86_cpu_AVX10_V102 - 1,
+  x86_cpu_AVX10_V100 = x86_cpu_AVX10_V101 - 1,
+  x86_cpu_AVX10_V99 = x86_cpu_AVX10_V100 - 1,
+  x86_cpu_AVX10_V98 = x86_cpu_AVX10_V99 - 1,
+  x86_cpu_AVX10_V97 = x86_cpu_AVX10_V98 - 1,
+  x86_cpu_AVX10_V96 = x86_cpu_AVX10_V97 - 1,
+  x86_cpu_AVX10_V95 = x86_cpu_AVX10_V96 - 1,
+  x86_cpu_AVX10_V94 = x86_cpu_AVX10_V95 - 1,
+  x86_cpu_AVX10_V93 = x86_cpu_AVX10_V94 - 1,
+  x86_cpu_AVX10_V92 = x86_cpu_AVX10_V93 - 1,
+  x86_cpu_AVX10_V91 = x86_cpu_AVX10_V92 - 1,
+  x86_cpu_AVX10_V90 = x86_cpu_AVX10_V91 - 1,
+  x86_cpu_AVX10_V89 = x86_cpu_AVX10_V90 - 1,
+  x86_cpu_AVX10_V88 = x86_cpu_AVX10_V89 - 1,
+  x86_cpu_AVX10_V87 = x86_cpu_AVX10_V88 - 1,
+  x86_cpu_AVX10_V86 = x86_cpu_AVX10_V87 - 1,
+  x86_cpu_AVX10_V85 = x86_cpu_AVX10_V86 - 1,
+  x86_cpu_AVX10_V84 = x86_cpu_AVX10_V85 - 1,
+  x86_cpu_AVX10_V83 = x86_cpu_AVX10_V84 - 1,
+  x86_cpu_AVX10_V82 = x86_cpu_AVX10_V83 - 1,
+  x86_cpu_AVX10_V81 = x86_cpu_AVX10_V82 - 1,
+  x86_cpu_AVX10_V80 = x86_cpu_AVX10_V81 - 1,
+  x86_cpu_AVX10_V79 = x86_cpu_AVX10_V80 - 1,
+  x86_cpu_AVX10_V78 = x86_cpu_AVX10_V79 - 1,
+  x86_cpu_AVX10_V77 = x86_cpu_AVX10_V78 - 1,
+  x86_cpu_AVX10_V76 = x86_cpu_AVX10_V77 - 1,
+  x86_cpu_AVX10_V75 = x86_cpu_AVX10_V76 - 1,
+  x86_cpu_AVX10_V74 = x86_cpu_AVX10_V75 - 1,
+  x86_cpu_AVX10_V73 = x86_cpu_AVX10_V74 - 1,
+  x86_cpu_AVX10_V72 = x86_cpu_AVX10_V73 - 1,
+  x86_cpu_AVX10_V71 = x86_cpu_AVX10_V72 - 1,
+  x86_cpu_AVX10_V70 = x86_cpu_AVX10_V71 - 1,
+  x86_cpu_AVX10_V69 = x86_cpu_AVX10_V70 - 1,
+  x86_cpu_AVX10_V68 = x86_cpu_AVX10_V69 - 1,
+  x86_cpu_AVX10_V67 = x86_cpu_AVX10_V68 - 1,
+  x86_cpu_AVX10_V66 = x86_cpu_AVX10_V67 - 1,
+  x86_cpu_AVX10_V65 = x86_cpu_AVX10_V66 - 1,
+  x86_cpu_AVX10_V64 = x86_cpu_AVX10_V65 - 1,
+  x86_cpu_AVX10_V63 = x86_cpu_AVX10_V64 - 1,
+  x86_cpu_AVX10_V62 = x86_cpu_AVX10_V63 - 1,
+  x86_cpu_AVX10_V61 = x86_cpu_AVX10_V62 - 1,
+  x86_cpu_AVX10_V60 = x86_cpu_AVX10_V61 - 1,
+  x86_cpu_AVX10_V59 = x86_cpu_AVX10_V60 - 1,
+  x86_cpu_AVX10_V58 = x86_cpu_AVX10_V59 - 1,
+  x86_cpu_AVX10_V57 = x86_cpu_AVX10_V58 - 1,
+  x86_cpu_AVX10_V56 = x86_cpu_AVX10_V57 - 1,
+  x86_cpu_AVX10_V55 = x86_cpu_AVX10_V56 - 1,
+  x86_cpu_AVX10_V54 = x86_cpu_AVX10_V55 - 1,
+  x86_cpu_AVX10_V53 = x86_cpu_AVX10_V54 - 1,
+  x86_cpu_AVX10_V52 = x86_cpu_AVX10_V53 - 1,
+  x86_cpu_AVX10_V51 = x86_cpu_AVX10_V52 - 1,
+  x86_cpu_AVX10_V50 = x86_cpu_AVX10_V51 - 1,
+  x86_cpu_AVX10_V49 = x86_cpu_AVX10_V50 - 1,
+  x86_cpu_AVX10_V48 = x86_cpu_AVX10_V49 - 1,
+  x86_cpu_AVX10_V47 = x86_cpu_AVX10_V48 - 1,
+  x86_cpu_AVX10_V46 = x86_cpu_AVX10_V47 - 1,
+  x86_cpu_AVX10_V45 = x86_cpu_AVX10_V46 - 1,
+  x86_cpu_AVX10_V44 = x86_cpu_AVX10_V45 - 1,
+  x86_cpu_AVX10_V43 = x86_cpu_AVX10_V44 - 1,
+  x86_cpu_AVX10_V42 = x86_cpu_AVX10_V43 - 1,
+  x86_cpu_AVX10_V41 = x86_cpu_AVX10_V42 - 1,
+  x86_cpu_AVX10_V40 = x86_cpu_AVX10_V41 - 1,
+  x86_cpu_AVX10_V39 = x86_cpu_AVX10_V40 - 1,
+  x86_cpu_AVX10_V38 = x86_cpu_AVX10_V39 - 1,
+  x86_cpu_AVX10_V37 = x86_cpu_AVX10_V38 - 1,
+  x86_cpu_AVX10_V36 = x86_cpu_AVX10_V37 - 1,
+  x86_cpu_AVX10_V35 = x86_cpu_AVX10_V36 - 1,
+  x86_cpu_AVX10_V34 = x86_cpu_AVX10_V35 - 1,
+  x86_cpu_AVX10_V33 = x86_cpu_AVX10_V34 - 1,
+  x86_cpu_AVX10_V32 = x86_cpu_AVX10_V33 - 1,
+  x86_cpu_AVX10_V31 = x86_cpu_AVX10_V32 - 1,
+  x86_cpu_AVX10_V30 = x86_cpu_AVX10_V31 - 1,
+  x86_cpu_AVX10_V29 = x86_cpu_AVX10_V30 - 1,
+  x86_cpu_AVX10_V28 = x86_cpu_AVX10_V29 - 1,
+  x86_cpu_AVX10_V27 = x86_cpu_AVX10_V28 - 1,
+  x86_cpu_AVX10_V26 = x86_cpu_AVX10_V27 - 1,
+  x86_cpu_AVX10_V25 = x86_cpu_AVX10_V26 - 1,
+  x86_cpu_AVX10_V24 = x86_cpu_AVX10_V25 - 1,
+  x86_cpu_AVX10_V23 = x86_cpu_AVX10_V24 - 1,
+  x86_cpu_AVX10_V22 = x86_cpu_AVX10_V23 - 1,
+  x86_cpu_AVX10_V21 = x86_cpu_AVX10_V22 - 1,
+  x86_cpu_AVX10_V20 = x86_cpu_AVX10_V21 - 1,
+  x86_cpu_AVX10_V19 = x86_cpu_AVX10_V20 - 1,
+  x86_cpu_AVX10_V18 = x86_cpu_AVX10_V19 - 1,
+  x86_cpu_AVX10_V17 = x86_cpu_AVX10_V18 - 1,
+  x86_cpu_AVX10_V16 = x86_cpu_AVX10_V17 - 1,
+  x86_cpu_AVX10_V15 = x86_cpu_AVX10_V16 - 1,
+  x86_cpu_AVX10_V14 = x86_cpu_AVX10_V15 - 1,
+  x86_cpu_AVX10_V13 = x86_cpu_AVX10_V14 - 1,
+  x86_cpu_AVX10_V12 = x86_cpu_AVX10_V13 - 1,
+  x86_cpu_AVX10_V11 = x86_cpu_AVX10_V12 - 1,
+  x86_cpu_AVX10_V10 = x86_cpu_AVX10_V11 - 1,
+  x86_cpu_AVX10_V9 = x86_cpu_AVX10_V10 - 1,
+  x86_cpu_AVX10_V8 = x86_cpu_AVX10_V9 - 1,
+  x86_cpu_AVX10_V7 = x86_cpu_AVX10_V8 - 1,
+  x86_cpu_AVX10_V6 = x86_cpu_AVX10_V7 - 1,
+  x86_cpu_AVX10_V5 = x86_cpu_AVX10_V6 - 1,
+  x86_cpu_AVX10_V4 = x86_cpu_AVX10_V5 - 1,
+  x86_cpu_AVX10_V3 = x86_cpu_AVX10_V4 - 1,
+  x86_cpu_AVX10_V2 = x86_cpu_AVX10_V3 - 1,
+  x86_cpu_AVX10_V1 = x86_cpu_AVX10_V2 - 1
+/* x86_cpu_AVX10_V0 is invalid.  */
 };
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index badf088874..0bf923d48b 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -115,11 +115,18 @@ update_active (struct cpu_features *cpu_features)
   CPU_FEATURE_SET_ACTIVE (cpu_features, SHSTK);
 #endif
 
+  enum
+  {
+    os_xmm = 1,
+    os_ymm = 2,
+    os_zmm = 4
+  } os_vector_size = os_xmm;
   /* Can we call xgetbv?  */
   if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE))
     {
       unsigned int xcrlow;
       unsigned int xcrhigh;
+      CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10);
       asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0));
       /* Is YMM and XMM state usable?  */
       if ((xcrlow & (bit_YMM_state | bit_XMM_state))
@@ -128,6 +135,7 @@ update_active (struct cpu_features *cpu_features)
 	  /* Determine if AVX is usable.  */
 	  if (CPU_FEATURES_CPU_P (cpu_features, AVX))
 	    {
+	      os_vector_size |= os_ymm;
 	      CPU_FEATURE_SET (cpu_features, AVX);
 	      /* The following features depend on AVX being usable.  */
 	      /* Determine if AVX2 is usable.  */
@@ -166,6 +174,7 @@ update_active (struct cpu_features *cpu_features)
 			 | bit_ZMM16_31_state))
 	      == (bit_Opmask_state | bit_ZMM0_15_state | bit_ZMM16_31_state))
 	    {
+	      os_vector_size |= os_zmm;
 	      /* Determine if AVX512F is usable.  */
 	      if (CPU_FEATURES_CPU_P (cpu_features, AVX512F))
 		{
@@ -210,6 +219,22 @@ update_active (struct cpu_features *cpu_features)
 	    }
 	}
 
+      if (CPU_FEATURES_CPU_P (cpu_features, AVX10)
+	  && cpu_features->basic.max_cpuid >= 0x24)
+	{
+	  __cpuid_count (
+	      0x24, 0, cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.eax,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ebx,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ecx,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.edx);
+	  if (os_vector_size & os_xmm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_XMM);
+	  if (os_vector_size & os_ymm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_YMM);
+	  if (os_vector_size & os_zmm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_ZMM);
+	}
+
       /* 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 eb30d342a6..2d7427a6c0 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_14_ECX_0 + 1
+  CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_0 + 1
 };
 
 enum
@@ -319,6 +319,7 @@ enum
 #define bit_cpu_AVX_NE_CONVERT	(1u << 5)
 #define bit_cpu_AMX_COMPLEX	(1u << 8)
 #define bit_cpu_PREFETCHI	(1u << 14)
+#define bit_cpu_AVX10		(1u << 19)
 #define bit_cpu_APX_F		(1u << 21)
 
 /* CPUID_INDEX_19.  */
@@ -332,6 +333,13 @@ enum
 /* EBX.  */
 #define bit_cpu_PTWRITE		(1u << 4)
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define bit_cpu_AVX10_XMM		(1u << 16)
+#define bit_cpu_AVX10_YMM		(1u << 17)
+#define bit_cpu_AVX10_ZMM		(1u << 18)
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -563,6 +571,7 @@ enum
 #define index_cpu_AVX_NE_CONVERT CPUID_INDEX_7_ECX_1
 #define index_cpu_AMX_COMPLEX	CPUID_INDEX_7_ECX_1
 #define index_cpu_PREFETCHI	CPUID_INDEX_7_ECX_1
+#define index_cpu_AVX10		CPUID_INDEX_7_ECX_1
 #define index_cpu_APX_F		CPUID_INDEX_7_ECX_1
 
 /* CPUID_INDEX_19.  */
@@ -576,6 +585,13 @@ enum
 /* EBX.  */
 #define index_cpu_PTWRITE	CPUID_INDEX_14_ECX_0
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define index_cpu_AVX10_XMM	CPUID_INDEX_24_ECX_0
+#define index_cpu_AVX10_YMM	CPUID_INDEX_24_ECX_0
+#define index_cpu_AVX10_ZMM	CPUID_INDEX_24_ECX_0
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -809,6 +825,7 @@ enum
 #define reg_AVX_NE_CONVERT	edx
 #define reg_AMX_COMPLEX		edx
 #define reg_PREFETCHI		edx
+#define reg_AVX10		edx
 #define reg_APX_F		edx
 
 /* CPUID_INDEX_19.  */
@@ -822,6 +839,14 @@ enum
 /* EBX.  */
 #define reg_PTWRITE		ebx
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define reg_AVX10_XMM		ebx
+#define reg_AVX10_YMM		ebx
+#define reg_AVX10_ZMM		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/sys/platform/x86.h b/sysdeps/x86/sys/platform/x86.h
index 1ea2c5fc0b..fa8c7e158d 100644
--- a/sysdeps/x86/sys/platform/x86.h
+++ b/sysdeps/x86/sys/platform/x86.h
@@ -29,9 +29,45 @@ __BEGIN_DECLS
 extern const struct cpuid_feature *__x86_get_cpuid_feature_leaf (unsigned int)
      __attribute__ ((pure));
 
+static __inline__ unsigned int
+x86_cpu_get_avx10_version_number_from_enum (unsigned int __enum)
+{
+  return __enum - x86_cpu_AVX10_V1 + 1;
+}
+
+static __inline__ _Bool
+x86_cpu_is_index_avx10_version_number (unsigned int __index)
+{
+  return __index >= (unsigned int) x86_cpu_AVX10_V1
+	 && __index <= (unsigned int) x86_cpu_AVX10_V255;
+}
+
+static __inline__ unsigned int
+x86_cpu_get_avx10_info (unsigned int __index)
+{
+  const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf (
+      __index / (8 * sizeof (unsigned int) * 4));
+  unsigned int __reg = __index & (8 * sizeof (unsigned int) * 4 - 1);
+  __reg /= 8 * sizeof (unsigned int);
+
+  return __ptr->cpuid_array[__reg];
+}
+
+/* Get AVX10 version number in byte form.  Must check AVX10 active first. Value
+   is in range [1, 255].  */
+static __inline__ unsigned int
+x86_cpu_get_avx10_version_number (void)
+{
+  return x86_cpu_get_avx10_info (x86_cpu_index_24_ecx_0_ebx) & 0xff;
+}
+
 static __inline__ _Bool
 x86_cpu_present (unsigned int __index)
 {
+  if (x86_cpu_is_index_avx10_version_number (__index))
+    return x86_cpu_get_avx10_version_number ()
+	   >= x86_cpu_get_avx10_version_number_from_enum (__index);
+
   const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
     (__index / (8 * sizeof (unsigned int) * 4));
   unsigned int __reg
@@ -45,6 +81,10 @@ x86_cpu_present (unsigned int __index)
 static __inline__ _Bool
 x86_cpu_active (unsigned int __index)
 {
+  if (x86_cpu_is_index_avx10_version_number (__index))
+    return x86_cpu_get_avx10_version_number ()
+	   >= x86_cpu_get_avx10_version_number_from_enum (__index);
+
   const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
     (__index / (8 * sizeof (unsigned int) * 4));
   unsigned int __reg
diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c
index b27fa7324a..53e68431f1 100644
--- a/sysdeps/x86/tst-get-cpu-features.c
+++ b/sysdeps/x86/tst-get-cpu-features.c
@@ -219,6 +219,7 @@ do_test (void)
   CHECK_CPU_FEATURE_PRESENT (AVX_NE_CONVERT);
   CHECK_CPU_FEATURE_PRESENT (AMX_COMPLEX);
   CHECK_CPU_FEATURE_PRESENT (PREFETCHI);
+  CHECK_CPU_FEATURE_PRESENT (AVX10);
   CHECK_CPU_FEATURE_PRESENT (APX_F);
   CHECK_CPU_FEATURE_PRESENT (AESKLE);
   CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
@@ -391,11 +392,273 @@ do_test (void)
   CHECK_CPU_FEATURE_ACTIVE (AVX_NE_CONVERT);
   CHECK_CPU_FEATURE_ACTIVE (AMX_COMPLEX);
   CHECK_CPU_FEATURE_ACTIVE (PREFETCHI);
+  CHECK_CPU_FEATURE_ACTIVE (AVX10);
   CHECK_CPU_FEATURE_ACTIVE (APX_F);
   CHECK_CPU_FEATURE_ACTIVE (AESKLE);
   CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
   CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
 
+  if (CPU_FEATURE_ACTIVE (AVX10))
+    {
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_XMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_YMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_ZMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V1);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V2);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V3);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V4);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V5);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V6);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V7);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V8);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V9);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V10);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V11);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V12);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V13);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V14);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V15);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V16);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V17);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V18);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V19);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V20);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V21);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V22);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V23);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V24);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V25);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V26);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V27);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V28);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V29);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V30);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V31);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V32);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V33);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V34);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V35);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V36);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V37);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V38);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V39);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V40);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V41);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V42);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V43);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V44);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V45);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V46);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V47);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V48);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V49);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V50);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V51);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V52);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V53);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V54);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V55);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V56);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V57);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V58);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V59);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V60);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V61);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V62);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V63);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V64);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V65);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V66);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V67);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V68);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V69);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V70);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V71);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V72);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V73);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V74);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V75);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V76);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V77);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V78);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V79);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V80);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V81);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V82);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V83);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V84);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V85);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V86);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V87);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V88);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V89);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V90);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V91);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V92);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V93);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V94);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V95);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V96);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V97);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V98);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V99);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V100);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V101);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V102);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V103);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V104);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V105);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V106);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V107);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V108);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V109);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V110);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V111);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V112);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V113);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V114);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V115);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V116);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V117);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V118);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V119);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V120);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V121);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V122);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V123);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V124);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V125);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V126);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V127);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V128);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V129);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V130);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V131);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V132);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V133);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V134);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V135);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V136);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V137);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V138);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V139);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V140);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V141);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V142);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V143);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V144);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V145);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V146);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V147);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V148);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V149);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V150);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V151);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V152);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V153);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V154);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V155);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V156);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V157);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V158);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V159);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V160);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V161);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V162);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V163);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V164);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V165);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V166);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V167);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V168);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V169);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V170);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V171);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V172);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V173);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V174);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V175);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V176);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V177);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V178);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V179);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V180);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V181);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V182);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V183);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V184);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V185);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V186);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V187);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V188);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V189);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V190);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V191);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V192);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V193);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V194);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V195);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V196);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V197);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V198);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V199);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V200);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V201);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V202);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V203);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V204);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V205);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V206);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V207);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V208);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V209);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V210);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V211);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V212);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V213);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V214);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V215);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V216);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V217);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V218);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V219);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V220);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V221);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V222);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V223);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V224);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V225);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V226);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V227);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V228);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V229);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V230);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V231);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V232);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V233);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V234);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V235);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V236);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V237);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V238);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V239);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V240);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V241);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V242);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V243);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V244);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V245);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V246);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V247);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V248);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V249);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V250);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V251);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V252);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V253);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V254);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V255);
+    }
   return 0;
 }
 
-- 
2.34.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2] x86: Add support for AVX10 version and vec size in cpu-features
  2023-08-24 19:14 ` [PATCH v2] " Noah Goldstein
@ 2023-08-25  7:12   ` Florian Weimer
  2023-08-25 17:39     ` Noah Goldstein
  0 siblings, 1 reply; 12+ messages in thread
From: Florian Weimer @ 2023-08-25  7:12 UTC (permalink / raw)
  To: Noah Goldstein via Libc-alpha; +Cc: Noah Goldstein, hjl.tools, carlos

* Noah Goldstein via Libc-alpha:

> +/* AVX10 version information is handled differently from all other CPUID
> +   related logic.  Rather than being encoded in cpuid as discrete booleans, the
> +   AVX10 version is encoded is a full byte that represents the version number
> +   (greater than or equal to 1).  Since the CPUID API is only able to handle
> +   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
> +   by the user and have special logic in `x86_cpu_{present,active}`.  This is
> +   unpleasant on our end, but is the only way to make the existing API also
> +   support version queries.  */
> +
> +  /* All 1s should never be a value feature index.  */
> +  x86_cpu_AVX10_V255 = ~0,
> +  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
> +  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
> +  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
> +  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,

Is this really necessary?  We can define an x86_cpu_avx10_version inline
function that calls __x86_get_cpuid_feature_leaf and extracts the
version byte.  Is it really necessary to support something like this?

  CPU_FEATURE_ACTIVE (AVX10_V2)

This would be the alternative:

  x86_cpu_avx10_version () >= 2

Let's hope that version 0 means no AVX10. 8-)

Thanks,
Florian


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2] x86: Add support for AVX10 version and vec size in cpu-features
  2023-08-25  7:12   ` Florian Weimer
@ 2023-08-25 17:39     ` Noah Goldstein
  2023-09-01 18:52       ` Noah Goldstein
  0 siblings, 1 reply; 12+ messages in thread
From: Noah Goldstein @ 2023-08-25 17:39 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Noah Goldstein via Libc-alpha, hjl.tools, carlos

On Fri, Aug 25, 2023 at 2:12 AM Florian Weimer <fweimer@redhat.com> wrote:
>
> * Noah Goldstein via Libc-alpha:
>
> > +/* AVX10 version information is handled differently from all other CPUID
> > +   related logic.  Rather than being encoded in cpuid as discrete booleans, the
> > +   AVX10 version is encoded is a full byte that represents the version number
> > +   (greater than or equal to 1).  Since the CPUID API is only able to handle
> > +   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
> > +   by the user and have special logic in `x86_cpu_{present,active}`.  This is
> > +   unpleasant on our end, but is the only way to make the existing API also
> > +   support version queries.  */
> > +
> > +  /* All 1s should never be a value feature index.  */
> > +  x86_cpu_AVX10_V255 = ~0,
> > +  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
> > +  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
> > +  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
> > +  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,
>
> Is this really necessary?  We can define an x86_cpu_avx10_version inline
> function that calls __x86_get_cpuid_feature_leaf and extracts the
> version byte.  Is it really necessary to support something like this?
>

I agree it's not the best API. My feelings are two fold on this.
1) The existing API that users know should support the feature, even if its
not the best way for users query the logic. Adding support for specific version
queries in CPU_FEATURE_{ACTIVE,PRESENT} doesn't prevent us from
adding an API that allows for querying the full byte. But only adding the byte
might be disruptive to users that expect to be able to do all their querying
through the existing API.
2) For a lot of use cases, this is sufficient. Currently we only have
two versions
and I think the common use case is not "is feature above level X?",
but "do I have
feature X?". The latter can reasonably be supported with a single query of:
CPU_FEATURE_{ACTIVE,PRESENT}(AVX10_<MIN_VERSION_WITH_X>).

>   CPU_FEATURE_ACTIVE (AVX10_V2)
>
> This would be the alternative:
>
>   x86_cpu_avx10_version () >= 2
>
We do plan to propose a new byte API in a follow up :)

> Let's hope that version 0 means no AVX10. 8-)
>
versions start at 1.



> Thanks,
> Florian
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2] x86: Add support for AVX10 version and vec size in cpu-features
  2023-08-25 17:39     ` Noah Goldstein
@ 2023-09-01 18:52       ` Noah Goldstein
  2023-09-08  4:55         ` Noah Goldstein
  0 siblings, 1 reply; 12+ messages in thread
From: Noah Goldstein @ 2023-09-01 18:52 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Noah Goldstein via Libc-alpha, hjl.tools, carlos

On Fri, Aug 25, 2023 at 12:39 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
>
> On Fri, Aug 25, 2023 at 2:12 AM Florian Weimer <fweimer@redhat.com> wrote:
> >
> > * Noah Goldstein via Libc-alpha:
> >
> > > +/* AVX10 version information is handled differently from all other CPUID
> > > +   related logic.  Rather than being encoded in cpuid as discrete booleans, the
> > > +   AVX10 version is encoded is a full byte that represents the version number
> > > +   (greater than or equal to 1).  Since the CPUID API is only able to handle
> > > +   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
> > > +   by the user and have special logic in `x86_cpu_{present,active}`.  This is
> > > +   unpleasant on our end, but is the only way to make the existing API also
> > > +   support version queries.  */
> > > +
> > > +  /* All 1s should never be a value feature index.  */
> > > +  x86_cpu_AVX10_V255 = ~0,
> > > +  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
> > > +  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
> > > +  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
> > > +  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,
> >
> > Is this really necessary?  We can define an x86_cpu_avx10_version inline
> > function that calls __x86_get_cpuid_feature_leaf and extracts the
> > version byte.  Is it really necessary to support something like this?
> >
>
> I agree it's not the best API. My feelings are two fold on this.
> 1) The existing API that users know should support the feature, even if its
> not the best way for users query the logic. Adding support for specific version
> queries in CPU_FEATURE_{ACTIVE,PRESENT} doesn't prevent us from
> adding an API that allows for querying the full byte. But only adding the byte
> might be disruptive to users that expect to be able to do all their querying
> through the existing API.
> 2) For a lot of use cases, this is sufficient. Currently we only have
> two versions
> and I think the common use case is not "is feature above level X?",
> but "do I have
> feature X?". The latter can reasonably be supported with a single query of:
> CPU_FEATURE_{ACTIVE,PRESENT}(AVX10_<MIN_VERSION_WITH_X>).
>
> >   CPU_FEATURE_ACTIVE (AVX10_V2)
> >
> > This would be the alternative:
> >
> >   x86_cpu_avx10_version () >= 2
> >
> We do plan to propose a new byte API in a follow up :)
>
> > Let's hope that version 0 means no AVX10. 8-)
> >
> versions start at 1.
>
>
>
> > Thanks,
> > Florian
> >

Ping.
Florian, you okay with this going in?

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2] x86: Add support for AVX10 version and vec size in cpu-features
  2023-09-01 18:52       ` Noah Goldstein
@ 2023-09-08  4:55         ` Noah Goldstein
  0 siblings, 0 replies; 12+ messages in thread
From: Noah Goldstein @ 2023-09-08  4:55 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Noah Goldstein via Libc-alpha, hjl.tools, carlos

On Fri, Sep 1, 2023 at 1:52 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
>
> On Fri, Aug 25, 2023 at 12:39 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
> >
> > On Fri, Aug 25, 2023 at 2:12 AM Florian Weimer <fweimer@redhat.com> wrote:
> > >
> > > * Noah Goldstein via Libc-alpha:
> > >
> > > > +/* AVX10 version information is handled differently from all other CPUID
> > > > +   related logic.  Rather than being encoded in cpuid as discrete booleans, the
> > > > +   AVX10 version is encoded is a full byte that represents the version number
> > > > +   (greater than or equal to 1).  Since the CPUID API is only able to handle
> > > > +   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
> > > > +   by the user and have special logic in `x86_cpu_{present,active}`.  This is
> > > > +   unpleasant on our end, but is the only way to make the existing API also
> > > > +   support version queries.  */
> > > > +
> > > > +  /* All 1s should never be a value feature index.  */
> > > > +  x86_cpu_AVX10_V255 = ~0,
> > > > +  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
> > > > +  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
> > > > +  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
> > > > +  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,
> > >
> > > Is this really necessary?  We can define an x86_cpu_avx10_version inline
> > > function that calls __x86_get_cpuid_feature_leaf and extracts the
> > > version byte.  Is it really necessary to support something like this?
> > >
> >
> > I agree it's not the best API. My feelings are two fold on this.
> > 1) The existing API that users know should support the feature, even if its
> > not the best way for users query the logic. Adding support for specific version
> > queries in CPU_FEATURE_{ACTIVE,PRESENT} doesn't prevent us from
> > adding an API that allows for querying the full byte. But only adding the byte
> > might be disruptive to users that expect to be able to do all their querying
> > through the existing API.
> > 2) For a lot of use cases, this is sufficient. Currently we only have
> > two versions
> > and I think the common use case is not "is feature above level X?",
> > but "do I have
> > feature X?". The latter can reasonably be supported with a single query of:
> > CPU_FEATURE_{ACTIVE,PRESENT}(AVX10_<MIN_VERSION_WITH_X>).
> >
> > >   CPU_FEATURE_ACTIVE (AVX10_V2)
> > >
> > > This would be the alternative:
> > >
> > >   x86_cpu_avx10_version () >= 2
> > >
> > We do plan to propose a new byte API in a follow up :)
> >
> > > Let's hope that version 0 means no AVX10. 8-)
> > >
> > versions start at 1.
> >
> >
> >
> > > Thanks,
> > > Florian
> > >
>
> Ping.
> Florian, you okay with this going in?

Ping

^ permalink raw reply	[flat|nested] 12+ messages in thread

* x86: Add support for AVX10 preset and vec size in cpu-features
  2023-08-24 18:48 [PATCH v1] x86: Add support for AVX10 version and vec size in cpu-features Noah Goldstein
                   ` (2 preceding siblings ...)
  2023-08-24 20:30 ` Noah Goldstein
@ 2023-09-20 20:44 ` Noah Goldstein
  2023-09-20 20:44   ` x86: Add support for AVX10 version " Noah Goldstein
  2023-09-25 20:49   ` x86: Add support for AVX10 preset and vec size " H.J. Lu
  3 siblings, 2 replies; 12+ messages in thread
From: Noah Goldstein @ 2023-09-20 20:44 UTC (permalink / raw)
  To: libc-alpha; +Cc: goldstein.w.n, hjl.tools, carlos

This commit add support for the new AVX10 cpu features:
https://cdrdv2-public.intel.com/784267/355989-intel-avx10-spec.pdf

We add checks for:
    - `AVX10`: Check if AVX10 is present.
    - `AVX10_{X,Y,Z}MM`: Check if a given vec class has AVX10 support.

`make check` passes and cpuid output was checked against GNR/DMR on an
emulator.
---
 manual/platform.texi               | 12 ++++++++++++
 sysdeps/x86/bits/platform/x86.h    | 14 ++++++++++++--
 sysdeps/x86/cpu-features.c         | 25 +++++++++++++++++++++++++
 sysdeps/x86/include/cpu-features.h | 27 ++++++++++++++++++++++++++-
 sysdeps/x86/tst-get-cpu-features.c |  8 ++++++++
 5 files changed, 83 insertions(+), 3 deletions(-)

diff --git a/manual/platform.texi b/manual/platform.texi
index 2a2d557067..478b6fdcdf 100644
--- a/manual/platform.texi
+++ b/manual/platform.texi
@@ -222,6 +222,18 @@ Leaf (EAX = 23H).
 @item
 @code{AVX} -- The AVX instruction extensions.
 
+@item
+@code{AVX10} -- The AVX10 instruction extensions.
+
+@item
+@code{AVX10_XMM} -- Whether AVX10 includes xmm registers.
+
+@item
+@code{AVX10_YMM} -- Whether AVX10 includes ymm registers.
+
+@item
+@code{AVX10_ZMM} -- Whether AVX10 includes zmm registers.
+
 @item
 @code{AVX2} -- The AVX2 instruction extensions.
 
diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
index 88ca071aa7..1e23d53ba2 100644
--- a/sysdeps/x86/bits/platform/x86.h
+++ b/sysdeps/x86/bits/platform/x86.h
@@ -30,7 +30,8 @@ enum
   CPUID_INDEX_80000008,
   CPUID_INDEX_7_ECX_1,
   CPUID_INDEX_19,
-  CPUID_INDEX_14_ECX_0
+  CPUID_INDEX_14_ECX_0,
+  CPUID_INDEX_24_ECX_0
 };
 
 struct cpuid_feature
@@ -312,6 +313,7 @@ enum
   x86_cpu_AVX_NE_CONVERT	= x86_cpu_index_7_ecx_1_edx + 5,
   x86_cpu_AMX_COMPLEX		= x86_cpu_index_7_ecx_1_edx + 8,
   x86_cpu_PREFETCHI		= x86_cpu_index_7_ecx_1_edx + 14,
+  x86_cpu_AVX10			= x86_cpu_index_7_ecx_1_edx + 19,
   x86_cpu_APX_F			= x86_cpu_index_7_ecx_1_edx + 21,
 
   x86_cpu_index_19_ebx
@@ -325,5 +327,13 @@ enum
     = (CPUID_INDEX_14_ECX_0 * 8 * 4 * sizeof (unsigned int)
        + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
 
-  x86_cpu_PTWRITE		= x86_cpu_index_14_ecx_0_ebx + 4
+  x86_cpu_PTWRITE		= x86_cpu_index_14_ecx_0_ebx + 4,
+
+  x86_cpu_index_24_ecx_0_ebx
+    = (CPUID_INDEX_24_ECX_0 * 8 * 4 * sizeof (unsigned int)
+       + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
+
+  x86_cpu_AVX10_XMM = x86_cpu_index_24_ecx_0_ebx + 16,
+  x86_cpu_AVX10_YMM = x86_cpu_index_24_ecx_0_ebx + 17,
+  x86_cpu_AVX10_ZMM = x86_cpu_index_24_ecx_0_ebx + 18,
 };
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index badf088874..0bf923d48b 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -115,11 +115,18 @@ update_active (struct cpu_features *cpu_features)
   CPU_FEATURE_SET_ACTIVE (cpu_features, SHSTK);
 #endif
 
+  enum
+  {
+    os_xmm = 1,
+    os_ymm = 2,
+    os_zmm = 4
+  } os_vector_size = os_xmm;
   /* Can we call xgetbv?  */
   if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE))
     {
       unsigned int xcrlow;
       unsigned int xcrhigh;
+      CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10);
       asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0));
       /* Is YMM and XMM state usable?  */
       if ((xcrlow & (bit_YMM_state | bit_XMM_state))
@@ -128,6 +135,7 @@ update_active (struct cpu_features *cpu_features)
 	  /* Determine if AVX is usable.  */
 	  if (CPU_FEATURES_CPU_P (cpu_features, AVX))
 	    {
+	      os_vector_size |= os_ymm;
 	      CPU_FEATURE_SET (cpu_features, AVX);
 	      /* The following features depend on AVX being usable.  */
 	      /* Determine if AVX2 is usable.  */
@@ -166,6 +174,7 @@ update_active (struct cpu_features *cpu_features)
 			 | bit_ZMM16_31_state))
 	      == (bit_Opmask_state | bit_ZMM0_15_state | bit_ZMM16_31_state))
 	    {
+	      os_vector_size |= os_zmm;
 	      /* Determine if AVX512F is usable.  */
 	      if (CPU_FEATURES_CPU_P (cpu_features, AVX512F))
 		{
@@ -210,6 +219,22 @@ update_active (struct cpu_features *cpu_features)
 	    }
 	}
 
+      if (CPU_FEATURES_CPU_P (cpu_features, AVX10)
+	  && cpu_features->basic.max_cpuid >= 0x24)
+	{
+	  __cpuid_count (
+	      0x24, 0, cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.eax,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ebx,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ecx,
+	      cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.edx);
+	  if (os_vector_size & os_xmm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_XMM);
+	  if (os_vector_size & os_ymm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_YMM);
+	  if (os_vector_size & os_zmm)
+	    CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_ZMM);
+	}
+
       /* 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 eb30d342a6..2d7427a6c0 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_14_ECX_0 + 1
+  CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_0 + 1
 };
 
 enum
@@ -319,6 +319,7 @@ enum
 #define bit_cpu_AVX_NE_CONVERT	(1u << 5)
 #define bit_cpu_AMX_COMPLEX	(1u << 8)
 #define bit_cpu_PREFETCHI	(1u << 14)
+#define bit_cpu_AVX10		(1u << 19)
 #define bit_cpu_APX_F		(1u << 21)
 
 /* CPUID_INDEX_19.  */
@@ -332,6 +333,13 @@ enum
 /* EBX.  */
 #define bit_cpu_PTWRITE		(1u << 4)
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define bit_cpu_AVX10_XMM		(1u << 16)
+#define bit_cpu_AVX10_YMM		(1u << 17)
+#define bit_cpu_AVX10_ZMM		(1u << 18)
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -563,6 +571,7 @@ enum
 #define index_cpu_AVX_NE_CONVERT CPUID_INDEX_7_ECX_1
 #define index_cpu_AMX_COMPLEX	CPUID_INDEX_7_ECX_1
 #define index_cpu_PREFETCHI	CPUID_INDEX_7_ECX_1
+#define index_cpu_AVX10		CPUID_INDEX_7_ECX_1
 #define index_cpu_APX_F		CPUID_INDEX_7_ECX_1
 
 /* CPUID_INDEX_19.  */
@@ -576,6 +585,13 @@ enum
 /* EBX.  */
 #define index_cpu_PTWRITE	CPUID_INDEX_14_ECX_0
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define index_cpu_AVX10_XMM	CPUID_INDEX_24_ECX_0
+#define index_cpu_AVX10_YMM	CPUID_INDEX_24_ECX_0
+#define index_cpu_AVX10_ZMM	CPUID_INDEX_24_ECX_0
+
 /* CPUID_INDEX_1.  */
 
 /* ECX.  */
@@ -809,6 +825,7 @@ enum
 #define reg_AVX_NE_CONVERT	edx
 #define reg_AMX_COMPLEX		edx
 #define reg_PREFETCHI		edx
+#define reg_AVX10		edx
 #define reg_APX_F		edx
 
 /* CPUID_INDEX_19.  */
@@ -822,6 +839,14 @@ enum
 /* EBX.  */
 #define reg_PTWRITE		ebx
 
+/* CPUID_INDEX_24_ECX_0.  */
+
+/* EBX.  */
+#define reg_AVX10_XMM		ebx
+#define reg_AVX10_YMM		ebx
+#define reg_AVX10_ZMM		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 b27fa7324a..44edd18df2 100644
--- a/sysdeps/x86/tst-get-cpu-features.c
+++ b/sysdeps/x86/tst-get-cpu-features.c
@@ -219,6 +219,7 @@ do_test (void)
   CHECK_CPU_FEATURE_PRESENT (AVX_NE_CONVERT);
   CHECK_CPU_FEATURE_PRESENT (AMX_COMPLEX);
   CHECK_CPU_FEATURE_PRESENT (PREFETCHI);
+  CHECK_CPU_FEATURE_PRESENT (AVX10);
   CHECK_CPU_FEATURE_PRESENT (APX_F);
   CHECK_CPU_FEATURE_PRESENT (AESKLE);
   CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
@@ -391,11 +392,18 @@ do_test (void)
   CHECK_CPU_FEATURE_ACTIVE (AVX_NE_CONVERT);
   CHECK_CPU_FEATURE_ACTIVE (AMX_COMPLEX);
   CHECK_CPU_FEATURE_ACTIVE (PREFETCHI);
+  CHECK_CPU_FEATURE_ACTIVE (AVX10);
   CHECK_CPU_FEATURE_ACTIVE (APX_F);
   CHECK_CPU_FEATURE_ACTIVE (AESKLE);
   CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
   CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
 
+  if (CPU_FEATURE_ACTIVE (AVX10))
+    {
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_XMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_YMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_ZMM);
+    }
   return 0;
 }
 
-- 
2.34.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* x86: Add support for AVX10 version in cpu-features
  2023-09-20 20:44 ` x86: Add support for AVX10 preset " Noah Goldstein
@ 2023-09-20 20:44   ` Noah Goldstein
  2023-09-25 20:49   ` x86: Add support for AVX10 preset and vec size " H.J. Lu
  1 sibling, 0 replies; 12+ messages in thread
From: Noah Goldstein @ 2023-09-20 20:44 UTC (permalink / raw)
  To: libc-alpha; +Cc: goldstein.w.n, hjl.tools, carlos

This commit add support for the new AVX10 cpu features:
https://cdrdv2-public.intel.com/784267/355989-intel-avx10-spec.pdf

We add checks for:
    - `AVX10_V{1..255}`: Check if a given version is active.

The version checks are not ideal, the reason for the reason for this
is the version information in AVX10 is encoded as complete a byte
value, but the `CPU_FEATURES` interface is only able to query bools.

To get around this, we add a feature for each possible version value
(starting at 1 as there is no AVX10 version 0).

`make check` passes and cpuid output was checked against GNR/DMR on an
emulator.
---
 manual/platform.texi               |  16 ++
 sysdeps/x86/bits/platform/x86.h    | 267 +++++++++++++++++++++++++++++
 sysdeps/x86/sys/platform/x86.h     |  40 +++++
 sysdeps/x86/tst-get-cpu-features.c | 255 +++++++++++++++++++++++++++
 4 files changed, 578 insertions(+)

diff --git a/manual/platform.texi b/manual/platform.texi
index 478b6fdcdf..99dc57b568 100644
--- a/manual/platform.texi
+++ b/manual/platform.texi
@@ -234,6 +234,10 @@ Leaf (EAX = 23H).
 @item
 @code{AVX10_ZMM} -- Whether AVX10 includes zmm registers.
 
+@item
+@code{AVX10_V1}..@code{AVX10_V255} -- Whether AVX10 supports a given
+version.
+
 @item
 @code{AVX2} -- The AVX2 instruction extensions.
 
@@ -772,3 +776,15 @@ avx_active (void)
   return CPU_FEATURE_ACTIVE (AVX);
 @}
 @end smallexample
+
+You could query @code{AVX10} version number with:
+
+@smallexample
+#include <sys/platform/x86.h>
+
+int
+has_avx10_version1 (void)
+@{
+  return CPU_FEATURE_ACTIVE (AVX10_V1); // Up to AVX10_V255
+@}
+@end smallexample
diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
index 1e23d53ba2..777fb6ce18 100644
--- a/sysdeps/x86/bits/platform/x86.h
+++ b/sysdeps/x86/bits/platform/x86.h
@@ -336,4 +336,271 @@ enum
   x86_cpu_AVX10_XMM = x86_cpu_index_24_ecx_0_ebx + 16,
   x86_cpu_AVX10_YMM = x86_cpu_index_24_ecx_0_ebx + 17,
   x86_cpu_AVX10_ZMM = x86_cpu_index_24_ecx_0_ebx + 18,
+
+/* AVX10 version information is handled differently from all other CPUID
+   related logic.  Rather than being encoded in cpuid as discrete booleans, the
+   AVX10 version is encoded is a full byte that represents the version number
+   (greater than or equal to 1).  Since the CPUID API is only able to handle
+   boolean returns, we enumerate `x86_cpu_AVX10_V{1..255}` which can be queried
+   by the user and have special logic in `x86_cpu_{present,active}`.  This is
+   unpleasant on our end, but is the only way to make the existing API also
+   support version queries.  */
+
+  /* All 1s should never be a value feature index.  */
+  x86_cpu_AVX10_V255 = ~0,
+  x86_cpu_AVX10_V254 = x86_cpu_AVX10_V255 - 1,
+  x86_cpu_AVX10_V253 = x86_cpu_AVX10_V254 - 1,
+  x86_cpu_AVX10_V252 = x86_cpu_AVX10_V253 - 1,
+  x86_cpu_AVX10_V251 = x86_cpu_AVX10_V252 - 1,
+  x86_cpu_AVX10_V250 = x86_cpu_AVX10_V251 - 1,
+  x86_cpu_AVX10_V249 = x86_cpu_AVX10_V250 - 1,
+  x86_cpu_AVX10_V248 = x86_cpu_AVX10_V249 - 1,
+  x86_cpu_AVX10_V247 = x86_cpu_AVX10_V248 - 1,
+  x86_cpu_AVX10_V246 = x86_cpu_AVX10_V247 - 1,
+  x86_cpu_AVX10_V245 = x86_cpu_AVX10_V246 - 1,
+  x86_cpu_AVX10_V244 = x86_cpu_AVX10_V245 - 1,
+  x86_cpu_AVX10_V243 = x86_cpu_AVX10_V244 - 1,
+  x86_cpu_AVX10_V242 = x86_cpu_AVX10_V243 - 1,
+  x86_cpu_AVX10_V241 = x86_cpu_AVX10_V242 - 1,
+  x86_cpu_AVX10_V240 = x86_cpu_AVX10_V241 - 1,
+  x86_cpu_AVX10_V239 = x86_cpu_AVX10_V240 - 1,
+  x86_cpu_AVX10_V238 = x86_cpu_AVX10_V239 - 1,
+  x86_cpu_AVX10_V237 = x86_cpu_AVX10_V238 - 1,
+  x86_cpu_AVX10_V236 = x86_cpu_AVX10_V237 - 1,
+  x86_cpu_AVX10_V235 = x86_cpu_AVX10_V236 - 1,
+  x86_cpu_AVX10_V234 = x86_cpu_AVX10_V235 - 1,
+  x86_cpu_AVX10_V233 = x86_cpu_AVX10_V234 - 1,
+  x86_cpu_AVX10_V232 = x86_cpu_AVX10_V233 - 1,
+  x86_cpu_AVX10_V231 = x86_cpu_AVX10_V232 - 1,
+  x86_cpu_AVX10_V230 = x86_cpu_AVX10_V231 - 1,
+  x86_cpu_AVX10_V229 = x86_cpu_AVX10_V230 - 1,
+  x86_cpu_AVX10_V228 = x86_cpu_AVX10_V229 - 1,
+  x86_cpu_AVX10_V227 = x86_cpu_AVX10_V228 - 1,
+  x86_cpu_AVX10_V226 = x86_cpu_AVX10_V227 - 1,
+  x86_cpu_AVX10_V225 = x86_cpu_AVX10_V226 - 1,
+  x86_cpu_AVX10_V224 = x86_cpu_AVX10_V225 - 1,
+  x86_cpu_AVX10_V223 = x86_cpu_AVX10_V224 - 1,
+  x86_cpu_AVX10_V222 = x86_cpu_AVX10_V223 - 1,
+  x86_cpu_AVX10_V221 = x86_cpu_AVX10_V222 - 1,
+  x86_cpu_AVX10_V220 = x86_cpu_AVX10_V221 - 1,
+  x86_cpu_AVX10_V219 = x86_cpu_AVX10_V220 - 1,
+  x86_cpu_AVX10_V218 = x86_cpu_AVX10_V219 - 1,
+  x86_cpu_AVX10_V217 = x86_cpu_AVX10_V218 - 1,
+  x86_cpu_AVX10_V216 = x86_cpu_AVX10_V217 - 1,
+  x86_cpu_AVX10_V215 = x86_cpu_AVX10_V216 - 1,
+  x86_cpu_AVX10_V214 = x86_cpu_AVX10_V215 - 1,
+  x86_cpu_AVX10_V213 = x86_cpu_AVX10_V214 - 1,
+  x86_cpu_AVX10_V212 = x86_cpu_AVX10_V213 - 1,
+  x86_cpu_AVX10_V211 = x86_cpu_AVX10_V212 - 1,
+  x86_cpu_AVX10_V210 = x86_cpu_AVX10_V211 - 1,
+  x86_cpu_AVX10_V209 = x86_cpu_AVX10_V210 - 1,
+  x86_cpu_AVX10_V208 = x86_cpu_AVX10_V209 - 1,
+  x86_cpu_AVX10_V207 = x86_cpu_AVX10_V208 - 1,
+  x86_cpu_AVX10_V206 = x86_cpu_AVX10_V207 - 1,
+  x86_cpu_AVX10_V205 = x86_cpu_AVX10_V206 - 1,
+  x86_cpu_AVX10_V204 = x86_cpu_AVX10_V205 - 1,
+  x86_cpu_AVX10_V203 = x86_cpu_AVX10_V204 - 1,
+  x86_cpu_AVX10_V202 = x86_cpu_AVX10_V203 - 1,
+  x86_cpu_AVX10_V201 = x86_cpu_AVX10_V202 - 1,
+  x86_cpu_AVX10_V200 = x86_cpu_AVX10_V201 - 1,
+  x86_cpu_AVX10_V199 = x86_cpu_AVX10_V200 - 1,
+  x86_cpu_AVX10_V198 = x86_cpu_AVX10_V199 - 1,
+  x86_cpu_AVX10_V197 = x86_cpu_AVX10_V198 - 1,
+  x86_cpu_AVX10_V196 = x86_cpu_AVX10_V197 - 1,
+  x86_cpu_AVX10_V195 = x86_cpu_AVX10_V196 - 1,
+  x86_cpu_AVX10_V194 = x86_cpu_AVX10_V195 - 1,
+  x86_cpu_AVX10_V193 = x86_cpu_AVX10_V194 - 1,
+  x86_cpu_AVX10_V192 = x86_cpu_AVX10_V193 - 1,
+  x86_cpu_AVX10_V191 = x86_cpu_AVX10_V192 - 1,
+  x86_cpu_AVX10_V190 = x86_cpu_AVX10_V191 - 1,
+  x86_cpu_AVX10_V189 = x86_cpu_AVX10_V190 - 1,
+  x86_cpu_AVX10_V188 = x86_cpu_AVX10_V189 - 1,
+  x86_cpu_AVX10_V187 = x86_cpu_AVX10_V188 - 1,
+  x86_cpu_AVX10_V186 = x86_cpu_AVX10_V187 - 1,
+  x86_cpu_AVX10_V185 = x86_cpu_AVX10_V186 - 1,
+  x86_cpu_AVX10_V184 = x86_cpu_AVX10_V185 - 1,
+  x86_cpu_AVX10_V183 = x86_cpu_AVX10_V184 - 1,
+  x86_cpu_AVX10_V182 = x86_cpu_AVX10_V183 - 1,
+  x86_cpu_AVX10_V181 = x86_cpu_AVX10_V182 - 1,
+  x86_cpu_AVX10_V180 = x86_cpu_AVX10_V181 - 1,
+  x86_cpu_AVX10_V179 = x86_cpu_AVX10_V180 - 1,
+  x86_cpu_AVX10_V178 = x86_cpu_AVX10_V179 - 1,
+  x86_cpu_AVX10_V177 = x86_cpu_AVX10_V178 - 1,
+  x86_cpu_AVX10_V176 = x86_cpu_AVX10_V177 - 1,
+  x86_cpu_AVX10_V175 = x86_cpu_AVX10_V176 - 1,
+  x86_cpu_AVX10_V174 = x86_cpu_AVX10_V175 - 1,
+  x86_cpu_AVX10_V173 = x86_cpu_AVX10_V174 - 1,
+  x86_cpu_AVX10_V172 = x86_cpu_AVX10_V173 - 1,
+  x86_cpu_AVX10_V171 = x86_cpu_AVX10_V172 - 1,
+  x86_cpu_AVX10_V170 = x86_cpu_AVX10_V171 - 1,
+  x86_cpu_AVX10_V169 = x86_cpu_AVX10_V170 - 1,
+  x86_cpu_AVX10_V168 = x86_cpu_AVX10_V169 - 1,
+  x86_cpu_AVX10_V167 = x86_cpu_AVX10_V168 - 1,
+  x86_cpu_AVX10_V166 = x86_cpu_AVX10_V167 - 1,
+  x86_cpu_AVX10_V165 = x86_cpu_AVX10_V166 - 1,
+  x86_cpu_AVX10_V164 = x86_cpu_AVX10_V165 - 1,
+  x86_cpu_AVX10_V163 = x86_cpu_AVX10_V164 - 1,
+  x86_cpu_AVX10_V162 = x86_cpu_AVX10_V163 - 1,
+  x86_cpu_AVX10_V161 = x86_cpu_AVX10_V162 - 1,
+  x86_cpu_AVX10_V160 = x86_cpu_AVX10_V161 - 1,
+  x86_cpu_AVX10_V159 = x86_cpu_AVX10_V160 - 1,
+  x86_cpu_AVX10_V158 = x86_cpu_AVX10_V159 - 1,
+  x86_cpu_AVX10_V157 = x86_cpu_AVX10_V158 - 1,
+  x86_cpu_AVX10_V156 = x86_cpu_AVX10_V157 - 1,
+  x86_cpu_AVX10_V155 = x86_cpu_AVX10_V156 - 1,
+  x86_cpu_AVX10_V154 = x86_cpu_AVX10_V155 - 1,
+  x86_cpu_AVX10_V153 = x86_cpu_AVX10_V154 - 1,
+  x86_cpu_AVX10_V152 = x86_cpu_AVX10_V153 - 1,
+  x86_cpu_AVX10_V151 = x86_cpu_AVX10_V152 - 1,
+  x86_cpu_AVX10_V150 = x86_cpu_AVX10_V151 - 1,
+  x86_cpu_AVX10_V149 = x86_cpu_AVX10_V150 - 1,
+  x86_cpu_AVX10_V148 = x86_cpu_AVX10_V149 - 1,
+  x86_cpu_AVX10_V147 = x86_cpu_AVX10_V148 - 1,
+  x86_cpu_AVX10_V146 = x86_cpu_AVX10_V147 - 1,
+  x86_cpu_AVX10_V145 = x86_cpu_AVX10_V146 - 1,
+  x86_cpu_AVX10_V144 = x86_cpu_AVX10_V145 - 1,
+  x86_cpu_AVX10_V143 = x86_cpu_AVX10_V144 - 1,
+  x86_cpu_AVX10_V142 = x86_cpu_AVX10_V143 - 1,
+  x86_cpu_AVX10_V141 = x86_cpu_AVX10_V142 - 1,
+  x86_cpu_AVX10_V140 = x86_cpu_AVX10_V141 - 1,
+  x86_cpu_AVX10_V139 = x86_cpu_AVX10_V140 - 1,
+  x86_cpu_AVX10_V138 = x86_cpu_AVX10_V139 - 1,
+  x86_cpu_AVX10_V137 = x86_cpu_AVX10_V138 - 1,
+  x86_cpu_AVX10_V136 = x86_cpu_AVX10_V137 - 1,
+  x86_cpu_AVX10_V135 = x86_cpu_AVX10_V136 - 1,
+  x86_cpu_AVX10_V134 = x86_cpu_AVX10_V135 - 1,
+  x86_cpu_AVX10_V133 = x86_cpu_AVX10_V134 - 1,
+  x86_cpu_AVX10_V132 = x86_cpu_AVX10_V133 - 1,
+  x86_cpu_AVX10_V131 = x86_cpu_AVX10_V132 - 1,
+  x86_cpu_AVX10_V130 = x86_cpu_AVX10_V131 - 1,
+  x86_cpu_AVX10_V129 = x86_cpu_AVX10_V130 - 1,
+  x86_cpu_AVX10_V128 = x86_cpu_AVX10_V129 - 1,
+  x86_cpu_AVX10_V127 = x86_cpu_AVX10_V128 - 1,
+  x86_cpu_AVX10_V126 = x86_cpu_AVX10_V127 - 1,
+  x86_cpu_AVX10_V125 = x86_cpu_AVX10_V126 - 1,
+  x86_cpu_AVX10_V124 = x86_cpu_AVX10_V125 - 1,
+  x86_cpu_AVX10_V123 = x86_cpu_AVX10_V124 - 1,
+  x86_cpu_AVX10_V122 = x86_cpu_AVX10_V123 - 1,
+  x86_cpu_AVX10_V121 = x86_cpu_AVX10_V122 - 1,
+  x86_cpu_AVX10_V120 = x86_cpu_AVX10_V121 - 1,
+  x86_cpu_AVX10_V119 = x86_cpu_AVX10_V120 - 1,
+  x86_cpu_AVX10_V118 = x86_cpu_AVX10_V119 - 1,
+  x86_cpu_AVX10_V117 = x86_cpu_AVX10_V118 - 1,
+  x86_cpu_AVX10_V116 = x86_cpu_AVX10_V117 - 1,
+  x86_cpu_AVX10_V115 = x86_cpu_AVX10_V116 - 1,
+  x86_cpu_AVX10_V114 = x86_cpu_AVX10_V115 - 1,
+  x86_cpu_AVX10_V113 = x86_cpu_AVX10_V114 - 1,
+  x86_cpu_AVX10_V112 = x86_cpu_AVX10_V113 - 1,
+  x86_cpu_AVX10_V111 = x86_cpu_AVX10_V112 - 1,
+  x86_cpu_AVX10_V110 = x86_cpu_AVX10_V111 - 1,
+  x86_cpu_AVX10_V109 = x86_cpu_AVX10_V110 - 1,
+  x86_cpu_AVX10_V108 = x86_cpu_AVX10_V109 - 1,
+  x86_cpu_AVX10_V107 = x86_cpu_AVX10_V108 - 1,
+  x86_cpu_AVX10_V106 = x86_cpu_AVX10_V107 - 1,
+  x86_cpu_AVX10_V105 = x86_cpu_AVX10_V106 - 1,
+  x86_cpu_AVX10_V104 = x86_cpu_AVX10_V105 - 1,
+  x86_cpu_AVX10_V103 = x86_cpu_AVX10_V104 - 1,
+  x86_cpu_AVX10_V102 = x86_cpu_AVX10_V103 - 1,
+  x86_cpu_AVX10_V101 = x86_cpu_AVX10_V102 - 1,
+  x86_cpu_AVX10_V100 = x86_cpu_AVX10_V101 - 1,
+  x86_cpu_AVX10_V99 = x86_cpu_AVX10_V100 - 1,
+  x86_cpu_AVX10_V98 = x86_cpu_AVX10_V99 - 1,
+  x86_cpu_AVX10_V97 = x86_cpu_AVX10_V98 - 1,
+  x86_cpu_AVX10_V96 = x86_cpu_AVX10_V97 - 1,
+  x86_cpu_AVX10_V95 = x86_cpu_AVX10_V96 - 1,
+  x86_cpu_AVX10_V94 = x86_cpu_AVX10_V95 - 1,
+  x86_cpu_AVX10_V93 = x86_cpu_AVX10_V94 - 1,
+  x86_cpu_AVX10_V92 = x86_cpu_AVX10_V93 - 1,
+  x86_cpu_AVX10_V91 = x86_cpu_AVX10_V92 - 1,
+  x86_cpu_AVX10_V90 = x86_cpu_AVX10_V91 - 1,
+  x86_cpu_AVX10_V89 = x86_cpu_AVX10_V90 - 1,
+  x86_cpu_AVX10_V88 = x86_cpu_AVX10_V89 - 1,
+  x86_cpu_AVX10_V87 = x86_cpu_AVX10_V88 - 1,
+  x86_cpu_AVX10_V86 = x86_cpu_AVX10_V87 - 1,
+  x86_cpu_AVX10_V85 = x86_cpu_AVX10_V86 - 1,
+  x86_cpu_AVX10_V84 = x86_cpu_AVX10_V85 - 1,
+  x86_cpu_AVX10_V83 = x86_cpu_AVX10_V84 - 1,
+  x86_cpu_AVX10_V82 = x86_cpu_AVX10_V83 - 1,
+  x86_cpu_AVX10_V81 = x86_cpu_AVX10_V82 - 1,
+  x86_cpu_AVX10_V80 = x86_cpu_AVX10_V81 - 1,
+  x86_cpu_AVX10_V79 = x86_cpu_AVX10_V80 - 1,
+  x86_cpu_AVX10_V78 = x86_cpu_AVX10_V79 - 1,
+  x86_cpu_AVX10_V77 = x86_cpu_AVX10_V78 - 1,
+  x86_cpu_AVX10_V76 = x86_cpu_AVX10_V77 - 1,
+  x86_cpu_AVX10_V75 = x86_cpu_AVX10_V76 - 1,
+  x86_cpu_AVX10_V74 = x86_cpu_AVX10_V75 - 1,
+  x86_cpu_AVX10_V73 = x86_cpu_AVX10_V74 - 1,
+  x86_cpu_AVX10_V72 = x86_cpu_AVX10_V73 - 1,
+  x86_cpu_AVX10_V71 = x86_cpu_AVX10_V72 - 1,
+  x86_cpu_AVX10_V70 = x86_cpu_AVX10_V71 - 1,
+  x86_cpu_AVX10_V69 = x86_cpu_AVX10_V70 - 1,
+  x86_cpu_AVX10_V68 = x86_cpu_AVX10_V69 - 1,
+  x86_cpu_AVX10_V67 = x86_cpu_AVX10_V68 - 1,
+  x86_cpu_AVX10_V66 = x86_cpu_AVX10_V67 - 1,
+  x86_cpu_AVX10_V65 = x86_cpu_AVX10_V66 - 1,
+  x86_cpu_AVX10_V64 = x86_cpu_AVX10_V65 - 1,
+  x86_cpu_AVX10_V63 = x86_cpu_AVX10_V64 - 1,
+  x86_cpu_AVX10_V62 = x86_cpu_AVX10_V63 - 1,
+  x86_cpu_AVX10_V61 = x86_cpu_AVX10_V62 - 1,
+  x86_cpu_AVX10_V60 = x86_cpu_AVX10_V61 - 1,
+  x86_cpu_AVX10_V59 = x86_cpu_AVX10_V60 - 1,
+  x86_cpu_AVX10_V58 = x86_cpu_AVX10_V59 - 1,
+  x86_cpu_AVX10_V57 = x86_cpu_AVX10_V58 - 1,
+  x86_cpu_AVX10_V56 = x86_cpu_AVX10_V57 - 1,
+  x86_cpu_AVX10_V55 = x86_cpu_AVX10_V56 - 1,
+  x86_cpu_AVX10_V54 = x86_cpu_AVX10_V55 - 1,
+  x86_cpu_AVX10_V53 = x86_cpu_AVX10_V54 - 1,
+  x86_cpu_AVX10_V52 = x86_cpu_AVX10_V53 - 1,
+  x86_cpu_AVX10_V51 = x86_cpu_AVX10_V52 - 1,
+  x86_cpu_AVX10_V50 = x86_cpu_AVX10_V51 - 1,
+  x86_cpu_AVX10_V49 = x86_cpu_AVX10_V50 - 1,
+  x86_cpu_AVX10_V48 = x86_cpu_AVX10_V49 - 1,
+  x86_cpu_AVX10_V47 = x86_cpu_AVX10_V48 - 1,
+  x86_cpu_AVX10_V46 = x86_cpu_AVX10_V47 - 1,
+  x86_cpu_AVX10_V45 = x86_cpu_AVX10_V46 - 1,
+  x86_cpu_AVX10_V44 = x86_cpu_AVX10_V45 - 1,
+  x86_cpu_AVX10_V43 = x86_cpu_AVX10_V44 - 1,
+  x86_cpu_AVX10_V42 = x86_cpu_AVX10_V43 - 1,
+  x86_cpu_AVX10_V41 = x86_cpu_AVX10_V42 - 1,
+  x86_cpu_AVX10_V40 = x86_cpu_AVX10_V41 - 1,
+  x86_cpu_AVX10_V39 = x86_cpu_AVX10_V40 - 1,
+  x86_cpu_AVX10_V38 = x86_cpu_AVX10_V39 - 1,
+  x86_cpu_AVX10_V37 = x86_cpu_AVX10_V38 - 1,
+  x86_cpu_AVX10_V36 = x86_cpu_AVX10_V37 - 1,
+  x86_cpu_AVX10_V35 = x86_cpu_AVX10_V36 - 1,
+  x86_cpu_AVX10_V34 = x86_cpu_AVX10_V35 - 1,
+  x86_cpu_AVX10_V33 = x86_cpu_AVX10_V34 - 1,
+  x86_cpu_AVX10_V32 = x86_cpu_AVX10_V33 - 1,
+  x86_cpu_AVX10_V31 = x86_cpu_AVX10_V32 - 1,
+  x86_cpu_AVX10_V30 = x86_cpu_AVX10_V31 - 1,
+  x86_cpu_AVX10_V29 = x86_cpu_AVX10_V30 - 1,
+  x86_cpu_AVX10_V28 = x86_cpu_AVX10_V29 - 1,
+  x86_cpu_AVX10_V27 = x86_cpu_AVX10_V28 - 1,
+  x86_cpu_AVX10_V26 = x86_cpu_AVX10_V27 - 1,
+  x86_cpu_AVX10_V25 = x86_cpu_AVX10_V26 - 1,
+  x86_cpu_AVX10_V24 = x86_cpu_AVX10_V25 - 1,
+  x86_cpu_AVX10_V23 = x86_cpu_AVX10_V24 - 1,
+  x86_cpu_AVX10_V22 = x86_cpu_AVX10_V23 - 1,
+  x86_cpu_AVX10_V21 = x86_cpu_AVX10_V22 - 1,
+  x86_cpu_AVX10_V20 = x86_cpu_AVX10_V21 - 1,
+  x86_cpu_AVX10_V19 = x86_cpu_AVX10_V20 - 1,
+  x86_cpu_AVX10_V18 = x86_cpu_AVX10_V19 - 1,
+  x86_cpu_AVX10_V17 = x86_cpu_AVX10_V18 - 1,
+  x86_cpu_AVX10_V16 = x86_cpu_AVX10_V17 - 1,
+  x86_cpu_AVX10_V15 = x86_cpu_AVX10_V16 - 1,
+  x86_cpu_AVX10_V14 = x86_cpu_AVX10_V15 - 1,
+  x86_cpu_AVX10_V13 = x86_cpu_AVX10_V14 - 1,
+  x86_cpu_AVX10_V12 = x86_cpu_AVX10_V13 - 1,
+  x86_cpu_AVX10_V11 = x86_cpu_AVX10_V12 - 1,
+  x86_cpu_AVX10_V10 = x86_cpu_AVX10_V11 - 1,
+  x86_cpu_AVX10_V9 = x86_cpu_AVX10_V10 - 1,
+  x86_cpu_AVX10_V8 = x86_cpu_AVX10_V9 - 1,
+  x86_cpu_AVX10_V7 = x86_cpu_AVX10_V8 - 1,
+  x86_cpu_AVX10_V6 = x86_cpu_AVX10_V7 - 1,
+  x86_cpu_AVX10_V5 = x86_cpu_AVX10_V6 - 1,
+  x86_cpu_AVX10_V4 = x86_cpu_AVX10_V5 - 1,
+  x86_cpu_AVX10_V3 = x86_cpu_AVX10_V4 - 1,
+  x86_cpu_AVX10_V2 = x86_cpu_AVX10_V3 - 1,
+  x86_cpu_AVX10_V1 = x86_cpu_AVX10_V2 - 1
+/* x86_cpu_AVX10_V0 is invalid.  */
 };
diff --git a/sysdeps/x86/sys/platform/x86.h b/sysdeps/x86/sys/platform/x86.h
index 1ea2c5fc0b..fa8c7e158d 100644
--- a/sysdeps/x86/sys/platform/x86.h
+++ b/sysdeps/x86/sys/platform/x86.h
@@ -29,9 +29,45 @@ __BEGIN_DECLS
 extern const struct cpuid_feature *__x86_get_cpuid_feature_leaf (unsigned int)
      __attribute__ ((pure));
 
+static __inline__ unsigned int
+x86_cpu_get_avx10_version_number_from_enum (unsigned int __enum)
+{
+  return __enum - x86_cpu_AVX10_V1 + 1;
+}
+
+static __inline__ _Bool
+x86_cpu_is_index_avx10_version_number (unsigned int __index)
+{
+  return __index >= (unsigned int) x86_cpu_AVX10_V1
+	 && __index <= (unsigned int) x86_cpu_AVX10_V255;
+}
+
+static __inline__ unsigned int
+x86_cpu_get_avx10_info (unsigned int __index)
+{
+  const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf (
+      __index / (8 * sizeof (unsigned int) * 4));
+  unsigned int __reg = __index & (8 * sizeof (unsigned int) * 4 - 1);
+  __reg /= 8 * sizeof (unsigned int);
+
+  return __ptr->cpuid_array[__reg];
+}
+
+/* Get AVX10 version number in byte form.  Must check AVX10 active first. Value
+   is in range [1, 255].  */
+static __inline__ unsigned int
+x86_cpu_get_avx10_version_number (void)
+{
+  return x86_cpu_get_avx10_info (x86_cpu_index_24_ecx_0_ebx) & 0xff;
+}
+
 static __inline__ _Bool
 x86_cpu_present (unsigned int __index)
 {
+  if (x86_cpu_is_index_avx10_version_number (__index))
+    return x86_cpu_get_avx10_version_number ()
+	   >= x86_cpu_get_avx10_version_number_from_enum (__index);
+
   const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
     (__index / (8 * sizeof (unsigned int) * 4));
   unsigned int __reg
@@ -45,6 +81,10 @@ x86_cpu_present (unsigned int __index)
 static __inline__ _Bool
 x86_cpu_active (unsigned int __index)
 {
+  if (x86_cpu_is_index_avx10_version_number (__index))
+    return x86_cpu_get_avx10_version_number ()
+	   >= x86_cpu_get_avx10_version_number_from_enum (__index);
+
   const struct cpuid_feature *__ptr = __x86_get_cpuid_feature_leaf
     (__index / (8 * sizeof (unsigned int) * 4));
   unsigned int __reg
diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c
index 44edd18df2..53e68431f1 100644
--- a/sysdeps/x86/tst-get-cpu-features.c
+++ b/sysdeps/x86/tst-get-cpu-features.c
@@ -403,6 +403,261 @@ do_test (void)
       CHECK_CPU_FEATURE_ACTIVE (AVX10_XMM);
       CHECK_CPU_FEATURE_ACTIVE (AVX10_YMM);
       CHECK_CPU_FEATURE_ACTIVE (AVX10_ZMM);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V1);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V2);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V3);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V4);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V5);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V6);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V7);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V8);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V9);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V10);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V11);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V12);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V13);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V14);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V15);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V16);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V17);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V18);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V19);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V20);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V21);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V22);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V23);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V24);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V25);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V26);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V27);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V28);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V29);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V30);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V31);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V32);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V33);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V34);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V35);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V36);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V37);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V38);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V39);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V40);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V41);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V42);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V43);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V44);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V45);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V46);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V47);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V48);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V49);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V50);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V51);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V52);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V53);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V54);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V55);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V56);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V57);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V58);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V59);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V60);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V61);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V62);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V63);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V64);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V65);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V66);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V67);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V68);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V69);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V70);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V71);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V72);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V73);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V74);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V75);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V76);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V77);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V78);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V79);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V80);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V81);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V82);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V83);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V84);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V85);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V86);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V87);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V88);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V89);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V90);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V91);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V92);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V93);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V94);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V95);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V96);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V97);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V98);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V99);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V100);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V101);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V102);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V103);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V104);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V105);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V106);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V107);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V108);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V109);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V110);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V111);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V112);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V113);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V114);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V115);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V116);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V117);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V118);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V119);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V120);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V121);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V122);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V123);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V124);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V125);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V126);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V127);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V128);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V129);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V130);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V131);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V132);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V133);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V134);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V135);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V136);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V137);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V138);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V139);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V140);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V141);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V142);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V143);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V144);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V145);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V146);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V147);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V148);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V149);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V150);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V151);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V152);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V153);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V154);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V155);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V156);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V157);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V158);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V159);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V160);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V161);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V162);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V163);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V164);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V165);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V166);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V167);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V168);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V169);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V170);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V171);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V172);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V173);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V174);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V175);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V176);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V177);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V178);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V179);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V180);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V181);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V182);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V183);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V184);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V185);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V186);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V187);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V188);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V189);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V190);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V191);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V192);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V193);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V194);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V195);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V196);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V197);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V198);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V199);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V200);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V201);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V202);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V203);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V204);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V205);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V206);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V207);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V208);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V209);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V210);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V211);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V212);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V213);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V214);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V215);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V216);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V217);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V218);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V219);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V220);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V221);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V222);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V223);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V224);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V225);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V226);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V227);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V228);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V229);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V230);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V231);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V232);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V233);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V234);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V235);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V236);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V237);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V238);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V239);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V240);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V241);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V242);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V243);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V244);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V245);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V246);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V247);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V248);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V249);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V250);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V251);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V252);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V253);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V254);
+      CHECK_CPU_FEATURE_ACTIVE (AVX10_V255);
     }
   return 0;
 }
-- 
2.34.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: x86: Add support for AVX10 preset and vec size in cpu-features
  2023-09-20 20:44 ` x86: Add support for AVX10 preset " Noah Goldstein
  2023-09-20 20:44   ` x86: Add support for AVX10 version " Noah Goldstein
@ 2023-09-25 20:49   ` H.J. Lu
  1 sibling, 0 replies; 12+ messages in thread
From: H.J. Lu @ 2023-09-25 20:49 UTC (permalink / raw)
  To: Noah Goldstein; +Cc: libc-alpha, carlos

On Wed, Sep 20, 2023 at 1:44 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
>
> This commit add support for the new AVX10 cpu features:
> https://cdrdv2-public.intel.com/784267/355989-intel-avx10-spec.pdf
>
> We add checks for:
>     - `AVX10`: Check if AVX10 is present.
>     - `AVX10_{X,Y,Z}MM`: Check if a given vec class has AVX10 support.
>
> `make check` passes and cpuid output was checked against GNR/DMR on an
> emulator.
> ---
>  manual/platform.texi               | 12 ++++++++++++
>  sysdeps/x86/bits/platform/x86.h    | 14 ++++++++++++--
>  sysdeps/x86/cpu-features.c         | 25 +++++++++++++++++++++++++
>  sysdeps/x86/include/cpu-features.h | 27 ++++++++++++++++++++++++++-
>  sysdeps/x86/tst-get-cpu-features.c |  8 ++++++++
>  5 files changed, 83 insertions(+), 3 deletions(-)
>
> diff --git a/manual/platform.texi b/manual/platform.texi
> index 2a2d557067..478b6fdcdf 100644
> --- a/manual/platform.texi
> +++ b/manual/platform.texi
> @@ -222,6 +222,18 @@ Leaf (EAX = 23H).
>  @item
>  @code{AVX} -- The AVX instruction extensions.
>
> +@item
> +@code{AVX10} -- The AVX10 instruction extensions.
> +
> +@item
> +@code{AVX10_XMM} -- Whether AVX10 includes xmm registers.
> +
> +@item
> +@code{AVX10_YMM} -- Whether AVX10 includes ymm registers.
> +
> +@item
> +@code{AVX10_ZMM} -- Whether AVX10 includes zmm registers.
> +
>  @item
>  @code{AVX2} -- The AVX2 instruction extensions.
>
> diff --git a/sysdeps/x86/bits/platform/x86.h b/sysdeps/x86/bits/platform/x86.h
> index 88ca071aa7..1e23d53ba2 100644
> --- a/sysdeps/x86/bits/platform/x86.h
> +++ b/sysdeps/x86/bits/platform/x86.h
> @@ -30,7 +30,8 @@ enum
>    CPUID_INDEX_80000008,
>    CPUID_INDEX_7_ECX_1,
>    CPUID_INDEX_19,
> -  CPUID_INDEX_14_ECX_0
> +  CPUID_INDEX_14_ECX_0,
> +  CPUID_INDEX_24_ECX_0
>  };
>
>  struct cpuid_feature
> @@ -312,6 +313,7 @@ enum
>    x86_cpu_AVX_NE_CONVERT       = x86_cpu_index_7_ecx_1_edx + 5,
>    x86_cpu_AMX_COMPLEX          = x86_cpu_index_7_ecx_1_edx + 8,
>    x86_cpu_PREFETCHI            = x86_cpu_index_7_ecx_1_edx + 14,
> +  x86_cpu_AVX10                        = x86_cpu_index_7_ecx_1_edx + 19,
>    x86_cpu_APX_F                        = x86_cpu_index_7_ecx_1_edx + 21,
>
>    x86_cpu_index_19_ebx
> @@ -325,5 +327,13 @@ enum
>      = (CPUID_INDEX_14_ECX_0 * 8 * 4 * sizeof (unsigned int)
>         + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
>
> -  x86_cpu_PTWRITE              = x86_cpu_index_14_ecx_0_ebx + 4
> +  x86_cpu_PTWRITE              = x86_cpu_index_14_ecx_0_ebx + 4,
> +
> +  x86_cpu_index_24_ecx_0_ebx
> +    = (CPUID_INDEX_24_ECX_0 * 8 * 4 * sizeof (unsigned int)
> +       + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
> +
> +  x86_cpu_AVX10_XMM = x86_cpu_index_24_ecx_0_ebx + 16,
> +  x86_cpu_AVX10_YMM = x86_cpu_index_24_ecx_0_ebx + 17,
> +  x86_cpu_AVX10_ZMM = x86_cpu_index_24_ecx_0_ebx + 18,
>  };
> diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
> index badf088874..0bf923d48b 100644
> --- a/sysdeps/x86/cpu-features.c
> +++ b/sysdeps/x86/cpu-features.c
> @@ -115,11 +115,18 @@ update_active (struct cpu_features *cpu_features)
>    CPU_FEATURE_SET_ACTIVE (cpu_features, SHSTK);
>  #endif
>
> +  enum
> +  {
> +    os_xmm = 1,
> +    os_ymm = 2,
> +    os_zmm = 4
> +  } os_vector_size = os_xmm;
>    /* Can we call xgetbv?  */
>    if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE))
>      {
>        unsigned int xcrlow;
>        unsigned int xcrhigh;
> +      CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10);
>        asm ("xgetbv" : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0));
>        /* Is YMM and XMM state usable?  */
>        if ((xcrlow & (bit_YMM_state | bit_XMM_state))
> @@ -128,6 +135,7 @@ update_active (struct cpu_features *cpu_features)
>           /* Determine if AVX is usable.  */
>           if (CPU_FEATURES_CPU_P (cpu_features, AVX))
>             {
> +             os_vector_size |= os_ymm;
>               CPU_FEATURE_SET (cpu_features, AVX);
>               /* The following features depend on AVX being usable.  */
>               /* Determine if AVX2 is usable.  */
> @@ -166,6 +174,7 @@ update_active (struct cpu_features *cpu_features)
>                          | bit_ZMM16_31_state))
>               == (bit_Opmask_state | bit_ZMM0_15_state | bit_ZMM16_31_state))
>             {
> +             os_vector_size |= os_zmm;
>               /* Determine if AVX512F is usable.  */
>               if (CPU_FEATURES_CPU_P (cpu_features, AVX512F))
>                 {
> @@ -210,6 +219,22 @@ update_active (struct cpu_features *cpu_features)
>             }
>         }
>
> +      if (CPU_FEATURES_CPU_P (cpu_features, AVX10)
> +         && cpu_features->basic.max_cpuid >= 0x24)
> +       {
> +         __cpuid_count (
> +             0x24, 0, cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.eax,
> +             cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ebx,
> +             cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.ecx,
> +             cpu_features->features[CPUID_INDEX_24_ECX_0].cpuid.edx);
> +         if (os_vector_size & os_xmm)
> +           CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_XMM);
> +         if (os_vector_size & os_ymm)
> +           CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_YMM);
> +         if (os_vector_size & os_zmm)
> +           CPU_FEATURE_SET_ACTIVE (cpu_features, AVX10_ZMM);
> +       }
> +
>        /* 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 eb30d342a6..2d7427a6c0 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_14_ECX_0 + 1
> +  CPUID_INDEX_MAX = CPUID_INDEX_24_ECX_0 + 1
>  };
>
>  enum
> @@ -319,6 +319,7 @@ enum
>  #define bit_cpu_AVX_NE_CONVERT (1u << 5)
>  #define bit_cpu_AMX_COMPLEX    (1u << 8)
>  #define bit_cpu_PREFETCHI      (1u << 14)
> +#define bit_cpu_AVX10          (1u << 19)
>  #define bit_cpu_APX_F          (1u << 21)
>
>  /* CPUID_INDEX_19.  */
> @@ -332,6 +333,13 @@ enum
>  /* EBX.  */
>  #define bit_cpu_PTWRITE                (1u << 4)
>
> +/* CPUID_INDEX_24_ECX_0.  */
> +
> +/* EBX.  */
> +#define bit_cpu_AVX10_XMM              (1u << 16)
> +#define bit_cpu_AVX10_YMM              (1u << 17)
> +#define bit_cpu_AVX10_ZMM              (1u << 18)
> +
>  /* CPUID_INDEX_1.  */
>
>  /* ECX.  */
> @@ -563,6 +571,7 @@ enum
>  #define index_cpu_AVX_NE_CONVERT CPUID_INDEX_7_ECX_1
>  #define index_cpu_AMX_COMPLEX  CPUID_INDEX_7_ECX_1
>  #define index_cpu_PREFETCHI    CPUID_INDEX_7_ECX_1
> +#define index_cpu_AVX10                CPUID_INDEX_7_ECX_1
>  #define index_cpu_APX_F                CPUID_INDEX_7_ECX_1
>
>  /* CPUID_INDEX_19.  */
> @@ -576,6 +585,13 @@ enum
>  /* EBX.  */
>  #define index_cpu_PTWRITE      CPUID_INDEX_14_ECX_0
>
> +/* CPUID_INDEX_24_ECX_0.  */
> +
> +/* EBX.  */
> +#define index_cpu_AVX10_XMM    CPUID_INDEX_24_ECX_0
> +#define index_cpu_AVX10_YMM    CPUID_INDEX_24_ECX_0
> +#define index_cpu_AVX10_ZMM    CPUID_INDEX_24_ECX_0
> +
>  /* CPUID_INDEX_1.  */
>
>  /* ECX.  */
> @@ -809,6 +825,7 @@ enum
>  #define reg_AVX_NE_CONVERT     edx
>  #define reg_AMX_COMPLEX                edx
>  #define reg_PREFETCHI          edx
> +#define reg_AVX10              edx
>  #define reg_APX_F              edx
>
>  /* CPUID_INDEX_19.  */
> @@ -822,6 +839,14 @@ enum
>  /* EBX.  */
>  #define reg_PTWRITE            ebx
>
> +/* CPUID_INDEX_24_ECX_0.  */
> +
> +/* EBX.  */
> +#define reg_AVX10_XMM          ebx
> +#define reg_AVX10_YMM          ebx
> +#define reg_AVX10_ZMM          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 b27fa7324a..44edd18df2 100644
> --- a/sysdeps/x86/tst-get-cpu-features.c
> +++ b/sysdeps/x86/tst-get-cpu-features.c
> @@ -219,6 +219,7 @@ do_test (void)
>    CHECK_CPU_FEATURE_PRESENT (AVX_NE_CONVERT);
>    CHECK_CPU_FEATURE_PRESENT (AMX_COMPLEX);
>    CHECK_CPU_FEATURE_PRESENT (PREFETCHI);
> +  CHECK_CPU_FEATURE_PRESENT (AVX10);
>    CHECK_CPU_FEATURE_PRESENT (APX_F);
>    CHECK_CPU_FEATURE_PRESENT (AESKLE);
>    CHECK_CPU_FEATURE_PRESENT (WIDE_KL);
> @@ -391,11 +392,18 @@ do_test (void)
>    CHECK_CPU_FEATURE_ACTIVE (AVX_NE_CONVERT);
>    CHECK_CPU_FEATURE_ACTIVE (AMX_COMPLEX);
>    CHECK_CPU_FEATURE_ACTIVE (PREFETCHI);
> +  CHECK_CPU_FEATURE_ACTIVE (AVX10);
>    CHECK_CPU_FEATURE_ACTIVE (APX_F);
>    CHECK_CPU_FEATURE_ACTIVE (AESKLE);
>    CHECK_CPU_FEATURE_ACTIVE (WIDE_KL);
>    CHECK_CPU_FEATURE_ACTIVE (PTWRITE);
>
> +  if (CPU_FEATURE_ACTIVE (AVX10))
> +    {
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_XMM);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_YMM);
> +      CHECK_CPU_FEATURE_ACTIVE (AVX10_ZMM);
> +    }
>    return 0;
>  }
>
> --
> 2.34.1
>

LGTM.

Thanks.

-- 
H.J.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-09-25 20:49 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-24 18:48 [PATCH v1] x86: Add support for AVX10 version and vec size in cpu-features Noah Goldstein
2023-08-24 19:01 ` H.J. Lu
2023-08-24 19:14   ` Noah Goldstein
2023-08-24 19:14 ` [PATCH v2] " Noah Goldstein
2023-08-25  7:12   ` Florian Weimer
2023-08-25 17:39     ` Noah Goldstein
2023-09-01 18:52       ` Noah Goldstein
2023-09-08  4:55         ` Noah Goldstein
2023-08-24 20:30 ` Noah Goldstein
2023-09-20 20:44 ` x86: Add support for AVX10 preset " Noah Goldstein
2023-09-20 20:44   ` x86: Add support for AVX10 version " Noah Goldstein
2023-09-25 20:49   ` x86: Add support for AVX10 preset and vec size " H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).