]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
(testandset): Call _test_and_set.
authorUlrich Drepper <drepper@redhat.com>
Sun, 3 Feb 2002 02:27:34 +0000 (02:27 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 3 Feb 2002 02:27:34 +0000 (02:27 +0000)
(__compare_and_swap): Return 0 only when failed to compare. Use branch likely.

linuxthreads/sysdeps/mips/pt-machine.h

index 16e264017da545fed1c177115cac8d6d5efd74db..368235e1a5dad5589e835bc075f590aca20d6d28 100644 (file)
 
 /* Spinlock implementation; required.  */
 
-#if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
-
-PT_EI long int
-testandset (int *spinlock)
-{
-  long int ret, temp;
-
-  __asm__ __volatile__
-    ("/* Inline spinlock test & set */\n\t"
-     "1:\n\t"
-     "ll       %0,%3\n\t"
-     ".set     push\n\t"
-     ".set     noreorder\n\t"
-     "bnez     %0,2f\n\t"
-     " li      %1,1\n\t"
-     ".set     pop\n\t"
-     "sc       %1,%2\n\t"
-     "beqz     %1,1b\n"
-     "2:\n\t"
-     "/* End spinlock test & set */"
-     : "=&r" (ret), "=&r" (temp), "=m" (*spinlock)
-     : "m" (*spinlock)
-     : "memory");
-
-  return ret;
-}
-
-#else /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */
-
 PT_EI long int
 testandset (int *spinlock)
 {
   return _test_and_set (spinlock, 1);
 }
-#endif /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */
 
 
 /* Get some notion of the current stack.  Need not be exactly the top
@@ -84,22 +54,24 @@ register char * stack_pointer __asm__ ("$29");
 PT_EI int
 __compare_and_swap (long int *p, long int oldval, long int newval)
 {
-  long int ret;
+  long int ret, temp;
 
   __asm__ __volatile__
     ("/* Inline compare & swap */\n\t"
+     "ll       %1,%5\n"
      "1:\n\t"
-     "ll       %0,%4\n\t"
-     ".set     push\n"
+     ".set     push\n\t"
      ".set     noreorder\n\t"
-     "bne      %0,%2,2f\n\t"
-     " move    %0,%3\n\t"
-     ".set     pop\n\t"
-     "sc       %0,%1\n\t"
-     "beqz     %0,1b\n"
+     "bne      %1,%3,2f\n\t"
+     " move    %0,$0\n\t"
+     "move     %0,%4\n\t"
+     "sc       %0,%2\n\t"
+     "beqzl    %0,1b\n\t"
+     " ll      %1,%5\n\t"
+     ".set     pop\n"
      "2:\n\t"
      "/* End compare & swap */"
-     : "=&r" (ret), "=m" (*p)
+     : "=&r" (ret), "=&r" (temp), "=m" (*p)
      : "r" (oldval), "r" (newval), "m" (*p)
      : "memory");