Fix make-array transforms.
[sbcl.git] / src / runtime / pseudo-atomic.h
index 9636e5b..0c2ea7f 100644 (file)
@@ -22,8 +22,6 @@
     SetSymbolValue(ALLOCATION_POINTER, value, 0)
 #define get_alloc_pointer()                     \
     SymbolValue(ALLOCATION_POINTER, 0)
-#define get_binding_stack_pointer(thread)       \
-    SymbolValue(BINDING_STACK_POINTER, thread)
 
 #if defined(LISP_FEATURE_X86)
 #define LISPOBJ_ASM_SUFFIX "l"
 static inline int
 get_pseudo_atomic_atomic(struct thread *thread)
 {
-    return fixnum_value(SymbolValue(PSEUDO_ATOMIC_BITS, thread) &
-                        make_fixnum(1));
+    return SymbolValue(PSEUDO_ATOMIC_BITS, thread) & (~1);
 }
 
 static inline void
 set_pseudo_atomic_atomic(struct thread *thread)
 {
     lispobj *p = SymbolValueAddress(PSEUDO_ATOMIC_BITS, thread);
+    if (*p)
+        lose("set_pseudo_atomic_atomic: pseudo atomic bits is %d.", *p);
     __asm__ __volatile__
         ("or" LISPOBJ_ASM_SUFFIX " %0,%1"
          :
-         : "g" (make_fixnum(1)), "m" (*p)
+         : "g" (~1), "m" (*p)
          : "memory");
 }
 
@@ -56,70 +55,87 @@ clear_pseudo_atomic_atomic(struct thread *thread)
     __asm__ __volatile__
         ("and" LISPOBJ_ASM_SUFFIX " %0,%1"
          :
-         : "g" (~make_fixnum(1)), "m" (*p)
+         : "g" (1), "m" (*p)
          : "memory");
 }
 
 static inline int
 get_pseudo_atomic_interrupted(struct thread *thread)
 {
-    return fixnum_value(SymbolValue(PSEUDO_ATOMIC_BITS, thread) &
-                        make_fixnum(2));
+    return SymbolValue(PSEUDO_ATOMIC_BITS, thread) & 1;
 }
 
 static inline void
 set_pseudo_atomic_interrupted(struct thread *thread)
 {
+    if (!get_pseudo_atomic_atomic(thread))
+        lose("set_pseudo_atomic_interrupted not in pseudo atomic");
     lispobj *p = SymbolValueAddress(PSEUDO_ATOMIC_BITS, thread);
     __asm__ __volatile__
         ("or" LISPOBJ_ASM_SUFFIX " %0,%1"
          :
-         : "g" (make_fixnum(2)), "m" (*p)
+         : "g" (1), "m" (*p)
          : "memory");
 }
 
 static inline void
 clear_pseudo_atomic_interrupted(struct thread *thread)
 {
+    if (get_pseudo_atomic_atomic(thread))
+        lose("clear_pseudo_atomic_interrupted in pseudo atomic");
     lispobj *p = SymbolValueAddress(PSEUDO_ATOMIC_BITS, thread);
     __asm__ __volatile__
         ("and" LISPOBJ_ASM_SUFFIX " %0,%1"
          :
-         : "g" (~make_fixnum(2)), "m" (*p)
+         : "g" (~1), "m" (*p)
          : "memory");
 }
 
 #undef LISPOBJ_SUFFIX
 
-#elif defined(LISP_FEATURE_PPC) && defined(LISP_FEATURE_GENCGC)
+#elif defined(LISP_FEATURE_GENCGC)
 
 /* FIXME: Are these async signal safe? Compiler reordering? */
 
 #define set_alloc_pointer(value) \
     (dynamic_space_free_pointer = \
      ((lispobj *) \
-      ((value) | (((unsigned long)dynamic_space_free_pointer) & LOWTAG_MASK))))
+      ((value) | (((uword_t)dynamic_space_free_pointer) & LOWTAG_MASK))))
 
 #define get_alloc_pointer()                                     \
-    ((unsigned long) dynamic_space_free_pointer & ~LOWTAG_MASK)
-#define get_binding_stack_pointer(thread)       \
-    (current_binding_stack_pointer)
+    ((uword_t) dynamic_space_free_pointer & ~LOWTAG_MASK)
+
+#ifdef LISP_FEATURE_SB_THREAD
+#define get_pseudo_atomic_atomic(thread) \
+    ((thread)->pseudo_atomic_bits & flag_PseudoAtomic)
+#define set_pseudo_atomic_atomic(thread) \
+    ((thread)->pseudo_atomic_bits |= flag_PseudoAtomic)
+#define clear_pseudo_atomic_atomic(thread) \
+    ((thread)->pseudo_atomic_bits &= ~flag_PseudoAtomic)
+#define get_pseudo_atomic_interrupted(thread) \
+    ((thread)->pseudo_atomic_bits & flag_PseudoAtomicInterrupted)
+#define set_pseudo_atomic_interrupted(thread) \
+    ((thread)->pseudo_atomic_bits |= flag_PseudoAtomicInterrupted)
+#define clear_pseudo_atomic_interrupted(thread) \
+    ((thread)->pseudo_atomic_bits &= ~flag_PseudoAtomicInterrupted)
+#else
 #define get_pseudo_atomic_atomic(thread)                                \
-    ((unsigned long)dynamic_space_free_pointer & flag_PseudoAtomic)
+    ((uword_t)dynamic_space_free_pointer & flag_PseudoAtomic)
 #define set_pseudo_atomic_atomic(thread)                                \
     (dynamic_space_free_pointer                                         \
-     = (lispobj*) ((unsigned long)dynamic_space_free_pointer | flag_PseudoAtomic))
+     = (lispobj*) ((uword_t)dynamic_space_free_pointer | flag_PseudoAtomic))
 #define clear_pseudo_atomic_atomic(thread)                              \
     (dynamic_space_free_pointer                                         \
-     = (lispobj*) ((unsigned long) dynamic_space_free_pointer & ~flag_PseudoAtomic))
+     = (lispobj*) ((uword_t) dynamic_space_free_pointer & ~flag_PseudoAtomic))
 #define get_pseudo_atomic_interrupted(thread)                           \
-    ((unsigned long) dynamic_space_free_pointer & flag_PseudoAtomicInterrupted)
+    ((uword_t) dynamic_space_free_pointer & flag_PseudoAtomicInterrupted)
 #define clear_pseudo_atomic_interrupted(thread)                         \
     (dynamic_space_free_pointer                                         \
-     = (lispobj*) ((unsigned long) dynamic_space_free_pointer & ~flag_PseudoAtomicInterrupted))
+     = (lispobj*) ((uword_t) dynamic_space_free_pointer & ~flag_PseudoAtomicInterrupted))
 #define set_pseudo_atomic_interrupted(thread)                           \
     (dynamic_space_free_pointer                                         \
-     = (lispobj*) ((unsigned long) dynamic_space_free_pointer | flag_PseudoAtomicInterrupted))
+     = (lispobj*) ((uword_t) dynamic_space_free_pointer | flag_PseudoAtomicInterrupted))
+#endif
 
 #endif