Couldn't this have been done without assembly? Something like:
__sync_fetch_and_or(__BitBase, 1 << __BitPos) On Thu Mar 13 2014 at 10:13:20 AM, Hans Wennborg <[email protected]> wrote: > Author: hans > Date: Thu Mar 13 12:05:09 2014 > New Revision: 203816 > > URL: http://llvm.org/viewvc/llvm-project?rev=203816&view=rev > Log: > MS intrinsics: __interlockedbittestandset(64) (PR19054) > > Modified: > cfe/trunk/lib/Headers/Intrin.h > > Modified: cfe/trunk/lib/Headers/Intrin.h > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/ > Intrin.h?rev=203816&r1=203815&r2=203816&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/Headers/Intrin.h (original) > +++ cfe/trunk/lib/Headers/Intrin.h Thu Mar 13 12:05:09 2014 > @@ -195,6 +195,7 @@ short _InterlockedAnd16(short volatile * > static __inline__ > char _InterlockedAnd8(char volatile *_Value, char _Mask); > unsigned char _interlockedbittestandreset(long volatile *, long); > +static __inline__ > unsigned char _interlockedbittestandset(long volatile *, long); > static __inline__ > long __cdecl _InterlockedCompareExchange(long volatile *_Destination, > @@ -390,6 +391,7 @@ short _InterlockedAnd16_np(short volatil > __int64 _InterlockedAnd64_np(__int64 volatile *_Value, __int64 _Mask); > char _InterlockedAnd8_np(char volatile *_Value, char _Mask); > unsigned char _interlockedbittestandreset64(__int64 volatile *, __int64); > +static __inline__ > unsigned char _interlockedbittestandset64(__int64 volatile *, __int64); > long _InterlockedCompareExchange_np(long volatile *_Destination, long > _Exchange, > long _Comparand); > @@ -572,6 +574,16 @@ _bittestandset(long *a, long b) { > *a = *a | (1 << b); > return x; > } > +static __inline__ unsigned char __attribute__((__always_inline__, > __nodebug__)) > +_interlockedbittestandset(long volatile *__BitBase, long __BitPos) { > + unsigned char __Res; > + __asm__ ("xor %0, %0\n" > + "lock bts %2, %1\n" > + "setc %0\n" > + : "=r" (__Res), "+m"(*__BitBase) > + : "Ir"(__BitPos)); > + return __Res; > +} > #ifdef __x86_64__ > static __inline__ unsigned char __attribute__((__always_inline__, > __nodebug__)) > _BitScanForward64(unsigned long *_Index, unsigned __int64 _Mask) { > @@ -621,6 +633,16 @@ _bittestandset64(__int64 *a, __int64 b) > *a = *a | (1ll << b); > return x; > } > +static __inline__ unsigned char __attribute__((__always_inline__, > __nodebug__)) > +_interlockedbittestandset64(__int64 volatile *__BitBase, __int64 > __BitPos) { > + unsigned char __Res; > + __asm__ ("xor %0, %0\n" > + "lock bts %2, %1\n" > + "setc %0\n" > + : "=r" (__Res), "+m"(*__BitBase) > + : "Ir"(__BitPos)); > + return __Res; > +} > #endif > /*---------------------------------------------------------- > ------------------*\ > |* Interlocked Exchange Add > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
