summaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-01-29 00:39:03 +0000
committerUlrich Drepper <drepper@redhat.com>2003-01-29 00:39:03 +0000
commit6cf26f4168aef852d7fa4106b59af1a7fc40c650 (patch)
tree5b749a1f696051bf18a600a15dc1a0150a931b0e /nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S
parent4a99d1604d9e5790cc8a96287ec34e4abff4960b (diff)
Update.
* Makefile (libpthread-routines): Remove lowlevelrwlock. Add pthread_rwlock_rdlock, pthread_rwlock_timedrdlock, pthread_rwlock_wrlock, pthread_rwlock_timedwrlock, and pthread_rwlock_unlock. * sysdeps/unix/sysv/linux/i386/i486/lowlevelrwlock.S: Removed * sysdeps/unix/sysv/linux/i386/i586/lowlevelrwlock.S: Removed * sysdeps/unix/sysv/linux/i386/i686/lowlevelrwlock.S: Removed * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S: New file. * sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S: New file.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S668
1 files changed, 0 insertions, 668 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S
deleted file mode 100644
index 83a4fb330b..0000000000
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelcond.S
+++ /dev/null
@@ -1,668 +0,0 @@
-/* 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.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-#include <sysdep.h>
-#include <shlib-compat.h>
-
-#ifdef UP
-# define LOCK
-#else
-# define LOCK lock
-#endif
-
-#define SYS_gettimeofday __NR_gettimeofday
-#define SYS_futex 240
-#define FUTEX_WAIT 0
-#define FUTEX_WAKE 1
-
-#define ETIMEDOUT 110
-
-#define cond_lock 0
-#define total_seq 4
-#define wakeup_seq 12
-#define woken_seq 20
-
-
- .text
-
- .align 16
- .type condvar_cleanup, @function
-condvar_cleanup:
- pushl %ebx
- movl 8(%esp), %ebx
-#if cond_lock != 0
- addl $cond_lock, %ebx
-#endif
-
- /* Get internal lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- je 1f
-
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
-
-1: addl $1, wakeup_seq(%ebx)
- adcl $0, wakeup_seq+4(%ebx)
-
- addl $1, woken_seq(%ebx)
- adcl $0, woken_seq+4(%ebx)
-
- LOCK
- decl (%ebx)
- je 2f
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
-
-2: popl %ebx
- ret
- .size condvar_cleanup, .-condvar_cleanup
-
-
-/* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) */
- .globl __pthread_cond_wait
- .type __pthread_cond_wait, @function
- .align 16
-__pthread_cond_wait:
-
- pushl %edi
- pushl %esi
- pushl %ebx
-
- xorl %esi, %esi
- movl 16(%esp), %ebx
-#if cond_lock != 0
- addl $cond_lock, %ebx
-#endif
-
- /* Get internal lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 1f
-
- /* Unlock the mutex. */
-2: pushl 20(%esp)
- call __pthread_mutex_unlock_internal
-
- addl $1, total_seq(%ebx)
- adcl $0, total_seq+4(%ebx)
-
- /* Install cancellation handler. */
-#ifdef PIC
- call __i686.get_pc_thunk.cx
- addl $_GLOBAL_OFFSET_TABLE_, %ecx
- leal condvar_cleanup@GOTOFF(%ecx), %eax
-#else
- leal condvar_cleanup, %eax
-#endif
- subl $24, %esp
- leal 12(%esp), %edx
- movl %ebx, 8(%esp)
- movl %eax, 4(%esp)
- movl %edx, (%esp)
- call __pthread_cleanup_push
-
- /* Get and store current wakeup_seq value. */
- movl wakeup_seq(%ebx), %edi
- movl wakeup_seq+4(%ebx), %edx
- movl %edi, 4(%esp)
- movl %edx, 8(%esp)
-
- /* Unlock. */
-8: LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 3f
-
-4: call __pthread_enable_asynccancel
- movl %eax, (%esp)
-
- movl %esi, %ecx /* movl $FUTEX_WAIT, %ecx */
- movl %edi, %edx
- addl $wakeup_seq-cond_lock, %ebx
- movl $SYS_futex, %eax
- ENTER_KERNEL
- subl $wakeup_seq-cond_lock, %ebx
-
- call __pthread_disable_asynccancel
-
- /* Lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 5f
-
-6: movl woken_seq(%ebx), %eax
- movl woken_seq+4(%ebx), %ecx
-
- movl wakeup_seq(%ebx), %edi
- movl wakeup_seq+4(%ebx), %edx
-
- cmpl 8(%esp), %ecx
- ja 7f
- jb 8b
- cmpl 4(%esp), %eax
- jb 8b
-
-7: cmpl %ecx, %edx
- ja 9f
- jb 8b
- cmp %eax, %edi
- jna 8b
-
-9: addl $1, woken_seq(%ebx)
- adcl $0, woken_seq+4(%ebx)
-
- LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 10f
-
- /* Remove cancellation handler. */
-11: leal 12(%esp), %edx
- movl $0, 4(%esp)
- movl %edx, (%esp)
- call __pthread_cleanup_pop
-
- movl 48(%esp), %eax
- movl %eax, (%esp)
- call __pthread_mutex_lock_internal
- addl $28, %esp
-
- popl %ebx
- popl %esi
- popl %edi
-
- /* We return the result of the mutex_lock operation. */
- ret
-
- /* Initial locking failed. */
-1:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 2b
-
- /* Unlock in loop requires waekup. */
-3:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 4b
-
- /* Locking in loop failed. */
-5:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 6b
-
- /* Unlock after loop requires waekup. */
-10:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 11b
- .size __pthread_cond_wait, .-__pthread_cond_wait
-versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
- GLIBC_2_3_2)
-
-
-/* int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
- const struct timespec *abstime) */
- .globl __pthread_cond_timedwait
- .type __pthread_cond_timedwait, @function
- .align 16
-__pthread_cond_timedwait:
-
- pushl %ebp
- pushl %edi
- pushl %esi
- pushl %ebx
-
- movl 20(%esp), %ebx
- movl 28(%esp), %ebp
-#if cond_lock != 0
- addl $cond_lock, %ebx
-#endif
-
- /* Get internal lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 1f
-
- /* Unlock the mutex. */
-2: pushl 24(%esp)
- call __pthread_mutex_unlock_internal
-
- addl $1, total_seq(%ebx)
- adcl $0, total_seq+4(%ebx)
-
- /* Install cancellation handler. */
-#ifdef PIC
- call __i686.get_pc_thunk.cx
- addl $_GLOBAL_OFFSET_TABLE_, %ecx
- leal condvar_cleanup@GOTOFF(%ecx), %eax
-#else
- leal condvar_cleanup, %eax
-#endif
- subl $32, %esp
- leal 16(%esp), %edx
- movl %ebx, 8(%esp)
- movl %eax, 4(%esp)
- movl %edx, (%esp)
- call __pthread_cleanup_push
-
- /* Get and store current wakeup_seq value. */
- movl wakeup_seq(%ebx), %edi
- movl wakeup_seq+4(%ebx), %edx
- movl %edi, 12(%esp)
- movl %edx, 16(%esp)
-
- /* Unlock. */
-8: LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 3f
-
-4: call __pthread_enable_asynccancel
- movl %eax, (%esp)
-
- /* Get the current time. */
- movl %ebx, %edx
- leal 4(%esp), %ebx
- xorl %ecx, %ecx
- movl $SYS_gettimeofday, %eax
- ENTER_KERNEL
- movl %edx, %ebx
-
- /* Compute relative timeout. */
- movl 8(%esp), %eax
- movl $1000, %edx
- mul %edx /* Milli seconds to nano seconds. */
- movl (%ebp), %ecx
- movl 4(%ebp), %edx
- subl 4(%esp), %ecx
- subl %eax, %edx
- jns 12f
- addl $1000000000, %edx
- decl %ecx
-12: testl %ecx, %ecx
- js 13f
-
- /* Store relative timeout. */
- movl %ecx, 4(%esp)
- movl %edx, 8(%esp)
- leal 4(%esp), %esi
- xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
- movl %edi, %edx
- addl $wakeup_seq-cond_lock, %ebx
- movl $SYS_futex, %eax
- ENTER_KERNEL
- subl $wakeup_seq-cond_lock, %ebx
- movl %eax, %esi
-
- call __pthread_disable_asynccancel
-
- /* Lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 5f
-
-6: movl woken_seq(%ebx), %eax
- movl woken_seq+4(%ebx), %ecx
-
- movl wakeup_seq(%ebx), %edi
- movl wakeup_seq+4(%ebx), %edx
-
- cmpl 16(%esp), %ecx
- ja 7f
- jb 15f
- cmpl 12(%esp), %eax
- jb 15f
-
-7: cmpl %ecx, %edx
- ja 9f
- jb 15f
- cmp %eax, %edi
- ja 9f
-
-15: cmpl $-ETIMEDOUT, %esi
- jne 8b
-
-13: addl $1, wakeup_seq(%ebx)
- adcl $0, wakeup_seq+4(%ebx)
- movl $ETIMEDOUT, %esi
- jmp 14f
-
-9: xorl %esi, %esi
-14: addl $1, woken_seq(%ebx)
- adcl $0, woken_seq+4(%ebx)
-
- LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 10f
-
- /* Remove cancellation handler. */
-11: leal 20(%esp), %edx
- movl $0, 4(%esp)
- movl %edx, (%esp)
- call __pthread_cleanup_pop
-
- movl 60(%esp), %ecx
- movl %ecx, (%esp)
- call __pthread_mutex_lock_internal
- addl $36, %esp
-
- movl %esi, %eax
-
- popl %ebx
- popl %esi
- popl %edi
- popl %ebp
-
- /* We return the result of the mutex_lock operation. */
- ret
-
- /* Initial locking failed. */
-1:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 2b
-
- /* Unlock in loop requires waekup. */
-3:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 4b
-
- /* Locking in loop failed. */
-5:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 6b
-
- /* Unlock after loop requires waekup. */
-10:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 11b
- .size __pthread_cond_timedwait, .-__pthread_cond_timedwait
-versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
- GLIBC_2_3_2)
-
-
- /* int pthread_cond_signal (pthread_cond_t *cond) */
- .globl __pthread_cond_signal
- .type __pthread_cond_signal, @function
- .align 16
-__pthread_cond_signal:
-
- pushl %esi
- pushl %ebx
-#if cond_lock != 0
- addl $cond_lock, %ebx
-#endif
-
- movl 12(%esp), %ebx
-
- /* Get internal lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 1f
-
-2: movl total_seq+4(%ebx), %eax
- movl total_seq(%ebx), %ecx
- cmpl wakeup_seq+4(%ebx), %eax
- ja 3f
- jb 4f
- cmpl wakeup_seq(%ebx), %ecx
- jbe 4f
-
- /* Bump the wakeup number. */
-3: addl $1, wakeup_seq(%ebx)
- adcl $0, wakeup_seq+4(%ebx)
-
- /* Wake up one thread. */
- addl $wakeup_seq-cond_lock, %ebx
- movl $FUTEX_WAKE, %ecx
- xorl %esi, %esi
- movl $SYS_futex, %eax
- movl %ecx, %edx /* movl $1, %edx */
- ENTER_KERNEL
-
- subl $wakeup_seq-cond_lock, %ebx
-
- /* Unlock. */
-4: LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 5f
-
-6: xorl %eax, %eax
- popl %ebx
- popl %esi
- ret
-
- /* Initial locking failed. */
-1:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 2b
-
- /* Unlock in loop requires waekup. */
-5:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 6b
- .size __pthread_cond_signal, .-__pthread_cond_signal
-versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal,
- GLIBC_2_3_2)
-
-
- /* int pthread_cond_broadcast (pthread_cond_t *cond) */
- .globl __pthread_cond_broadcast
- .type __pthread_cond_broadcast, @function
- .align 16
-__pthread_cond_broadcast:
-
- pushl %esi
- pushl %ebx
-
- movl 12(%esp), %ebx
-#if cond_lock != 0
- addl $cond_lock, %ebx
-#endif
-
- /* Get internal lock. */
- movl $1, %eax
- LOCK
-#if cond_lock == 0
- xaddl %eax, (%ebx)
-#else
- xaddl %eax, cond_lock(%ebx)
-#endif
- testl %eax, %eax
- jne 1f
-
-2: movl total_seq+4(%ebx), %eax
- movl total_seq(%ebx), %ecx
- cmpl wakeup_seq+4(%ebx), %eax
- ja 3f
- jb 4f
- cmpl wakeup_seq(%ebx), %ecx
- jna 4f
-
- /* Case all currently waiting threads to wake up. */
-3: movl %ecx, wakeup_seq(%ebx)
- movl %eax, wakeup_seq+4(%ebx)
-
- /* Wake up all threads. */
- addl $wakeup_seq-cond_lock, %ebx
- movl $FUTEX_WAKE, %ecx
- xorl %esi, %esi
- movl $SYS_futex, %eax
- movl $0x7fffffff, %edx
- ENTER_KERNEL
-
- subl $wakeup_seq-cond_lock, %ebx
-
- /* Unlock. */
-4: LOCK
-#if cond_lock == 0
- decl (%ebx)
-#else
- decl cond_lock(%ebx)
-#endif
- jne 5f
-
-6: xorl %eax, %eax
- popl %ebx
- popl %esi
- ret
-
- /* Initial locking failed. */
-1:
-#if cond_lock == 0
- movl %ebx, %ecx
-#else
- leal cond_lock(%ebx), %ecx
-#endif
- call __lll_mutex_lock_wait
- jmp 2b
-
- /* Unlock in loop requires waekup. */
-5:
-#if cond_lock == 0
- movl %ebx, %eax
-#else
- leal cond_lock(%ebx), %eax
-#endif
- call __lll_mutex_unlock_wake
- jmp 6b
- .size __pthread_cond_broadcast, .-__pthread_cond_broadcast
-versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
- GLIBC_2_3_2)
-
-
-#ifdef PIC
- .section .gnu.linkonce.t.__i686.get_pc_thunk.cx,"ax",@progbits
- .globl __i686.get_pc_thunk.cx
- .hidden __i686.get_pc_thunk.cx
- .type __i686.get_pc_thunk.cx,@function
-__i686.get_pc_thunk.cx:
- movl (%esp), %ecx;
- ret
- .size __i686.get_pc_thunk.cx,.-__i686.get_pc_thunk.cx
-#endif