InterlockedBitTestAndXXX fix by dw aka mud aka limegreensocks yahoo at com

git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@5877 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 296f33c..4ce1258 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -258,7 +258,7 @@
   intrincs/readgsqword.c  intrincs/writegsbyte.c  intrincs/writegsword.c  intrincs/writegsdword.c    \
   intrincs/writegsqword.c intrincs/mul128ex.c     intrincs/umul128ex.c    intrincs/_mul128.c         \
   intrincs/_umul128.c     intrincs/__movsq.c      intrincs/__stosq.c      intrincs/__shiftright128.c \
-  intrincs/__shiftleft128.c
+  intrincs/bittestci64.c  intrincs/__shiftleft128.c
 
 # these only go into the 32 bit version:
 src_intrincs32=\
diff --git a/mingw-w64-crt/Makefile.in b/mingw-w64-crt/Makefile.in
index e148f10..e014149 100644
--- a/mingw-w64-crt/Makefile.in
+++ b/mingw-w64-crt/Makefile.in
@@ -1387,7 +1387,8 @@
 	intrincs/writegsdword.c intrincs/writegsqword.c \
 	intrincs/mul128ex.c intrincs/umul128ex.c intrincs/_mul128.c \
 	intrincs/_umul128.c intrincs/__movsq.c intrincs/__stosq.c \
-	intrincs/__shiftright128.c intrincs/__shiftleft128.c
+	intrincs/__shiftright128.c intrincs/bittestci64.c \
+	intrincs/__shiftleft128.c
 am__objects_36 = intrincs/lib64_libkernel32_a-__movsb.$(OBJEXT) \
 	intrincs/lib64_libkernel32_a-__movsd.$(OBJEXT) \
 	intrincs/lib64_libkernel32_a-__movsw.$(OBJEXT) \
@@ -1481,6 +1482,7 @@
 	intrincs/lib64_libkernel32_a-__movsq.$(OBJEXT) \
 	intrincs/lib64_libkernel32_a-__stosq.$(OBJEXT) \
 	intrincs/lib64_libkernel32_a-__shiftright128.$(OBJEXT) \
+	intrincs/lib64_libkernel32_a-bittestci64.$(OBJEXT) \
 	intrincs/lib64_libkernel32_a-__shiftleft128.$(OBJEXT)
 @LIB64_TRUE@am_lib64_libkernel32_a_OBJECTS = $(am__objects_36) \
 @LIB64_TRUE@	$(am__objects_37)
@@ -3876,7 +3878,7 @@
   intrincs/readgsqword.c  intrincs/writegsbyte.c  intrincs/writegsword.c  intrincs/writegsdword.c    \
   intrincs/writegsqword.c intrincs/mul128ex.c     intrincs/umul128ex.c    intrincs/_mul128.c         \
   intrincs/_umul128.c     intrincs/__movsq.c      intrincs/__stosq.c      intrincs/__shiftright128.c \
-  intrincs/__shiftleft128.c
+  intrincs/bittestci64.c  intrincs/__shiftleft128.c
 
 
 # these only go into the 32 bit version:
@@ -6824,6 +6826,8 @@
 	intrincs/$(am__dirstamp) intrincs/$(DEPDIR)/$(am__dirstamp)
 intrincs/lib64_libkernel32_a-__shiftright128.$(OBJEXT):  \
 	intrincs/$(am__dirstamp) intrincs/$(DEPDIR)/$(am__dirstamp)
+intrincs/lib64_libkernel32_a-bittestci64.$(OBJEXT):  \
+	intrincs/$(am__dirstamp) intrincs/$(DEPDIR)/$(am__dirstamp)
 intrincs/lib64_libkernel32_a-__shiftleft128.$(OBJEXT):  \
 	intrincs/$(am__dirstamp) intrincs/$(DEPDIR)/$(am__dirstamp)
 lib64/libkernel32.a: $(lib64_libkernel32_a_OBJECTS) $(lib64_libkernel32_a_DEPENDENCIES) $(EXTRA_lib64_libkernel32_a_DEPENDENCIES) lib64/$(am__dirstamp)
