From 29e1039ca211c4e3f1053925eda0a81c57cbcb0c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 18 Jul 2020 04:43:10 -0700 Subject: [PATCH] x86: Add __cpuidex and include guard to Add void __cpuidex (int __cpuid_info[4], int __leaf, int __subleaf); as well as include guard to . 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. --- gcc/config/i386/cpuid.h | 12 ++++++++++++ gcc/testsuite/gcc.target/i386/pr95973.c | 25 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr95973.c diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h index 94af4910d3c..bca61d620db 100644 --- a/gcc/config/i386/cpuid.h +++ b/gcc/config/i386/cpuid.h @@ -21,6 +21,9 @@ * . */ +#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 00000000000..08c7dba8f46 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr95973.c @@ -0,0 +1,25 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -Wall" } */ + +#include +#include + +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; +} -- 2.30.2