aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2020-07-18 04:43:10 -0700
committerH.J. Lu <hjl.tools@gmail.com>2020-07-19 04:10:04 -0700
commit29e1039ca211c4e3f1053925eda0a81c57cbcb0c (patch)
tree4d4f14320ba26cc0f022a662e40d106972b01e48
parent3055d879edb1bc2a3923f92a5e681c8f6774fbc3 (diff)
downloadgcc-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.h12
-rw-r--r--gcc/testsuite/gcc.target/i386/pr95973.c25
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;
+}