[gcc r17-3274] x86: Update cpuid.h to pass leaf to __get_cpuid_max

"H.J. Lu via Gcc-cvs" <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:d0aa6740323e48d4b3743dc8fcd5c0ff552f86d1

commit r17-3274-gd0aa6740323e48d4b3743dc8fcd5c0ff552f86d1
Author: H.J. Lu <[email protected]>
Date:   Fri Aug 7 16:21:54 2026 +0800

    x86: Update cpuid.h to pass leaf to __get_cpuid_max
    
    commit 44cc8e5718efd0cc1ef57c68052dbe33b047f158
    Author: Ewan <[email protected]>
    Date:   Tue Mar 17 16:12:15 2026 +0800
    
        i386: Fix __get_cpuid() and __get_cpuid_count() for Centaur/Zhaoxin CPUID ra
    nge
    
    caused many regressions, like
    
    FAIL: gcc.dg/vect/vect-100.c scan-tree-dump-not optimized "Invalid sum"
    
    on Linux/x86-64 with -m32.  The commit above changed __get_cpuid_count
    which is used by check_vect in tree-vect.h.  When GCC tried to vectorize
    check_vect, it outputted
    
    __attribute__((noinline))
    void check_vect ()
    {
    ...
    ;;   Invalid sum of incoming counts 966367640 (estimated locally, freq 0.9000),
    should be 719407024 (estimated locally, freq 0.6700)
    
    which failed
    
    /* { dg-final { scan-tree-dump-not "Invalid sum" "optimized" } } */
    
    Change __get_cpuid and __get_cpuid_count to pass the leaf argument
    directly to __get_cpuid_max and apply 0xC0000000 mask before passing
    it to CPUID.
    
            PR testsuite/126697
            * config/i386/cpuid.h (__get_cpuid_max): Rename the first
            argument to __leaf and apply 0xC0000000 mask before passing
            it to CPUID.
            (__get_cpuid): Pass __leaf to __get_cpuid_max.
            (__get_cpuid_count): Likewise.
    
    Signed-off-by: H.J. Lu <[email protected]>

Diff:
---
 gcc/config/i386/cpuid.h | 33 ++++++---------------------------
 1 file changed, 6 insertions(+), 27 deletions(-)

diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h
index 129531dcc382..5e1aad57d40d 100644
--- a/gcc/config/i386/cpuid.h
+++ b/gcc/config/i386/cpuid.h
@@ -270,8 +270,8 @@
 			: "0" (level), "2" (count))
 
 
-/* Return highest supported input value for cpuid instruction.  ext can
-   be either 0x0, 0x40000000, 0x80000000, or 0xC0000000 to return
+/* Return highest supported input value for cpuid instruction.  leaf can
+   be either 0xXXX, 0x40000XXX, 0x80000XXX, or 0xC000XXX to return
    highest supported value for basic, hypervisor, extended, or
    Centaur/Zhaoxin cpuid information.  Function returns 0 if cpuid
    is not supported or whatever cpuid returns in eax register.  If sig
@@ -279,9 +279,10 @@
    (as found in ebx register) are returned in location pointed by sig.  */
 
 static __inline unsigned int
-__get_cpuid_max (unsigned int __ext, unsigned int *__sig)
+__get_cpuid_max (unsigned int __leaf, unsigned int *__sig)
 {
   unsigned int __eax, __ebx, __ecx, __edx;
+  unsigned int __ext = __leaf & 0xC0000000;
 
 #ifndef __x86_64__
   /* See if we can use cpuid.  On AMD64 we always can.  */
@@ -338,18 +339,7 @@ __get_cpuid (unsigned int __leaf,
 	     unsigned int *__eax, unsigned int *__ebx,
 	     unsigned int *__ecx, unsigned int *__edx)
 {
-  unsigned int __ext;
-
-  if (__leaf >= 0xC0000000)
-    __ext = 0xC0000000;
-  else if (__leaf >= 0x80000000)
-    __ext = 0x80000000;
-  else if (__leaf >= 0x40000000)
-    __ext = 0x40000000;
-  else
-    __ext = 0x00000000;
-
-  unsigned int __maxlevel = __get_cpuid_max (__ext, 0);
+  unsigned int __maxlevel = __get_cpuid_max (__leaf, 0);
 
   if (__maxlevel == 0 || __maxlevel < __leaf)
     return 0;
@@ -365,18 +355,7 @@ __get_cpuid_count (unsigned int __leaf, unsigned int __subleaf,
 		   unsigned int *__eax, unsigned int *__ebx,
 		   unsigned int *__ecx, unsigned int *__edx)
 {
-  unsigned int __ext;
-
-  if (__leaf >= 0xC0000000)
-    __ext = 0xC0000000;
-  else if (__leaf >= 0x80000000)
-    __ext = 0x80000000;
-  else if (__leaf >= 0x40000000)
-    __ext = 0x40000000;
-  else
-    __ext = 0x00000000;
-
-  unsigned int __maxlevel = __get_cpuid_max (__ext, 0);
+  unsigned int __maxlevel = __get_cpuid_max (__leaf, 0);
 
   if (__builtin_expect (__maxlevel == 0, 0) || __maxlevel < __leaf)
     return 0;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.