diff options
author | Andi Kleen <ak@linux.intel.com> | 2014-03-03 07:06:11 -0800 |
---|---|---|
committer | Andi Kleen <ak@linux.intel.com> | 2014-06-13 13:16:06 -0700 |
commit | b7aa8caacee9ec707835ee48d14ab46bfdbae4e9 (patch) | |
tree | 823ee7f3238c8e4ad474df0a94edcd1dd7098f82 /sysdeps/unix | |
parent | 8491ed6d70b60e4c75cdcfde10ae759898547b08 (diff) | |
download | glibc-b7aa8caacee9ec707835ee48d14ab46bfdbae4e9.tar glibc-b7aa8caacee9ec707835ee48d14ab46bfdbae4e9.tar.gz glibc-b7aa8caacee9ec707835ee48d14ab46bfdbae4e9.tar.bz2 glibc-b7aa8caacee9ec707835ee48d14ab46bfdbae4e9.zip |
Remove x86 assembler rwlock code
With the recent tuning the C version of rwlocks is basically the same
performance as the x86 assembler version for uncontended locks (with a
a few cycles near the run-to-run variability). For others it should not
matter anyways.
So remove the assembler code and use the C version like other
architectures.
Diffstat (limited to 'sysdeps/unix')
20 files changed, 0 insertions, 2204 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S b/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S deleted file mode 100644 index a81bc06d7c..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S +++ /dev/null @@ -1,192 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <kernel-features.h> - -#include <stap-probe.h> - - .text - - .globl __pthread_rwlock_rdlock - .type __pthread_rwlock_rdlock,@function - .align 16 -__pthread_rwlock_rdlock: - cfi_startproc - pushl %esi - cfi_adjust_cfa_offset(4) - pushl %ebx - cfi_adjust_cfa_offset(4) - cfi_offset(%esi, -8) - cfi_offset(%ebx, -12) - - xorl %esi, %esi - movl 12(%esp), %ebx - - LIBC_PROBE (rdlock_entry, 1, %ebx) - - /* Get the lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %edx, (%ebx) -#else - cmpxchgl %edx, MUTEX(%ebx) -#endif - jnz 1f - -2: movl WRITER(%ebx), %eax - testl %eax, %eax - jne 14f - cmpl $0, WRITERS_QUEUED(%ebx) - je 5f - cmpb $0, FLAGS(%ebx) - je 5f - -3: addl $1, READERS_QUEUED(%ebx) - je 4f - - movl READERS_WAKEUP(%ebx), %edx - - LOCK -#if MUTEX == 0 - subl $1, (%ebx) -#else - subl $1, MUTEX(%ebx) -#endif - jne 10f - -11: -#ifdef __ASSUME_PRIVATE_FUTEX - movzbl PSHARED(%ebx), %ecx - xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx -#else - movzbl PSHARED(%ebx), %ecx -# if FUTEX_WAIT != 0 - orl $FUTEX_WAIT, %ecx -# endif - xorl %gs:PRIVATE_FUTEX, %ecx -#endif - addl $READERS_WAKEUP, %ebx - movl $SYS_futex, %eax - ENTER_KERNEL - - subl $READERS_WAKEUP, %ebx - - /* Reget the lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %edx, (%ebx) -#else - cmpxchgl %edx, MUTEX(%ebx) -#endif - jnz 12f - -13: subl $1, READERS_QUEUED(%ebx) - jmp 2b - -5: xorl %edx, %edx - addl $1, NR_READERS(%ebx) - je 8f -9: LOCK -#if MUTEX == 0 - subl $1, (%ebx) -#else - subl $1, MUTEX(%ebx) -#endif - jne 6f -7: - - movl %edx, %eax - popl %ebx - cfi_adjust_cfa_offset(-4) - cfi_restore(%ebx) - popl %esi - cfi_adjust_cfa_offset(-4) - cfi_restore(%esi) - ret - - cfi_adjust_cfa_offset(8) - cfi_offset(%esi, -8) - cfi_offset(%ebx, -12) -1: -#if MUTEX == 0 - movl %ebx, %edx -#else - leal MUTEX(%ebx), %edx -#endif - movzbl PSHARED(%ebx), %ecx - call __lll_lock_wait - jmp 2b - -14: cmpl %gs:TID, %eax - jne 3b - /* Deadlock detected. */ - movl $EDEADLK, %edx - jmp 9b - -6: -#if MUTEX == 0 - movl %ebx, %eax -#else - leal MUTEX(%ebx), %eax -#endif - movzbl PSHARED(%ebx), %ecx - call __lll_unlock_wake - jmp 7b - - /* Overflow. */ -8: subl $1, NR_READERS(%ebx) - movl $EAGAIN, %edx - jmp 9b - - /* Overflow. */ -4: subl $1, READERS_QUEUED(%ebx) - movl $EAGAIN, %edx - jmp 9b - -10: -#if MUTEX == 0 - movl %ebx, %eax -#else - leal MUTEX(%ebx), %eax -#endif - movzbl PSHARED(%ebx), %ecx - call __lll_unlock_wake - jmp 11b - -12: -#if MUTEX == 0 - movl %ebx, %edx -#else - leal MUTEX(%ebx), %edx -#endif - movzbl PSHARED(%ebx), %ecx - call __lll_lock_wait - jmp 13b - cfi_endproc - .size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock - -strong_alias (__pthread_rwlock_rdlock, pthread_rwlock_rdlock) -hidden_def (__pthread_rwlock_rdlock) diff --git a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S b/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S deleted file mode 100644 index bc1001ce9c..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S +++ /dev/null @@ -1,243 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <kernel-features.h> - - - .text - - .globl pthread_rwlock_timedrdlock - .type pthread_rwlock_timedrdlock,@function - .align 16 -pthread_rwlock_timedrdlock: - cfi_startproc - pushl %esi - cfi_adjust_cfa_offset(4) - pushl %edi - cfi_adjust_cfa_offset(4) - pushl %ebx - cfi_adjust_cfa_offset(4) - pushl %ebp - cfi_adjust_cfa_offset(4) - cfi_offset(%esi, -8) - cfi_offset(%edi, -12) - cfi_offset(%ebx, -16) - cfi_offset(%ebp, -20) - subl $8, %esp - cfi_adjust_cfa_offset(8) - - movl 28(%esp), %ebp - movl 32(%esp), %edi - - /* Get the lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %edx, (%ebp) -#else - cmpxchgl %edx, MUTEX(%ebp) -#endif - jnz 1f - -2: movl WRITER(%ebp), %eax - testl %eax, %eax - jne 14f - cmpl $0, WRITERS_QUEUED(%ebp) - je 5f - cmpb $0, FLAGS(%ebp) - je 5f - - /* Check the value of the timeout parameter. */ -3: cmpl $1000000000, 4(%edi) - jae 19f - - addl $1, READERS_QUEUED(%ebp) - je 4f - - movl READERS_WAKEUP(%ebp), %esi - - LOCK -#if MUTEX == 0 - subl $1, (%ebp) -#else - subl $1, MUTEX(%ebp) -#endif - jne 10f - - /* Get current time. */ -11: movl %esp, %ebx - xorl %ecx, %ecx - movl $__NR_gettimeofday, %eax - ENTER_KERNEL - - /* Compute relative timeout. */ - movl 4(%esp), %eax - movl $1000, %edx - mul %edx /* Milli seconds to nano seconds. */ - movl (%edi), %ecx - movl 4(%edi), %edx - subl (%esp), %ecx - subl %eax, %edx - jns 15f - addl $1000000000, %edx - subl $1, %ecx -15: testl %ecx, %ecx - js 16f /* Time is already up. */ - - /* Futex call. */ - movl %ecx, (%esp) /* Store relative timeout. */ - movl %edx, 4(%esp) - - movl %esi, %edx -#ifdef __ASSUME_PRIVATE_FUTEX - movzbl PSHARED(%ebp), %ecx - xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx -#else - movzbl PSHARED(%ebp), %ecx -# if FUTEX_WAIT != 0 - orl $FUTEX_WAIT, %ecx -# endif - xorl %gs:PRIVATE_FUTEX, %ecx -#endif - movl %esp, %esi - leal READERS_WAKEUP(%ebp), %ebx - movl $SYS_futex, %eax - ENTER_KERNEL - movl %eax, %esi -17: - - /* Reget the lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %edx, (%ebp) -#else - cmpxchgl %edx, MUTEX(%ebp) -#endif - jnz 12f - -13: subl $1, READERS_QUEUED(%ebp) - cmpl $-ETIMEDOUT, %esi - jne 2b - -18: movl $ETIMEDOUT, %edx - jmp 9f - - -5: xorl %edx, %edx - addl $1, NR_READERS(%ebp) - je 8f -9: LOCK -#if MUTEX == 0 - subl $1, (%ebp) -#else - subl $1, MUTEX(%ebp) -#endif - jne 6f - -7: movl %edx, %eax - - addl $8, %esp - cfi_adjust_cfa_offset(-8) - popl %ebp - cfi_adjust_cfa_offset(-4) - cfi_restore(%ebp) - popl %ebx - cfi_adjust_cfa_offset(-4) - cfi_restore(%ebx) - popl %edi - cfi_adjust_cfa_offset(-4) - cfi_restore(%edi) - popl %esi - cfi_adjust_cfa_offset(-4) - cfi_restore(%esi) - ret - - cfi_adjust_cfa_offset(24) - cfi_offset(%esi, -8) - cfi_offset(%edi, -12) - cfi_offset(%ebx, -16) - cfi_offset(%ebp, -20) -1: -#if MUTEX == 0 - movl %ebp, %edx -#else - leal MUTEX(%ebp), %edx -#endif - movzbl PSHARED(%ebp), %ecx - call __lll_lock_wait - jmp 2b - -14: cmpl %gs:TID, %eax - jne 3b - movl $EDEADLK, %edx - jmp 9b - -6: -#if MUTEX == 0 - movl %ebp, %eax -#else - leal MUTEX(%ebp), %eax -#endif - movzbl PSHARED(%ebp), %ecx - call __lll_unlock_wake - jmp 7b - - /* Overflow. */ -8: subl $1, NR_READERS(%ebp) - movl $EAGAIN, %edx - jmp 9b - - /* Overflow. */ -4: subl $1, READERS_QUEUED(%ebp) - movl $EAGAIN, %edx - jmp 9b - -10: -#if MUTEX == 0 - movl %ebp, %eax -#else - leal MUTEX(%ebp), %eax -#endif - movzbl PSHARED(%ebp), %ecx - call __lll_unlock_wake - jmp 11b - -12: -#if MUTEX == 0 - movl %ebp, %edx -#else - leal MUTEX(%ebp), %edx -#endif - movzbl PSHARED(%ebp), %ecx - call __lll_lock_wait - jmp 13b - -16: movl $-ETIMEDOUT, %esi - jmp 17b - -19: movl $EINVAL, %edx - jmp 9b - cfi_endproc - .size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock diff --git a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S b/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S deleted file mode 100644 index 9abba58ca8..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S +++ /dev/null @@ -1,236 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <kernel-features.h> - - - .text - - .globl pthread_rwlock_timedwrlock - .type pthread_rwlock_timedwrlock,@function - .align 16 -pthread_rwlock_timedwrlock: - cfi_startproc - pushl %esi - cfi_adjust_cfa_offset(4) - pushl %edi - cfi_adjust_cfa_offset(4) - pushl %ebx - cfi_adjust_cfa_offset(4) - pushl %ebp - cfi_adjust_cfa_offset(4) - cfi_offset(%esi, -8) - cfi_offset(%edi, -12) - cfi_offset(%ebx, -16) - cfi_offset(%ebp, -20) - subl $8, %esp - cfi_adjust_cfa_offset(8) - - movl 28(%esp), %ebp - movl 32(%esp), %edi - - /* Get the lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %edx, (%ebp) -#else - cmpxchgl %edx, MUTEX(%ebp) -#endif - jnz 1f - -2: movl WRITER(%ebp), %eax - testl %eax, %eax - jne 14f - cmpl $0, NR_READERS(%ebp) - je 5f - - /* Check the value of the timeout parameter. */ -3: cmpl $1000000000, 4(%edi) - jae 19f - - addl $1, WRITERS_QUEUED(%ebp) - je 4f - - movl WRITERS_WAKEUP(%ebp), %esi - - LOCK -#if MUTEX == 0 - subl $1, (%ebp) -#else - subl $1, MUTEX(%ebp) -#endif - jne 10f - - /* Get current time. */ -11: movl %esp, %ebx - xorl %ecx, %ecx - movl $__NR_gettimeofday, %eax - ENTER_KERNEL - - /* Compute relative timeout. */ - movl 4(%esp), %eax - movl $1000, %edx - mul %edx /* Milli seconds to nano seconds. */ - movl (%edi), %ecx - movl 4(%edi), %edx - subl (%esp), %ecx - subl %eax, %edx - jns 15f - addl $1000000000, %edx - subl $1, %ecx -15: testl %ecx, %ecx - js 16f /* Time is already up. */ - - /* Futex call. */ - movl %ecx, (%esp) /* Store relative timeout. */ - movl %edx, 4(%esp) - - movl %esi, %edx -#ifdef __ASSUME_PRIVATE_FUTEX - movzbl PSHARED(%ebp), %ecx - xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx -#else - movzbl PSHARED(%ebp), %ecx -# if FUTEX_WAIT != 0 - orl $FUTEX_WAIT, %ecx -# endif - xorl %gs:PRIVATE_FUTEX, %ecx -#endif - movl %esp, %esi - leal WRITERS_WAKEUP(%ebp), %ebx - movl $SYS_futex, %eax - ENTER_KERNEL - movl %eax, %esi -17: - - /* Reget the lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %edx, (%ebp) -#else - cmpxchgl %edx, MUTEX(%ebp) -#endif - jnz 12f - -13: subl $1, WRITERS_QUEUED(%ebp) - cmpl $-ETIMEDOUT, %esi - jne 2b - -18: movl $ETIMEDOUT, %edx - jmp 9f - - -5: xorl %edx, %edx - movl %gs:TID, %eax - movl %eax, WRITER(%ebp) -9: LOCK -#if MUTEX == 0 - subl $1, (%ebp) -#else - subl $1, MUTEX(%ebp) -#endif - jne 6f - -7: movl %edx, %eax - - addl $8, %esp - cfi_adjust_cfa_offset(-8) - popl %ebp - cfi_adjust_cfa_offset(-4) - cfi_restore(%ebp) - popl %ebx - cfi_adjust_cfa_offset(-4) - cfi_restore(%ebx) - popl %edi - cfi_adjust_cfa_offset(-4) - cfi_restore(%edi) - popl %esi - cfi_adjust_cfa_offset(-4) - cfi_restore(%esi) - ret - - cfi_adjust_cfa_offset(24) - cfi_offset(%esi, -8) - cfi_offset(%edi, -12) - cfi_offset(%ebx, -16) - cfi_offset(%ebp, -20) -1: -#if MUTEX == 0 - movl %ebp, %edx -#else - leal MUTEX(%ebp), %edx -#endif - movzbl PSHARED(%ebp), %ecx - call __lll_lock_wait - jmp 2b - -14: cmpl %gs:TID, %eax - jne 3b -20: movl $EDEADLK, %edx - jmp 9b - -6: -#if MUTEX == 0 - movl %ebp, %eax -#else - leal MUTEX(%ebp), %eax -#endif - movzbl PSHARED(%ebp), %ecx - call __lll_unlock_wake - jmp 7b - - /* Overflow. */ -4: subl $1, WRITERS_QUEUED(%ebp) - movl $EAGAIN, %edx - jmp 9b - -10: -#if MUTEX == 0 - movl %ebp, %eax -#else - leal MUTEX(%ebp), %eax -#endif - movzbl PSHARED(%ebp), %ecx - call __lll_unlock_wake - jmp 11b - -12: -#if MUTEX == 0 - movl %ebp, %edx -#else - leal MUTEX(%ebp), %edx -#endif - movzbl PSHARED(%ebp), %ecx - call __lll_lock_wait - jmp 13b - -16: movl $-ETIMEDOUT, %esi - jmp 17b - -19: movl $EINVAL, %edx - jmp 9b - cfi_endproc - .size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock diff --git a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S b/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S deleted file mode 100644 index 738c067780..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <kernel-features.h> - - - .text - - .globl __pthread_rwlock_unlock - .type __pthread_rwlock_unlock,@function - .align 16 -__pthread_rwlock_unlock: - cfi_startproc - pushl %ebx - cfi_adjust_cfa_offset(4) - pushl %edi - cfi_adjust_cfa_offset(4) - cfi_offset(%ebx, -8) - cfi_offset(%edi, -12) - - movl 12(%esp), %edi - - /* Get the lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %edx, (%edi) -#else - cmpxchgl %edx, MUTEX(%edi) -#endif - jnz 1f - -2: cmpl $0, WRITER(%edi) - jne 5f - subl $1, NR_READERS(%edi) - jnz 6f - -5: movl $0, WRITER(%edi) - - movl $1, %edx - leal WRITERS_WAKEUP(%edi), %ebx - cmpl $0, WRITERS_QUEUED(%edi) - 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: addl $1, (%ebx) - LOCK -#if MUTEX == 0 - subl $1, (%edi) -#else - subl $1, MUTEX(%edi) -#endif - jne 7f - -8: -#ifdef __ASSUME_PRIVATE_FUTEX - movzbl PSHARED(%edi), %ecx - xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAKE, %ecx -#else - movzbl PSHARED(%edi), %ecx - orl $FUTEX_WAKE, %ecx - xorl %gs:PRIVATE_FUTEX, %ecx -#endif - movl $SYS_futex, %eax - ENTER_KERNEL - - xorl %eax, %eax - popl %edi - cfi_adjust_cfa_offset(-4) - cfi_restore(%edi) - popl %ebx - cfi_adjust_cfa_offset(-4) - cfi_restore(%ebx) - ret - - cfi_adjust_cfa_offset(8) - cfi_offset(%ebx, -8) - cfi_offset(%edi, -12) - .align 16 -6: LOCK -#if MUTEX == 0 - subl $1, (%edi) -#else - subl $1, MUTEX(%edi) -#endif - jne 3f - -4: xorl %eax, %eax - popl %edi - popl %ebx - ret - -1: -#if MUTEX == 0 - movl %edi, %edx -#else - leal MUTEX(%edi), %edx -#endif - movzbl PSHARED(%edi), %ecx - call __lll_lock_wait - jmp 2b - -3: -#if MUTEX == 0 - movl %edi, %eax -#else - leal MUTEX(%edi), %eax -#endif - movzbl PSHARED(%edi), %ecx - call __lll_unlock_wake - jmp 4b - -7: -#if MUTEX == 0 - movl %edi, %eax -#else - leal MUTEX(%edi), %eax -#endif - movzbl PSHARED(%edi), %ecx - call __lll_unlock_wake - jmp 8b - cfi_endproc - .size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock - -strong_alias (__pthread_rwlock_unlock, pthread_rwlock_unlock) -hidden_def (__pthread_rwlock_unlock) diff --git a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S b/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S deleted file mode 100644 index 8345cae1ea..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S +++ /dev/null @@ -1,183 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <kernel-features.h> - -#include <stap-probe.h> - - .text - - .globl __pthread_rwlock_wrlock - .type __pthread_rwlock_wrlock,@function - .align 16 -__pthread_rwlock_wrlock: - cfi_startproc - pushl %esi - cfi_adjust_cfa_offset(4) - pushl %ebx - cfi_adjust_cfa_offset(4) - cfi_offset(%esi, -8) - cfi_offset(%ebx, -12) - - xorl %esi, %esi - movl 12(%esp), %ebx - - LIBC_PROBE (wrlock_entry, 1, %ebx) - - /* Get the lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %edx, (%ebx) -#else - cmpxchgl %edx, MUTEX(%ebx) -#endif - jnz 1f - -2: movl WRITER(%ebx), %eax - testl %eax, %eax - jne 14f - cmpl $0, NR_READERS(%ebx) - je 5f - -3: addl $1, WRITERS_QUEUED(%ebx) - je 4f - - movl WRITERS_WAKEUP(%ebx), %edx - - LOCK -#if MUTEX == 0 - subl $1, (%ebx) -#else - subl $1, MUTEX(%ebx) -#endif - jne 10f - -11: -#ifdef __ASSUME_PRIVATE_FUTEX - movzbl PSHARED(%ebx), %ecx - xorl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %ecx -#else - movzbl PSHARED(%ebx), %ecx -# if FUTEX_WAIT != 0 - orl $FUTEX_WAIT, %ecx -# endif - xorl %gs:PRIVATE_FUTEX, %ecx -#endif - addl $WRITERS_WAKEUP, %ebx - movl $SYS_futex, %eax - ENTER_KERNEL - - subl $WRITERS_WAKEUP, %ebx - - /* Reget the lock. */ - movl $1, %edx - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %edx, (%ebx) -#else - cmpxchgl %edx, MUTEX(%ebx) -#endif - jnz 12f - -13: subl $1, WRITERS_QUEUED(%ebx) - jmp 2b - -5: xorl %edx, %edx - movl %gs:TID, %eax - movl %eax, WRITER(%ebx) -9: LOCK -#if MUTEX == 0 - subl $1, (%ebx) -#else - subl $1, MUTEX(%ebx) -#endif - jne 6f -7: - - movl %edx, %eax - popl %ebx - cfi_adjust_cfa_offset(-4) - cfi_restore(%ebx) - popl %esi - cfi_adjust_cfa_offset(-4) - cfi_restore(%esi) - ret - - cfi_adjust_cfa_offset(8) - cfi_offset(%esi, -8) - cfi_offset(%ebx, -12) -1: -#if MUTEX == 0 - movl %ebx, %edx -#else - leal MUTEX(%ebx), %edx -#endif - movzbl PSHARED(%ebx), %ecx - call __lll_lock_wait - jmp 2b - -14: cmpl %gs:TID , %eax - jne 3b - movl $EDEADLK, %edx - jmp 9b - -6: -#if MUTEX == 0 - movl %ebx, %eax -#else - leal MUTEX(%ebx), %eax -#endif - movzbl PSHARED(%ebx), %ecx - call __lll_unlock_wake - jmp 7b - -4: subl $1, WRITERS_QUEUED(%ebx) - movl $EAGAIN, %edx - jmp 9b - -10: -#if MUTEX == 0 - movl %ebx, %eax -#else - leal MUTEX(%ebx), %eax -#endif - movzbl PSHARED(%ebx), %ecx - call __lll_unlock_wake - jmp 11b - -12: -#if MUTEX == 0 - movl %ebx, %edx -#else - leal MUTEX(%ebx), %edx -#endif - movzbl PSHARED(%ebx), %ecx - call __lll_lock_wait - jmp 13b - cfi_endproc - .size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock - -strong_alias (__pthread_rwlock_wrlock, pthread_rwlock_wrlock) -hidden_def (__pthread_rwlock_wrlock) diff --git a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S b/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S deleted file mode 100644 index 85127c7824..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_rdlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include "../i486/pthread_rwlock_rdlock.S" diff --git a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S b/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S deleted file mode 100644 index 5a843e5986..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedrdlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include "../i486/pthread_rwlock_timedrdlock.S" diff --git a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S b/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S deleted file mode 100644 index a8ca4cf51a..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_timedwrlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include "../i486/pthread_rwlock_timedwrlock.S" diff --git a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S b/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S deleted file mode 100644 index 8018c8fa98..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_unlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include "../i486/pthread_rwlock_unlock.S" diff --git a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S b/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S deleted file mode 100644 index 0b4cfa8637..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i586/pthread_rwlock_wrlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include "../i486/pthread_rwlock_wrlock.S" diff --git a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S b/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S deleted file mode 100644 index 85127c7824..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_rdlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include "../i486/pthread_rwlock_rdlock.S" diff --git a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S b/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S deleted file mode 100644 index 5a843e5986..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedrdlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include "../i486/pthread_rwlock_timedrdlock.S" diff --git a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S b/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S deleted file mode 100644 index a8ca4cf51a..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_timedwrlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include "../i486/pthread_rwlock_timedwrlock.S" diff --git a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S b/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S deleted file mode 100644 index e52344b66a..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_unlock.S +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#define HAVE_CMOV 1 -#include "../i486/pthread_rwlock_unlock.S" diff --git a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S b/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S deleted file mode 100644 index 0b4cfa8637..0000000000 --- a/sysdeps/unix/sysv/linux/i386/i686/pthread_rwlock_wrlock.S +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright (C) 2003-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. - - 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, see - <http://www.gnu.org/licenses/>. */ - -#include "../i486/pthread_rwlock_wrlock.S" diff --git a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S b/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S deleted file mode 100644 index 3bbb4c7f62..0000000000 --- a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_rdlock.S +++ /dev/null @@ -1,177 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <kernel-features.h> -#include <stap-probe.h> - - .text - - .globl __pthread_rwlock_rdlock - .type __pthread_rwlock_rdlock,@function - .align 16 -__pthread_rwlock_rdlock: - cfi_startproc - - LIBC_PROBE (rdlock_entry, 1, %rdi) - - xorq %r10, %r10 - - /* Get the lock. */ - movl $1, %esi - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %esi, (%rdi) -#else - cmpxchgl %esi, MUTEX(%rdi) -#endif - jnz 1f - -2: movl WRITER(%rdi), %eax - testl %eax, %eax - jne 14f - cmpl $0, WRITERS_QUEUED(%rdi) - je 5f - cmpl $0, FLAGS(%rdi) - je 5f - -3: incl READERS_QUEUED(%rdi) - je 4f - - movl READERS_WAKEUP(%rdi), %edx - - LOCK -#if MUTEX == 0 - decl (%rdi) -#else - decl MUTEX(%rdi) -#endif - jne 10f - -11: -#ifdef __ASSUME_PRIVATE_FUTEX - movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %esi - xorl PSHARED(%rdi), %esi -#else -# if FUTEX_WAIT == 0 - movl PSHARED(%rdi), %esi -# else - movl $FUTEX_WAIT, %esi - orl PSHARED(%rdi), %esi -# endif - xorl %fs:PRIVATE_FUTEX, %esi -#endif - addq $READERS_WAKEUP, %rdi - movl $SYS_futex, %eax - syscall - - subq $READERS_WAKEUP, %rdi - - /* Reget the lock. */ - movl $1, %esi - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %esi, (%rdi) -#else - cmpxchgl %esi, MUTEX(%rdi) -#endif - jnz 12f - -13: decl READERS_QUEUED(%rdi) - jmp 2b - -5: xorl %edx, %edx - incl NR_READERS(%rdi) - je 8f -9: LOCK -#if MUTEX == 0 - decl (%rdi) -#else - decl MUTEX(%rdi) -#endif - jne 6f -7: - - movq %rdx, %rax - retq - -1: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_lock_wait -#if MUTEX != 0 - subq $MUTEX, %rdi -#endif - jmp 2b - -14: cmpl %fs:TID, %eax - jne 3b - /* Deadlock detected. */ - movl $EDEADLK, %edx - jmp 9b - -6: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_unlock_wake -#if MUTEX != 0 - subq $MUTEX, %rdi -#endif - jmp 7b - - /* Overflow. */ -8: decl NR_READERS(%rdi) - movl $EAGAIN, %edx - jmp 9b - - /* Overflow. */ -4: decl READERS_QUEUED(%rdi) - movl $EAGAIN, %edx - jmp 9b - -10: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_unlock_wake -#if MUTEX != 0 - subq $MUTEX, %rdi -#endif - jmp 11b - -12: movl PSHARED(%rdi), %esi -#if MUTEX == 0 - addq $MUTEX, %rdi -#endif - callq __lll_lock_wait -#if MUTEX != 0 - subq $MUTEX, %rdi -#endif - jmp 13b - cfi_endproc - .size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock - -strong_alias (__pthread_rwlock_rdlock, pthread_rwlock_rdlock) -hidden_def (__pthread_rwlock_rdlock) diff --git a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S b/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S deleted file mode 100644 index 40bcc04a9d..0000000000 --- a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S +++ /dev/null @@ -1,274 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <kernel-features.h> - - .text - - .globl pthread_rwlock_timedrdlock - .type pthread_rwlock_timedrdlock,@function - .align 16 -pthread_rwlock_timedrdlock: - cfi_startproc - pushq %r12 - cfi_adjust_cfa_offset(8) - cfi_rel_offset(%r12, 0) - pushq %r13 - cfi_adjust_cfa_offset(8) - cfi_rel_offset(%r13, 0) -#ifdef __ASSUME_FUTEX_CLOCK_REALTIME -# define VALREG %edx -#else - pushq %r14 - cfi_adjust_cfa_offset(8) - cfi_rel_offset(%r14, 0) - - subq $16, %rsp - cfi_adjust_cfa_offset(16) -# define VALREG %r14d -#endif - - movq %rdi, %r12 - movq %rsi, %r13 - - /* Get the lock. */ - movl $1, %esi - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %esi, (%rdi) -#else - cmpxchgl %esi, MUTEX(%rdi) -#endif - jnz 1f - -2: movl WRITER(%r12), %eax - testl %eax, %eax - jne 14f - cmpl $0, WRITERS_QUEUED(%r12) - je 5f - cmpl $0, FLAGS(%r12) - je 5f - - /* Check the value of the timeout parameter. */ -3: cmpq $1000000000, 8(%r13) - jae 19f - - incl READERS_QUEUED(%r12) - je 4f - - movl READERS_WAKEUP(%r12), VALREG - - /* Unlock. */ - LOCK -#if MUTEX == 0 - decl (%r12) -#else - decl MUTEX(%r12) -#endif - jne 10f - -11: -#ifndef __ASSUME_FUTEX_CLOCK_REALTIME -# ifdef PIC - cmpl $0, __have_futex_clock_realtime(%rip) -# else - cmpl $0, __have_futex_clock_realtime -# endif - je .Lreltmo -#endif - - cmpq $0, (%r13) - js 16f /* Time is already up. */ - - movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %esi - xorl PSHARED(%r12), %esi - movq %r13, %r10 - movl $0xffffffff, %r9d -#ifndef __ASSUME_FUTEX_CLOCK_REALTIME - movl %r14d, %edx -#endif -21: leaq READERS_WAKEUP(%r12), %rdi - movl $SYS_futex, %eax - syscall - movq %rax, %rdx - -#ifndef __ASSUME_FUTEX_CLOCK_REALTIME - .subsection 2 -.Lreltmo: - /* Get current time. */ - movq %rsp, %rdi - xorl %esi, %esi - /* This call works because we directly jump to a system call entry - which preserves all the registers. */ - call JUMPTARGET(__gettimeofday) - - /* Compute relative timeout. */ - movq 8(%rsp), %rax - movl $1000, %edi - mul %rdi /* Milli seconds to nano seconds. */ - movq (%r13), %rcx - movq 8(%r13), %rdi - subq (%rsp), %rcx - subq %rax, %rdi - jns 15f - addq $1000000000, %rdi - decq %rcx -15: testq %rcx, %rcx - js 16f /* Time is already up. */ - - /* Futex call. */ - movq %rcx, (%rsp) /* Store relative timeout. */ - movq %rdi, 8(%rsp) - -# ifdef __ASSUME_PRIVATE_FUTEX - movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %esi - xorl PSHARED(%r12), %esi -# else -# if FUTEX_WAIT == 0 - movl PSHARED(%r12), %esi -# else - movl $FUTEX_WAIT, %esi - orl PSHARED(%r12), %esi -# endif - xorl %fs:PRIVATE_FUTEX, %esi -# endif - movq %rsp, %r10 - movl %r14d, %edx - - jmp 21b - .previous -#endif - -17: /* Reget the lock. */ - movl $1, %esi - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %esi, (%r12) -#else - cmpxchgl %esi, MUTEX(%r12) -#endif - jnz 12f - -13: decl READERS_QUEUED(%r12) - cmpq $-ETIMEDOUT, %rdx - jne 2b - -18: movl $ETIMEDOUT, %edx - jmp 9f - - -5: xorl %edx, %edx - incl NR_READERS(%r12) - je 8f -9: LOCK -#if MUTEX == 0 - decl (%r12) -#else - decl MUTEX(%r12) -#endif - jne 6f - -7: movq %rdx, %rax - -#ifndef __ASSUME_FUTEX_CLOCK_REALTIME - addq $16, %rsp - cfi_adjust_cfa_offset(-16) - popq %r14 - cfi_adjust_cfa_offset(-8) - cfi_restore(%r14) -#endif - popq %r13 - cfi_adjust_cfa_offset(-8) - cfi_restore(%r13) - popq %r12 - cfi_adjust_cfa_offset(-8) - cfi_restore(%r12) - retq - -#ifdef __ASSUME_PRIVATE_FUTEX - cfi_adjust_cfa_offset(16) - cfi_rel_offset(%r12, 8) - cfi_rel_offset(%r13, 0) -#else - cfi_adjust_cfa_offset(40) - cfi_offset(%r12, -16) - cfi_offset(%r13, -24) - cfi_offset(%r14, -32) -#endif -1: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_lock_wait - jmp 2b - -14: cmpl %fs:TID, %eax - jne 3b - movl $EDEADLK, %edx - jmp 9b - -6: movl PSHARED(%r12), %esi -#if MUTEX == 0 - movq %r12, %rdi -#else - leal MUTEX(%r12), %rdi -#endif - callq __lll_unlock_wake - jmp 7b - - /* Overflow. */ -8: decl NR_READERS(%r12) - movl $EAGAIN, %edx - jmp 9b - - /* Overflow. */ -4: decl READERS_QUEUED(%r12) - movl $EAGAIN, %edx - jmp 9b - -10: movl PSHARED(%r12), %esi -#if MUTEX == 0 - movq %r12, %rdi -#else - leaq MUTEX(%r12), %rdi -#endif - callq __lll_unlock_wake - jmp 11b - -12: movl PSHARED(%r12), %esi -#if MUTEX == 0 - movq %r12, %rdi -#else - leaq MUTEX(%r12), %rdi -#endif - callq __lll_lock_wait - jmp 13b - -16: movq $-ETIMEDOUT, %rdx - jmp 17b - -19: movl $EINVAL, %edx - jmp 9b - cfi_endproc - .size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock diff --git a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S b/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S deleted file mode 100644 index f57ef5238c..0000000000 --- a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S +++ /dev/null @@ -1,266 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <kernel-features.h> - - .text - - .globl pthread_rwlock_timedwrlock - .type pthread_rwlock_timedwrlock,@function - .align 16 -pthread_rwlock_timedwrlock: - cfi_startproc - pushq %r12 - cfi_adjust_cfa_offset(8) - cfi_rel_offset(%r12, 0) - pushq %r13 - cfi_adjust_cfa_offset(8) - cfi_rel_offset(%r13, 0) -#ifdef __ASSUME_FUTEX_CLOCK_REALTIME -# define VALREG %edx -#else - pushq %r14 - cfi_adjust_cfa_offset(8) - cfi_rel_offset(%r14, 0) - - subq $16, %rsp - cfi_adjust_cfa_offset(16) -# define VALREG %r14d -#endif - - movq %rdi, %r12 - movq %rsi, %r13 - - /* Get the lock. */ - movl $1, %esi - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %esi, (%rdi) -#else - cmpxchgl %esi, MUTEX(%rdi) -#endif - jnz 1f - -2: movl WRITER(%r12), %eax - testl %eax, %eax - jne 14f - cmpl $0, NR_READERS(%r12) - je 5f - - /* Check the value of the timeout parameter. */ -3: cmpq $1000000000, 8(%r13) - jae 19f - - incl WRITERS_QUEUED(%r12) - je 4f - - movl WRITERS_WAKEUP(%r12), VALREG - - LOCK -#if MUTEX == 0 - decl (%r12) -#else - decl MUTEX(%r12) -#endif - jne 10f - -11: -#ifndef __ASSUME_FUTEX_CLOCK_REALTIME -# ifdef PIC - cmpl $0, __have_futex_clock_realtime(%rip) -# else - cmpl $0, __have_futex_clock_realtime -# endif - je .Lreltmo -#endif - - cmpq $0, (%r13) - js 16f /* Time is already up. */ - - movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %esi - xorl PSHARED(%r12), %esi - movq %r13, %r10 - movl $0xffffffff, %r9d -#ifndef __ASSUME_FUTEX_CLOCK_REALTIME - movl %r14d, %edx -#endif -21: leaq WRITERS_WAKEUP(%r12), %rdi - movl $SYS_futex, %eax - syscall - movq %rax, %rdx - -#ifndef __ASSUME_FUTEX_CLOCK_REALTIME - .subsection 2 -.Lreltmo: - /* Get current time. */ - movq %rsp, %rdi - xorl %esi, %esi - /* This call works because we directly jump to a system call entry - which preserves all the registers. */ - call JUMPTARGET(__gettimeofday) - - /* Compute relative timeout. */ - movq 8(%rsp), %rax - movl $1000, %edi - mul %rdi /* Milli seconds to nano seconds. */ - movq (%r13), %rcx - movq 8(%r13), %rdi - subq (%rsp), %rcx - subq %rax, %rdi - jns 15f - addq $1000000000, %rdi - decq %rcx -15: testq %rcx, %rcx - js 16f /* Time is already up. */ - - /* Futex call. */ - movq %rcx, (%rsp) /* Store relative timeout. */ - movq %rdi, 8(%rsp) - -# ifdef __ASSUME_PRIVATE_FUTEX - movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %esi - xorl PSHARED(%r12), %esi -# else -# if FUTEX_WAIT == 0 - movl PSHARED(%r12), %esi -# else - movl $FUTEX_WAIT, %esi - orl PSHARED(%r12), %esi -# endif - xorl %fs:PRIVATE_FUTEX, %esi -# endif - movq %rsp, %r10 - movl %r14d, %edx - - jmp 21b - .previous -#endif - -17: /* Reget the lock. */ - movl $1, %esi - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %esi, (%r12) -#else - cmpxchgl %esi, MUTEX(%r12) -#endif - jnz 12f - -13: decl WRITERS_QUEUED(%r12) - cmpq $-ETIMEDOUT, %rdx - jne 2b - -18: movl $ETIMEDOUT, %edx - jmp 9f - - -5: xorl %edx, %edx - movl %fs:TID, %eax - movl %eax, WRITER(%r12) -9: LOCK -#if MUTEX == 0 - decl (%r12) -#else - decl MUTEX(%r12) -#endif - jne 6f - -7: movq %rdx, %rax - -#ifndef __ASSUME_FUTEX_CLOCK_REALTIME - addq $16, %rsp - cfi_adjust_cfa_offset(-16) - popq %r14 - cfi_adjust_cfa_offset(-8) - cfi_restore(%r14) -#endif - popq %r13 - cfi_adjust_cfa_offset(-8) - cfi_restore(%r13) - popq %r12 - cfi_adjust_cfa_offset(-8) - cfi_restore(%r12) - retq - -#ifdef __ASSUME_PRIVATE_FUTEX - cfi_adjust_cfa_offset(16) - cfi_rel_offset(%r12, 8) - cfi_rel_offset(%r13, 0) -#else - cfi_adjust_cfa_offset(40) - cfi_offset(%r12, -16) - cfi_offset(%r13, -24) - cfi_offset(%r14, -32) -#endif -1: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_lock_wait - jmp 2b - -14: cmpl %fs:TID, %eax - jne 3b -20: movl $EDEADLK, %edx - jmp 9b - -6: movl PSHARED(%r12), %esi -#if MUTEX == 0 - movq %r12, %rdi -#else - leal MUTEX(%r12), %rdi -#endif - callq __lll_unlock_wake - jmp 7b - - /* Overflow. */ -4: decl WRITERS_QUEUED(%r12) - movl $EAGAIN, %edx - jmp 9b - -10: movl PSHARED(%r12), %esi -#if MUTEX == 0 - movq %r12, %rdi -#else - leaq MUTEX(%r12), %rdi -#endif - callq __lll_unlock_wake - jmp 11b - -12: movl PSHARED(%r12), %esi -#if MUTEX == 0 - movq %r12, %rdi -#else - leaq MUTEX(%r12), %rdi -#endif - callq __lll_lock_wait - jmp 13b - -16: movq $-ETIMEDOUT, %rdx - jmp 17b - -19: movl $EINVAL, %edx - jmp 9b - cfi_endproc - .size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock diff --git a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S b/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S deleted file mode 100644 index d779f7b759..0000000000 --- a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_unlock.S +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <kernel-features.h> - - - .text - - .globl __pthread_rwlock_unlock - .type __pthread_rwlock_unlock,@function - .align 16 -__pthread_rwlock_unlock: - cfi_startproc - /* Get the lock. */ - movl $1, %esi - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %esi, (%rdi) -#else - cmpxchgl %esi, MUTEX(%rdi) -#endif - jnz 1f - -2: cmpl $0, WRITER(%rdi) - jne 5f - decl NR_READERS(%rdi) - jnz 6f - -5: movl $0, WRITER(%rdi) - - movl $1, %edx - leaq WRITERS_WAKEUP(%rdi), %r10 - cmpl $0, WRITERS_QUEUED(%rdi) - jne 0f - - /* If also no readers waiting nothing to do. */ - cmpl $0, READERS_QUEUED(%rdi) - je 6f - - movl $0x7fffffff, %edx - leaq READERS_WAKEUP(%rdi), %r10 - -0: incl (%r10) - LOCK -#if MUTEX == 0 - decl (%rdi) -#else - decl MUTEX(%rdi) -#endif - jne 7f - -8: -#ifdef __ASSUME_PRIVATE_FUTEX - movl $FUTEX_PRIVATE_FLAG|FUTEX_WAKE, %esi - xorl PSHARED(%rdi), %esi -#else - movl $FUTEX_WAKE, %esi - orl PSHARED(%rdi), %esi - xorl %fs:PRIVATE_FUTEX, %esi -#endif - movl $SYS_futex, %eax - movq %r10, %rdi - syscall - - xorl %eax, %eax - retq - - .align 16 -6: LOCK -#if MUTEX == 0 - decl (%rdi) -#else - decl MUTEX(%rdi) -#endif - jne 3f - -4: xorl %eax, %eax - retq - -1: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_lock_wait -#if MUTEX != 0 - subq $MUTEX, %rdi -#endif - jmp 2b - -3: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_unlock_wake - jmp 4b - -7: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_unlock_wake - jmp 8b - cfi_endproc - .size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock - -strong_alias (__pthread_rwlock_unlock, pthread_rwlock_unlock) -hidden_def (__pthread_rwlock_unlock) diff --git a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S b/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S deleted file mode 100644 index e444def525..0000000000 --- a/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_wrlock.S +++ /dev/null @@ -1,165 +0,0 @@ -/* Copyright (C) 2002-2014 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, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <lowlevellock.h> -#include <lowlevelrwlock.h> -#include <pthread-errnos.h> -#include <kernel-features.h> -#include <stap-probe.h> - - .text - - .globl __pthread_rwlock_wrlock - .type __pthread_rwlock_wrlock,@function - .align 16 -__pthread_rwlock_wrlock: - cfi_startproc - - LIBC_PROBE (wrlock_entry, 1, %rdi) - - xorq %r10, %r10 - - /* Get the lock. */ - movl $1, %esi - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %esi, (%rdi) -#else - cmpxchgl %esi, MUTEX(%rdi) -#endif - jnz 1f - -2: movl WRITER(%rdi), %eax - testl %eax, %eax - jne 14f - cmpl $0, NR_READERS(%rdi) - je 5f - -3: incl WRITERS_QUEUED(%rdi) - je 4f - - movl WRITERS_WAKEUP(%rdi), %edx - - LOCK -#if MUTEX == 0 - decl (%rdi) -#else - decl MUTEX(%rdi) -#endif - jne 10f - -11: -#ifdef __ASSUME_PRIVATE_FUTEX - movl $FUTEX_PRIVATE_FLAG|FUTEX_WAIT, %esi - xorl PSHARED(%rdi), %esi -#else -# if FUTEX_WAIT == 0 - movl PSHARED(%rdi), %esi -# else - movl $FUTEX_WAIT, %esi - orl PSHARED(%rdi), %esi -# endif - xorl %fs:PRIVATE_FUTEX, %esi -#endif - addq $WRITERS_WAKEUP, %rdi - movl $SYS_futex, %eax - syscall - - subq $WRITERS_WAKEUP, %rdi - - /* Reget the lock. */ - movl $1, %esi - xorl %eax, %eax - LOCK -#if MUTEX == 0 - cmpxchgl %esi, (%rdi) -#else - cmpxchgl %esi, MUTEX(%rdi) -#endif - jnz 12f - -13: decl WRITERS_QUEUED(%rdi) - jmp 2b - -5: xorl %edx, %edx - movl %fs:TID, %eax - movl %eax, WRITER(%rdi) -9: LOCK -#if MUTEX == 0 - decl (%rdi) -#else - decl MUTEX(%rdi) -#endif - jne 6f -7: - - movq %rdx, %rax - retq - -1: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_lock_wait -#if MUTEX != 0 - subq $MUTEX, %rdi -#endif - jmp 2b - -14: cmpl %fs:TID, %eax - jne 3b - movl $EDEADLK, %edx - jmp 9b - -6: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_unlock_wake - jmp 7b - -4: decl WRITERS_QUEUED(%rdi) - movl $EAGAIN, %edx - jmp 9b - -10: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_unlock_wake -#if MUTEX != 0 - subq $MUTEX, %rdi -#endif - jmp 11b - -12: movl PSHARED(%rdi), %esi -#if MUTEX != 0 - addq $MUTEX, %rdi -#endif - callq __lll_lock_wait -#if MUTEX != 0 - subq $MUTEX, %rdi -#endif - jmp 13b - cfi_endproc - .size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock - -strong_alias (__pthread_rwlock_wrlock, pthread_rwlock_wrlock) -hidden_def (__pthread_rwlock_wrlock) |