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_