Couldn't this have been done without assembly?<br><br>Something like:<br><br><div>__sync_fetch_and_or(__BitBase, 1 << __BitPos)<br></div><br><div>On Thu Mar 13 2014 at 10:13:20 AM, Hans Wennborg <<a href="mailto:hans@hanshq.net">hans@hanshq.net</a>> wrote:</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: hans<br>
Date: Thu Mar 13 12:05:09 2014<br>
New Revision: 203816<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=203816&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=203816&view=rev</a><br>
Log:<br>
MS intrinsics: __interlockedbittestandset(64) (PR19054)<br>
<br>
Modified:<br>
    cfe/trunk/lib/Headers/Intrin.h<br>
<br>
Modified: cfe/trunk/lib/Headers/Intrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/Intrin.h?rev=203816&r1=203815&r2=203816&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/cfe/trunk/lib/Headers/<u></u>Intrin.h?rev=203816&r1=203815&<u></u>r2=203816&view=diff</a><br>

==============================<u></u>==============================<u></u>==================<br>
--- cfe/trunk/lib/Headers/Intrin.h (original)<br>
+++ cfe/trunk/lib/Headers/Intrin.h Thu Mar 13 12:05:09 2014<br>
@@ -195,6 +195,7 @@ short _InterlockedAnd16(short volatile *<br>
 static __inline__<br>
 char _InterlockedAnd8(char volatile *_Value, char _Mask);<br>
 unsigned char _interlockedbittestandreset(<u></u>long volatile *, long);<br>
+static __inline__<br>
 unsigned char _interlockedbittestandset(long volatile *, long);<br>
 static __inline__<br>
 long __cdecl _InterlockedCompareExchange(<u></u>long volatile *_Destination,<br>
@@ -390,6 +391,7 @@ short _InterlockedAnd16_np(short volatil<br>
 __int64 _InterlockedAnd64_np(__int64 volatile *_Value, __int64 _Mask);<br>
 char _InterlockedAnd8_np(char volatile *_Value, char _Mask);<br>
 unsigned char _interlockedbittestandreset64(<u></u>__int64 volatile *, __int64);<br>
+static __inline__<br>
 unsigned char _interlockedbittestandset64(__<u></u>int64 volatile *, __int64);<br>
 long _InterlockedCompareExchange_<u></u>np(long volatile *_Destination, long _Exchange,<br>
                                     long _Comparand);<br>
@@ -572,6 +574,16 @@ _bittestandset(long *a, long b) {<br>
   *a = *a | (1 << b);<br>
   return x;<br>
 }<br>
+static __inline__ unsigned char __attribute__((__always_<u></u>inline__, __nodebug__))<br>
+_interlockedbittestandset(<u></u>long volatile *__BitBase, long __BitPos) {<br>
+  unsigned char __Res;<br>
+  __asm__ ("xor %0, %0\n"<br>
+           "lock bts %2, %1\n"<br>
+           "setc %0\n"<br>
+           : "=r" (__Res), "+m"(*__BitBase)<br>
+           : "Ir"(__BitPos));<br>
+  return __Res;<br>
+}<br>
 #ifdef __x86_64__<br>
 static __inline__ unsigned char __attribute__((__always_<u></u>inline__, __nodebug__))<br>
 _BitScanForward64(unsigned long *_Index, unsigned __int64 _Mask) {<br>
@@ -621,6 +633,16 @@ _bittestandset64(__int64 *a, __int64 b)<br>
   *a = *a | (1ll << b);<br>
   return x;<br>
 }<br>
+static __inline__ unsigned char __attribute__((__always_<u></u>inline__, __nodebug__))<br>
+_interlockedbittestandset64(_<u></u>_int64 volatile *__BitBase, __int64 __BitPos) {<br>
+  unsigned char __Res;<br>
+  __asm__ ("xor %0, %0\n"<br>
+           "lock bts %2, %1\n"<br>
+           "setc %0\n"<br>
+           : "=r" (__Res), "+m"(*__BitBase)<br>
+           : "Ir"(__BitPos));<br>
+  return __Res;<br>
+}<br>
 #endif<br>
 /*----------------------------<u></u>------------------------------<u></u>------------------*\<br>
 |* Interlocked Exchange Add<br>
<br>
<br>
______________________________<u></u>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-commits</a><br>
</blockquote>