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
This commit is contained in:
Uros Bizjak 2016-09-29 20:44:32 +02:00 committed by Uros Bizjak
parent f90b32b95b
commit 2488ebe5ef
4 changed files with 34 additions and 27 deletions

View 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> 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 @@
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.

View File

@ -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;
} }

View 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> 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 @@
* 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

View File

@ -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))