]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
More random patches.
authorUlrich Drepper <drepper@redhat.com>
Sat, 15 Mar 2003 21:46:30 +0000 (21:46 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 15 Mar 2003 21:46:30 +0000 (21:46 +0000)
nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
nptl/sysdeps/unix/sysv/linux/x86_64/lowlevelmutex.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S

index 122b1c7ab08d89d25211f61d7a34b73c4dba6928..cd233bf47ada90501a751983dfde373afe676b85 100644 (file)
@@ -82,14 +82,13 @@ extern int __lll_mutex_unlock_wait (int *__futex) attribute_hidden;
                       "testl %0, %0\n\t"                                     \
                       "jne 1f\n\t"                                           \
                       ".subsection 1\n"                                      \
-                      "1:\tmovl %0, %%esi\n\t"                               \
-                      "leaq %4, %%rdi\n\t"                                   \
+                      "1:\tleaq %4, %%rdi\n\t"                               \
                       "movq %7, %%rdx\n\t"                                   \
                       "call __lll_mutex_timedlock_wait\n\t"                  \
                       "jmp 2f\n\t"                                           \
                       ".previous\n"                                          \
                       "2:"                                                   \
-                      : "=a" (result), "=&D" (ignore1), "=&S" (ignore2),     \
+                      : "=S" (result), "=&D" (ignore1), "=&a" (ignore2),     \
                         "=&d" (ignore3), "=m" (futex)                        \
                       : "0" (1), "4" (futex), "m" (timeout)                  \
                       : "memory", "cx", "cc", "r10");                        \
index b6dc9b57bab5ac2d9ef0a35ff63fe4b2b370cd68..e189dc1266e8db9d41b4eb32d5e8c47057bf5561 100644 (file)
@@ -80,13 +80,14 @@ __lll_mutex_timedlock_wait:
 
        pushq   %r12
        pushq   %r13
+       pushq   %r14
 
        /* Stack frame for the timespec and timeval structs.  */
        subq    $16, %rsp
 
        movq    %rdi, %r12
        movq    %rdx, %r13
-       leaq    1(%rax), %rdx
+       leaq    1(%rsi), %r14
 
        /* Get current time.  */
 1:     movq    %rsp, %rdi
@@ -112,24 +113,26 @@ __lll_mutex_timedlock_wait:
 
        /* Futex call.  */
        movq    %rdi, (%rsp)    /* Store relative timeout.  */
-       movq    %rsi, 4(%rsp)
+       movq    %rsi, 8(%rsp)
 
+       movl    %r14d, %edx
        movq    %rsp, %r10
        xorq    %rsi, %rsi      /* movq $FUTEX_WAIT, %rsi */
        movq    %r12, %rdi
        movq    $SYS_futex, %rax
        syscall
 
-       movl    $1, %edx
+       movl    $1, %r14d
        LOCK
-       xaddl   %edx, (%rdi)
-       testl   %edx, %edx
+       xaddl   %r14d, (%rdi)
+       testl   %r14d, %r14d
        jne     7f
 
        movl    $2, (%rdi)
        xorl    %eax, %eax
 
 8:     addq    $16, %rsp
+       popq    %r14
        popq    %r13
        popq    %r12
        retq
index 2198c3a1403fe9b3351af567de0a4a72e46d99d6..3c8acc1c25dc6edfc94949580d5fc07b66d98121 100644 (file)
@@ -48,6 +48,23 @@ __pthread_cond_timedwait:
        pushq   %r13
        pushq   %r14
        subq    $80, %rsp
+       /* Stack frame:
+
+          rsp + 80
+                   +--------------------------+
+          rsp + 48 | cleanup buffer           |
+                   +--------------------------+
+          rsp + 40 | old wake_seq value       |
+                   +--------------------------+
+          rsp + 24 | timeout value            |
+                   +--------------------------+
+          rsp + 16 | mutex pointer            |
+                   +--------------------------+
+          rsp +  8 | condvar pointer          |
+                   +--------------------------+
+          rsp +  0 | old cancellation mode    |
+                   +--------------------------+
+       */
 
        /* Prepare structure passed to cancellation handler.  */
        movq    %rdi, 8(%rsp)
@@ -73,7 +90,7 @@ __pthread_cond_timedwait:
        jne     16f
 
        movq    8(%rsp), %rdi
-       addq    $1, total_seq(%rdi)
+       incq    total_seq(%rdi)
 
        /* Install cancellation handler.  */
 #ifdef PIC
@@ -113,7 +130,7 @@ __pthread_cond_timedwait:
        movq    $1000, %rdx
        mul     %rdx            /* Milli seconds to nano seconds.  */
        movq    (%r13), %rcx
-       movq    4(%r13), %rdx
+       movq    8(%r13), %rdx
        subq    24(%rsp), %rcx
        subq    %rax, %rdx
        jns     12f
index 3bebbd3e49d9cd2940960d1634692a56e4157870..4a0e3cce55b3a35cf0686b644a2d4d5a23176c5e 100644 (file)
@@ -61,9 +61,9 @@ __condvar_cleanup:
        subq    $cond_lock, %rdi
 #endif
 
-1:     addq    $1, wakeup_seq(%rdi)
+1:     incq    wakeup_seq(%rdi)
 
-       addq    $1, woken_seq(%rdi)
+       incq    woken_seq(%rdi)
 
        /* Wake up all waiters to make sure no signal gets lost.  */
        addq    $wakeup_seq, %rdi
@@ -103,6 +103,21 @@ __condvar_cleanup:
 __pthread_cond_wait:
        pushq   %r12
        subq    $64, %rsp
+       /* Stack frame:
+
+          rsp + 64
+                   +--------------------------+
+          rsp + 32 | cleanup buffer           |
+                   +--------------------------+
+          rsp + 24 | old wake_seq value       |
+                   +--------------------------+
+          rsp + 16 | mutex pointer            |
+                   +--------------------------+
+          rsp +  8 | condvar pointer          |
+                   +--------------------------+
+          rsp +  0 | old cancellation mode    |
+                   +--------------------------+
+       */
 
        /* Prepare structure passed to cancellation handler.  */
        movq    %rdi, 8(%rsp)
@@ -127,7 +142,7 @@ __pthread_cond_wait:
        jne     12f
 
        movq    8(%rsp), %rdi
-       addq    $1, total_seq(%rdi)
+       incq    total_seq(%rdi)
 
        /* Install cancellation handler.  */
 #ifdef PIC
index 21eae3a14c662b967b9fe1cb6d04a9d37b7ce5e4..de9b934e3ad1102100af22e8891de84c511ae435 100644 (file)
@@ -60,7 +60,7 @@ sem_timedwait:
        movq    %rsi, %r9
 
        /* Check for invalid nanosecond field.  */
-       cmpq    $1000000000, 4(%r9)
+       cmpq    $1000000000, 8(%r9)
        movl    $EINVAL, %eax
        jae     6f