> From: Jiang, Haochen
> Sent: Monday, August 31, 2026 5:05 PM
> 
> > From: Sharma, Dipesh <[email protected]>
> > Sent: Monday, August 31, 2026 4:56 PM
> >
> > AMD General
> >
> > Hi Haochen,
> >
> > > From: Haochen Jiang <[email protected]>
> > > Sent: 19 August 2026 11:19
> > > To: [email protected]
> > > diff --git a/gcc/common/config/i386/cpuinfo.h
> > > b/gcc/common/config/i386/cpuinfo.h
> > > index fef8f90f94c..c63349085c0 100644
> > > --- a/gcc/common/config/i386/cpuinfo.h
> > > +++ b/gcc/common/config/i386/cpuinfo.h
> > > @@ -822,6 +822,7 @@ get_available_features (struct __processor_model
> > > *cpu_model,
> > >    int has_kl = 0;
> > >    /* Record AVX10 version.  */
> > >    int avx10_set = 0;
> > > +  int ace_set = 0, avx10v2aux_set = 0;
> > >    int version = 0;
> > >    if ((ecx & bit_OSXSAVE))
> >
> > Since we have XSAVE BSR state as a part of ACE detection algorithm, should
> > we also check for OSXSAVE state here just like what exist for AMX ?
> >
> > <Snip start>
> > 1. ( AVX10.1 and AVX10_V1_AUX ) or AVX10.2
> > 2. AVX10_V2_AUX
> > 3. ACE
> > 4. ACE_VSN >= 1
> > 5. XCR0[20,18:17] = 0b111 (XSAVE state enabled for tile + BSR)
> > 6. XCR0[7:5] = 0b111
> > <Snip end>
> >
> 
> Sure, I suppose the only thing we need to check is BSR. avx10 part
> has already checked XCR0[7:5].
> 
> > >      {
> > > @@ -1045,6 +1046,11 @@ get_available_features (struct
> > __processor_model
> > > *cpu_model,
> > >               if (edx & bit_AVX10)
> > >                 avx10_set = 1;
> > >             }
> > > +         if (avx10_set)
> > > +           {
> > > +             if (ecx & bit_ACE)
> > > +               ace_set = 1;
> > > +           }
> > >           if (amx_usable)
> > >             {
> > >               if (eax & bit_AMX_FP16)
> > > @@ -1143,7 +1149,32 @@ get_available_features (struct
> > __processor_model
> > > *cpu_model,
> > >         {
> > >           __cpuid_count (0x24, 1, eax, ebx, ecx, edx);
> > >           if (ecx & bit_AVX10V2AUX)
> > > -           set_feature (FEATURE_AVX10V2AUX);
> > > +           {
> > > +             set_feature (FEATURE_AVX10V2AUX);
> > > +             avx10v2aux_set = 1;
> > > +           }
> > > +       }
> > > +    }
> > > +
> > > +  /* Get Advanced Features at level 0x1d (eax = 0x1d).
> > > +     ACE check must be put after AVX10 check to get AVX10 features.
> > > +     TODO: Change the condition after AVX10V1AUX is added.  */  if
> > > + (version >= 2 && avx10v2aux_set && ace_set && max_cpuid_level >=
> > 0x1d)
> >
> > Should this guard also have ace_usable set after we check for ACE OSXSAVE
> > bits?
> >
> 
> ace_set should have promised ace_usable before. The ace_usable guard
> should
> happen when we set ace_set as 1. I will add it there.
> 

I will change this file to:

--- a/gcc/common/config/i386/cpuinfo.h
+++ b/gcc/common/config/i386/cpuinfo.h
@@ -802,8 +802,9 @@ get_available_features (struct __processor_model *cpu_model,
 #define XSTATE_ZMM                     0x40
 #define XSTATE_HI_ZMM                  0x80
 #define XSTATE_TILECFG                 0x20000
-#define XSTATE_TILEDATA                0x40000
+#define XSTATE_TILEDATA                        0x40000
 #define XSTATE_APX_F                   0x80000
+#define XSTATE_BSR                     0x100000

 #define XCR_AVX_ENABLED_MASK \
   (XSTATE_SSE | XSTATE_YMM)
@@ -811,17 +812,21 @@ get_available_features (struct __processor_model 
*cpu_model,
   (XSTATE_SSE | XSTATE_YMM | XSTATE_OPMASK | XSTATE_ZMM | XSTATE_HI_ZMM)
 #define XCR_AMX_ENABLED_MASK \
   (XSTATE_TILECFG | XSTATE_TILEDATA)
+#define XCR_ACE_ENABLED_MASK \
+  (XSTATE_TILECFG | XSTATE_TILEDATA | XSTATE_BSR)
 #define XCR_APX_F_ENABLED_MASK XSTATE_APX_F

-  /* Check if AVX, AVX512 and APX are usable.  */
+  /* Check if AVX, AVX512, AMX, APX and ACE are usable.  */
   int avx_usable = 0;
   int avx512_usable = 0;
   int amx_usable = 0;
   int apx_usable = 0;
+  int ace_usable = 0;
   /* Check if KL is usable.  */
   int has_kl = 0;
   /* Record AVX10 version.  */
   int avx10_set = 0;
+  int ace_set = 0, avx10v2aux_set = 0;
   int version = 0;
   if ((ecx & bit_OSXSAVE))
     {
@@ -842,6 +847,8 @@ get_available_features (struct __processor_model *cpu_model,
                    == XCR_AMX_ENABLED_MASK);
       apx_usable = ((xcrlow & XCR_APX_F_ENABLED_MASK)
                    == XCR_APX_F_ENABLED_MASK);
+      ace_usable = ((xcrlow & XCR_ACE_ENABLED_MASK)
+                   == XCR_ACE_ENABLED_MASK);
     }

 #define set_feature(f) \
@@ -1045,6 +1052,14 @@ get_available_features (struct __processor_model 
*cpu_model,
              if (edx & bit_AVX10)
                avx10_set = 1;
            }
+         if (avx10_set)
+           {
+             /* The XSTATE for vector registers has been checked
+                when setting avx10_set.  */
+             if (ace_usable)
+               if (ecx & bit_ACE)
+                 ace_set = 1;
+           }
          if (amx_usable)
            {
              if (eax & bit_AMX_FP16)
@@ -1133,7 +1148,32 @@ get_available_features (struct __processor_model 
*cpu_model,
        {
          __cpuid_count (0x24, 1, eax, ebx, ecx, edx);
          if (ecx & bit_AVX10V2AUX)
-           set_feature (FEATURE_AVX10V2AUX);
+           {
+             set_feature (FEATURE_AVX10V2AUX);
+             avx10v2aux_set = 1;
+           }
+       }
+    }
+
+  /* Get Advanced Features at level 0x1d (eax = 0x1d).
+     ACE check must be put after AVX10 check to get AVX10 features.
+     TODO: Change the condition after AVX10V1AUX is added.  */
+  if (version >= 2 && avx10v2aux_set && ace_set && max_cpuid_level >= 0x1d)
+    {
+      __cpuid_count (0x1d, 0, eax, ebx, ecx, edx);
+      if (eax == 2)
+       {
+         __cpuid_count (0x1d, 2, eax, ebx, ecx, edx);
+         version = eax & 0xff;
+         switch (version)
+           {
+           case 1:
+             set_feature (FEATURE_ACEV1);
+             break;
+           default:
+             set_feature (FEATURE_ACEV1);
+             break;
+           }
        }
     }

Thx,
Haochen

Reply via email to