x86: Add __cpuidex and include guard to <cpuid.h>

Add

void __cpuidex (int __cpuid_info[4], int __leaf, int __subleaf);

as well as include guard to <cpuid.h>.

gcc/

	PR target/95973
	PR target/96238
	* config/i386/cpuid.h: Add include guard.
	(__cpuidex): New.

gcc/testsuite/

	PR target/95973
	PR target/96238
	* gcc.target/i386/pr95973.c: New test.
This commit is contained in:
H.J. Lu 2020-07-18 04:43:10 -07:00
parent 3055d879ed
commit 29e1039ca2
2 changed files with 37 additions and 0 deletions

View File

@ -21,6 +21,9 @@
* <http://www.gnu.org/licenses/>.
*/
#ifndef _CPUID_H_INCLUDED
#define _CPUID_H_INCLUDED
/* %eax */
#define bit_AVX512BF16 (1 << 5)
@ -313,3 +316,12 @@ __get_cpuid_count (unsigned int __leaf, unsigned int __subleaf,
__cpuid_count (__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);
return 1;
}
static __inline void
__cpuidex (int __cpuid_info[4], int __leaf, int __subleaf)
{
__cpuid_count (__leaf, __subleaf, __cpuid_info[0], __cpuid_info[1],
__cpuid_info[2], __cpuid_info[3]);
}
#endif /* _CPUID_H_INCLUDED */

View File

@ -0,0 +1,25 @@
/* { dg-do run } */
/* { dg-options "-O2 -Wall" } */
#include <cpuid.h>
#include <cpuid.h>
int
main ()
{
unsigned int eax, ebx, ecx, edx;
int cpuid_info[4];
if (!__get_cpuid_count (7, 0, &eax, &ebx, &ecx, &edx))
return 0;
__cpuidex (cpuid_info, 7, 0);
if (cpuid_info[0] != eax
|| cpuid_info[1] != ebx
|| cpuid_info[2] != ecx
|| cpuid_info[3] != edx)
__builtin_abort ();
return 0;
}