Author: hpoussin Date: Mon Sep 3 12:50:06 2007 New Revision: 28807
URL: http://svn.reactos.org/svn/reactos?rev=28807&view=rev Log: Add a generic implementation of InterlockedBitTestAndSet/InterlockedBitTestAndReset/BitScanReverse
Modified: trunk/reactos/include/psdk/winnt.h
Modified: trunk/reactos/include/psdk/winnt.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/winnt.h?rev=28... ============================================================================== --- trunk/reactos/include/psdk/winnt.h (original) +++ trunk/reactos/include/psdk/winnt.h Mon Sep 3 12:50:06 2007 @@ -4,6 +4,9 @@ #pragma GCC system_header #endif
+#ifdef __GNUC__ +#include "intrin.h" +#endif
/* translate GCC target defines to MS equivalents. Keep this synchronized with windows.h. */ @@ -2341,7 +2344,7 @@ #endif } CONTEXT;
-#elif defined(MIPS) +#elif defined(_MIPS_)
/* The following flags control the contents of the CONTEXT structure. */
@@ -4039,28 +4042,32 @@
#if defined(__GNUC__)
-#ifdef _M_IX86 +#if defined(_M_IX86) static __inline__ PVOID GetCurrentFiber(void) { void* ret; __asm__ __volatile__ ( - "movl %%fs:0x10,%0" - : "=r" (ret) /* allow use of reg eax,ebx,ecx,edx,esi,edi */ - ); + "movl %%fs:0x10,%0" + : "=r" (ret) /* allow use of reg eax,ebx,ecx,edx,esi,edi */ + ); return ret; } #else +#if defined(_M_PPC) static __inline__ __attribute__((always_inline)) unsigned long __readfsdword_winnt(const unsigned long Offset) { unsigned long result; __asm__("\tadd 7,13,%1\n" - "\tlwz %0,0(7)\n" - : "=r" (result) - : "r" (Offset) - : "r7"); + "\tlwz %0,0(7)\n" + : "=r" (result) + : "r" (Offset) + : "r7"); return result; }
+#else +#error Unknown architecture +#endif static __inline__ PVOID GetCurrentFiber(void) { return __readfsdword_winnt(0x10); @@ -4147,78 +4154,36 @@ InterlockedBitTestAndSet(IN LONG volatile *Base, IN LONG Bit) { +#if defined(_M_IX86) LONG OldBit; - -#ifdef _M_IX86 __asm__ __volatile__("lock " "btsl %2,%1\n\t" "sbbl %0,%0\n\t" - :"=r" (OldBit),"=m" (*Base) - :"Ir" (Bit) - : "memory"); -#elif defined(_M_PPC) - LONG scratch = 0; - - Bit = 1 << Bit; - /* %0 - OldBit - * %1 - Bit - * %2 - scratch - * %3 - Base - */ - __asm__ __volatile__( - "sync\n" - "0:\n\t" - "lwarx %2,0,%3\n\t" - "mr %0,%2\n\t" - "or %2,%1,%2\n\t" - "stwcx. %2,0,%3\n\t" - "bne- 0b\n\t" : - "=r" (OldBit) : - "r" (Bit), - "r" (scratch), - "r" (Base) - ); -#endif + :"=r" (OldBit),"=m" (*Base) + :"Ir" (Bit) + : "memory"); return OldBit; +#else + return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1; +#endif }
static __inline__ BOOLEAN InterlockedBitTestAndReset(IN LONG volatile *Base, - IN LONG Bit) + IN LONG Bit) { +#if defined(_M_IX86) LONG OldBit; - -#ifdef _M_IX86 __asm__ __volatile__("lock " "btrl %2,%1\n\t" "sbbl %0,%0\n\t" - :"=r" (OldBit),"=m" (*Base) - :"Ir" (Bit) - : "memory"); -#elif defined(_M_PPC) - LONG scratch = 0; - - Bit = ~(1 << Bit); - /* %0 - OldBit - * %1 - Bit - * %2 - scratch - * %3 - Base - */ - __asm__ __volatile__( - "sync\n" - "0:\n\t" - "lwarx %2,0,%3\n\t" - "mr %0,%2\n\t" - "and %2,%1,%2\n\t" - "stwcx. %2,0,%3\n\t" - "bne- 0b\n\t" : - "=r" (OldBit) : - "r" (Bit), - "r" (scratch), - "r" (Base) - ); -#endif + :"=r" (OldBit),"=m" (*Base) + :"Ir" (Bit) + : "memory"); return OldBit; +#else + return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1; +#endif }
static __inline__ BOOLEAN @@ -4226,14 +4191,14 @@ IN ULONG Mask) { BOOLEAN BitPosition = 0; -#ifdef _M_IX86 +#if defined(_M_IX86) __asm__ __volatile__("bsrl %2,%0\n\t" "setnz %1\n\t" - :"=&r" (*Index), "=r" (BitPosition) - :"rm" (Mask) - :"memory"); + :"=&r" (*Index), "=r" (BitPosition) + :"rm" (Mask) + :"memory"); return BitPosition; -#elif defined(_M_PPC) +#else /* Slow implementation for now */ for( *Index = 31; *Index; *Index-- ) { if( (1<<*Index) & Mask ) { @@ -4247,10 +4212,14 @@
#endif
-#ifdef _M_IX86 +#if defined(_M_IX86) #define YieldProcessor() __asm__ __volatile__("pause"); #elif defined(_M_PPC) #define YieldProcessor() __asm__ __volatile__("nop"); +#elif defined(_M_MIPS) +#define YieldProcessor() __asm__ __volatile__("nop"); +#else +#error Unknown architecture #endif
#if defined(_AMD64_)