Commit 2488ebe5 by Uros Bizjak Committed by Uros Bizjak

re PR target/77756 (__get_cpuid() returns wrong values for level 7 (extended features))

	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
parent f90b32b9
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> 2016-09-29 Marek Polacek <polacek@redhat.com>
* genattrtab.c (write_attr_case): Also emit FALLTHRU marker. * genattrtab.c (write_attr_case): Also emit FALLTHRU marker.
...@@ -100,11 +106,6 @@ ...@@ -100,11 +106,6 @@
get_destination_size, pass_sprintf_length::handle_gimple_call): get_destination_size, pass_sprintf_length::handle_gimple_call):
Likewise. 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> 2016-09-28 Jakub Jelinek <jakub@redhat.com>
* gimple-ssa-sprintf.c: Fix comment formatting. * gimple-ssa-sprintf.c: Fix comment formatting.
......
...@@ -229,31 +229,37 @@ __get_cpuid_max (unsigned int __ext, unsigned int *__sig) ...@@ -229,31 +229,37 @@ __get_cpuid_max (unsigned int __ext, unsigned int *__sig)
return __eax; 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 eax, ebx, ecx and edx registers. The function checks if cpuid is
supported and returns 1 for valid cpuid information or 0 for 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 static __inline int
__get_cpuid (unsigned int __level, __get_cpuid (unsigned int __leaf,
unsigned int *__eax, unsigned int *__ebx, unsigned int *__eax, unsigned int *__ebx,
unsigned int *__ecx, unsigned int *__edx) 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; return 0;
if (__ext) __cpuid (__leaf, *__eax, *__ebx, *__ecx, *__edx);
__cpuid (__level, *__eax, *__ebx, *__ecx, *__edx); return 1;
else }
{
if (__level >= 13) /* Same as above, but sub-leaf can be specified. */
__cpuid_count (__level, 1, *__eax, *__ebx, *__ecx, *__edx);
else if (__level >= 7) static __inline int
__cpuid_count (__level, 0, *__eax, *__ebx, *__ecx, *__edx); __get_cpuid_count (unsigned int __leaf, unsigned int __subleaf,
else unsigned int *__eax, unsigned int *__ebx,
__cpuid (__level, *__eax, *__ebx, *__ecx, *__edx); 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; return 1;
} }
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> 2016-09-29 Marek Polacek <polacek@redhat.com>
* g++.dg/cpp0x/fallthrough2.C: Use the c++14_down target. * g++.dg/cpp0x/fallthrough2.C: Use the c++14_down target.
...@@ -32,11 +37,6 @@ ...@@ -32,11 +37,6 @@
* gcc.dg/profile-update-warning.c: Restrict to ia32. * gcc.dg/profile-update-warning.c: Restrict to ia32.
(dg-options): Remove -m32. (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> 2016-09-28 Martin Sebor <msebor@redhat.com>
PR middle-end/77721 PR middle-end/77721
......
...@@ -11,7 +11,7 @@ main () ...@@ -11,7 +11,7 @@ main ()
{ {
unsigned int eax, ebx, ecx, edx; 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 (); __builtin_abort ();
if (!(ebx & bit_AVX2)) if (!(ebx & bit_AVX2))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment