diff options
author | Christopher Faylor <me@cgf.cx> | 2002-12-14 08:06:59 +0300 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2002-12-14 08:06:59 +0300 |
commit | ba88622498adc2939b747b3f14f2713926631f7e (patch) | |
tree | 87c4fc975ec3bdd0919ffdf5230101629f882786 /winsup/cygwin | |
parent | 8bce0d723c50924b908dca1467037c8008e872be (diff) |
* winbase.h: Turn on inline versions of Interlocked* by default.
* winbase.h: Fixup inline asm functions. Add ilockcmpexch.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r-- | winsup/cygwin/ChangeLog | 8 | ||||
-rw-r--r-- | winsup/cygwin/string.h | 18 | ||||
-rw-r--r-- | winsup/cygwin/winbase.h | 42 |
3 files changed, 45 insertions, 23 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index e107aaed1..1a98713cd 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2002-12-14 Christopher Faylor <cgf@redhat.com> + + * winbase.h: Turn on inline versions of Interlocked* by default. + +2002-12-14 Gary R. Van Sickle <g.r.vansickle@worldnet.att.net> + + * winbase.h: Fixup inline asm functions. Add ilockcmpexch. + 2002-12-13 Christopher Faylor <cgf@redhat.com> Throughout, change fhandler_*::read and fhandler_*::raw_read to void diff --git a/winsup/cygwin/string.h b/winsup/cygwin/string.h index 778bb40ac..6e410249b 100644 --- a/winsup/cygwin/string.h +++ b/winsup/cygwin/string.h @@ -24,15 +24,15 @@ strchr (const char *s, int c) { register char * res; __asm__ __volatile__ ("\ - movb %%al,%%ah\n\ - 1: movb (%1),%%al\n\ - cmpb %%ah,%%al\n\ - je 2f\n\ - incl %1\n\ - testb %%al,%%al\n\ - jne 1b\n\ - xorl %1,%1\n\ - 2: movl %1,%0\n\ + movb %%al,%%ah\n\ +1: movb (%1),%%al\n\ + cmpb %%ah,%%al\n\ + je 2f\n\ + incl %1\n\ + testb %%al,%%al\n\ + jne 1b\n\ + xorl %1,%1\n\ +2: movl %1,%0\n\ ":"=a" (res), "=r" (s) :"0" (c), "1" (s)); return res; 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*/ |