re PR target/77756 (__get_cpuid() returns wrong values for level 7 (extended features))
authorUros Bizjak <ubizjak@gmail.com>
Thu, 29 Sep 2016 18:44:32 +0000 (20:44 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Thu, 29 Sep 2016 18:44:32 +0000 (20:44 +0200)
PR target/77756
* config/i386/cpuid.h (__get_cpuid_count): New.
(__get_cpuid): Rename __level to __leaf.

testsuite/ChangeLog:

PR target/77756
* gcc.target/i386/pr77756.c: New test.

From-SVN: r240629

gcc/ChangeLog
gcc/config/i386/cpuid.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr77756.c

index b3731d2de974cc1a415a9246ef7c807b3a0a33b1..d9f7844c9710cdb2df7dd17b223c1c8c048b43a1 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/77756
+       * config/i386/cpuid.h (__get_cpuid_count): New.
+       (__get_cpuid): Rename __level to __leaf.
+
 2016-09-29  Marek Polacek  <polacek@redhat.com>
 
        * genattrtab.c (write_attr_case): Also emit FALLTHRU marker.
        get_destination_size, pass_sprintf_length::handle_gimple_call):
        Likewise.
 
-2016-09-28  Uros Bizjak  <ubizjak@gmail.com>
-
-       PR target/77756
-       * config/i386/cpuid.h (__get_cpuid): Handle CPUID level >= 7.
-
 2016-09-28  Jakub Jelinek  <jakub@redhat.com>
 
        * gimple-ssa-sprintf.c: Fix comment formatting.
index a4f658af79772f34cd9fde4a41a686c133e0894f..4ea3f74fecdb3ef000eda0896914dca7d72904ab 100644 (file)
@@ -229,31 +229,37 @@ __get_cpuid_max (unsigned int __ext, unsigned int *__sig)
   return __eax;
 }
 
-/* Return cpuid data for requested cpuid level, as found in returned
+/* Return cpuid data for requested cpuid leaf, as found in returned
    eax, ebx, ecx and edx registers.  The function checks if cpuid is
    supported and returns 1 for valid cpuid information or 0 for
-   unsupported cpuid level.  All pointers are required to be non-null.  */
+   unsupported cpuid leaf.  All pointers are required to be non-null.  */
 
 static __inline int
-__get_cpuid (unsigned int __level,
+__get_cpuid (unsigned int __leaf,
             unsigned int *__eax, unsigned int *__ebx,
             unsigned int *__ecx, unsigned int *__edx)
 {
-  unsigned int __ext = __level & 0x80000000;
+  unsigned int __ext = __leaf & 0x80000000;
 
-  if (__get_cpuid_max (__ext, 0) < __level)
+  if (__get_cpuid_max (__ext, 0) < __leaf)
     return 0;
 
-  if (__ext)
-    __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);
-  else
-    {
-      if (__level >= 13)
-       __cpuid_count (__level, 1, *__eax, *__ebx, *__ecx, *__edx);
-      else if (__level >= 7)
-       __cpuid_count (__level, 0, *__eax, *__ebx, *__ecx, *__edx);
-      else
-       __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);
-    }
+  __cpuid (__leaf, *__eax, *__ebx, *__ecx, *__edx);
+  return 1;
+}
+
+/* Same as above, but sub-leaf can be specified.  */
+
+static __inline int
+__get_cpuid_count (unsigned int __leaf, unsigned int __subleaf,
+                  unsigned int *__eax, unsigned int *__ebx,
+                  unsigned int *__ecx, unsigned int *__edx)
+{
+  unsigned int __ext = __leaf & 0x80000000;
+
+  if (__get_cpuid_max (__ext, 0) < __leaf)
+    return 0;
+
+  __cpuid_count (__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);
   return 1;
 }
index 1a92e7899bbf942ac55cfe1444b099bfd3e04b47..af6884772484a997956a3678e8130b6b8eef6f3c 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/77756
+       * gcc.target/i386/pr77756.c: New test.
+
 2016-09-29  Marek Polacek  <polacek@redhat.com>
 
        * g++.dg/cpp0x/fallthrough2.C: Use the c++14_down target.
        * gcc.dg/profile-update-warning.c: Restrict to ia32.
        (dg-options): Remove -m32.
 
-2016-09-28  Uros Bizjak  <ubizjak@gmail.com>
-
-       PR target/77756
-       * gcc.target/i386/pr77756.c: New test.
-
 2016-09-28  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/77721
index cd880381006ec9b70e4d0615efc9042d78f6aec2..1eee7cd5a00f59341f199ad1fff4269f6070e928 100644 (file)
@@ -11,7 +11,7 @@ main ()
     {
       unsigned int eax, ebx, ecx, edx;
 
-      if (!__get_cpuid (7, &eax, &ebx, &ecx, &edx))
+      if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
        __builtin_abort ();
 
       if (!(ebx & bit_AVX2))