(__lll_mutex_lock_wait): Replace one memory operation with one register operation.
authorUlrich Drepper <drepper@redhat.com>
Fri, 30 May 2003 17:49:37 +0000 (17:49 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 30 May 2003 17:49:37 +0000 (17:49 +0000)
nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelmutex.S
nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S

index 484beaf..a54e48c 100644 (file)
@@ -45,21 +45,23 @@ __lll_mutex_lock_wait:
        pushl   %ebx
        pushl   %edx
 
+       /* In the loop we are going to add 2 instead of 1 which is what
+          the caller did.  Account for that.  */
+       subl    $1, %eax
+
        movl    %ecx, %ebx
        xorl    %esi, %esi      /* No timeout.  */
        xorl    %ecx, %ecx      /* movl $FUTEX_WAIT, %ecx */
 1:
-       leal    1(%eax), %edx   /* account for the preceeded xadd.  */
+       leal    2(%eax), %edx   /* account for the preceeded xadd.  */
        movl    $SYS_futex, %eax
        ENTER_KERNEL
 
-       movl    $1, %eax
+       movl    $2, %eax
        LOCK
        xaddl   %eax, (%ebx)
        testl   %eax, %eax
-       jne     1b
-
-       movl    $2, (%ebx)
+       jne,pn  1b
 
        popl    %edx
        popl    %ebx
@@ -83,13 +85,17 @@ __lll_mutex_timedlock_wait:
        pushl   %ebx
        pushl   %ebp
 
+       /* In the loop we are going to add 2 instead of 1 which is what
+          the caller did.  Account for that.  */
+       subl    $1, %eax
+
        /* Stack frame for the timespec and timeval structs.  */
        subl    $8, %esp
 
        movl    %ecx, %ebp
        movl    %edx, %edi
 
-1:     leal    1(%eax), %esi
+1:     leal    2(%eax), %esi
 
        /* Get current time.  */
        movl    %esp, %ebx
@@ -122,13 +128,12 @@ __lll_mutex_timedlock_wait:
        ENTER_KERNEL
        movl    %eax, %ecx
 
-       movl    $1, %eax
+       movl    $2, %eax
        LOCK
        xaddl   %eax, (%ebx)
        testl   %eax, %eax
        jne     7f
 
-       movl    $2, (%ebx)
        xorl    %eax, %eax
 
 6:     addl    $8, %esp
index 1b2731a..2a2f847 100644 (file)
@@ -46,22 +46,24 @@ __lll_mutex_lock_wait:
        pushq   %r10
        pushq   %rdx
 
+       /* In the loop we are going to add 2 instead of 1 which is what
+          the caller did.  Account for that.  */
+       decq    %rsi
+
        xorq    %r10, %r10      /* No timeout.  */
 
 1:
-       leaq    1(%rsi), %rdx   /* account for the preceeded xadd.  */
+       leaq    2(%rsi), %rdx   /* account for the preceeded xadd.  */
        movq    %r10, %rsi      /* movq $FUTEX_WAIT, %rsi */
        movq    $SYS_futex, %rax
        syscall
 
-       movl    $1, %esi
+       movl    $2, %esi
        LOCK
        xaddl   %esi, (%rdi)
        testl   %esi, %esi
        jne     1b
 
-       movl    $2, (%rdi)
-
        popq    %rdx
        popq    %r10
        retq