diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2013-04-23 09:44:36 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2013-04-23 09:44:36 +0000 |
commit | 61522196c71593da09572fce9af9e0d7dad61bc3 (patch) | |
tree | 9bf74facd67974fa2f780d6ce68b14eb7a94e371 /winsup/cygwin/cpuid.h | |
parent | 1875ee55d31d3673059373c8f9837bf98f93c713 (diff) | |
download | cygnal-61522196c71593da09572fce9af9e0d7dad61bc3.tar.gz cygnal-61522196c71593da09572fce9af9e0d7dad61bc3.tar.bz2 cygnal-61522196c71593da09572fce9af9e0d7dad61bc3.zip |
* Merge in cygwin-64bit-branch.
Diffstat (limited to 'winsup/cygwin/cpuid.h')
-rw-r--r-- | winsup/cygwin/cpuid.h | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/winsup/cygwin/cpuid.h b/winsup/cygwin/cpuid.h index 998bbbf91..ff353227e 100644 --- a/winsup/cygwin/cpuid.h +++ b/winsup/cygwin/cpuid.h @@ -12,10 +12,31 @@ cpuid (unsigned *a, unsigned *b, unsigned *c, unsigned *d, unsigned in) : "a" (in)); } +#ifdef __x86_64__ extern inline bool -can_set_flag (unsigned flag) +can_set_flag (register unsigned long flag) { - unsigned r1, r2; + register unsigned long r1, r2; + asm("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 +extern inline bool +can_set_flag (register unsigned flag) +{ + register unsigned r1, r2; asm("pushfl\n" "popl %0\n" "movl %0, %1\n" @@ -31,5 +52,6 @@ can_set_flag (unsigned flag) ); return ((r1 ^ r2) & flag) != 0; } +#endif #endif // !CPUID_H |