diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-07-18 04:43:10 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-07-19 04:10:04 -0700 |
commit | 29e1039ca211c4e3f1053925eda0a81c57cbcb0c (patch) | |
tree | 4d4f14320ba26cc0f022a662e40d106972b01e48 | |
parent | 3055d879edb1bc2a3923f92a5e681c8f6774fbc3 (diff) | |
download | gcc-29e1039ca211c4e3f1053925eda0a81c57cbcb0c.zip gcc-29e1039ca211c4e3f1053925eda0a81c57cbcb0c.tar.gz gcc-29e1039ca211c4e3f1053925eda0a81c57cbcb0c.tar.bz2 |
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.
-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; +} |