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

Message ID 20200718115253.70917-1-hjl.tools@gmail.com
State New
Headers show
Series
  • x86: Add __cpuidex and include guard to <cpuid.h>
Related show

Commit Message

Bill Schmidt via Gcc-patches July 18, 2020, 11:52 a.m.
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.
---
 gcc/config/i386/cpuid.h                 | 12 ++++++++++++
 gcc/testsuite/gcc.target/i386/pr95973.c | 26 +++++++++++++++++++++++++
 2 files changed, 38 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr95973.c

-- 
2.26.2

Patch

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 @@ 
  * <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 00000000000..6d8e8f12f64
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr95973.c
@@ -0,0 +1,26 @@ 
+/* { dg-do run } */
+/* { dg-options "-O2 -Wall" } */
+
+#include <stdlib.h>
+#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)
+    abort ();
+
+  return 0;
+}