Don't include <sgidefs.h>. Always use ll/sc.
authorUlrich Drepper <drepper@redhat.com>
Tue, 16 Jul 2002 00:58:07 +0000 (00:58 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 16 Jul 2002 00:58:07 +0000 (00:58 +0000)
sysdeps/mips/atomicity.h
sysdeps/unix/sysv/linux/mips/sys/tas.h

index b4b7b64..bccacd9 100644 (file)
 #ifndef _MIPS_ATOMICITY_H
 #define _MIPS_ATOMICITY_H    1
 
-#include <sgidefs.h>
 #include <inttypes.h>
 
-#if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
-
 static inline int
 __attribute__ ((unused))
 exchange_and_add (volatile uint32_t *mem, int val)
@@ -34,9 +31,12 @@ exchange_and_add (volatile uint32_t *mem, int val)
   __asm__ __volatile__
     ("/* Inline exchange & add */\n"
      "1:\n\t"
+     ".set     push\n\t"
+     ".set     mips2\n\t"
      "ll       %0,%3\n\t"
      "addu     %1,%4,%0\n\t"
      "sc       %1,%2\n\t"
+     ".set     pop\n\t"
      "beqz     %1,1b\n\t"
      "/* End exchange & add */"
      : "=&r"(result), "=&r"(tmp), "=m"(*mem)
@@ -55,9 +55,12 @@ atomic_add (volatile uint32_t *mem, int val)
   __asm__ __volatile__
     ("/* Inline atomic add */\n"
      "1:\n\t"
+     ".set     push\n\t"
+     ".set     mips2\n\t"
      "ll       %0,%2\n\t"
      "addu     %0,%3,%0\n\t"
      "sc       %0,%1\n\t"
+     ".set     pop\n\t"
      "beqz     %0,1b\n\t"
      "/* End atomic add */"
      : "=&r"(result), "=m"(*mem)
@@ -74,11 +77,14 @@ compare_and_swap (volatile long int *p, long int oldval, long int newval)
   __asm__ __volatile__
     ("/* Inline compare & swap */\n"
      "1:\n\t"
+     ".set     push\n\t"
+     ".set     mips2\n\t"
      "ll       %1,%5\n\t"
      "move     %0,$0\n\t"
      "bne      %1,%3,2f\n\t"
      "move     %0,%4\n\t"
      "sc       %0,%2\n\t"
+     ".set     pop\n\t"
      "beqz     %0,1b\n"
      "2:\n\t"
      "/* End compare & swap */"
@@ -89,37 +95,4 @@ compare_and_swap (volatile long int *p, long int oldval, long int newval)
   return ret;
 }
 
-#else /* (_MIPS_ISA >= _MIPS_ISA_MIPS2) */
-
-#warning MIPS I atomicity functions are not atomic
-
-static inline int
-__attribute__ ((unused))
-exchange_and_add (volatile uint32_t *mem, int val)
-{
-  int result = *mem;
-  *mem += val;
-  return result;
-}
-
-static inline void
-__attribute__ ((unused))
-atomic_add (volatile uint32_t *mem, int val)
-{
-  *mem += val;
-}
-
-static inline int
-__attribute__ ((unused))
-compare_and_swap (volatile long int *p, long int oldval, long int newval)
-{
-  if (*p != oldval)
-    return 0;
-
-  *p = newval;
-  return 1;
-}
-
-#endif /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */
-
 #endif /* atomicity.h */
index 2a1a045..7ad916c 100644 (file)
@@ -21,8 +21,6 @@
 #define _SYS_TAS_H 1
 
 #include <features.h>
-#include <sgidefs.h>
-#include <sys/sysmips.h>
 
 __BEGIN_DECLS
 
@@ -34,8 +32,6 @@ extern int _test_and_set (int *p, int v) __THROW;
 #  define _EXTERN_INLINE extern __inline
 # endif
 
-# if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
-
 _EXTERN_INLINE int
 _test_and_set (int *p, int v) __THROW
 {
@@ -44,10 +40,13 @@ _test_and_set (int *p, int v) __THROW
   __asm__ __volatile__
     ("/* Inline test and set */\n"
      "1:\n\t"
+     ".set     push\n\t"
+     ".set     mips2\n\t"
      "ll       %0,%3\n\t"
      "move     %1,%4\n\t"
      "beq      %0,%4,2f\n\t"
      "sc       %1,%2\n\t"
+     ".set     pop\n\t"
      "beqz     %1,1b\n"
      "2:\n\t"
      "/* End test and set */"
@@ -58,16 +57,6 @@ _test_and_set (int *p, int v) __THROW
   return r;
 }
 
-# else /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */
-
-_EXTERN_INLINE int
-_test_and_set (int *p, int v) __THROW
-{
-  return sysmips (MIPS_ATOMIC_SET, (int) p, v, 0);
-}
-
-# endif /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */
-
 #endif /* __USE_EXTERN_INLINES */
 
 __END_DECLS