(pthread_barrier_wait): Don't save, load, and restore %esi for last thread.
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / linux / i386 / i486 / libc-lowlevellock.S
index 65e39e7..3484009 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -18,6 +18,7 @@
    02111-1307 USA.  */
 
 #include <sysdep.h>
+#include <tls.h>
 
        .text
 
@@ -44,23 +45,17 @@ __lll_lock_wait:
 1:
        leal    -1(%eax), %edx  /* account for the preceeded xadd.  */
        movl    $SYS_futex, %eax
-       int     $0x80
+       ENTER_KERNEL
 
        orl     $-1, %eax       /* Load -1.  */
 #ifndef UP
-# ifdef PIC
-       call    __i686.get_pc_thunk.dx
-       addl    $_GLOBAL_OFFSET_TABLE_, %edx
-       cmpl    $0, __libc_locking_needed@GOTOFF(%edx)
-# else
-       cmpl    $0, __libc_locking_needed
-# endif
+       cmpl    $0, %gs:MULTIPLE_THREADS_OFFSET
        je,pt   0f
        lock
 0:
 #endif
        xaddl   %eax, (%ebx)
-       jne     1b
+       jne,pn  1b
 
        movl    $-1, (%ebx)
 
@@ -71,40 +66,6 @@ __lll_lock_wait:
        .size   __lll_lock_wait,.-__lll_lock_wait
 
 
-       .globl  lll_unlock_wake_cb
-       .type   lll_unlock_wake_cb,@function
-       .hidden lll_unlock_wake_cb
-       .align  16
-lll_unlock_wake_cb:
-       pushl   %esi
-       pushl   %ebx
-       pushl   %ecx
-       pushl   %edx
-
-       movl    20(%esp), %ebx
-#ifndef UP
-# ifdef PIC
-       call    __i686.get_pc_thunk.dx
-       addl    $_GLOBAL_OFFSET_TABLE_, %edx
-       cmpl    $0, __libc_locking_needed@GOTOFF(%edx)
-# else
-       cmpl    $0, __libc_locking_needed
-# endif
-       je,pt   0f
-       lock
-0:
-#endif
-       incl    (%ebx)
-       jng     1f
-
-       popl    %edx
-       popl    %ecx
-       popl    %ebx
-       popl    %esi
-       ret
-       .size   lll_unlock_wake_cb,.-lll_unlock_wake_cb
-
-
        .globl  __lll_unlock_wake
        .type   __lll_unlock_wake,@function
        .hidden __lll_unlock_wake
@@ -120,7 +81,7 @@ __lll_unlock_wake:
        xorl    %esi, %esi
        movl    %edx, (%ebx)    /* Stores '$1'.  */
        movl    $SYS_futex, %eax
-       int     $0x80
+       ENTER_KERNEL
 
        popl    %edx
        popl    %ecx
@@ -147,7 +108,7 @@ __lll_timedwait_tid:
 2:     movl    %esp, %ebx
        xorl    %ecx, %ecx
        movl    $SYS_gettimeofday, %eax
-       int     $0x80
+       ENTER_KERNEL
 
        /* Compute relative timeout.  */
        movl    4(%esp), %eax
@@ -174,7 +135,7 @@ __lll_timedwait_tid:
        xorl    %ecx, %ecx      /* movl $FUTEX_WAIT, %ecx */
        movl    %ebp, %ebx
        movl    $SYS_futex, %eax
-       int     $0x80
+       ENTER_KERNEL
 
        movl    %eax, %edx
 
@@ -194,13 +155,3 @@ __lll_timedwait_tid:
 6:     movl    $ETIMEDOUT, %eax
        jmp     3b
        .size   __lll_timedwait_tid,.-__lll_timedwait_tid
-
-
-       .section .gnu.linkonce.t.__i686.get_pc_thunk.dx,"ax",@progbits
-       .globl __i686.get_pc_thunk.dx
-       .hidden __i686.get_pc_thunk.dx
-       .type __i686.get_pc_thunk.dx,@function
-__i686.get_pc_thunk.dx:
-       movl    (%esp), %edx
-       ret
-       .size   __i686.get_pc_thunk.dx,.-__i686.get_pc_thunk.dx