1.0.13.18: Revived OpenBSD support, contributed by Josh Elsasser
[sbcl.git] / src / runtime / x86-64-arch.h
index 90b5150..10df5d8 100644 (file)
@@ -9,6 +9,8 @@
 #error genesis/config.h (or sbcl.h) must be included before this file
 #endif
 
+#include "interr.h"                     /* for declaration of lose() */
+
 #define ARCH_HAS_STACK_POINTER
 
 /* FIXME: Do we also want
@@ -26,11 +28,19 @@ 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" (rax)
+             : "r" (value), "m" (*word)
+             : "memory", "cc");
+#else
         asm ("xor %0,%0\n\
               lock cmpxchg %1,%2"
              : "=a" (rax)
              : "r" (value), "m" (*word)
              : "memory", "cc");
+#endif
     } while(rax!=0);
 #else
     *word=value;
@@ -43,4 +53,15 @@ release_spinlock(volatile lispobj *word)
     *word=0;
 }
 
+static inline lispobj
+swap_lispobjs(volatile lispobj *dest, lispobj value)
+{
+    lispobj old_value;
+    asm ("lock xchg %0,(%1)"
+         : "=r" (old_value)
+         : "r" (dest), "0" (value)
+         : "memory");
+    return old_value;
+}
+
 #endif /* _X86_64_ARCH_H */