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:
authorChristopher Faylor <me@cgf.cx>2002-12-14 08:06:59 +0300
committerChristopher Faylor <me@cgf.cx>2002-12-14 08:06:59 +0300
commitba88622498adc2939b747b3f14f2713926631f7e (patch)
tree87c4fc975ec3bdd0919ffdf5230101629f882786 /winsup/cygwin/winbase.h
parent8bce0d723c50924b908dca1467037c8008e872be (diff)
* winbase.h: Turn on inline versions of Interlocked* by default.
* winbase.h: Fixup inline asm functions. Add ilockcmpexch.
Diffstat (limited to 'winsup/cygwin/winbase.h')
-rw-r--r--winsup/cygwin/winbase.h42
1 files changed, 28 insertions, 14 deletions
diff --git a/winsup/cygwin/winbase.h b/winsup/cygwin/winbase.h
index 15d16a429..351d320a4 100644
--- a/winsup/cygwin/winbase.h
+++ b/winsup/cygwin/winbase.h
@@ -1,43 +1,50 @@
#include_next "winbase.h"
-#ifdef EXPCGF
-#define DECLARE_TLS_STORAGE char **tls[4096] __attribute__ ((unused))
-#else
-#define DECLARE_TLS_STORAGE do {} while (0)
-#define _WINBASE2_H
-#endif
-
#ifndef _WINBASE2_H
#define _WINBASE2_H
-extern __inline__ long ilockincr (long *m)
+extern __inline__ long
+ilockincr (long *m)
{
register int __res;
__asm__ __volatile__ ("\n\
movl $1,%0\n\
lock xadd %0,(%1)\n\
inc %0\n\
- ": "=a" (__res), "=r" (m): "1" (m));
+ ": "=a" (__res), "=q" (m): "1" (m));
return __res;
}
-extern __inline__ long ilockdecr (long *m)
+
+extern __inline__ long
+ilockdecr (long *m)
{
register int __res;
__asm__ __volatile__ ("\n\
movl $0xffffffff,%0\n\
lock xadd %0,(%1)\n\
dec %0\n\
- ": "=a" (__res), "=r" (m): "1" (m));
+ ": "=a" (__res), "=q" (m): "1" (m));
return __res;
}
-extern __inline__ long ilockexch (long *t, long v)
+
+extern __inline__ long
+ilockexch (long *t, long v)
{
register int __res;
__asm__ __volatile__ ("\n\
- movl (%2),%0\n\
1: lock cmpxchgl %3,(%1)\n\
jne 1b\n\
- ": "=a" (__res), "=c" (t): "1" (t), "d" (v));
+ ": "=a" (__res), "=q" (t): "1" (t), "q" (v), "0" (*t));
+ return __res;
+}
+
+extern __inline__ long
+ilockcmpexch (long *t, long v, long c)
+{
+ register int __res;
+ __asm__ __volatile__ ("\n\
+ lock cmpxchgl %3,(%1)\n\
+ ": "=a" (__res), "=q" (t) : "1" (t), "q" (v), "0" (c));
return __res;
}
@@ -47,7 +54,13 @@ extern __inline__ long ilockexch (long *t, long v)
#define InterlockedDecrement ilockdecr
#undef InterlockedExchange
#define InterlockedExchange ilockexch
+#undef InterlockedCompareExchange
+#define InterlockedCompareExchange ilockcmpexch
+#ifndef EXPCGf
+#define DECLARE_TLS_STORAGE do {} while (0)
+#else
+#define DECLARE_TLS_STORAGE char **tls[4096] __attribute__ ((unused))
extern long tls_ix;
extern char * volatile *__stackbase __asm__ ("%fs:4");
@@ -87,4 +100,5 @@ my_tlsfree (DWORD ix)
#define TlsSetValue my_tlssetvalue
#undef TlsFree
#define TlsFree my_tlsfree
+#endif /*EXPCGF*/
#endif /*_WINBASE2_H*/