0.9.13.22:
[sbcl.git] / src / runtime / x86-arch.h
index 7fe1aa0..82daa19 100644 (file)
@@ -26,11 +26,20 @@ get_spinlock(volatile lispobj *word,long value)
     if(*word==value)
         lose("recursive get_spinlock: 0x%x,%ld\n",word,value);
     do {
+#if defined(LISP_FEATURE_DARWIN)
+        asm ("xor %0,%0;\n\
+              lock/cmpxchg %1,%2"
+             : "=a" (eax)
+             : "r" (value), "m" (*word)
+             : "memory", "cc");
+#else
         asm ("xor %0,%0\n\
               lock cmpxchg %1,%2"
              : "=a" (eax)
              : "r" (value), "m" (*word)
              : "memory", "cc");
+#endif
+
     } while(eax!=0);
 #else
     *word=value;
@@ -49,10 +58,17 @@ static inline lispobj
 swap_lispobjs(volatile lispobj *dest, lispobj value)
 {
     lispobj old_value;
+#if defined(LISP_FEATURE_DARWIN)
+    asm ("lock/xchg %0,(%1)"
+         : "=r" (old_value)
+         : "r" (dest), "0" (value)
+         : "memory");
+#else
     asm ("lock xchg %0,(%1)"
          : "=r" (old_value)
          : "r" (dest), "0" (value)
          : "memory");
+#endif
     return old_value;
 }