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_