[ros-diffs] [hpoussin] 28807: Add a generic implementation of InterlockedBitTestAndSet/InterlockedBitTestAndReset/BitScanReverse

hpoussin at svn.reactos.org hpoussin at svn.reactos.org
Mon Sep 3 10:50:06 CEST 2007


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=28807&r1=28806&r2=28807&view=diff
==============================================================================
--- 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_)




More information about the Ros-diffs mailing list