(pthread_barrier_wait): Don't save, load, and restore %esi for last thread.
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / linux / i386 / i486 / pthread_rwlock_unlock.S
index 8296046..c51c148 100644 (file)
        .align  16
 __pthread_rwlock_unlock:
        pushl   %ebx
-       pushl   %esi
        pushl   %edi
 
-       xorl    %esi, %esi
-       xorl    %edx, %edx
-       movl    16(%esp), %edi
+       movl    12(%esp), %edi
 
        /* Get the lock.  */
        movl    $1, %eax
@@ -64,23 +61,37 @@ __pthread_rwlock_unlock:
 
 5:     movl    $0, WRITER(%edi)
 
-       movl    $0x7fffffff, %edx
-       leal    READERS_WAKEUP(%edi), %ebx
        movl    $1, %ecx
-       leal    WRITERS_WAKEUP(%edi), %eax
+       leal    WRITERS_WAKEUP(%edi), %ebx
+       movl    %ecx, %edx
        cmpl    $0, WRITERS_QUEUED(%edi)
-#ifdef HAVE_CMOV
-       cmovnel %ecx, %edx
-       cmovnel %eax, %ebx
+       jne     0f
+
+       /* If also no readers waiting nothing to do.  */
+       cmpl    $0, READERS_QUEUED(%edi)
+       je      6f
+
+       movl    $0x7fffffff, %edx
+       leal    READERS_WAKEUP(%edi), %ebx
+
+0:     incl    (%ebx)
+       LOCK
+#if MUTEX == 0
+       decl    (%edi)
 #else
-       je      0f
-       movl    %ecx, %edx
-       movl    %eax, %ebx
-0:
+       decl    MUTEX(%edi)
 #endif
-       movl    $SYS_futex, %eax
+       jne     7f
+
+8:     movl    $SYS_futex, %eax
        ENTER_KERNEL
 
+       xorl    %eax, %eax
+       popl    %edi
+       popl    %ebx
+       ret
+
+       .align  16
 6:     LOCK
 #if MUTEX == 0
        decl    (%edi)
@@ -91,18 +102,36 @@ __pthread_rwlock_unlock:
 
 4:     xorl    %eax, %eax
        popl    %edi
-       popl    %esi
        popl    %ebx
        ret
 
-1:     movl    %edi, %ecx
+1:
+#if MUTEX == 0
+       movl    %edi, %ecx
+#else
+       leal    MUTEX(%edx), %ecx
+#endif
        call    __lll_mutex_lock_wait
        jmp     2b
 
-3:     movl    %edi, %eax
+3:
+#if MUTEX == 0
+       movl    %edi, %eax
+#else
+       leal    MUTEX(%edx), %eax
+#endif
        call    __lll_mutex_unlock_wake
        jmp     4b
 
+7:
+#if MUTEX == 0
+       movl    %edi, %eax
+#else
+       leal    MUTEX(%edx), %eax
+#endif
+       call    __lll_mutex_unlock_wake
+       jmp     8b
+
        .size   __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
 
        .globl  pthread_rwlock_unlock