@@ -9233,6 +9237,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestc64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestci.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestci64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestr.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestr64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestri.Po@am__quote@
@@ -22121,6 +22126,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libkernel32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o intrincs/lib64_libkernel32_a-__shiftright128.obj `if test -f 'intrincs/__shiftright128.c'; then $(CYGPATH_W) 'intrincs/__shiftright128.c'; else $(CYGPATH_W) '$(srcdir)/intrincs/__shiftright128.c'; fi`
 
+intrincs/lib64_libkernel32_a-bittestci64.o: intrincs/bittestci64.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libkernel32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT intrincs/lib64_libkernel32_a-bittestci64.o -MD -MP -MF intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestci64.Tpo -c -o intrincs/lib64_libkernel32_a-bittestci64.o `test -f 'intrincs/bittestci64.c' || echo '$(srcdir)/'`intrincs/bittestci64.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestci64.Tpo intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestci64.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='intrincs/bittestci64.c' object='intrincs/lib64_libkernel32_a-bittestci64.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libkernel32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o intrincs/lib64_libkernel32_a-bittestci64.o `test -f 'intrincs/bittestci64.c' || echo '$(srcdir)/'`intrincs/bittestci64.c
+
+intrincs/lib64_libkernel32_a-bittestci64.obj: intrincs/bittestci64.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libkernel32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT intrincs/lib64_libkernel32_a-bittestci64.obj -MD -MP -MF intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestci64.Tpo -c -o intrincs/lib64_libkernel32_a-bittestci64.obj `if test -f 'intrincs/bittestci64.c'; then $(CYGPATH_W) 'intrincs/bittestci64.c'; else $(CYGPATH_W) '$(srcdir)/intrincs/bittestci64.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestci64.Tpo intrincs/$(DEPDIR)/lib64_libkernel32_a-bittestci64.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='intrincs/bittestci64.c' object='intrincs/lib64_libkernel32_a-bittestci64.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libkernel32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o intrincs/lib64_libkernel32_a-bittestci64.obj `if test -f 'intrincs/bittestci64.c'; then $(CYGPATH_W) 'intrincs/bittestci64.c'; else $(CYGPATH_W) '$(srcdir)/intrincs/bittestci64.c'; fi`
+
 intrincs/lib64_libkernel32_a-__shiftleft128.o: intrincs/__shiftleft128.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib64_libkernel32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT intrincs/lib64_libkernel32_a-__shiftleft128.o -MD -MP -MF intrincs/$(DEPDIR)/lib64_libkernel32_a-__shiftleft128.Tpo -c -o intrincs/lib64_libkernel32_a-__shiftleft128.o `test -f 'intrincs/__shiftleft128.c' || echo '$(srcdir)/'`intrincs/__shiftleft128.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) intrincs/$(DEPDIR)/lib64_libkernel32_a-__shiftleft128.Tpo intrincs/$(DEPDIR)/lib64_libkernel32_a-__shiftleft128.Po
diff --git a/mingw-w64-crt/intrincs/bittestci.c b/mingw-w64-crt/intrincs/bittestci.c
index d69fdf4..8aab4d8 100644
--- a/mingw-w64-crt/intrincs/bittestci.c
+++ b/mingw-w64-crt/intrincs/bittestci.c
@@ -1,14 +1,6 @@
 #include <intrin.h>
+#include <psdk_inc/intrin-mac.h>
 
-unsigned char _InterlockedBitTestAndComplement(__LONG32 *Base, __LONG32 Bit);			/* not in intrin.h */
-unsigned char _InterlockedBitTestAndComplement(__LONG32 *Base, __LONG32 Bit)
-{
-  int old = 0;
-  __asm__ __volatile__("lock ; btcl %2,%1\n\tsbbl %0,%0 "
-    :"=r" (old),"=m" ((*(volatile __LONG32 *) Base))
-    :"Ir" (Bit) : "memory");
-  return (old != 0);
-}
+__buildbittesti(_interlockedbittestandcomplement, __LONG32, "lock btc", "I", /* unused param */)
 
-unsigned char InterlockedBitTestAndComplement(__LONG32 *Base, __LONG32 Bit) __attribute__((alias("_InterlockedBitTestAndComplement")));
-
+unsigned char InterlockedBitTestAndComplement(__LONG32 volatile *, __LONG32) __attribute__((alias("_interlockedbittestandcomplement")));
diff --git a/mingw-w64-crt/intrincs/bittestci64.c b/mingw-w64-crt/intrincs/bittestci64.c
new file mode 100644
index 0000000..112adaa
--- /dev/null
+++ b/mingw-w64-crt/intrincs/bittestci64.c
@@ -0,0 +1,6 @@
+#include <intrin.h>
+#include <psdk_inc/intrin-mac.h>
+
+__buildbittesti(_interlockedbittestandcomplement64, __int64, "lock btc", "J", /* unused param */)
+
+unsigned char InterlockedBitTestAndComplement64(__int64 volatile *, __int64) __attribute__((alias("_interlockedbittestandcomplement64")));
diff --git a/mingw-w64-crt/intrincs/bittestri.c b/mingw-w64-crt/intrincs/bittestri.c
index e362906..aff9752 100644
--- a/mingw-w64-crt/intrincs/bittestri.c
+++ b/mingw-w64-crt/intrincs/bittestri.c
@@ -1,11 +1,6 @@
 #include <intrin.h>
+#include <psdk_inc/intrin-mac.h>
 
-unsigned char _interlockedbittestandreset(__LONG32 *Base, __LONG32 Offset)
-{
-  int old = 0;
-  __asm__ __volatile__("lock ; btrl %2,%1\n\tsbbl %0,%0 "
-    :"=r" (old),"=m" ((*(volatile __LONG32 *) Base))
-    :"Ir" (Offset) : "memory");
-  return (old != 0);
-}
+__buildbittesti(_interlockedbittestandreset, __LONG32, "lock btr", "I", /* unused param */)
 
+unsigned char InterlockedBitTestAndReset(__LONG32 volatile *, __LONG32) __attribute__((alias("_interlockedbittestandreset")));
diff --git a/mingw-w64-crt/intrincs/bittestri64.c b/mingw-w64-crt/intrincs/bittestri64.c
index f5dc59d..39dad8c 100644
--- a/mingw-w64-crt/intrincs/bittestri64.c
+++ b/mingw-w64-crt/intrincs/bittestri64.c
@@ -1,11 +1,6 @@
 #include <intrin.h>
+#include <psdk_inc/intrin-mac.h>
 
-unsigned char _interlockedbittestandreset64(__int64 *Base, __int64 Offset)
-{
-  int old = 0;
-  __asm__ __volatile__("lock ; btrq %2,%1\n\tsbbl %0,%0 "
-    :"=r" (old),"=m" ((*(volatile long long *) Base))
-    :"Ir" (Offset) : "memory");
-  return (old != 0);
-}
+__buildbittesti(_interlockedbittestandreset64, __int64, "lock btr", "J", /* unused param */)
 
+unsigned char InterlockedBitTestAndReset64(__int64 volatile *, __int64) __attribute__((alias("_interlockedbittestandreset64")));
diff --git a/mingw-w64-crt/intrincs/bittestsi.c b/mingw-w64-crt/intrincs/bittestsi.c
index 37e3d83..3c7e1e6 100644
--- a/mingw-w64-crt/intrincs/bittestsi.c
+++ b/mingw-w64-crt/intrincs/bittestsi.c
@@ -1,11 +1,6 @@
 #include <intrin.h>
+#include <psdk_inc/intrin-mac.h>
 
-unsigned char _interlockedbittestandset(__LONG32 *Base, __LONG32 Offset)
-{
-  int old = 0;
-  __asm__ __volatile__("lock ; btsl %2,%1\n\tsbbl %0,%0 "
-    :"=r" (old),"=m" ((*(volatile __LONG32 *) Base))
-    :"Ir" (Offset) : "memory");
-  return (old != 0);
-}
+__buildbittesti(_interlockedbittestandset, __LONG32, "lock bts", "I", /* unused param */)
 
+unsigned char InterlockedBitTestAndSet(__LONG32 volatile *, __LONG32) __attribute__((alias("_interlockedbittestandset")));
diff --git a/mingw-w64-crt/intrincs/bittestsi64.c b/mingw-w64-crt/intrincs/bittestsi64.c
index fe16fe0..c8c6b1c 100644
--- a/mingw-w64-crt/intrincs/bittestsi64.c
+++ b/mingw-w64-crt/intrincs/bittestsi64.c
@@ -1,11 +1,6 @@
 #include <intrin.h>
+#include <psdk_inc/intrin-mac.h>
 
-unsigned char _interlockedbittestandset64(__int64 *Base, __int64 Offset)
-{
-  int old = 0;
-  __asm__ __volatile__("lock ; btsq %2,%1\n\tsbbl %0,%0 "
-    :"=r" (old),"=m" ((*(volatile long long *) Base))
-    :"Ir" (Offset) : "memory");
-  return (old != 0);
-}
+__buildbittesti(_interlockedbittestandset64, __int64, "lock bts", "J", /* unused param */)
 
+unsigned char InterlockedBitTestAndSet64(__int64 volatile *, __int64) __attribute__((alias("_interlockedbittestandset64")));
diff --git a/mingw-w64-headers/crt/intrin.h b/mingw-w64-headers/crt/intrin.h
index cb16bbc..7f202d3 100644
--- a/mingw-w64-headers/crt/intrin.h
+++ b/mingw-w64-headers/crt/intrin.h
@@ -1037,14 +1037,22 @@
     __MACHINEIW64(unsigned char _bittestandset(__LONG32 *a,__LONG32 b))
     __MACHINEIW64(unsigned char _bittestandreset(__LONG32 *a,__LONG32 b))
     __MACHINEIW64(unsigned char _bittestandcomplement(__LONG32 *a,__LONG32 b))
+    __MACHINEI(unsigned char InterlockedBitTestAndSet(volatile __LONG32 *a,__LONG32 b))
+    __MACHINEI(unsigned char InterlockedBitTestAndReset(volatile __LONG32 *a,__LONG32 b))
+    __MACHINEI(unsigned char InterlockedBitTestAndComplement(volatile __LONG32 *a,__LONG32 b))
     __MACHINEI(unsigned char _interlockedbittestandset(__LONG32 *a,__LONG32 b))
     __MACHINEI(unsigned char _interlockedbittestandreset(__LONG32 *a,__LONG32 b))
+    __MACHINEI(unsigned char _interlockedbittestandcomplement(__LONG32 *a,__LONG32 b))
     __MACHINEW64(__MINGW_EXTENSION unsigned char _bittest64(__int64 const *a,__int64 b))
     __MACHINEW64(__MINGW_EXTENSION unsigned char _bittestandset64(__int64 *a,__int64 b))
     __MACHINEW64(__MINGW_EXTENSION unsigned char _bittestandreset64(__int64 *a,__int64 b))
     __MACHINEW64(__MINGW_EXTENSION unsigned char _bittestandcomplement64(__int64 *a,__int64 b))
+    __MACHINEX64(__MINGW_EXTENSION unsigned char InterlockedBitTestAndSet64(volatile __int64 *a,__int64 b))
+    __MACHINEX64(__MINGW_EXTENSION unsigned char InterlockedBitTestAndReset64(volatile __int64 *a,__int64 b))
+    __MACHINEX64(__MINGW_EXTENSION unsigned char InterlockedBitTestAndComplement64(volatile __int64 *a,__int64 b))
     __MACHINEX64(__MINGW_EXTENSION unsigned char _interlockedbittestandset64(__int64 *a,__int64 b))
     __MACHINEX64(__MINGW_EXTENSION unsigned char _interlockedbittestandreset64(__int64 *a,__int64 b))
+    __MACHINEX64(__MINGW_EXTENSION unsigned char _interlockedbittestandcomplement64(__int64 *a,__int64 b))
     __MACHINEI(void __cpuid(int a[4],int b))
     __MACHINEI(__MINGW_EXTENSION unsigned __int64 __readpmc(unsigned __LONG32 a))
     __MACHINEI(unsigned __LONG32 __segmentlimit(unsigned __LONG32 a))
diff --git a/mingw-w64-headers/include/psdk_inc/intrin-mac.h b/mingw-w64-headers/include/psdk_inc/intrin-mac.h
index 8a2167b..e40c046 100644
--- a/mingw-w64-headers/include/psdk_inc/intrin-mac.h
+++ b/mingw-w64-headers/include/psdk_inc/intrin-mac.h
@@ -6,10 +6,15 @@
 
 /* The macros in this file are included in multiple places */
 
-#ifndef _INTRIN-MAC_
-#define _INTRIN-MAC_
+#ifndef _INTRIN_MAC_
+#define _INTRIN_MAC_
 
 /* This macro is used by __stosb, __stosw, __stosd, __stosq */
+
+/* Parameters: (FunctionName, DataType, Operator)
+   FunctionName: Any valid function name
+   DataType: BYTE, WORD, DWORD or DWORD64 */
+
 #define __buildstos(x, y) void x(y *Dest, y Data, size_t Count) \
 { \
    __asm__ __volatile__ ("rep stos%z[Data]" \
@@ -18,10 +23,35 @@
       : "memory"); \
 }
 
-// This macro is used by InterlockedAnd, InterlockedOr, InterlockedXor, InterlockedAnd64, InterlockedOr64, InterlockedXor64
+/* This macro is used by InterlockedAnd, InterlockedOr, InterlockedXor, InterlockedAnd64, InterlockedOr64, InterlockedXor64 */
+
+/* Parameters: (FunctionName, DataType, Operator)
+   FunctionName: Any valid function name
+   DataType: __LONG32 or LONG64
+   Operator: One of xor, or, and */
 #define __buildlogicali(x, y, o) y x(volatile y *Destination, y Value) \
 { \
     return __sync_fetch_and_ ## o(Destination, Value); \
 }
 
-#endif /* _INTRIN-MAC_ */
+/* This macro is used by InterlockedBitTestAndSet, InterlockedBitTestAndReset, InterlockedBitTestAndComplement,
+   InterlockedBitTestAndSet64, InterlockedBitTestAndReset64, InterlockedBitTestAndComplement64
+   _interlockedbittestandset, _interlockedbittestandreset, _interlockedbittestandcomplement
+   _interlockedbittestandset64, _interlockedbittestandreset64, _interlockedbittestandcomplement64 */
+
+/* Parameters: (FunctionName, DataType, AsmCode, OffsetConstraint, Volatile)
+   FunctionName: Any valid function name
+   DataType: __LONG32 or LONG64
+   OffsetConstraint: either "I" for 32bit data types or "J" for 64.
+   Volatile: either volatile or blank. */
+#define __buildbittesti(x, y, z, a, b) unsigned char x(b y *Base, y Offset) \
+{ \
+   unsigned char old; \
+   __asm__ __volatile__ (z "%z[Base] {%[Offset],%[Base] | %[Base],%[Offset]} ; setc %[old]" \
+      : [old] "=qm" (old), [Base] "+m" (*Base) \
+      : [Offset] a "r" (Offset) \
+      : "memory", "cc"); \
+   return old; \
+}
+
+#endif /* _INTRIN_MAC_ */
diff --git a/mingw-w64-headers/include/winnt.h b/mingw-w64-headers/include/winnt.h
index c6b596b..06b06bb 100644
--- a/mingw-w64-headers/include/winnt.h
+++ b/mingw-w64-headers/include/winnt.h
@@ -1178,14 +1178,10 @@
 #define BitTestAndComplement _bittestandcomplement
 #define BitTestAndSet _bittestandset
 #define BitTestAndReset _bittestandreset
-#define InterlockedBitTestAndSet _interlockedbittestandset
-#define InterlockedBitTestAndReset _interlockedbittestandreset
 #define BitTest64 _bittest64
 #define BitTestAndComplement64 _bittestandcomplement64
 #define BitTestAndSet64 _bittestandset64
 #define BitTestAndReset64 _bittestandreset64
-#define InterlockedBitTestAndSet64 _interlockedbittestandset64
-#define InterlockedBitTestAndReset64 _interlockedbittestandreset64
 
     BOOLEAN _bittest(LONG const *Base,LONG Offset);
     BOOLEAN _bittestandcomplement(LONG *Base,LONG Offset);
@@ -1207,25 +1203,25 @@
     }
 #endif /* __CRT__NO_INLINE */
 
-    BOOLEAN InterlockedBitTestAndComplement(LONG *Base,LONG Bit);
     BOOLEAN _bittestandset(LONG *Base,LONG Offset);
     BOOLEAN _bittestandreset(LONG *Base,LONG Offset);
-    BOOLEAN _interlockedbittestandset(LONG *Base,LONG Offset);
-    BOOLEAN _interlockedbittestandreset(LONG *Base,LONG Offset);
+    BOOLEAN _interlockedbittestandset(__LONG32 *Base,LONG Offset);
+    BOOLEAN _interlockedbittestandreset(__LONG32 *Base,LONG Offset);
+    BOOLEAN _interlockedbittestandcomplement(__LONG32 *Base,LONG Bit);
+    BOOLEAN InterlockedBitTestAndSet(volatile __LONG32 *Base,LONG Offset);
+    BOOLEAN InterlockedBitTestAndReset(volatile __LONG32 *Base,LONG Offset);
+    BOOLEAN InterlockedBitTestAndComplement(volatile __LONG32 *Base,LONG Bit);
     BOOLEAN _bittest64(LONG64 const *Base,LONG64 Offset);
     BOOLEAN _bittestandcomplement64(LONG64 *Base,LONG64 Offset);
     BOOLEAN _bittestandset64(LONG64 *Base,LONG64 Offset);
     BOOLEAN _bittestandreset64(LONG64 *Base,LONG64 Offset);
+    BOOLEAN InterlockedBitTestAndSet64(volatile LONG64 *Base,LONG64 Offset);
+    BOOLEAN InterlockedBitTestAndReset64(volatile LONG64 *Base,LONG64 Offset);
+    BOOLEAN InterlockedBitTestAndComplement64(volatile LONG64 *Base,LONG64 Bit);
     BOOLEAN _interlockedbittestandset64(LONG64 *Base,LONG64 Offset);
     BOOLEAN _interlockedbittestandreset64(LONG64 *Base,LONG64 Offset);
+    BOOLEAN _interlockedbittestandcomplement64(LONG64 *Base,LONG64 Bit);
 #ifndef __CRT__NO_INLINE
-    __CRT_INLINE BOOLEAN InterlockedBitTestAndComplement(LONG *Base,LONG Bit) {
-      int old = 0;
-      __asm__ __volatile__("lock ; btcl %2,%1\n\tsbbl %0,%0 "
-	:"=r" (old),"=m" ((*(volatile __LONG32 *) Base))
-	:"Ir" (Bit) : "memory");
-      return (BOOLEAN) (old!=0);
-    }
     __CRT_INLINE BOOLEAN _bittestandset(LONG *Base,LONG Offset) {
       int old = 0;
       __asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0 "
@@ -1240,20 +1236,14 @@
 	:"Ir" (Offset) : "memory");
       return (BOOLEAN) (old!=0);
     }
-    __CRT_INLINE BOOLEAN _interlockedbittestandset(LONG *Base,LONG Offset) {
-      int old = 0;
-      __asm__ __volatile__("lock ; btsl %2,%1\n\tsbbl %0,%0 "
-	:"=r" (old),"=m" ((*(volatile __LONG32 *) Base))
-	:"Ir" (Offset) : "memory");
-      return (BOOLEAN) (old!=0);
-    }
-    __CRT_INLINE BOOLEAN _interlockedbittestandreset(LONG *Base,LONG Offset) {
-      int old = 0;
-      __asm__ __volatile__("lock ; btrl %2,%1\n\tsbbl %0,%0 "
-	:"=r" (old),"=m" ((*(volatile __LONG32 *) Base))
-	:"Ir" (Offset) : "memory");
-      return (BOOLEAN) (old!=0);
-    }
+    __CRT_INLINE __buildbittesti(_interlockedbittestandset, __LONG32, "lock bts", "I", /* unused param */)
+    __CRT_INLINE __buildbittesti(_interlockedbittestandreset, __LONG32, "lock btr", "I", /* unused param */)
+    __CRT_INLINE __buildbittesti(_interlockedbittestandcomplement, __LONG32, "lock btc", "I", /* unused param */)
+
+    __CRT_INLINE __buildbittesti(InterlockedBitTestAndSet, __LONG32, "lock bts", "I", volatile)
+    __CRT_INLINE __buildbittesti(InterlockedBitTestAndReset, __LONG32, "lock btr", "I", volatile)
+    __CRT_INLINE __buildbittesti(InterlockedBitTestAndComplement, __LONG32, "lock btc", "I", volatile)
+
     __CRT_INLINE BOOLEAN _bittest64(LONG64 const *Base,LONG64 Offset) {
       int old = 0;
       __asm__ __volatile__("btq %2,%1\n\tsbbl %0,%0 "
@@ -1282,20 +1272,14 @@
 	:"Ir" (Offset) : "memory");
       return (BOOLEAN) (old!=0);
     }
-    __CRT_INLINE BOOLEAN _interlockedbittestandset64(LONG64 *Base,LONG64 Offset) {
-      int old = 0;
-      __asm__ __volatile__("lock ; btsq %2,%1\n\tsbbl %0,%0 "
-	:"=r" (old),"=m" ((*(volatile LONG64 *) Base))
-	:"Ir" (Offset) : "memory");
-      return (BOOLEAN) (old!=0);
-    }
-    __CRT_INLINE BOOLEAN _interlockedbittestandreset64(LONG64 *Base,LONG64 Offset) {
-      int old = 0;
-      __asm__ __volatile__("lock ; btrq %2,%1\n\tsbbl %0,%0 "
-	:"=r" (old),"=m" ((*(volatile LONG64 *) Base))
-	:"Ir" (Offset) : "memory");
-      return (BOOLEAN) (old!=0);
-    }
+    __CRT_INLINE __buildbittesti(_interlockedbittestandset64, LONG64, "lock bts", "J", /* unused param */)
+    __CRT_INLINE __buildbittesti(_interlockedbittestandreset64, LONG64, "lock btr", "J", /* unused param */)
+    __CRT_INLINE __buildbittesti(_interlockedbittestandcomplement64, LONG64, "lock btc", "J", /* unused param */)
+
+    __CRT_INLINE __buildbittesti(InterlockedBitTestAndSet64, LONG64, "lock bts", "J", volatile)
+    __CRT_INLINE __buildbittesti(InterlockedBitTestAndReset64, LONG64, "lock btr", "J", volatile)
+    __CRT_INLINE __buildbittesti(InterlockedBitTestAndComplement64, LONG64, "lock btc", "J", volatile)
+
 #endif /* !__CRT__NO_INLINE */
 
 #define BitScanForward _BitScanForward
@@ -1418,13 +1402,13 @@
       return prev;
     }
 
-__CRT_INLINE __buildlogicali(InterlockedAnd, LONG, and)
-__CRT_INLINE __buildlogicali(InterlockedOr, LONG, or)
-__CRT_INLINE __buildlogicali(InterlockedXor, LONG, xor)
+    __CRT_INLINE __buildlogicali(InterlockedAnd, LONG, and)
+    __CRT_INLINE __buildlogicali(InterlockedOr, LONG, or)
+    __CRT_INLINE __buildlogicali(InterlockedXor, LONG, xor)
 
-__CRT_INLINE __buildlogicali(InterlockedAnd64, LONG64, and)
-__CRT_INLINE __buildlogicali(InterlockedOr64, LONG64, or)
-__CRT_INLINE __buildlogicali(InterlockedXor64, LONG64, xor)
+    __CRT_INLINE __buildlogicali(InterlockedAnd64, LONG64, and)
+    __CRT_INLINE __buildlogicali(InterlockedOr64, LONG64, or)
+    __CRT_INLINE __buildlogicali(InterlockedXor64, LONG64, xor)
 #endif /* !__CRT__NO_INLINE */
 
     LONG InterlockedExchangeAdd(LONG volatile *Addend,LONG Value);
@@ -1809,8 +1793,6 @@
 #define BitTestAndComplement _bittestandcomplement
 #define BitTestAndSet _bittestandset
 #define BitTestAndReset _bittestandreset
-#define InterlockedBitTestAndSet _interlockedbittestandset
-#define InterlockedBitTestAndReset _interlockedbittestandreset
 
 #define BitScanForward _BitScanForward
 #define BitScanReverse _BitScanReverse
@@ -1822,35 +1804,21 @@
 #define InterlockedIncrementAcquire InterlockedIncrement
 #define InterlockedIncrementRelease InterlockedIncrement
 
-    BOOLEAN InterlockedBitTestAndSet(LONG *Base,LONG Bit);
-    BOOLEAN InterlockedBitTestAndReset(LONG *Base,LONG Bit);
-#ifndef __CRT__NO_INLINE
-    __CRT_INLINE BOOLEAN InterlockedBitTestAndSet(LONG *Base,LONG Bit) {
-      int old = 0;
-      __asm__ __volatile__("lock ; btsl %2,%1\n\tsbbl %0,%0 "
-	:"=r" (old),"=m" ((*(volatile __LONG32 *) Base))
-	:"Ir" (Bit) : "memory");
-      return (BOOLEAN) (old!=0);
-    }
+    BOOLEAN _interlockedbittestandset(LONG *Base,LONG Bit);
+    BOOLEAN _interlockedbittestandreset(LONG *Base,LONG Bit);
+    BOOLEAN _interlockedbittestandcomplement(LONG *Base,LONG Bit);
 
-    __CRT_INLINE BOOLEAN InterlockedBitTestAndReset(LONG *Base,LONG Bit) {
-      int old = 0;
-      __asm__ __volatile__("lock ; btrl %2,%1\n\tsbbl %0,%0 "
-	:"=r" (old),"=m" ((*(volatile __LONG32 *) Base))
-	:"Ir" (Bit) : "memory");
-      return (BOOLEAN) (old!=0);
-    }
-#endif /* __CRT__NO_INLINE */
-
-    BOOLEAN InterlockedBitTestAndComplement(LONG *Base,LONG Bit);
+    BOOLEAN InterlockedBitTestAndSet(volatile LONG *Base,LONG Bit);
+    BOOLEAN InterlockedBitTestAndReset(volatile LONG *Base,LONG Bit);
+    BOOLEAN InterlockedBitTestAndComplement(volatile LONG *Base,LONG Bit);
 #ifndef __CRT__NO_INLINE
-    __CRT_INLINE BOOLEAN InterlockedBitTestAndComplement(LONG *Base,LONG Bit) {
-      int old = 0;
-      __asm__ __volatile__("lock ; btcl %2,%1\n\tsbbl %0,%0 "
-	:"=r" (old),"=m" ((*(volatile __LONG32 *) Base))
-	:"Ir" (Bit));
-      return (BOOLEAN) (old!=0);
-    }
+    __CRT_INLINE __buildbittesti(_interlockedbittestandset, LONG, "lock bts", "I", /* unused param */)
+    __CRT_INLINE __buildbittesti(_interlockedbittestandreset, LONG, "lock btr", "I", /* unused param */)
+    __CRT_INLINE __buildbittesti(_interlockedbittestandcomplement, LONG, "lock btc", "I", /* unused param */)
+
+    __CRT_INLINE __buildbittesti(InterlockedBitTestAndSet, LONG, "lock bts", "I", volatile)
+    __CRT_INLINE __buildbittesti(InterlockedBitTestAndReset, LONG, "lock btr", "I", volatile)
+    __CRT_INLINE __buildbittesti(InterlockedBitTestAndComplement, LONG, "lock btc", "I", volatile)
 #endif /* !__CRT__NO_INLINE */
 
 #ifdef _PREFIX_