summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/cpuid.h
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2013-04-23 09:44:36 +0000
committerCorinna Vinschen <corinna@vinschen.de>2013-04-23 09:44:36 +0000
commit61522196c71593da09572fce9af9e0d7dad61bc3 (patch)
tree9bf74facd67974fa2f780d6ce68b14eb7a94e371 /winsup/cygwin/cpuid.h
parent1875ee55d31d3673059373c8f9837bf98f93c713 (diff)
downloadcygnal-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.h26
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