diff options
Diffstat (limited to 'winsup/cygwin/cpuid.h')
-rw-r--r-- | winsup/cygwin/cpuid.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/winsup/cygwin/cpuid.h b/winsup/cygwin/cpuid.h new file mode 100644 index 000000000..1f0cc5006 --- /dev/null +++ b/winsup/cygwin/cpuid.h @@ -0,0 +1,35 @@ +#ifndef CPUID_H +#define CPUID_H + +extern inline void +cpuid (unsigned *a, unsigned *b, unsigned *c, unsigned *d, unsigned in) +{ + asm ("cpuid" + : "=a" (*a), + "=b" (*b), + "=c" (*c), + "=d" (*d) + : "a" (in)); +} + +extern inline bool +can_set_flag (unsigned flag) +{ + unsigned r1, r2; + asm("pushfl\n" + "popl %0\n" + "movl %0, %1\n" + "xorl %2, %0\n" + "pushl %0\n" + "popfl\n" + "pushfl\n" + "popl %0\n" + "pushl %1\n" + "popfl\n" + : "=&r" (r1), "=&r" (r2) + : "ir" (flag) + ); + return ((r1 ^ r2) & flag) != 0; +} + +#endif // !CPUID_H |