Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/local_includes/cpuid.h')
-rw-r--r--winsup/cygwin/local_includes/cpuid.h46
1 files changed, 46 insertions, 0 deletions
diff --git a/winsup/cygwin/local_includes/cpuid.h b/winsup/cygwin/local_includes/cpuid.h
new file mode 100644
index 000000000..6dbb1bddf
--- /dev/null
+++ b/winsup/cygwin/local_includes/cpuid.h
@@ -0,0 +1,46 @@
+/* cpuid.h: Define cpuid instruction
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef CPUID_H
+#define CPUID_H
+
+static inline void __attribute ((always_inline))
+cpuid (uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, uint32_t ain,
+ uint32_t cin = 0)
+{
+ asm volatile ("cpuid"
+ : "=a" (*a), "=b" (*b), "=c" (*c), "=d" (*d)
+ : "a" (ain), "c" (cin));
+}
+
+#ifdef __x86_64__
+static inline bool __attribute ((always_inline))
+can_set_flag (uint32_t long flag)
+{
+ uint32_t long r1, r2;
+
+ asm volatile ("pushfq\n"
+ "popq %0\n"
+ "movq %0, %1\n"
+ "xorq %2, %0\n"
+ "pushq %0\n"
+ "popfq\n"
+ "pushfq\n"
+ "popq %0\n"
+ "pushq %1\n"
+ "popfq\n"
+ : "=&r" (r1), "=&r" (r2)
+ : "ir" (flag)
+ );
+ return ((r1 ^ r2) & flag) != 0;
+}
+#else
+#error unimplemented for this target
+#endif
+
+#endif // !CPUID_H