diff options
-rw-r--r-- | gcc/config/i386/cpuid.h | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr95973.c | 25 |
2 files changed, 37 insertions, 0 deletions
diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h index 94af491..bca61d62 100644 --- a/gcc/config/i386/cpuid.h +++ b/gcc/config/i386/cpuid.h @@ -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 */ diff --git a/gcc/testsuite/gcc.target/i386/pr95973.c b/gcc/testsuite/gcc.target/i386/pr95973.c new file mode 100644 index 0000000..08c7dba --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr95973.c @@ -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; +} |