gencgc: More precise conservatism for pointers to boxed pages.
[sbcl.git] / src / runtime / mips-arch.h
index 0e9a729..cedd280 100644 (file)
@@ -1,17 +1,64 @@
 #ifndef _MIPS_ARCH_H
 #define _MIPS_ARCH_H
 
+#define ALIEN_STACK_GROWS_DOWNWARD
 
-static inline void 
-get_spinlock(lispobj *word,long value)
+static inline void
+get_spinlock(volatile lispobj *word, long value)
 {
-    *word=value;               /* FIXME for threads */
+#ifdef LISP_FEATURE_SB_THREAD
+    unsigned long __old = (volatile lispobj)*word;
+    unsigned long __prev;
+    int __cmp;
+
+    __asm__ __volatile__ (
+        "       .set push\n"
+        "       .set mips2\n"
+        "       .set noreorder\n"
+        "1:     ll      %[__prev],%[__mem]\n"
+        "       bne     %[__prev],%[__old],2f\n"
+        "        li     %[__cmp],0\n"
+        "       move    %[__cmp],%[__new]\n"
+        "       sc      %[__cmp],%[__mem]\n"
+        "       beqz    %[__cmp],1b\n"
+        "        nop\n"
+        "       sync\n"
+        "2:\n"
+        "       .set pop"
+        : [__prev] "=&r" (__prev),
+          [__cmp] "=&r" (__cmp)
+        : [__mem] "R" (*word),
+          [__old] "r" (__old),
+          [__new] "r" (value)
+        : "memory");
+
+    if (!cmp)
+        lose("recursive get_spinlock: 0x%x,%d\n", word, value);
+#else /* LISP_FEATURE_SB_THREAD */
+    *word=value;
+#endif
 }
 
 static inline void
-release_spinlock(lispobj *word)
+release_spinlock(volatile lispobj *word)
 {
+#ifdef LISP_FEATURE_SB_THREAD
+    __asm__ __volatile__ (
+        "       .set push\n"
+        "       .set mips2\n"
+        "       .set noreorder\n"
+        "       sw      $0,%[__mem]\n"
+        "       sync\n"
+        "       .set pop"
+        :
+        : [__mem] "R" (*word)
+        : "memory");
+#else /* LISP_FEATURE_SB_THREAD */
     *word=0;
+#endif
 }
 
+unsigned int arch_get_fp_control(void);
+void arch_set_fp_control(unsigned int fp);
+
 #endif /* _MIPS_ARCH_H */