Explorar o código

sh: remove assembly code from NPTL

Waldemar Brodkorb %!s(int64=7) %!d(string=hai) anos
pai
achega
a2b99c04d8
Modificáronse 23 ficheiros con 293 adicións e 5927 borrados
  1. 0 13
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile
  2. 1 7
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile.arch
  3. 0 80
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h
  4. 0 539
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
  5. 203 329
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h
  6. 0 264
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S
  7. 0 215
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S
  8. 0 262
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
  9. 0 189
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S
  10. 0 860
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
  11. 0 753
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
  12. 0 262
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S
  13. 89 0
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.c
  14. 0 254
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S
  15. 0 313
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S
  16. 0 297
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S
  17. 0 198
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S
  18. 0 234
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S
  19. 0 108
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S
  20. 0 357
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S
  21. 0 88
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S
  22. 0 301
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S
  23. 0 4
      libpthread/nptl/sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h

+ 0 - 13
libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile

@@ -1,13 +0,0 @@
-# Makefile for uClibc NPTL
-#
-# Copyright (C) 2005 Steven J. Hill <sjhill@uclibc.org>
-#
-# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
-#
-
-top_srcdir=../../../../../../../
-top_builddir=../../../../../../../
-all: objs
-include $(top_builddir)Rules.mak
-include Makefile.arch
-include $(top_srcdir)Makerules

+ 1 - 7
libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile.arch

@@ -5,13 +5,7 @@
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
 #
 
 
-libpthread_linux_arch_SSRC = pthread_once.S pthread_rwlock_wrlock.S \
+libpthread_linux_arch_CSRC = pthread_once.c
-			pthread_rwlock_rdlock.S pthread_rwlock_unlock.S \
-			lowlevellock.S lowlevelrobustlock.S pthread_barrier_wait.S \
-			pthread_cond_broadcast.S pthread_cond_signal.S \
-			pthread_rwlock_timedwrlock.S pthread_rwlock_timedrdlock.S \
-			sem_post.S sem_timedwait.S sem_trywait.S sem_wait.S
-
 libc_linux_arch_CSRC = fork.c
 libc_linux_arch_CSRC = fork.c
 
 
 ASFLAGS += -DUSE___THREAD
 ASFLAGS += -DUSE___THREAD

+ 0 - 80
libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevel-atomic.h

@@ -1,80 +0,0 @@
-/* Copyright (C) 2003, 2004, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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/>.  */
-
-#ifdef __ASSEMBLER__
-
-#define _IMP1 #1
-#define _IMM1 #-1
-#define _IMM4 #-4
-#define _IMM6 #-6
-#define _IMM8 #-8
-
-#define	INC(mem, reg) \
-	.align	2; \
-	mova	99f, r0; \
-	mov	r15, r1; \
-	mov	_IMM6, r15; \
-98:	mov.l	mem, reg; \
-	add	_IMP1, reg; \
-	mov.l	reg, mem; \
-99:	mov	r1, r15
-
-#define	DEC(mem, reg) \
-	.align	2; \
-	mova	99f, r0; \
-	mov	r15, r1; \
-	mov	_IMM6, r15; \
-98:	mov.l	mem, reg; \
-	add	_IMM1, reg; \
-	mov.l	reg, mem; \
-99:	mov	r1, r15
-
-#define	XADD(reg, mem, old, tmp) \
-	.align	2; \
-	mova	99f, r0; \
-	nop; \
-	mov	r15, r1; \
-	mov	_IMM8, r15; \
-98:	mov.l	mem, old; \
-	mov	reg, tmp; \
-	add	old, tmp; \
-	mov.l	tmp, mem; \
-99:	mov	r1, r15
-
-#define	XCHG(reg, mem, old) \
-	.align	2; \
-	mova	99f, r0; \
-	nop; \
-	mov	r15, r1; \
-	mov	_IMM4, r15; \
-98:	mov.l	mem, old; \
-	mov.l	reg, mem; \
-99:	mov	r1, r15
-
-#define	CMPXCHG(reg, mem, new, old) \
-	.align	2; \
-	mova	99f, r0; \
-	nop; \
-	mov	r15, r1; \
-	mov	_IMM8, r15; \
-98:	mov.l	mem, old; \
-	cmp/eq	old, reg; \
-	bf	99f; \
-	mov.l	new, mem; \
-99:	mov	r1, r15
-
-#endif  /* __ASSEMBLER__ */

+ 0 - 539
libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S

@@ -1,539 +0,0 @@
-/* Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009
-   Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <pthread-errnos.h>
-#include <bits/kernel-features.h>
-#include <lowlevellock.h>
-#include <tcb-offsets.h>
-#include "lowlevel-atomic.h"
-
-	.text
-
-#ifdef __ASSUME_PRIVATE_FUTEX
-# define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \
-	mov	#(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg; \
-	extu.b	reg, reg
-# define LOAD_PRIVATE_FUTEX_WAKE(reg,tmp,tmp2) \
-	mov	#(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), reg; \
-	extu.b	reg, reg
-# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \
-	mov	#(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), tmp; \
-	extu.b	tmp, tmp; \
-	xor	tmp, reg
-# define LOAD_FUTEX_WAIT_ABS(reg,tmp,tmp2) \
-	mov	#(FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG), tmp; \
-	extu.b	tmp, tmp; \
-	mov	#(FUTEX_CLOCK_REALTIME >> 8), tmp2; \
-	swap.b	tmp2, tmp2; \
-	or	tmp2, tmp; \
-	xor	tmp, reg
-# define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \
-	mov	#(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), tmp; \
-	extu.b	tmp, tmp; \
-	xor	tmp, reg
-#else
-# if FUTEX_WAIT == 0
-#  define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \
-	stc	gbr, tmp	; \
-	mov.w	99f, reg	; \
-	add	reg, tmp	; \
-	bra	98f		; \
-	 mov.l	@tmp, reg	; \
-99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
-98:
-# else
-#  define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \
-	stc	gbr, tmp	; \
-	mov.w	99f, reg	; \
-	add	reg, tmp	; \
-	mov.l	@tmp, reg	; \
-	bra	98f		; \
-	 mov	#FUTEX_WAIT, tmp ; \
-99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
-98:	or	tmp, reg
-# endif
-# define LOAD_PRIVATE_FUTEX_WAKE(reg,tmp,tmp2) \
-	stc	gbr, tmp	; \
-	mov.w	99f, reg	; \
-	add	reg, tmp	; \
-	mov.l	@tmp, reg	; \
-	bra	98f		; \
-	 mov	#FUTEX_WAKE, tmp ; \
-99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
-98:	or	tmp, reg
-# if FUTEX_WAIT == 0
-#  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \
-	stc	gbr, tmp	; \
-	mov.w	99f, tmp2	; \
-	add	tmp2, tmp	; \
-	mov.l	@tmp, tmp2	; \
-	bra	98f		; \
-	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
-99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
-98:	extu.b	tmp, tmp	; \
-	xor	tmp, reg	; \
-	and	tmp2, reg
-# else
-#  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \
-	stc	gbr, tmp	; \
-	mov.w	99f, tmp2	; \
-	add	tmp2, tmp	; \
-	mov.l	@tmp, tmp2	; \
-	bra	98f		; \
-	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
-99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
-98:	extu.b	tmp, tmp	; \
-	xor	tmp, reg	; \
-	and	tmp2, reg	; \
-	mov	#FUTEX_WAIT, tmp ; \
-	or	tmp, reg
-# endif
-# define LOAD_FUTEX_WAIT_ABS(reg,tmp,tmp2) \
-	stc	gbr, tmp	; \
-	mov.w	99f, tmp2	; \
-	add	tmp2, tmp	; \
-	mov.l	@tmp, tmp2	; \
-	bra	98f		; \
-	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
-99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
-98:	extu.b	tmp, tmp	; \
-	xor	tmp, reg	; \
-	and	tmp2, reg	; \
-	mov	#FUTEX_WAIT_BITSET, tmp ; \
-	mov	#(FUTEX_CLOCK_REALTIME >> 8), tmp2; \
-	swap.b	tmp2, tmp2; \
-	or	tmp2, tmp; \
-	or	tmp, reg
-# define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \
-	stc	gbr, tmp	; \
-	mov.w	99f, tmp2	; \
-	add	tmp2, tmp	; \
-	mov.l	@tmp, tmp2	; \
-	bra	98f		; \
-	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
-99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
-98:	extu.b	tmp, tmp	; \
-	xor	tmp, reg	; \
-	and	tmp2, reg	; \
-	mov	#FUTEX_WAKE, tmp ; \
-	or	tmp, reg
-#endif
-
-	.globl	__lll_lock_wait_private
-	.type	__lll_lock_wait_private,@function
-	.hidden	__lll_lock_wait_private
-	.align	5
-	cfi_startproc
-__lll_lock_wait_private:
-	mov.l	r8, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r8, 0)
-	mov	r4, r6
-	mov	r5, r8
-	mov	#0, r7		/* No timeout.  */
-	LOAD_PRIVATE_FUTEX_WAIT (r5, r0, r1)
-
-	mov	#2, r4
-	cmp/eq	r4, r6
-	bf	2f
-
-1:
-	mov	r8, r4
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-2:
-	mov	#2, r6
-	XCHG (r6, @r8, r2)
-	tst	r2, r2
-	bf	1b
-
-	mov.l	@r15+, r8
-	rts
-	 mov	r2, r0
-	cfi_endproc
-	.size	__lll_lock_wait_private,.-__lll_lock_wait_private
-
-#ifdef NOT_IN_libc
-	.globl	__lll_lock_wait
-	.type	__lll_lock_wait,@function
-	.hidden	__lll_lock_wait
-	.align	5
-	cfi_startproc
-__lll_lock_wait:
-	mov.l	r9, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r9, 0)
-	mov.l	r8, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r8, 0)
-	mov	r6, r9
-	mov	r4, r6
-	mov	r5, r8
-	mov	#0, r7		/* No timeout.  */
-	mov	r9, r5
-	LOAD_FUTEX_WAIT (r5, r0, r1)
-
-	mov	#2, r4
-	cmp/eq	r4, r6
-	bf	2f
-
-1:
-	mov	r8, r4
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-2:
-	mov	#2, r6
-	XCHG (r6, @r8, r2)
-	tst	r2, r2
-	bf	1b
-
-	mov.l	@r15+, r8
-	mov.l	@r15+, r9
-	ret
-	 mov	r2, r0
-	cfi_endproc
-	.size	__lll_lock_wait,.-__lll_lock_wait
-
-	/*      r5  (r8): futex
-		r7 (r11): flags
-		r6  (r9): timeout
-		r4 (r10): futex value
-	*/
-	.globl	__lll_timedlock_wait
-	.type	__lll_timedlock_wait,@function
-	.hidden	__lll_timedlock_wait
-	.align	5
-	cfi_startproc
-__lll_timedlock_wait:
-	mov.l	r12, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r12, 0)
-
-# ifndef __ASSUME_FUTEX_CLOCK_REALTIME
-	mov.l	.Lhave, r1
-#  ifdef __PIC__
-	mova	.Lgot, r0
-	mov.l	.Lgot, r12
-	add	r0, r12
-	add	r12, r1
-#  endif
-	mov.l	@r1, r0
-	tst	r0, r0
-	bt	.Lreltmo
-# endif
-
-	mov	r4, r2
-	mov	r5, r4
-	mov	r7, r5
-	mov	r6, r7
-	LOAD_FUTEX_WAIT_ABS (r5, r0, r1)
-
-	mov	#2, r6
-	cmp/eq	r6, r2
-	bf/s	2f
-	 mov	r6, r2
-
-1:
-	mov	#2, r6
-	mov	#-1, r1
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x16
-	SYSCALL_INST_PAD
-	mov	r0, r6
-
-2:
-	XCHG	(r2, @r4, r3)	/* NB:   lock is implied */
-
-	tst	r3, r3
-	bt/s	3f
-	 mov	r6, r0
-
-	cmp/eq	#-ETIMEDOUT, r0
-	bt	4f
-	cmp/eq	#-EINVAL, r0
-	bf	1b
-4:
-	neg	r0, r3
-3:
-	mov	r3, r0
-	rts
-	 mov.l	@r15+, r12
-
-	.align	2
-# ifndef __ASSUME_FUTEX_CLOCK_REALTIME
-# ifdef __PIC__
-.Lgot:
-	.long	_GLOBAL_OFFSET_TABLE_
-.Lhave:
-	.long	__have_futex_clock_realtime@GOTOFF
-# else
-.Lhave:
-	.long	__have_futex_clock_realtime
-# endif
-
-.Lreltmo:
-	/* Check for a valid timeout value.  */
-	mov.l	@(4,r6), r1
-	mov.l	.L1g, r0
-	cmp/hs	r0, r1
-	bt	3f
-
-	mov.l	r11, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r11, 0)
-	mov.l	r10, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r10, 0)
-	mov.l	r9, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r9, 0)
-	mov.l	r8, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r8, 0)
-	mov	r7, r11
-	mov	r4, r10
-	mov	r6, r9
-	mov	r5, r8
-
-	/* Stack frame for the timespec and timeval structs.  */
-	add	#-8, r15
-	cfi_adjust_cfa_offset(8)
-
-	mov	#2, r2
-	XCHG (r2, @r8, r3)
-
-	tst	r3, r3
-	bt	6f
-
-1:
-	/* Get current time.  */
-	mov	r15, r4
-	mov	#0, r5
-	mov	#__NR_gettimeofday, r3
-	trapa	#0x12
-	SYSCALL_INST_PAD
-
-	/* Compute relative timeout.  */
-	mov.l	@(4,r15), r0
-	mov.w	.L1k, r1
-	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */
-	mov.l	@r9, r2
-	mov.l	@(4,r9), r3
-	mov.l	@r15, r0
-	sts	macl, r1
-	sub	r0, r2
-	clrt
-	subc	r1, r3
-	bf	4f
-	mov.l	.L1g, r1
-	add	r1, r3
-	add	#-1, r2
-4:
-	cmp/pz	r2
-	bf	2f		/* Time is already up.  */
-
-	mov.l	r2, @r15	/* Store relative timeout.  */
-	mov.l	r3, @(4,r15)
-
-	mov	r8, r4
-	mov	r11, r5
-	LOAD_FUTEX_WAIT (r5, r0, r1)
-	mov	r10, r6
-	mov	r15, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	mov	r0, r5
-
-	mov	#2, r2
-	XCHG (r2, @r8, r3)
-
-	tst	r3, r3
-	bt/s	6f
-	 mov	#-ETIMEDOUT, r1
-	cmp/eq	r5, r1
-	bf	1b
-
-2:	mov	#ETIMEDOUT, r3
-
-6:
-	mov	r3, r0
-	add	#8, r15
-	mov.l	@r15+, r8
-	mov.l	@r15+, r9
-	mov.l	@r15+, r10
-	mov.l	@r15+, r11
-	rts
-	 mov.l	@r15+, r12
-
-3:
-	mov.l	@r15+, r12
-	rts
-	 mov	#EINVAL, r0
-# endif
-	cfi_endproc
-
-.L1k:
-	.word	1000
-	.align	2
-.L1g:
-	.long	1000000000
-
-	.size	__lll_timedlock_wait,.-__lll_timedlock_wait
-#endif
-
-	.globl	__lll_unlock_wake_private
-	.type	__lll_unlock_wake_private,@function
-	.hidden	__lll_unlock_wake_private
-	.align	5
-	cfi_startproc
-__lll_unlock_wake_private:
-	LOAD_PRIVATE_FUTEX_WAKE (r5, r0, r1)
-	mov	#1, r6		/* Wake one thread.  */
-	mov	#0, r7
-	mov.l	r7, @r4		/* Stores 0.  */
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	rts
-	 nop
-	cfi_endproc
-	.size	__lll_unlock_wake_private,.-__lll_unlock_wake_private
-
-#ifdef NOT_IN_libc
-	.globl	__lll_unlock_wake
-	.type	__lll_unlock_wake,@function
-	.hidden	__lll_unlock_wake
-	.align	5
-	cfi_startproc
-__lll_unlock_wake:
-	LOAD_FUTEX_WAKE (r5, r0, r1)
-	mov	#1, r6		/* Wake one thread.  */
-	mov	#0, r7
-	mov.l	r7, @r4		/* Stores 0.  */
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	rts
-	 nop
-	cfi_endproc
-	.size	__lll_unlock_wake,.-__lll_unlock_wake
-
-	.globl	__lll_timedwait_tid
-	.type	__lll_timedwait_tid,@function
-	.hidden	__lll_timedwait_tid
-	.align	5
-	cfi_startproc
-__lll_timedwait_tid:
-	mov.l	r9, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r9, 0)
-	mov.l	r8, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r8, 0)
-	mov	r4, r8
-	mov	r5, r9
-
-	/* Stack frame for the timespec and timeval structs.  */
-	add	#-8, r15
-	cfi_adjust_cfa_offset(8)
-
-2:
-	/* Get current time.  */
-	mov	r15, r4
-	mov	#0, r5
-	mov	#__NR_gettimeofday, r3
-	trapa	#0x12
-	SYSCALL_INST_PAD
-
-	/* Compute relative timeout.  */
-	mov.l	@(4,r15), r0
-	mov.w	.L1k2, r1
-	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */
-	mov.l	@r9, r2
-	mov.l	@(4,r9), r3
-	mov.l	@r15, r0
-	sts	macl, r1
-	sub	r0, r2
-	clrt
-	subc	r1, r3
-	bf	5f
-	mov.l	.L1g2, r1
-	add	r1, r3
-	add	#-1, r2
-5:
-	cmp/pz	r2
-	bf	6f		/* Time is already up.  */
-
-	mov.l	r2, @r15	/* Store relative timeout.  */
-	mov.l	r3, @(4,r15)
-
-	mov.l	@r8, r2
-	tst	r2, r2
-	bt	4f
-
-	mov	r8, r4
-	/* XXX The kernel so far uses global futex for the wakeup at
-	   all times.  */
-	mov	#0, r5
-	extu.b	r5, r5
-	mov	r2, r6
-	mov	r15, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	mov.l	@r8, r2
-	tst	r2, r2
-	bf	1f
-4:
-	mov	#0, r0
-3:
-	add	#8, r15
-	mov.l	@r15+, r8
-	rts
-	 mov.l	@r15+, r9
-1:
-	/* Check whether the time expired.  */
-	mov	#-ETIMEDOUT, r1
-	cmp/eq	r0, r1
-	bf	2b
-6:
-	bra	3b
-	 mov	#ETIMEDOUT, r0
-	cfi_endproc
-
-.L1k2:
-	.word	1000
-	.align	2
-.L1g2:
-	.long	1000000000
-	.size	__lll_timedwait_tid,.-__lll_timedwait_tid
-#endif

+ 203 - 329
libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h

@@ -1,5 +1,4 @@
-/* Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009
+/* Copyright (C) 2005-2013 Free Software Foundation, Inc.
-   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    This file is part of the GNU C Library.
 
 
    The GNU C Library is free software; you can redistribute it and/or
    The GNU C Library is free software; you can redistribute it and/or
@@ -9,27 +8,29 @@
 
 
    The GNU C Library is distributed in the hope that it will be useful,
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
    Lesser General Public License for more details.
    Lesser General Public License for more details.
 
 
    You should have received a copy of the GNU Lesser General Public
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
+   License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
    <http://www.gnu.org/licenses/>.  */
 
 
 #ifndef _LOWLEVELLOCK_H
 #ifndef _LOWLEVELLOCK_H
 #define _LOWLEVELLOCK_H	1
 #define _LOWLEVELLOCK_H	1
 
 
-#ifndef __ASSEMBLER__
 #include <time.h>
 #include <time.h>
 #include <sys/param.h>
 #include <sys/param.h>
 #include <bits/pthreadtypes.h>
 #include <bits/pthreadtypes.h>
+#include <atomic.h>
+#include <sysdep.h>
 #include <bits/kernel-features.h>
 #include <bits/kernel-features.h>
-#endif
 
 
 #define FUTEX_WAIT		0
 #define FUTEX_WAIT		0
 #define FUTEX_WAKE		1
 #define FUTEX_WAKE		1
+#define FUTEX_REQUEUE		3
 #define FUTEX_CMP_REQUEUE	4
 #define FUTEX_CMP_REQUEUE	4
 #define FUTEX_WAKE_OP		5
 #define FUTEX_WAKE_OP		5
+#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1)
 #define FUTEX_LOCK_PI		6
 #define FUTEX_LOCK_PI		6
 #define FUTEX_UNLOCK_PI		7
 #define FUTEX_UNLOCK_PI		7
 #define FUTEX_TRYLOCK_PI	8
 #define FUTEX_TRYLOCK_PI	8
@@ -40,13 +41,11 @@
 
 
 #define FUTEX_BITSET_MATCH_ANY	0xffffffff
 #define FUTEX_BITSET_MATCH_ANY	0xffffffff
 
 
-#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1)
-
 /* Values for 'private' parameter of locking macros.  Yes, the
 /* Values for 'private' parameter of locking macros.  Yes, the
    definition seems to be backwards.  But it is not.  The bit will be
    definition seems to be backwards.  But it is not.  The bit will be
    reversed before passing to the system call.  */
    reversed before passing to the system call.  */
-#define LLL_PRIVATE    0
+#define LLL_PRIVATE	0
-#define LLL_SHARED     FUTEX_PRIVATE_FLAG
+#define LLL_SHARED	FUTEX_PRIVATE_FLAG
 
 
 
 
 #if !defined NOT_IN_libc || defined IS_IN_rtld
 #if !defined NOT_IN_libc || defined IS_IN_rtld
@@ -73,347 +72,222 @@
 # endif
 # endif
 #endif
 #endif
 
 
-#ifndef __ASSEMBLER__
 
 
-/* Initializer for compatibility lock.  */
+#define lll_futex_wait(futexp, val, private) \
-#define LLL_LOCK_INITIALIZER		(0)
+  lll_futex_timed_wait(futexp, val, NULL, private)
-#define LLL_LOCK_INITIALIZER_LOCKED	(1)
+
-#define LLL_LOCK_INITIALIZER_WAITERS	(2)
+#define lll_futex_timed_wait(futexp, val, timespec, private) \
-
+  ({									      \
-extern int __lll_lock_wait_private (int val, int *__futex)
+    INTERNAL_SYSCALL_DECL (__err);					      \
-  attribute_hidden;
+    long int __ret;							      \
-extern int __lll_lock_wait (int val, int *__futex, int private)
+    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \
-  attribute_hidden;
+			      __lll_private_flag (FUTEX_WAIT, private),	      \
-extern int __lll_timedlock_wait (int val, int *__futex,
+			      (val), (timespec));			      \
-				 const struct timespec *abstime, int private)
+    __ret;								      \
-  attribute_hidden;
+  })
-extern int __lll_robust_lock_wait (int val, int *__futex, int private)
+
-  attribute_hidden;
+#define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \
-extern int __lll_robust_timedlock_wait (int val, int *__futex,
+  ({									\
-					const struct timespec *abstime,
+    INTERNAL_SYSCALL_DECL (__err);					\
-					int private)
+    long int __ret;							\
-  attribute_hidden;
+    int __op = FUTEX_WAIT_BITSET | clockbit;				\
-extern int __lll_unlock_wake_private (int *__futex) attribute_hidden;
+    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		\
-extern int __lll_unlock_wake (int *__futex, int private) attribute_hidden;
+			      __lll_private_flag (__op, private),	\
-
+			      (val), (timespec), NULL /* Unused.  */,	\
-#define lll_trylock(futex) \
+			      FUTEX_BITSET_MATCH_ANY);			\
-  ({ unsigned char __ret; \
+    __ret;								\
-     __asm__ __volatile__ ("\
+  })
-	.align 2\n\
+
-	mova 1f,r0\n\
+#define lll_futex_wake(futexp, nr, private) \
-	nop\n\
+  ({									      \
-	mov r15,r1\n\
+    INTERNAL_SYSCALL_DECL (__err);					      \
-	mov #-8,r15\n\
+    long int __ret;							      \
-     0: mov.l @%1,r2\n\
+    __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp),		      \
-	cmp/eq r2,%3\n\
+			      __lll_private_flag (FUTEX_WAKE, private),	      \
-	bf 1f\n\
+			      (nr), 0);					      \
-	mov.l %2,@%1\n\
+    __ret;								      \
-     1: mov r1,r15\n\
+  })
-	mov #-1,%0\n\
+
-	negc %0,%0"\
+#define lll_robust_dead(futexv, private) \
-	: "=r" (__ret) \
+  do									      \
-	: "r" (&(futex)), \
+    {									      \
-	  "r" (LLL_LOCK_INITIALIZER_LOCKED), \
+      int *__futexp = &(futexv);					      \
-	  "r" (LLL_LOCK_INITIALIZER) \
+      atomic_or (__futexp, FUTEX_OWNER_DIED);				      \
-	: "r0", "r1", "r2", "t", "memory"); \
+      lll_futex_wake (__futexp, 1, private);				      \
-     __ret; })
+    }									      \
-
+  while (0)
-#define lll_robust_trylock(futex, id)	\
+
-  ({ unsigned char __ret; \
+/* Returns non-zero if error happened, zero if success.  */
-     __asm__ __volatile__ ("\
+#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \
-	.align 2\n\
+  ({									      \
-	mova 1f,r0\n\
+    INTERNAL_SYSCALL_DECL (__err);					      \
-	nop\n\
+    long int __ret;							      \
-	mov r15,r1\n\
+    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \
-	mov #-8,r15\n\
+			      __lll_private_flag (FUTEX_CMP_REQUEUE, private),\
-     0: mov.l @%1,r2\n\
+			      (nr_wake), (nr_move), (mutex), (val));	      \
-	cmp/eq r2,%3\n\
+    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \
-	bf 1f\n\
+  })
-	mov.l %2,@%1\n\
+
-     1: mov r1,r15\n\
+
-	mov #-1,%0\n\
+/* Returns non-zero if error happened, zero if success.  */
-	negc %0,%0"\
+#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \
-	: "=r" (__ret) \
+  ({									      \
-	: "r" (&(futex)), \
+    INTERNAL_SYSCALL_DECL (__err);					      \
-	  "r" (id), \
+    long int __ret;							      \
-	  "r" (LLL_LOCK_INITIALIZER) \
+    __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp),		      \
-	: "r0", "r1", "r2", "t", "memory"); \
+			      __lll_private_flag (FUTEX_WAKE_OP, private),    \
-     __ret; })
+			      (nr_wake), (nr_wake2), (futexp2),		      \
-
+			      FUTEX_OP_CLEAR_WAKE_IF_GT_ONE);		      \
-#define lll_cond_trylock(futex) \
+    INTERNAL_SYSCALL_ERROR_P (__ret, __err);				      \
-  ({ unsigned char __ret; \
+  })
-     __asm__ __volatile__ ("\
+
-	.align 2\n\
+
-	mova 1f,r0\n\
+#define lll_trylock(lock)	\
-	nop\n\
+  atomic_compare_and_exchange_val_acq(&(lock), 1, 0)
-	mov r15,r1\n\
+
-	mov #-8,r15\n\
+#define lll_cond_trylock(lock)	\
-     0: mov.l @%1,r2\n\
+  atomic_compare_and_exchange_val_acq(&(lock), 2, 0)
-	cmp/eq r2,%3\n\
+
-	bf 1f\n\
+#define __lll_robust_trylock(futex, id) \
-	mov.l %2,@%1\n\
+  (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0)
-     1: mov r1,r15\n\
+#define lll_robust_trylock(lock, id) \
-	mov #-1,%0\n\
+  __lll_robust_trylock (&(lock), id)
-	negc %0,%0"\
+
-	: "=r" (__ret) \
+extern void __lll_lock_wait_private (int *futex) attribute_hidden;
-	: "r" (&(futex)), \
+extern void __lll_lock_wait (int *futex, int private) attribute_hidden;
-	  "r" (LLL_LOCK_INITIALIZER_WAITERS), \
+extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden;
-	  "r" (LLL_LOCK_INITIALIZER) \
+
-	: "r0", "r1", "r2", "t", "memory"); \
+#define __lll_lock(futex, private)					      \
-     __ret; })
+  ((void) ({								      \
-
+    int *__futex = (futex);						      \
-#define lll_lock(futex, private) \
+    if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex,       \
-  (void) ({ int __ret, *__futex = &(futex); \
+								1, 0), 0))    \
-	    __asm__ __volatile__ ("\
+      {									      \
-		.align 2\n\
+	if (__builtin_constant_p (private) && (private) == LLL_PRIVATE)	      \
-		mova 1f,r0\n\
+	  __lll_lock_wait_private (__futex);				      \
-		nop\n\
+	else								      \
-		mov r15,r1\n\
+	  __lll_lock_wait (__futex, private);				      \
-		mov #-8,r15\n\
+      }									      \
-	     0: mov.l @%2,%0\n\
+  }))
-		tst %0,%0\n\
+#define lll_lock(futex, private) __lll_lock (&(futex), private)
-		bf 1f\n\
+
-		mov.l %1,@%2\n\
-	     1: mov r1,r15"\
-		: "=&r" (__ret) : "r" (1), "r" (__futex) \
-		: "r0", "r1", "t", "memory"); \
-	    if (__ret) \
-	      { \
-		if (__builtin_constant_p (private) \
-		    && (private) == LLL_PRIVATE) \
-		  __lll_lock_wait_private (__ret, __futex); \
-	        else \
-		  __lll_lock_wait (__ret, __futex, (private));	\
-	      } \
-    })
 
 
+#define __lll_robust_lock(futex, id, private)				      \
+  ({									      \
+    int *__futex = (futex);						      \
+    int __val = 0;							      \
+									      \
+    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \
+								0), 0))	      \
+      __val = __lll_robust_lock_wait (__futex, private);		      \
+    __val;								      \
+  })
 #define lll_robust_lock(futex, id, private) \
 #define lll_robust_lock(futex, id, private) \
-  ({ int __ret, *__futex = &(futex); \
+  __lll_robust_lock (&(futex), id, private)
-     __asm__ __volatile__ ("\
+
-	.align 2\n\
+
-	mova 1f,r0\n\
+#define __lll_cond_lock(futex, private)					      \
-	nop\n\
+  ((void) ({								      \
-	mov r15,r1\n\
+    int *__futex = (futex);						      \
-	mov #-8,r15\n\
+    if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0))		      \
-      0: mov.l @%2,%0\n\
+      __lll_lock_wait (__futex, private);				      \
-	tst %0,%0\n\
+  }))
-	bf 1f\n\
+#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private)
-	mov.l %1,@%2\n\
+
-      1: mov r1,r15"\
-	: "=&r" (__ret) : "r" (id), "r" (__futex) \
-	: "r0", "r1", "t", "memory"); \
-     if (__ret) \
-       __ret = __lll_robust_lock_wait (__ret, __futex, private); \
-     __ret; })
-
-/* Special version of lll_mutex_lock which causes the unlock function to
-   always wakeup waiters.  */
-#define lll_cond_lock(futex, private) \
-  (void) ({ int __ret, *__futex = &(futex); \
-	    __asm__ __volatile__ ("\
-		.align 2\n\
-		mova 1f,r0\n\
-		nop\n\
-		mov r15,r1\n\
-		mov #-8,r15\n\
-	     0: mov.l @%2,%0\n\
-		tst %0,%0\n\
-		bf 1f\n\
-		mov.l %1,@%2\n\
-	     1: mov r1,r15"\
-		: "=&r" (__ret) : "r" (2), "r" (__futex) \
-		: "r0", "r1", "t", "memory"); \
-	    if (__ret) \
-	      __lll_lock_wait (__ret, __futex, private); })
 
 
 #define lll_robust_cond_lock(futex, id, private) \
 #define lll_robust_cond_lock(futex, id, private) \
-  ({ int __ret, *__futex = &(futex); \
+  __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private)
-     __asm__ __volatile__ ("\
-	.align 2\n\
-	mova 1f,r0\n\
-	nop\n\
-	mov r15,r1\n\
-	mov #-8,r15\n\
-     0: mov.l @%2,%0\n\
-	tst %0,%0\n\
-	bf 1f\n\
-	mov.l %1,@%2\n\
-     1: mov r1,r15"\
-	: "=&r" (__ret) : "r" (id | FUTEX_WAITERS), "r" (__futex) \
-	: "r0", "r1", "t", "memory"); \
-      if (__ret) \
-	__ret = __lll_robust_lock_wait (__ret, __futex, private); \
-      __ret; })
-
-#define lll_timedlock(futex, timeout, private) \
-  ({ int __ret, *__futex = &(futex); \
-     __asm__ __volatile__ ("\
-	.align 2\n\
-	mova 1f,r0\n\
-	nop\n\
-	mov r15,r1\n\
-	mov #-8,r15\n\
-     0: mov.l @%2,%0\n\
-	tst %0,%0\n\
-	bf 1f\n\
-	mov.l %1,@%2\n\
-     1: mov r1,r15"\
-	: "=&r" (__ret) : "r" (1), "r" (__futex) \
-	: "r0", "r1", "t", "memory"); \
-    if (__ret) \
-      __ret = __lll_timedlock_wait (__ret, __futex, timeout, private); \
-    __ret; })
-
-#define lll_robust_timedlock(futex, timeout, id, private) \
-  ({ int __ret, *__futex = &(futex); \
-     __asm__ __volatile__ ("\
-	.align 2\n\
-	mova 1f,r0\n\
-	nop\n\
-	mov r15,r1\n\
-	mov #-8,r15\n\
-     0: mov.l @%2,%0\n\
-	tst %0,%0\n\
-	bf 1f\n\
-	mov.l %1,@%2\n\
-     1: mov r1,r15"\
-	: "=&r" (__ret) : "r" (id), "r" (__futex) \
-	: "r0", "r1", "t", "memory"); \
-    if (__ret) \
-      __ret = __lll_robust_timedlock_wait (__ret, __futex, \
-					      timeout, private); \
-    __ret; })
-
-#define lll_unlock(futex, private) \
-  (void) ({ int __ret, *__futex = &(futex); \
-	    __asm__ __volatile__ ("\
-		.align 2\n\
-		mova 1f,r0\n\
-		mov r15,r1\n\
-		mov #-6,r15\n\
-	     0: mov.l @%1,%0\n\
-		add #-1,%0\n\
-		mov.l %0,@%1\n\
-	     1: mov r1,r15"\
-		: "=&r" (__ret) : "r" (__futex) \
-		: "r0", "r1", "memory"); \
-	    if (__ret) \
-	      { \
-		if (__builtin_constant_p (private) \
-		    && (private) == LLL_PRIVATE) \
-		  __lll_unlock_wake_private (__futex); \
-	        else \
-		  __lll_unlock_wake (__futex, (private)); \
-	      } \
-    })
 
 
-#define lll_robust_unlock(futex, private) \
-  (void) ({ int __ret, *__futex = &(futex); \
-	    __asm__ __volatile__ ("\
-		.align 2\n\
-		mova 1f,r0\n\
-		mov r15,r1\n\
-		mov #-6,r15\n\
-	     0: mov.l @%1,%0\n\
-		and %2,%0\n\
-		mov.l %0,@%1\n\
-	     1: mov r1,r15"\
-		: "=&r" (__ret) : "r" (__futex), "r" (FUTEX_WAITERS) \
-		: "r0", "r1", "memory");	\
-	    if (__ret) \
-	      __lll_unlock_wake (__futex, private); })
-
-#define lll_robust_dead(futex, private)		       \
-  (void) ({ int __ignore, *__futex = &(futex); \
-	    __asm__ __volatile__ ("\
-		.align 2\n\
-		mova 1f,r0\n\
-		mov r15,r1\n\
-		mov #-6,r15\n\
-	     0: mov.l @%1,%0\n\
-		or %2,%0\n\
-		mov.l %0,@%1\n\
-	     1: mov r1,r15"\
-		: "=&r" (__ignore) : "r" (__futex), "r" (FUTEX_OWNER_DIED) \
-		: "r0", "r1", "memory");	\
-	    lll_futex_wake (__futex, 1, private); })
-
-# ifdef NEED_SYSCALL_INST_PAD
-#  define SYSCALL_WITH_INST_PAD "\
-	trapa #0x14; or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0"
-# else
-#  define SYSCALL_WITH_INST_PAD "\
-	trapa #0x14"
-# endif
 
 
-#define lll_futex_wait(futex, val, private) \
+extern int __lll_timedlock_wait (int *futex, const struct timespec *,
-  lll_futex_timed_wait (futex, val, NULL, private)
+				 int private) attribute_hidden;
+extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *,
+					int private) attribute_hidden;
+
+#define __lll_timedlock(futex, abstime, private)			      \
+  ({									      \
+     int *__futex = (futex);						      \
+     int __val = 0;							      \
+									      \
+     if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0))	      \
+       __val = __lll_timedlock_wait (__futex, abstime, private);	      \
+     __val;								      \
+  })
+#define lll_timedlock(futex, abstime, private) \
+  __lll_timedlock (&(futex), abstime, private)
 
 
 
 
-#define lll_futex_timed_wait(futex, val, timeout, private) \
+#define __lll_robust_timedlock(futex, abstime, id, private)		      \
   ({									      \
   ({									      \
-    int __status;							      \
+    int *__futex = (futex);						      \
-    register unsigned long __r3 __asm__ ("r3") = SYS_futex;			      \
+    int __val = 0;							      \
-    register unsigned long __r4 __asm__ ("r4") = (unsigned long) (futex);	      \
+									      \
-    register unsigned long __r5 __asm__ ("r5")				      \
+    if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id,  \
-      = __lll_private_flag (FUTEX_WAIT, private);			      \
+								0), 0))	      \
-    register unsigned long __r6 __asm__ ("r6") = (unsigned long) (val);	      \
+      __val = __lll_robust_timedlock_wait (__futex, abstime, private);	      \
-    register unsigned long __r7 __asm__ ("r7") = (unsigned long) (timeout);   \
+    __val;								      \
-    __asm__ __volatile__ (SYSCALL_WITH_INST_PAD				      \
-		      : "=z" (__status)					      \
-		      : "r" (__r3), "r" (__r4), "r" (__r5),		      \
-			"r" (__r6), "r" (__r7)				      \
-		      : "memory", "t");					      \
-    __status;								      \
   })
   })
+#define lll_robust_timedlock(futex, abstime, id, private) \
+  __lll_robust_timedlock (&(futex), abstime, id, private)
 
 
 
 
-#define lll_futex_wake(futex, nr, private) \
+#define __lll_unlock(futex, private) \
-  do {									      \
+  (void)							\
-    int __ignore;							      \
+    ({ int *__futex = (futex);					\
-    register unsigned long __r3 __asm__ ("r3") = SYS_futex;			      \
+       int __oldval = atomic_exchange_rel (__futex, 0);		\
-    register unsigned long __r4 __asm__ ("r4") = (unsigned long) (futex);	      \
+       if (__builtin_expect (__oldval > 1, 0))			\
-    register unsigned long __r5 __asm__ ("r5")				      \
+	 lll_futex_wake (__futex, 1, private);			\
-      = __lll_private_flag (FUTEX_WAKE, private);			      \
+    })
-    register unsigned long __r6 __asm__ ("r6") = (unsigned long) (nr);	      \
+#define lll_unlock(futex, private) __lll_unlock(&(futex), private)
-    register unsigned long __r7 __asm__ ("r7") = 0;				      \
+
-    __asm__ __volatile__ (SYSCALL_WITH_INST_PAD				      \
+
-		      : "=z" (__ignore)					      \
+#define __lll_robust_unlock(futex, private) \
-		      : "r" (__r3), "r" (__r4), "r" (__r5),		      \
+  (void)							\
-			"r" (__r6), "r" (__r7)				      \
+    ({ int *__futex = (futex);					\
-		      : "memory", "t");					      \
+       int __oldval = atomic_exchange_rel (__futex, 0);		\
-  } while (0)
+       if (__builtin_expect (__oldval & FUTEX_WAITERS, 0))	\
+	 lll_futex_wake (__futex, 1, private);			\
+    })
+#define lll_robust_unlock(futex, private) \
+  __lll_robust_unlock(&(futex), private)
 
 
 
 
 #define lll_islocked(futex) \
 #define lll_islocked(futex) \
-  (futex != LLL_LOCK_INITIALIZER)
+  (futex != 0)
+
+
+/* Our internal lock implementation is identical to the binary-compatible
+   mutex implementation. */
+
+/* Initializers for lock.  */
+#define LLL_LOCK_INITIALIZER		(0)
+#define LLL_LOCK_INITIALIZER_LOCKED	(1)
+
+/* The states of a lock are:
+    0  -  untaken
+    1  -  taken by one user
+   >1  -  taken by more users */
 
 
-/* The kernel notifies a process with uses CLONE_CLEARTID via futex
+/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex
    wakeup when the clone terminates.  The memory location contains the
    wakeup when the clone terminates.  The memory location contains the
    thread ID while the clone is running and is reset to zero
    thread ID while the clone is running and is reset to zero
-   afterwards.  */
+   afterwards.	*/
-
 #define lll_wait_tid(tid) \
 #define lll_wait_tid(tid) \
-  do {									      \
+  do {					\
-    __typeof (tid) __tid;						      \
+    __typeof (tid) __tid;		\
-    while ((__tid = (tid)) != 0)						      \
+    while ((__tid = (tid)) != 0)	\
-      lll_futex_wait (&(tid), __tid, LLL_SHARED);			      \
+      lll_futex_wait (&(tid), __tid, LLL_SHARED);\
   } while (0)
   } while (0)
 
 
-extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime)
+extern int __lll_timedwait_tid (int *, const struct timespec *)
      attribute_hidden;
      attribute_hidden;
-#define lll_timedwait_tid(tid, abstime) \
-  ({									      \
-    int __ret = 0;							      \
-    if (tid != 0)							      \
-      {									      \
-	if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)	      \
-	  __ret = EINVAL;						      \
-	else								      \
-	  __ret = __lll_timedwait_tid (&tid, abstime);		      \
-      }									      \
-    __ret; })
 
 
-#endif  /* !__ASSEMBLER__ */
+#define lll_timedwait_tid(tid, abstime) \
+  ({							\
+    int __res = 0;					\
+    if ((tid) != 0)					\
+      __res = __lll_timedwait_tid (&(tid), (abstime));	\
+    __res;						\
+  })
 
 
-#endif  /* lowlevellock.h */
+#endif	/* lowlevellock.h */

+ 0 - 264
libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S

@@ -1,264 +0,0 @@
-/* Copyright (C) 2003, 2004, 2005, 2006, 2007
-   Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <pthread-errnos.h>
-#include <lowlevellock.h>
-#include <lowlevelrobustlock.h>
-#include <bits/kernel-features.h>
-#include <tcb-offsets.h>
-#include "lowlevel-atomic.h"
-
-	.text
-
-#define FUTEX_WAITERS		0x80000000
-#define FUTEX_OWNER_DIED	0x40000000
-
-#ifdef __ASSUME_PRIVATE_FUTEX
-# define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \
-	mov	#(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), tmp; \
-	extu.b	tmp, tmp; \
-	xor	tmp, reg
-#else
-# if FUTEX_WAIT == 0
-#  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \
-	stc	gbr, tmp	; \
-	mov.w	99f, tmp2	; \
-	add	tmp2, tmp 	; \
-	mov.l	@tmp, tmp2	; \
-	bra	98f		; \
-	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
-99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
-98:	extu.b	tmp, tmp	; \
-	xor	tmp, reg	; \
-	and	tmp2, reg
-# else
-#  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \
-	stc	gbr, tmp	; \
-	mov.w	99f, tmp2	; \
-	add	tmp2, tmp 	; \
-	mov.l	@tmp, tmp2	; \
-	bra	98f		; \
-	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
-99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
-98:	extu.b	tmp, tmp	; \
-	xor	tmp, reg	; \
-	and	tmp2, reg	; \
-	mov	#FUTEX_WAIT, tmp ; \
-	or	tmp, reg
-# endif
-#endif
-
-	.globl	__lll_robust_lock_wait
-	.type	__lll_robust_lock_wait,@function
-	.hidden	__lll_robust_lock_wait
-	.align	5
-	cfi_startproc
-__lll_robust_lock_wait:
-	mov.l	r8, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r8, 0)
-	mov	r5, r8
-	mov	#0, r7		/* No timeout.  */
-	mov	r6, r5
-	LOAD_FUTEX_WAIT (r5, r0, r1)
-
-4:
-	mov	r4, r6
-	mov.l	.L_FUTEX_WAITERS, r0
-	or	r0, r6
-	shlr	r0		/* r0 = FUTEX_OWNER_DIED */
-	tst	r0, r4
-	bf/s	3f
-	 cmp/eq	r4, r6
-	bt	1f
-
-	CMPXCHG (r4, @r8, r6, r2)
-	bf	2f
-
-1:
-	mov	r8, r4
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	mov.l	@r8, r2
-
-2:
-	tst	r2, r2
-	bf/s	4b
-	 mov	r2, r4
-
-	stc	gbr, r1
-	mov.w	.Ltidoff, r2
-	add	r2, r1
-	mov.l	@r1, r6
-	mov	#0, r3
-	CMPXCHG (r3, @r8, r6, r4)
-	bf	4b
-	mov	#0, r4
-
-3:
-	mov.l	@r15+, r8
-	ret
-	 mov	r4, r0
-	cfi_endproc
-	.align	2
-.L_FUTEX_WAITERS:
-	.long	FUTEX_WAITERS
-.Ltidoff:
-	.word	TID - TLS_PRE_TCB_SIZE
-	.size	__lll_robust_lock_wait,.-__lll_robust_lock_wait
-
-
-	.globl	__lll_robust_timedlock_wait
-	.type	__lll_robust_timedlock_wait,@function
-	.hidden	__lll_robust_timedlock_wait
-	.align	5
-	cfi_startproc
-__lll_robust_timedlock_wait:
-	/* Check for a valid timeout value.  */
-	mov.l	@(4,r6), r1
-	mov.l	.L1g, r0
-	cmp/hs	r0, r1
-	bt	3f
-
-	mov.l	r11, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r11, 0)
-	mov.l	r10, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r10, 0)
-	mov.l	r9, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r9, 0)
-	mov.l	r8, @-r15
-	cfi_adjust_cfa_offset(4)
-	cfi_rel_offset (r8, 0)
-	mov	r7, r11
-	mov	r4, r10
-	mov	r6, r9
-	mov	r5, r8
-
-	/* Stack frame for the timespec and timeval structs.  */
-	add	#-8, r15
-	cfi_adjust_cfa_offset(8)
-
-1:
-	/* Get current time.  */
-	mov	r15, r4
-	mov	#0, r5
-	mov	#__NR_gettimeofday, r3
-	trapa	#0x12
-	SYSCALL_INST_PAD
-
-	/* Compute relative timeout.  */
-	mov.l	@(4,r15), r0
-	mov.w	.L1k, r1
-	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */
-	mov.l	@r9, r2
-	mov.l	@(4,r9), r3
-	mov.l	@r15, r0
-	sts	macl, r1
-	sub	r0, r2
-	clrt
-	subc	r1, r3
-	bf	4f
-	mov.l	.L1g, r1
-	add	r1, r3
-	add	#-1, r2
-4:
-	cmp/pz	r2
-	bf	8f		/* Time is already up.  */
-
-	mov.l	r2, @r15	/* Store relative timeout.  */
-	mov.l	r3, @(4,r15)
-
-	mov	r10, r6
-	mov.l	.L_FUTEX_WAITERS2, r0
-	or	r0, r6
-	shlr	r0		/* r0 = FUTEX_OWNER_DIED */
-	tst	r0, r4
-	bf/s	6f
-	 cmp/eq	r4, r6
-	bt	2f
-
-	CMPXCHG (r4, @r8, r6, r2)
-	bf/s	5f
-	 mov	#0, r5
-
-2:
-	mov	r8, r4
-	mov	r11, r5
-	LOAD_FUTEX_WAIT (r5, r0, r1)
-	mov	r10, r6
-	mov	r15, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	mov	r0, r5
-
-	mov.l	@r8, r2
-
-5:
-	tst	r2, r2
-	bf/s	7f
-	 mov	r2, r10
-
-	stc	gbr, r1
-	mov.w	.Ltidoff2, r2
-	add	r2, r1
-	mov.l	@r1, r4
-	mov	#0, r3
-	CMPXCHG (r3, @r8, r4, r10)
-	bf	7f
-	mov	#0, r0
-
-6:
-	add	#8, r15
-	mov.l	@r15+, r8
-	mov.l	@r15+, r9
-	mov.l	@r15+, r10
-	rts
-	 mov.l	@r15+, r11
-
-7:
-	/* Check whether the time expired.  */
-	mov	#-ETIMEDOUT, r1
-	cmp/eq	r5, r1
-	bf	1b
-
-8:
-	bra	6b
-	 mov	#ETIMEDOUT, r0
-3:
-	rts
-	 mov	#EINVAL, r0
-	cfi_endproc
-	.align	2
-.L_FUTEX_WAITERS2:
-	.long	FUTEX_WAITERS
-.L1g:
-	.long	1000000000
-.Ltidoff2:
-	.word	TID - TLS_PRE_TCB_SIZE
-.L1k:
-	.word	1000
-	.size	__lll_robust_timedlock_wait,.-__lll_robust_timedlock_wait

+ 0 - 215
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S

@@ -1,215 +0,0 @@
-/* Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <lowlevelbarrier.h>
-#include "lowlevel-atomic.h"
-
-	.text
-
-	.globl	pthread_barrier_wait
-	.type	pthread_barrier_wait,@function
-	.align	5
-pthread_barrier_wait:
-	mov.l	r9, @-r15
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	mov	r4, r8
-
-	/* Get the mutex.  */
-	mov	#0, r3
-	mov	#1, r4
-	CMPXCHG (r3, @(MUTEX,r8), r4, r2)
-	bf	1f
-
-	/* One less waiter.  If this was the last one needed wake
-	   everybody.  */
-2:
-	mov.l	@(LEFT,r8), r0
-	add	#-1, r0
-	mov.l	r0, @(LEFT,r8)
-	tst	r0, r0
-	bt	3f
-
-	/* There are more threads to come.  */
-	mov.l	@(CURR_EVENT,r8), r6
-
-	/* Release the mutex.  */
-	DEC (@(MUTEX,r8), r2)
-	tst	r2, r2
-	bf	6f
-7:
-	/* Wait for the remaining threads.  The call will return immediately
-	   if the CURR_EVENT memory has meanwhile been changed.  */
-	mov	r8, r4
-#if CURR_EVENT != 0
-	add	#CURR_EVENT, r4
-#endif
-#if FUTEX_WAIT == 0
-	mov.l	@(PRIVATE,r8), r5
-#else
-	mov	#FUTEX_WAIT, r5
-	mov.l	@(PRIVATE,r8), r0
-	or	r0, r5
-#endif
-	mov	#0, r7
-8:
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	/* Don't return on spurious wakeups.  The syscall does not change
-	   any register except r0 so there is no need to reload any of
-	   them.  */
-	mov.l	@(CURR_EVENT,r8), r0
-	cmp/eq	r0, r6
-	bt	8b
-
-	/* Increment LEFT.  If this brings the count back to the
-	   initial count unlock the object.  */
-	mov	#1, r3
-	mov.l	@(INIT_COUNT,r8), r4
-	XADD	(r3, @(LEFT,r8), r2, r5)
-	add	#-1, r4
-	cmp/eq	r2, r4
-	bf	10f
-
-	/* Release the mutex.  We cannot release the lock before
-	   waking the waiting threads since otherwise a new thread might
-	   arrive and gets waken up, too.  */
-	DEC (@(MUTEX,r8), r2)
-	tst	r2, r2
-	bf	9f
-
-10:
-	mov	#0, r0		/* != PTHREAD_BARRIER_SERIAL_THREAD */
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	rts
-	 mov.l	@r15+, r9
-
-3:
-	/* The necessary number of threads arrived.  */
-	mov.l	@(CURR_EVENT,r8), r1
-	add	#1, r1
-	mov.l	r1, @(CURR_EVENT,r8)
-
-	/* Wake up all waiters.  The count is a signed number in the kernel
-	   so 0x7fffffff is the highest value.  */
-	mov.l	.Lall, r6
-	mov	r8, r4
-#if CURR_EVENT != 0
-	add	#CURR_EVENT, r4
-#endif
-	mov	#0, r7
-	mov	#FUTEX_WAKE, r5
-	mov.l	@(PRIVATE,r8), r0
-	or	r0, r5
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	/* Increment LEFT.  If this brings the count back to the
-	   initial count unlock the object.  */
-	mov	#1, r3
-	mov.l	@(INIT_COUNT,r8), r4
-	XADD	(r3, @(LEFT,r8), r2, r5)
-	add	#-1, r4
-	cmp/eq	r2, r4
-	bf	5f
-
-	/* Release the mutex.  */
-	DEC (@(MUTEX,r8), r2)
-	tst	r2, r2
-	bf	4f
-5:
-	mov	#-1, r0		/* == PTHREAD_BARRIER_SERIAL_THREAD */
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	rts
-	 mov.l	@r15+, r9
-
-1:
-	mov.l	@(PRIVATE,r8), r6
-	mov	#LLL_SHARED, r0
-	extu.b	r0, r0
-	xor	r0, r6
-	mov	r2, r4
-	mov	r8, r5
-	mov.l	.Lwait0, r1
-	bsrf	r1
-	 add	#MUTEX, r5
-.Lwait0b:
-	bra	2b
-	 nop
-
-4:
-	mov.l	@(PRIVATE,r8), r5
-	mov	#LLL_SHARED, r0
-	extu.b	r0, r0
-	xor	r0, r5
-	mov	r8, r4
-	mov.l	.Lwake0, r1
-	bsrf	r1
-	 add	#MUTEX, r4
-.Lwake0b:
-	bra	5b
-	 nop
-
-6:
-	mov	r6, r9
-	mov.l	@(PRIVATE,r8), r5
-	mov	#LLL_SHARED, r0
-	extu.b	r0, r0
-	xor	r0, r5
-	mov	r8, r4
-	mov.l	.Lwake1, r1
-	bsrf	r1
-	 add	#MUTEX, r4
-.Lwake1b:
-	bra	7b
-	 mov	r9, r6
-
-9:	
-	mov	r6, r9
-	mov.l	@(PRIVATE,r8), r5
-	mov	#LLL_SHARED, r0
-	extu.b	r0, r0
-	xor	r0, r5
-	mov	r8, r4
-	mov.l	.Lwake2, r1
-	bsrf	r1
-	 add	#MUTEX, r4
-.Lwake2b:
-	bra	10b
-	 mov	r9, r6
-
-	.align	2
-.Lall:
-	.long	0x7fffffff
-.Lwait0:
-	.long	__lll_lock_wait-.Lwait0b
-.Lwake0:
-	.long	__lll_unlock_wake-.Lwake0b
-.Lwake1:
-	.long	__lll_unlock_wake-.Lwake1b
-.Lwake2:
-	.long	__lll_unlock_wake-.Lwake2b
-	.size	pthread_barrier_wait,.-pthread_barrier_wait

+ 0 - 262
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S

@@ -1,262 +0,0 @@
-/* Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <lowlevelcond.h>
-#include <bits/kernel-features.h>
-#include <pthread-pi-defines.h>
-#include <pthread-errnos.h>
-#include <tcb-offsets.h>
-#include "lowlevel-atomic.h"
-
-	.text
-
-	/* int pthread_cond_broadcast (pthread_cond_t *cond) */
-	.globl	__pthread_cond_broadcast
-	.type	__pthread_cond_broadcast, @function
-	.protected	__pthread_cond_broadcast
-	.align	5
-__pthread_cond_broadcast:
-	mov.l   r10, @-r15
-	mov.l   r9, @-r15
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	mov	r4, r8
-
-	/* Get internal lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if cond_lock != 0
-	CMPXCHG (r3, @(cond_lock,r8), r4, r2)
-#else
-	CMPXCHG (r3, @r8, r4, r2)
-#endif
-	bf	1f
-2:
-	mov.l	@(total_seq+4,r8),r0
-	mov.l	@(total_seq,r8),r1
-	mov.l	@(wakeup_seq+4,r8), r2
-	cmp/hi	r2, r0
-	bt	3f
-	cmp/hi	r0, r2
-	bt	4f
-	mov.l	@(wakeup_seq,r8), r2
-	cmp/hi	r2, r1
-	bf	4f
-
-3:
-	/* Cause all currently waiting threads to recognize they are
-	   woken up.  */
-	mov.l	r1, @(wakeup_seq,r8)
-	mov.l	r0, @(wakeup_seq+4,r8)
-	mov.l	r1, @(woken_seq,r8)
-	mov.l	r0, @(woken_seq+4,r8)
-	mov.l	@(broadcast_seq,r8), r2
-	add	#1, r2
-	mov.l	r2, @(broadcast_seq,r8)
-	add	r1, r1
-	mov	r1, r10
-	mov.l	r10, @(cond_futex,r8)
-
-	/* Get the address of the mutex used.  */
-	mov.l	@(dep_mutex,r8), r9
-
-	/* Unlock.  */
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bf	7f
-
-8:
-	/* Don't use requeue for pshared condvars.  */
-	mov	#-1, r0
-	cmp/eq	r0, r9
-	mov	r8, r4
-	bt/s	9f
-	 add	#cond_futex, r4
-
-	/* XXX: The kernel only supports FUTEX_CMP_REQUEUE to the same
-	   type of futex (private resp. shared).  */
-	mov.l	@(MUTEX_KIND,r9), r0
-	tst	#(PI_BIT|PS_BIT), r0
-	bf	9f
-
-	/* Wake up all threads.  */
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_CMP_REQUEUE, r0
-	or	r0, r5
-#endif
-	mov	#1, r6
-	mov	#-1, r7
-	shlr	r7		/* r7 = 0x7fffffff */
-	mov	r9, r0
-# if MUTEX_FUTEX != 0
-	add	#MUTEX_FUTEX, r0
-# endif
-	mov	r10, r1
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x16
-	SYSCALL_INST_PAD
-
-	/* For any kind of error, which mainly is EAGAIN, we try again
-	   with WAKE.  The general test also covers running on old
-	   kernels.  */
-	mov	r0, r1
-	mov	#-12, r2
-	shad	r2, r1
-	not	r1, r1
-	tst	r1, r1
-	mov	r8, r4
-	bt/s	9f
-	 add	#cond_futex, r4
-
-10:
-	mov	#0, r0
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r9
-	rts
-	 mov.l	@r15+, r10
-
-4:
-	/* Unlock.  */
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bf	5f
-6:
-	mov	#0, r0
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r9
-	rts
-	 mov.l	@r15+, r10
-
-1:
-	/* Initial locking failed.  */
-	mov	r8, r5
-#if cond_lock != 0
-	add	#cond_lock, r5
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r6
-	mov	#LLL_SHARED, r6
-99:
-	extu.b	r6, r6
-	mov.l	.Lwait5, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait5b:
-	bra	2b
-	 nop
-
-5:
-	/* Unlock in loop requires wakeup.  */
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lwake5, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lwake5b:
-	bra	6b
-	 nop
-
-7:
-	/* Unlock in loop requires wakeup.  */
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov	#-1, r0
-	cmp/eq	r0, r9
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lwake6, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lwake6b:
-	bra	8b
-	 nop
-
-9:
-	mov	#-1, r0
-	cmp/eq	r0, r9
-	bt/s	99f
-	 mov	#FUTEX_WAKE, r5
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAKE, r0
-	or	r0, r5
-#endif
-99:
-	mov	#-1, r6
-	shlr	r6		/* r6 = 0x7fffffff */
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	bra	10b
-	 nop
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-
-	.align	2
-.Lwait5:
-	.long	__lll_lock_wait-.Lwait5b
-.Lwake5:
-	.long	__lll_unlock_wake-.Lwake5b
-.Lwake6:
-	.long	__lll_unlock_wake-.Lwake6b
-	.size	__pthread_cond_broadcast, .-__pthread_cond_broadcast
-weak_alias (__pthread_cond_broadcast, pthread_cond_broadcast)

+ 0 - 189
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S

@@ -1,189 +0,0 @@
-/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <lowlevelcond.h>
-#include <bits/kernel-features.h>
-#include <pthread-errnos.h>
-#include <tcb-offsets.h>
-#include "lowlevel-atomic.h"
-
-	.text
-
-	/* int pthread_cond_signal (pthread_cond_t *cond) */
-	.globl	__pthread_cond_signal
-	.type	__pthread_cond_signal, @function
-	.protected	__pthread_cond_signal
-	.align	5
-__pthread_cond_signal:
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	mov	r4, r8
-
-	/* Get internal lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if cond_lock != 0
-	CMPXCHG (r3, @(cond_lock,r8), r4, r2)
-#else
-	CMPXCHG (r3, @r8, r4, r2)
-#endif
-	bf	1f
-2:
-	mov.l	@(total_seq+4,r8),r0
-	mov.l	@(total_seq,r8),r1
-	mov.l	@(wakeup_seq+4,r8), r2
-	cmp/hi	r2, r0
-	bt	3f
-	cmp/hi	r0, r2
-	bt	4f
-	mov.l	@(wakeup_seq,r8), r2
-	cmp/hi	r2, r1
-	bf	4f
-
-3:
-	/* Bump the wakeup number.  */
-	mov	#1, r2
-	mov	#0, r3
-	clrt
-	mov.l	@(wakeup_seq,r8),r0
-	mov.l	@(wakeup_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(wakeup_seq,r8)
-	mov.l	r1,@(wakeup_seq+4,r8)
-	mov.l	@(cond_futex,r8),r0
-	add	r2, r0
-	mov.l	r0,@(cond_futex,r8)
-
-	/* Wake up one thread.  */
-	mov	r8, r4
-	add	#cond_futex, r4
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bt/s	99f
-	 mov	#FUTEX_WAKE_OP, r5
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAKE_OP, r0
-	or	r0, r5
-#endif
-99:
-	mov	#1, r6
-	mov	#0, r7
-	mov	r8, r0
-	add	#cond_lock, r0
-	mov.l	.Lfutexop, r1
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	/* For any kind of error, we try again with WAKE.
-	   The general test also covers running on old kernels.  */
-	mov	r0, r1
-	mov	#-12, r2
-	shad	r2, r1
-	not	r1, r1
-	tst	r1, r1
-	bt	7f
-
-6:
-	mov	#0, r0
-	lds.l	@r15+, pr
-	rts
-	 mov.l	@r15+, r8
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-	.align	2
-.Lfutexop:
-	.long	FUTEX_OP_CLEAR_WAKE_IF_GT_ONE
-
-7:
-	/* r5 should be either FUTEX_WAKE_OP or
-	   FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG from the previous syscall.  */
-	mov	#(FUTEX_WAKE ^ FUTEX_WAKE_OP), r0
-	xor	r0, r5
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-4:
-	/* Unlock.  */
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bt	6b
-
-5:
-	/* Unlock in loop requires wakeup.  */
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:	
-	mov.l	.Lwake4, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lwake4b:
-	bra	6b
-	 nop
-
-1:
-	/* Initial locking failed.  */
-	mov	r8, r5
-#if cond_lock != 0
-	add	#cond_lock, r5
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r6
-	mov	#LLL_SHARED, r6
-99:	
-	extu.b	r6, r6
-	mov.l	.Lwait4, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait4b:
-	bra	2b
-	 nop
-
-	.align	2
-.Lwait4:
-	.long	__lll_lock_wait-.Lwait4b
-.Lwake4:
-	.long	__lll_unlock_wake-.Lwake4b
-	.size	__pthread_cond_signal, .-__pthread_cond_signal
-weak_alias (__pthread_cond_signal, pthread_cond_signal)

+ 0 - 860
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S

@@ -1,860 +0,0 @@
-/* Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <lowlevelcond.h>
-#include <pthread-errnos.h>
-#include <bits/kernel-features.h>
-#include <tcb-offsets.h>
-#include "lowlevel-atomic.h"
-
-	.text
-
-/* 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
-	.protected	__pthread_cond_timedwait
-	.align	5
-__pthread_cond_timedwait:
-.LSTARTCODE:
-	mov.l	r8, @-r15
-.Lpush_r8:
-	mov.l	r9, @-r15
-.Lpush_r9:
-	mov.l	r10, @-r15
-.Lpush_r10:
-	mov.l	r11, @-r15
-.Lpush_r11:
-	mov.l	r12, @-r15
-.Lpush_r12:
-	mov.l	r13, @-r15
-.Lpush_r13:
-	sts.l	pr, @-r15
-.Lpush_pr:
-	add	#-64, r15
-.Lalloc:
-	mov	r4, r8
-	mov	r5, r9
-	mov	r6, r13
-#ifdef __PIC__
-	mova	.Lgot0, r0
-	mov.l	.Lgot0, r12
-	add	r0, r12
-#endif
-
-	mov.l	@(4,r13), r0
-	mov.l	.L1g, r1
-	cmp/hs	r1, r0
-	bf	0f
-	bra	18f
-	 mov	#EINVAL, r0
-0:
-	/* Get internal lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if cond_lock != 0
-	CMPXCHG (r3, @(cond_lock,r8), r4, r2)
-#else
-	CMPXCHG (r3, @r8, r4, r2)
-#endif
-	bt	2f
-	bra	1f
-	 nop
-#ifdef __PIC__
-	.align	2
-.Lgot0:
-	.long	_GLOBAL_OFFSET_TABLE_
-#endif
-
-2:
-	/* Store the reference to the mutex.  If there is already a
-	   different value in there this is a bad user bug.  */
-	mov.l	@(dep_mutex,r8),r0
-	cmp/eq	#-1, r0
-	bt	17f
-	mov.l	r9, @(dep_mutex,r8)
-
-17:
-	/* Unlock the mutex.  */
-	mov.l	.Lmunlock1, r1
-	mov	#0, r5
-	bsrf	r1
-	 mov	r9, r4
-.Lmunlock1b:
-
-	tst	r0, r0
-	bt	0f
-	bra	16f
-	 nop
-0:
-	mov	#1, r2
-	mov	#0, r3
-
-	clrt
-	mov.l	@(total_seq,r8),r0
-	mov.l	@(total_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(total_seq,r8)
-	mov.l	r1,@(total_seq+4,r8)
-	mov.l	@(cond_futex,r8), r0
-	add	r2, r0
-	mov.l	r0, @(cond_futex,r8)
-	mov	#(1 << nwaiters_shift), r2
-	mov.l	@(cond_nwaiters,r8), r0
-	add	r2, r0
-	mov.l	r0, @(cond_nwaiters,r8)
-
-	/* Get and store current wakeup_seq value.  */
-	mov.l	@(wakeup_seq,r8), r10
-	mov.l	@(wakeup_seq+4,r8), r11
-	mov.l	@(broadcast_seq,r8), r0
-	mov.l	r0, @(4,r15)
-
-8:
-	/* Get current time.  */
-#ifdef __NR_clock_gettime
-	/* Get the clock number.	 */
-	mov.l	@(cond_nwaiters,r8), r4
-	mov	#((1 << nwaiters_shift) - 1), r0
-	and	r0, r4
-	/* Only clocks 0 and 1 are allowed.  Both are handled in the
-	   kernel.  */
-	mov	r15, r5
-	add	#16, r5
-	mov.w	.L__NR_clock_gettime, r3
-	trapa	#0x12
-	SYSCALL_INST_PAD
-# ifndef __ASSUME_POSIX_TIMERS
-	cmp/eq	#-ENOSYS, r0
-	bt	19f
-# endif
-
-	/* Compute relative timeout.  */
-	mov.l	@r13, r2
-	mov.l	@(4,r13), r3
-	mov.l	@(16,r15), r0
-	bra	0f
-	 mov.l	@(20,r15), r1
-.L__NR_clock_gettime:
-	.word	__NR_clock_gettime
-
-# ifndef __ASSUME_POSIX_TIMERS
-19:
-	mov	r15, r4
-	add	#16, r4
-	mov	#0, r5
-	mov	#__NR_gettimeofday, r3
-	trapa	#0x12
-	SYSCALL_INST_PAD
-
-	/* Compute relative timeout.  */
-	mov.l	@(20,r15), r0
-	mov.w	.L1k, r1
-	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */
-	mov.l	@r13, r2
-	mov.l	@(4,r13), r3
-	mov.l	@(16,r15), r0
-	sts	macl, r1
-#endif
-0:
-#else
-	mov	r15, r4
-	add	#16, r4
-	mov	#0, r5
-	mov	#__NR_gettimeofday, r3
-	trapa	#0x12
-	SYSCALL_INST_PAD
-
-	/* Compute relative timeout.  */
-	mov.l	@(20,r15), r0
-	mov.w	.L1k, r1
-	dmulu.l	r0, r1		/* Micro seconds to nano seconds.  */
-	mov.l	@r13, r2
-	mov.l	@(4,r13), r3
-	mov.l	@(16,r15), r0
-	sts	macl, r1
-#endif
-	sub	r0, r2
-	clrt
-	subc	r1, r3
-	bf	12f
-	mov.l	.L1g, r1
-	add	r1, r3
-	add	#-1, r2
-12:
-	mov	#-ETIMEDOUT, r1
-	mov.l	r1, @(12,r15)
-	cmp/pz	r2
-	bf	6f		/* Time is already up.  */
-
-	/* Store relative timeout.  */
-	mov.l	r2, @(16,r15)
-	mov.l	r3, @(20,r15)
-	mov.l	@(cond_futex,r8), r1
-	mov.l	r1, @(8,r15)
-
-	/* Unlock.  */
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bt	4f
-	bra	3f
-	 nop
-4:
-.LcleanupSTART:
-	mov.l	.Lenable1, r1
-	bsrf	r1
-	 nop
-.Lenable1b:
-	mov.l	r0, @r15
-
-	mov	r15, r7
-	add	#16, r7
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bt/s	99f
-	 mov	#FUTEX_WAIT, r5
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_WAIT|FUTEX_PRIVATE_FLAG), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAIT, r0
-	or	r0, r5
-#endif
-99:
-	mov.l	@(8,r15), r6
-	mov	r8, r4
-	add	#cond_futex, r4
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	mov.l	r0, @(12,r15)
-
-	mov.l	.Ldisable1, r1
-	bsrf	r1
-	 mov.l	@r15, r4
-.Ldisable1b:
-.LcleanupEND:
-
-	/* Lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if cond_lock != 0
-	CMPXCHG (r3, @(cond_lock,r8), r4, r2)
-#else
-	CMPXCHG (r3, @r8, r4, r2)
-#endif
-	bf	5f
-6:
-	mov.l	@(broadcast_seq,r8), r0
-	mov.l	@(4,r15), r1
-	cmp/eq	r0, r1
-	bf	23f
-
-	mov.l	@(woken_seq,r8), r0
-	mov.l	@(woken_seq+4,r8), r1
-
-	mov.l	@(wakeup_seq,r8), r2
-	mov.l	@(wakeup_seq+4,r8), r3
-
-	cmp/eq	r3, r11
-	bf	7f
-	cmp/eq	r2, r10
-	bt	15f
-7:
-	cmp/eq	r1, r3
-	bf	9f
-	cmp/eq	r0, r2
-	bf	9f
-15:
-	mov.l	@(12,r15),r0
-	cmp/eq	#-ETIMEDOUT, r0
-	bf	8b
-
-	mov	#1, r2
-	mov	#0, r3
-
-	clrt
-	mov.l	@(wakeup_seq,r8),r0
-	mov.l	@(wakeup_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(wakeup_seq,r8)
-	mov.l	r1,@(wakeup_seq+4,r8)
-	mov.l	@(cond_futex,r8),r0
-	add	r2, r0
-	mov.l	r0,@(cond_futex,r8)
-	mov	#ETIMEDOUT, r0
-	bra	14f
-	 mov.l	r0, @(24,r15)
-
-23:
-	mov	#0, r0
-	bra	24f
-	 mov.l	r0, @(24,r15)
-
-9:
-	mov	#0, r0
-	mov.l	r0, @(24,r15)
-14:
-	mov	#1, r2
-	mov	#0, r3
-
-	clrt
-	mov.l	@(woken_seq,r8),r0
-	mov.l	@(woken_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(woken_seq,r8)
-	mov.l	r1,@(woken_seq+4,r8)
-
-24:
-	mov	#(1 << nwaiters_shift), r2
-	mov.l	@(cond_nwaiters,r8),r0
-	sub	r2, r0
-	mov.l	r0,@(cond_nwaiters,r8)
-
-	/* Wake up a thread which wants to destroy the condvar object.  */
-	mov.l	@(total_seq,r8),r0
-	mov.l	@(total_seq+4,r8),r1
-	and	r1, r0
-	not	r0, r0
-	cmp/eq	#0, r0
-	bf/s	25f
-	 mov	#((1 << nwaiters_shift) - 1), r1
-	not	r1, r1
-	mov.l	@(cond_nwaiters,r8),r0
-	tst	r1, r0
-	bf	25f
-
-	mov	r8, r4
-	add	#cond_nwaiters, r4
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bt/s	99f
-	 mov	#FUTEX_WAKE, r5
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAKE, r0
-	or	r0, r5
-#endif
-99:
-	mov	#1, r6
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-25:
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bf	10f
-
-11:
-	mov	r9, r4
-	mov.l	.Lmlocki1, r1
-	bsrf	r1
-	 nop
-.Lmlocki1b:
-
-	/* We return the result of the mutex_lock operation if it failed.  */
-	tst	r0, r0
-	bf	18f
-	mov.l	@(24,r15), r0
-
-18:
-	add	#64, r15
-	lds.l	@r15+, pr
-	mov.l	@r15+, r13
-	mov.l	@r15+, r12
-	mov.l	@r15+, r11
-	mov.l	@r15+, r10
-	mov.l	@r15+, r9
-	rts
-	 mov.l	@r15+, r8
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-.L1k:
-	.word	1000
-	.align	2
-.Lmunlock1:
-	.long	__pthread_mutex_unlock_usercnt-.Lmunlock1b
-.Lenable1:
-	.long	__pthread_enable_asynccancel-.Lenable1b
-.Ldisable1:
-	.long	__pthread_disable_asynccancel-.Ldisable1b
-.Lmlocki1:
-	.long	__pthread_mutex_cond_lock-.Lmlocki1b
-.L1g:
-	.long	1000000000
-
-1:
-	/* Initial locking failed.  */
-	mov	r8, r5
-#if cond_lock != 0
-	add	#cond_lock, r5
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r6
-	mov	#LLL_SHARED, r6
-99:
-	extu.b	r6, r6
-	mov.l	.Lwait2, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait2b:
-	bra	2b
-	 nop
-
-3:
-	/* Unlock in loop requires wakeup.  */
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lmwait2, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lmwait2b:
-	bra	4b
-	 nop
-
-5:
-	/* Locking in loop failed.  */
-	mov	r8, r5
-#if cond_lock != 0
-	add	#cond_lock, r5
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r6
-	mov	#LLL_SHARED, r6
-99:
-	extu.b	r6, r6
-	mov.l	.Lwait3, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait3b:
-	bra	6b
-	 nop
-
-10:
-	/* Unlock after loop requires wakeup.  */
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lmwait3, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lmwait3b:
-	bra	11b
-	 nop
-
-16:
-	/* The initial unlocking of the mutex failed.  */
-	mov.l	r0, @(24,r15)
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bf	17f
-
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lmwait4, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lmwait4b:
-17:
-	bra	18b
-	 mov.l	@(24,r15), r0
-
-	.align	2
-.Lwait2:
-	.long	__lll_lock_wait-.Lwait2b
-.Lmwait2:
-	.long	__lll_unlock_wake-.Lmwait2b
-.Lwait3:
-	.long	__lll_lock_wait-.Lwait3b
-.Lmwait3:
-	.long	__lll_unlock_wake-.Lmwait3b
-.Lmwait4:
-	.long	__lll_unlock_wake-.Lmwait4b
-	.size	__pthread_cond_timedwait, .-__pthread_cond_timedwait
-weak_alias (__pthread_cond_timedwait, pthread_cond_timedwait)
-
-
-	.type	__condvar_tw_cleanup, @function
-__condvar_tw_cleanup:
-	mov	r4, r11
-
-	/* Get internal lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if cond_lock != 0
-	CMPXCHG (r3, @(cond_lock,r8), r4, r2)
-#else
-	CMPXCHG (r3, @r8, r4, r2)
-#endif
-	bt	1f
-	 nop
-
-	mov	r8, r5
-#if cond_lock != 0
-	add	#cond_lock, r5
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r6
-	mov	#LLL_SHARED, r6
-99:
-	extu.b	r6, r6
-	mov.l	.Lwait5, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait5b:
-
-1:
-	mov.l	@(broadcast_seq,r8), r0
-	mov.l	@(4,r15), r1
-	cmp/eq	r0, r1
-	bf	3f
-
-	mov	#1, r2
-	mov	#0, r3
-
-	/* We increment the wakeup_seq counter only if it is lower than
-	   total_seq.  If this is not the case the thread was woken and
-	   then canceled.  In this case we ignore the signal.  */
-	mov.l	@(total_seq+4,r8), r0
-	mov.l	@(wakeup_seq+4,r8), r1
-	cmp/hi	r1, r0
-	bt/s	6f
-	 cmp/hi	r0, r1
-	bt	7f
-	mov.l	@(total_seq,r8), r0
-	mov.l	@(wakeup_seq,r8), r1
-	cmp/hs	r0, r1
-	bt	7f
-
-6:
-	clrt
-	mov.l	@(wakeup_seq,r8),r0
-	mov.l	@(wakeup_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(wakeup_seq,r8)
-	mov.l	r1,@(wakeup_seq+4,r8)
-	mov.l	@(cond_futex,r8),r0
-	add	r2, r0
-	mov.l	r0,@(cond_futex,r8)
-
-7:
-	clrt
-	mov.l	@(woken_seq,r8),r0
-	mov.l	@(woken_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(woken_seq,r8)
-	mov.l	r1,@(woken_seq+4,r8)
-
-3:
-	mov	#(1 << nwaiters_shift), r2
-	mov.l	@(cond_nwaiters,r8),r0
-	sub	r2, r0
-	mov.l	r0,@(cond_nwaiters,r8)
-
-	/* Wake up a thread which wants to destroy the condvar object.  */
-	mov	#0, r10
-	mov.l	@(total_seq,r8),r0
-	mov.l	@(total_seq+4,r8),r1
-	and	r1, r0
-	not	r0, r0
-	cmp/eq	#0, r0
-	bf/s	4f
-	 mov	#((1 << nwaiters_shift) - 1), r1
-	not	r1, r1
-	mov.l	@(cond_nwaiters,r8),r0
-	tst	r1, r0
-	bf	4f
-
-	mov	r8, r4
-	add	#cond_nwaiters, r4
-	mov	#FUTEX_WAKE, r5
-	mov	#1, r6
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	mov	#1, r10
-
-4:
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bt	2f
-
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lmwait5, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lmwait5b:
-
-2:
-	/* Wake up all waiters to make sure no signal gets lost.  */
-	tst	r10, r10
-	bf/s	5f
-	 mov	r8, r4
-	add	#cond_futex, r4
-	mov	#FUTEX_WAKE, r5
-	mov	#-1, r6
-	shlr	r6		/* r6 = 0x7fffffff */
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-5:
-        mov.l   .Lmlocki5, r1
-        bsrf    r1
-         mov     r9, r4
-.Lmlocki5b:
-
-.LcallUR:
-	mov.l	.Lresume, r1
-#ifdef __PIC__
-	add	r12, r1
-#endif
-	jsr	@r1
-	 mov	r11, r4
-	sleep
-
-	.align	2
-.Lwait5:
-	.long   __lll_lock_wait-.Lwait5b
-.Lmwait5:
-        .long   __lll_unlock_wake-.Lmwait5b
-.Lmlocki5:
-	.long   __pthread_mutex_cond_lock-.Lmlocki5b
-.Lresume:
-#ifdef __PIC__
-	.long	_Unwind_Resume@GOTOFF
-#else
-	.long	_Unwind_Resume
-#endif
-.LENDCODE:
-	.size	__condvar_tw_cleanup, .-__condvar_tw_cleanup
-
-
-	.section .gcc_except_table,"a",@progbits
-.LexceptSTART:
-	.byte	0xff				! @LPStart format (omit)
-	.byte	0xff				! @TType format (omit)
-	.byte	0x0b				! call-site format
-						! DW_EH_PE_sdata4
-	.uleb128 .Lcstend-.Lcstbegin
-.Lcstbegin:
-	.ualong	.LcleanupSTART-.LSTARTCODE
-	.ualong	.LcleanupEND-.LcleanupSTART
-	.ualong	__condvar_tw_cleanup-.LSTARTCODE
-	.uleb128  0
-	.ualong	.LcallUR-.LSTARTCODE
-	.ualong	.LENDCODE-.LcallUR
-	.ualong	0
-	.uleb128  0
-.Lcstend:
-
-	.section .eh_frame,"a",@progbits
-.LSTARTFRAME:
-	.ualong	.LENDCIE-.LSTARTCIE		! Length of the CIE.
-.LSTARTCIE:
-	.ualong	0				! CIE ID.
-	.byte	1				! Version number.
-#ifdef SHARED
-	.string	"zPLR"				! NUL-terminated augmentation
-						! string.
-#else
-	.string	"zPL"				! NUL-terminated augmentation
-						! string.
-#endif
-	.uleb128 1				! Code alignment factor.
-	.sleb128 -4				! Data alignment factor.
-	.byte	0x11				! Return address register
-						! column.
-#ifdef SHARED
-	.uleb128 7				! Augmentation value length.
-	.byte	0x9b				! Personality: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4
-						! + DW_EH_PE_indirect
-	.ualong	DW.ref.__gcc_personality_v0-.
-	.byte	0x1b				! LSDA Encoding: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4.
-	.byte	0x1b				! FDE Encoding: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4.
-#else
-	.uleb128 6				! Augmentation value length.
-	.byte	0x0				! Personality: absolute
-	.ualong	__gcc_personality_v0
-	.byte	0x0				! LSDA Encoding: absolute
-#endif
-	.byte 0x0c				! DW_CFA_def_cfa
-	.uleb128 0xf
-	.uleb128 0
-	.align 2
-.LENDCIE:
-
-	.ualong	.LENDFDE-.LSTARTFDE		! Length of the FDE.
-.LSTARTFDE:
-	.ualong	.LSTARTFDE-.LSTARTFRAME		! CIE pointer.
-#ifdef SHARED
-	.ualong	.LSTARTCODE-.			! PC-relative start address
-						! of the code.
-#else
-	.ualong	.LSTARTCODE			! Start address of the code.
-#endif
-	.ualong	.LENDCODE-.LSTARTCODE		! Length of the code.
-	.uleb128 4				! Augmentation size
-#ifdef SHARED
-	.ualong	.LexceptSTART-.
-#else
-	.ualong	.LexceptSTART
-#endif
-	.byte	0x4
-	.ualong	.Lpush_r8-.LSTARTCODE
-	.byte	0xe
-	.uleb128 4
-	.byte	0x88
-	.uleb128 1
-	.byte	0x4
-	.ualong	.Lpush_r9-.Lpush_r8
-	.byte	0xe
-	.uleb128 8
-	.byte	0x89
-	.uleb128 2
-	.byte	0x4
-	.ualong	.Lpush_r10-.Lpush_r9
-	.byte	0xe
-	.uleb128 12
-	.byte	0x8a
-	.uleb128 3
-	.byte	0x4
-	.ualong	.Lpush_r11-.Lpush_r10
-	.byte	0xe
-	.uleb128 16
-	.byte	0x8b
-	.uleb128 4
-	.byte	0x4
-	.ualong	.Lpush_r12-.Lpush_r11
-	.byte	0xe
-	.uleb128 20
-	.byte	0x8c
-	.uleb128 5
-	.byte	0x4
-	.ualong	.Lpush_r13-.Lpush_r12
-	.byte	0xe
-	.uleb128 24
-	.byte	0x8d
-	.uleb128 6
-	.byte	0x4
-	.ualong	.Lpush_pr-.Lpush_r13
-	.byte	0xe
-	.uleb128 28
-	.byte	0x91
-	.uleb128 7
-	.byte	0x4
-	.ualong	.Lalloc-.Lpush_pr
-	.byte	0xe
-	.uleb128 92
-	.align	2
-.LENDFDE:
-
-#ifdef SHARED
-	.hidden DW.ref.__gcc_personality_v0
-	.weak   DW.ref.__gcc_personality_v0
-	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
-	.align 4
-	.type   DW.ref.__gcc_personality_v0, @object
-	.size   DW.ref.__gcc_personality_v0, 4
-DW.ref.__gcc_personality_v0:
-	.long   __gcc_personality_v0
-#endif

+ 0 - 753
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S

@@ -1,753 +0,0 @@
-/* Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <lowlevelcond.h>
-#include <tcb-offsets.h>
-#include <bits/kernel-features.h>
-#include "lowlevel-atomic.h"
-
-	.text
-
-/* int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex)  */
-	.globl	__pthread_cond_wait
-	.type	__pthread_cond_wait, @function
-	.protected	__pthread_cond_wait
-	.align	5
-__pthread_cond_wait:
-.LSTARTCODE:
-	mov.l	r8, @-r15
-.Lpush_r8:
-	mov.l	r9, @-r15
-.Lpush_r9:
-	mov.l	r10, @-r15
-.Lpush_r10:
-	mov.l	r11, @-r15
-.Lpush_r11:
-	mov.l	r12, @-r15
-.Lpush_r12:
-	sts.l	pr, @-r15
-.Lpush_pr:
-	add	#-48, r15
-.Lalloc:
-	mov	r4, r8
-	mov	r5, r9
-#ifdef __PIC__
-	mova	.Lgot0, r0
-	mov.l	.Lgot0, r12
-	add	r0, r12
-#endif
-
-	/* Get internal lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if cond_lock != 0
-	CMPXCHG (r3, @(cond_lock,r8), r4, r2)
-#else
-	CMPXCHG (r3, @r8, r4, r2)
-#endif
-	bt	2f
-	bra	1f
-	 nop
-#ifdef __PIC__
-	.align	2
-.Lgot0:
-	.long	_GLOBAL_OFFSET_TABLE_
-#endif
-
-2:
-	/* Store the reference to the mutex.  If there is already a
-	   different value in there this is a bad user bug.  */
-	mov.l	@(dep_mutex,r8),r0
-	cmp/eq	#-1, r0
-	bt	15f
-	mov.l	r9, @(dep_mutex,r8)
-
-15:
-	/* Unlock the mutex.  */
-	mov.l	.Lmunlock0, r1
-	mov	#0, r5
-	bsrf	r1
-	 mov	r9, r4
-.Lmunlock0b:
-
-	tst	r0, r0
-	bt	0f
-	bra	12f
-	 nop
-0:
-	mov	#1, r2
-	mov	#0, r3
-
-	clrt
-	mov.l	@(total_seq,r8),r0
-	mov.l	@(total_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(total_seq,r8)
-	mov.l	r1,@(total_seq+4,r8)
-	mov.l	@(cond_futex,r8),r0
-	add	r2, r0
-	mov.l	r0,@(cond_futex,r8)
-	mov	#(1 << nwaiters_shift), r2
-	mov.l	@(cond_nwaiters,r8), r0
-	add	r2, r0
-	mov.l	r0, @(cond_nwaiters,r8)
-
-	/* Get and store current wakeup_seq value.  */
-	mov.l	@(wakeup_seq,r8), r10
-	mov.l	@(wakeup_seq+4,r8), r11
-	mov.l	@(broadcast_seq,r8), r0
-	mov.l	r0, @(4,r15)
-
-8:
-	mov.l	@(cond_futex,r8),r0
-	mov.l	r0, @(8,r15)
-
-	/* Unlock.  */
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bf	3f
-4:
-.LcleanupSTART:
-	mov.l	.Lenable0, r1
-	bsrf	r1
-	 nop
-.Lenable0b:
-	mov.l	r0, @r15
-
-	mov	#0, r7
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bt/s	99f
-	 mov	#FUTEX_WAIT, r5
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_WAIT|FUTEX_PRIVATE_FLAG), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff0, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAIT, r0
-	or	r0, r5
-#endif
-99:
-	mov.l	@(8,r15), r6
-	mov	r8, r4
-	add	#cond_futex, r4
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	mov.l	.Ldisable0, r1
-	bsrf	r1
-	 mov.l	@r15, r4
-.Ldisable0b:
-.LcleanupEND:
-
-	/* Lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if cond_lock != 0
-	CMPXCHG (r3, @(cond_lock,r8), r4, r2)
-#else
-	CMPXCHG (r3, @r8, r4, r2)
-#endif
-	bf	5f
-6:
-	mov.l	@(broadcast_seq,r8), r0
-	mov.l	@(4,r15), r1
-	cmp/eq	r0, r1
-	bf	16f
-
-	mov.l	@(woken_seq,r8), r0
-	mov.l	@(woken_seq+4,r8), r1
-
-	mov.l	@(wakeup_seq,r8), r2
-	mov.l	@(wakeup_seq+4,r8), r3
-
-	cmp/eq	r3, r11
-	bf	7f
-	cmp/eq	r2, r10
-	bt	8b
-7:
-	cmp/eq	r1, r3
-	bf	9f
-	cmp/eq	r0, r2
-	bt	8b
-9:
-	mov	#1, r2
-	mov	#0, r3
-
-	clrt
-	mov.l	@(woken_seq,r8),r0
-	mov.l	@(woken_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(woken_seq,r8)
-	mov.l	r1,@(woken_seq+4,r8)
-
-16:
-	mov	#(1 << nwaiters_shift), r2
-	mov.l	@(cond_nwaiters,r8),r0
-	sub	r2, r0
-	mov.l	r0,@(cond_nwaiters,r8)
-
-	/* Wake up a thread which wants to destroy the condvar object.  */
-	mov.l	@(total_seq,r8),r0
-	mov.l	@(total_seq+4,r8),r1
-	and	r1, r0
-	not	r0, r0
-	cmp/eq	#0, r0
-	bf/s	17f
-	 mov	#((1 << nwaiters_shift) - 1), r1
-	not	r1, r1
-	mov.l	@(cond_nwaiters,r8),r0
-	tst	r1, r0
-	bf	17f
-
-	mov	r8, r4
-	add	#cond_nwaiters, r4
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bt/s	99f
-	 mov	#FUTEX_WAKE, r5
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff0, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAKE, r0
-	or	r0, r5
-#endif
-99:
-	mov	#1, r6
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-17:
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bf	10f
-
-11:
-	mov.l	.Lmlocki0, r1
-	bsrf	r1
-	 mov	r9, r4
-.Lmlocki0b:
-	/* We return the result of the mutex_lock operation.  */
-
-14:
-	add	#48, r15
-	lds.l	@r15+, pr
-	mov.l	@r15+, r12
-	mov.l	@r15+, r11
-	mov.l	@r15+, r10
-	mov.l	@r15+, r9
-	rts
-	 mov.l	@r15+, r8
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff0:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-	.align	2
-.Lmunlock0:
-	.long	__pthread_mutex_unlock_usercnt-.Lmunlock0b
-.Lenable0:
-	.long	__pthread_enable_asynccancel-.Lenable0b
-.Ldisable0:
-	.long	__pthread_disable_asynccancel-.Ldisable0b
-.Lmlocki0:
-	.long	__pthread_mutex_cond_lock-.Lmlocki0b
-
-1:
-	/* Initial locking failed.  */
-	mov	r8, r5
-#if cond_lock != 0
-	add	#cond_lock, r5
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r6
-	mov	#LLL_SHARED, r6
-99:
-	extu.b	r6, r6
-	mov.l	.Lwait0, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait0b:
-	bra	2b
-	 nop
-3:
-	/* Unlock in loop requires waekup.  */
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lwake0, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lwake0b:
-	bra	4b
-	 nop
-
-5:
-	/* Locking in loop failed.  */
-	mov	r8, r5
-#if cond_lock != 0
-	add	#cond_lock, r5
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r6
-	mov	#LLL_SHARED, r6
-99:
-	extu.b	r6, r6
-	mov.l	.Lwait1, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait1b:
-	bra	6b
-	 nop
-
-10:
-	/* Unlock after loop requires wakeup.  */
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lwake1, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lwake1b:
-	bra	11b
-	 nop
-
-12:
-	/* The initial unlocking of the mutex failed.  */
-	mov.l	r0, @(12,r15)
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bf	13f
-
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lwake2, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lwake2b:
-
-13:
-	bra	14b
-	 mov.l	@(12,r15), r0
-
-	.align	2
-.Lwait0:
-	.long	__lll_lock_wait-.Lwait0b
-.Lwake0:
-	.long	__lll_unlock_wake-.Lwake0b
-.Lwait1:
-	.long	__lll_lock_wait-.Lwait1b
-.Lwake1:
-	.long	__lll_unlock_wake-.Lwake1b
-.Lwake2:
-	.long	__lll_unlock_wake-.Lwake2b
-	.size	__pthread_cond_wait, .-__pthread_cond_wait
-weak_alias (__pthread_cond_wait, pthread_cond_wait)
-
-
-	.type	__condvar_w_cleanup, @function
-__condvar_w_cleanup:
-	mov	r4, r11
-
-	/* Get internal lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if cond_lock != 0
-	CMPXCHG (r3, @(cond_lock,r8), r4, r2)
-#else
-	CMPXCHG (r3, @r8, r4, r2)
-#endif
-	bt	1f
-	 nop
-
-	mov	r8, r5
-#if cond_lock != 0
-	add	#cond_lock, r5
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r6
-	mov	#LLL_SHARED, r6
-99:
-	extu.b	r6, r6
-	mov.l	.Lwait3, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait3b:
-
-1:
-	mov.l	@(broadcast_seq,r8), r0
-	mov.l	@(4,r15), r1
-	cmp/eq	r0, r1
-	bf	3f
-
-	mov	#1, r2
-	mov	#0, r3
-
-	/* We increment the wakeup_seq counter only if it is lower than
-	   total_seq.  If this is not the case the thread was woken and
-	   then canceled.  In this case we ignore the signal.  */
-	mov.l	@(total_seq+4,r8), r0
-	mov.l	@(wakeup_seq+4,r8), r1
-	cmp/hi	r1, r0
-	bt/s	6f
-	 cmp/hi	r0, r1
-	bt	7f
-	mov.l	@(total_seq,r8), r0
-	mov.l	@(wakeup_seq,r8), r1
-	cmp/hs	r0, r1
-	bt	7f
-
-6:
-	clrt
-	mov.l	@(wakeup_seq,r8),r0
-	mov.l	@(wakeup_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(wakeup_seq,r8)
-	mov.l	r1,@(wakeup_seq+4,r8)
-	mov.l	@(cond_futex,r8),r0
-	add	r2, r0
-	mov.l	r0,@(cond_futex,r8)
-
-7:
-	clrt
-	mov.l	@(woken_seq,r8),r0
-	mov.l	@(woken_seq+4,r8),r1
-	addc	r2, r0
-	addc	r3, r1
-	mov.l	r0,@(woken_seq,r8)
-	mov.l	r1,@(woken_seq+4,r8)
-
-3:
-	mov	#(1 << nwaiters_shift), r2
-	mov.l	@(cond_nwaiters,r8),r0
-	sub	r2, r0
-	mov.l	r0,@(cond_nwaiters,r8)
-
-	/* Wake up a thread which wants to destroy the condvar object.  */
-	mov	#0, r10
-	mov.l	@(total_seq,r8),r0
-	mov.l	@(total_seq+4,r8),r1
-	and	r1, r0
-	not	r0, r0
-	cmp/eq	#0, r0
-	bf/s	4f
-	 mov	#((1 << nwaiters_shift) - 1), r1
-	not	r1, r1
-	mov.l	@(cond_nwaiters,r8),r0
-	tst	r1, r0
-	bf	4f
-
-	mov	r8, r4
-	add	#cond_nwaiters, r4
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bt/s	99f
-	 mov	#FUTEX_WAKE, r5
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff1, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAKE, r0
-	or	r0, r5
-#endif
-99:
-	mov	#1, r6
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	mov	#1, r10
-
-4:
-#if cond_lock != 0
-	DEC (@(cond_lock,r8), r2)
-#else
-	DEC (@r8, r2)
-#endif
-	tst	r2, r2
-	bt	2f
-
-	mov	r8, r4
-#if cond_lock != 0
-	add	#cond_lock, r4
-#endif
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bf/s	99f
-	 mov	#LLL_PRIVATE, r5
-	mov	#LLL_SHARED, r5
-99:
-	mov.l	.Lwake3, r1
-	bsrf	r1
-	 extu.b	r5, r5
-.Lwake3b:
-
-2:
-	/* Wake up all waiters to make sure no signal gets lost.  */
-	tst	r10, r10
-	bf/s	5f
-	 mov	r8, r4
-	add	#cond_futex, r4
-	mov.l	@(dep_mutex,r8), r0
-	cmp/eq	#-1, r0
-	bt/s	99f
-	 mov	#FUTEX_WAKE, r5
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_WAKE|FUTEX_PRIVATE_FLAG), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff1, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAKE, r0
-	or	r0, r5
-#endif
-99:
-	mov	#-1, r6
-	shlr	r6		/* r6 = 0x7fffffff */
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-5:
-        mov.l   .Lmlocki3, r1
-        bsrf    r1
-         mov     r9, r4
-.Lmlocki3b:
-
-.LcallUR:
-	mov.l	.Lresume, r1
-#ifdef __PIC__
-	add	r12, r1
-#endif
-	jsr	@r1
-	 mov	r11, r4
-	sleep
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff1:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-	.align	2
-.Lwait3:
-	.long   __lll_lock_wait-.Lwait3b
-.Lwake3:
-        .long   __lll_unlock_wake-.Lwake3b
-.Lmlocki3:
-	.long   __pthread_mutex_cond_lock-.Lmlocki3b
-.Lresume:
-#ifdef __PIC__
-	.long	_Unwind_Resume@GOTOFF
-#else
-	.long	_Unwind_Resume
-#endif
-.LENDCODE:
-	.size	__condvar_w_cleanup, .-__condvar_w_cleanup
-
-
-	.section .gcc_except_table,"a",@progbits
-.LexceptSTART:
-	.byte	0xff				! @LPStart format (omit)
-	.byte	0xff				! @TType format (omit)
-	.byte	0x0b				! call-site format
-						! DW_EH_PE_sdata4
-	.uleb128 .Lcstend-.Lcstbegin
-.Lcstbegin:
-	.ualong	.LcleanupSTART-.LSTARTCODE
-	.ualong	.LcleanupEND-.LcleanupSTART
-	.ualong	__condvar_w_cleanup-.LSTARTCODE
-	.uleb128  0
-	.ualong	.LcallUR-.LSTARTCODE
-	.ualong	.LENDCODE-.LcallUR
-	.ualong	0
-	.uleb128  0
-.Lcstend:
-
-	.section .eh_frame,"a",@progbits
-.LSTARTFRAME:
-	.ualong	.LENDCIE-.LSTARTCIE		! Length of the CIE.
-.LSTARTCIE:
-	.ualong	0				! CIE ID.
-	.byte	1				! Version number.
-#ifdef SHARED
-	.string	"zPLR"				! NUL-terminated augmentation
-						! string.
-#else
-	.string	"zPL"				! NUL-terminated augmentation
-						! string.
-#endif
-	.uleb128 1				! Code alignment factor.
-	.sleb128 -4				! Data alignment factor.
-	.byte	0x11				! Return address register
-						! column.
-#ifdef SHARED
-	.uleb128 7				! Augmentation value length.
-	.byte	0x9b				! Personality: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4
-						! + DW_EH_PE_indirect
-	.ualong	DW.ref.__gcc_personality_v0-.
-	.byte	0x1b				! LSDA Encoding: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4.
-	.byte	0x1b				! FDE Encoding: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4.
-#else
-	.uleb128 6				! Augmentation value length.
-	.byte	0x0				! Personality: absolute
-	.ualong	__gcc_personality_v0
-	.byte	0x0				! LSDA Encoding: absolute
-#endif
-	.byte 0x0c				! DW_CFA_def_cfa
-	.uleb128 0xf
-	.uleb128 0
-	.align 2
-.LENDCIE:
-
-	.ualong	.LENDFDE-.LSTARTFDE		! Length of the FDE.
-.LSTARTFDE:
-	.ualong	.LSTARTFDE-.LSTARTFRAME		! CIE pointer.
-#ifdef SHARED
-	.ualong	.LSTARTCODE-.			! PC-relative start address
-						! of the code.
-#else
-	.ualong	.LSTARTCODE			! Start address of the code.
-#endif
-	.ualong	.LENDCODE-.LSTARTCODE		! Length of the code.
-	.uleb128 4				! Augmentation size
-#ifdef SHARED
-	.ualong	.LexceptSTART-.
-#else
-	.ualong	.LexceptSTART
-#endif
-	.byte	0x4
-	.ualong	.Lpush_r8-.LSTARTCODE
-	.byte	0xe
-	.uleb128 4
-	.byte	0x88
-	.uleb128 1
-	.byte	0x4
-	.ualong	.Lpush_r9-.Lpush_r8
-	.byte	0xe
-	.uleb128 8
-	.byte	0x89
-	.uleb128 2
-	.byte	0x4
-	.ualong	.Lpush_r10-.Lpush_r9
-	.byte	0xe
-	.uleb128 12
-	.byte	0x8a
-	.uleb128 3
-	.byte	0x4
-	.ualong	.Lpush_r11-.Lpush_r10
-	.byte	0xe
-	.uleb128 16
-	.byte	0x8b
-	.uleb128 4
-	.byte	0x4
-	.ualong	.Lpush_r12-.Lpush_r11
-	.byte	0xe
-	.uleb128 20
-	.byte	0x8c
-	.uleb128 5
-	.byte	0x4
-	.ualong	.Lpush_pr-.Lpush_r12
-	.byte	0xe
-	.uleb128 24
-	.byte	0x91
-	.uleb128 6
-	.byte	0x4
-	.ualong	.Lalloc-.Lpush_pr
-	.byte	0xe
-	.uleb128 72
-	.align	2
-.LENDFDE:
-
-#ifdef SHARED
-	.hidden DW.ref.__gcc_personality_v0
-	.weak   DW.ref.__gcc_personality_v0
-	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
-	.align 4
-	.type   DW.ref.__gcc_personality_v0, @object
-	.size   DW.ref.__gcc_personality_v0, 4
-DW.ref.__gcc_personality_v0:
-	.long   __gcc_personality_v0
-#endif

+ 0 - 262
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.S

@@ -1,262 +0,0 @@
-/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <unwindbuf.h>
-#include <sysdep.h>
-#include <bits/kernel-features.h>
-#include <lowlevellock.h>
-#include <tcb-offsets.h>
-#include "lowlevel-atomic.h"
-
-
-	.comm	__fork_generation, 4, 4
-
-	.text
-	.globl	__pthread_once
-	.type	__pthread_once,@function
-	.protected	__pthread_once
-	.align	5
-	cfi_startproc
-__pthread_once:
-	mov.l	@r4, r0
-	tst	#2, r0
-	bt	1f
-	rts
-	 mov	#0, r0
-
-1:
-	mov.l	r12, @-r15
-	cfi_adjust_cfa_offset (4)
-	cfi_rel_offset (r12, 0)
-	mov.l	r9, @-r15
-	cfi_adjust_cfa_offset (4)
-	cfi_rel_offset (r9, 0)
-	mov.l	r8, @-r15
-	cfi_adjust_cfa_offset (4)
-	cfi_rel_offset (r8, 0)
-	sts.l	pr, @-r15
-	cfi_adjust_cfa_offset (4)
-	cfi_rel_offset (pr, 0)
-	mov	r5, r8
-	mov	r4, r9
-
-	/* Not yet initialized or initialization in progress.
-	   Get the fork generation counter now.  */
-6:
-	mov.l	@r4, r1
-	mova	.Lgot, r0
-	mov.l	.Lgot, r12
-	add	r0, r12
-
-5:
-	mov	r1, r0
-
-	tst	#2, r0
-	bf	4f
-
-	and	#3, r0
-	mov.l	.Lfgen, r2
-#ifdef __PIC__
-	add	r12, r2
-#endif
-	mov.l	@r2, r3
-	or	r3, r0
-	or	#1, r0
-	mov	r0, r3
-	mov	r1, r5
-
-	CMPXCHG (r5, @r4, r3, r2)
-	bf	5b
-
-	/* Check whether another thread already runs the initializer.  */
-	mov	r2, r0
-	tst	#1, r0
-	bt	3f	/* No -> do it.  */
-
-	/* Check whether the initializer execution was interrupted
-	   by a fork.  */
-	xor	r3, r0
-	mov	#-4, r1	/* -4 = 0xfffffffc */
-	tst	r1, r0
-	bf	3f	/* Different for generation -> run initializer.  */
-
-	/* Somebody else got here first.  Wait.  */
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r5
-# if FUTEX_WAIT != 0
-	mov	#FUTEX_WAIT, r0
-	or	r0, r5
-# endif
-#endif
-	mov	r3, r6
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	bra	6b
-	 nop
-
-	.align	2
-.Lgot:
-	.long	_GLOBAL_OFFSET_TABLE_
-#ifdef __PIC__
-.Lfgen:
-	.long	__fork_generation@GOTOFF
-#else
-.Lfgen:
-	.long	__fork_generation
-#endif
-
-3:
-	/* Call the initializer function after setting up the
-	   cancellation handler.  Note that it is not possible here
-	   to use the unwind-based cleanup handling.  This would require
-	   that the user-provided function and all the code it calls
-	   is compiled with exceptions.  Unfortunately this cannot be
-	   guaranteed.  */
-	add	#-UNWINDBUFSIZE, r15
-	cfi_adjust_cfa_offset (UNWINDBUFSIZE)
-
-	mov.l	.Lsigsetjmp, r1
-	mov	#UWJMPBUF, r4
-	add	r15, r4
-	bsrf	r1
-	 mov	#0, r5
-.Lsigsetjmp0:
-	tst	r0, r0
-	bf	7f
-
-	mov.l	.Lcpush, r1
-	bsrf	r1
-	 mov	r15, r4
-.Lcpush0:
-
-	/* Call the user-provided initialization function.  */
-	jsr	@r8
-	 nop
-
-	/* Pop the cleanup handler.  */
-	mov.l	.Lcpop, r1
-	bsrf	r1
-	 mov	r15, r4
-.Lcpop0:
-
-	add	#UNWINDBUFSIZE, r15
-	cfi_adjust_cfa_offset (-UNWINDBUFSIZE)
-
-	/* Sucessful run of the initializer.  Signal that we are done.  */
-	INC (@r9, r2)
-	/* Wake up all other threads.  */
-	mov	r9, r4
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5
-	extu.b	r5, r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAKE, r0
-	or	r0, r5
-#endif
-	mov	#-1, r6
-	shlr	r6		/* r6 = 0x7fffffff */
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-4:
-	lds.l	@r15+, pr
-	cfi_adjust_cfa_offset (-4)
-	cfi_restore (pr)
-	mov.l	@r15+, r8
-	cfi_adjust_cfa_offset (-4)
-	cfi_restore (r8)
-	mov.l	@r15+, r9
-	cfi_adjust_cfa_offset (-4)
-	cfi_restore (r9)
-	mov.l	@r15+, r12
-	cfi_adjust_cfa_offset (-4)
-	cfi_restore (r12)
-	rts
-	 mov	#0, r0
-
-7:
-	/* __sigsetjmp returned for the second time.  */
-	cfi_adjust_cfa_offset (UNWINDBUFSIZE+16)
-	cfi_offset (r12, -4)
-	cfi_offset (r9, -8)
-	cfi_offset (r8, -12)
-	cfi_offset (pr, -16)
-	mov	#0, r7
-	mov.l	r7, @r9
-	mov	r9, r4
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5
-#else
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r5
-	mov	#FUTEX_WAKE, r0
-	or	r0, r5
-#endif
-	extu.b	r5, r5
-	mov	#-1, r6
-	shlr	r6		/* r6 = 0x7fffffff */
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	mov.l	.Lunext, r1
-	bsrf	r1
-	 mov	r15, r4
-.Lunext0:
-	/* NOTREACHED */
-	sleep
-	cfi_endproc
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-	.align	2
-.Lsigsetjmp:
-	.long	__sigsetjmp@PLT-(.Lsigsetjmp0-.)
-.Lcpush:
-	.long	HIDDEN_JUMPTARGET(__pthread_register_cancel)-.Lcpush0
-.Lcpop:
-	.long	HIDDEN_JUMPTARGET(__pthread_unregister_cancel)-.Lcpop0
-.Lunext:
-	.long	HIDDEN_JUMPTARGET(__pthread_unwind_next)-.Lunext0
-	.size	__pthread_once,.-__pthread_once
-
-	.globl	__pthread_once_internal
-__pthread_once_internal = __pthread_once
-
-	.globl	pthread_once
-pthread_once = __pthread_once

+ 89 - 0
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_once.c

@@ -0,0 +1,89 @@
+/* Copyright (C) 2004-2013 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   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 "pthreadP.h"
+#include <lowlevellock.h>
+
+unsigned long int __fork_generation attribute_hidden;
+
+static void
+clear_once_control (void *arg)
+{
+  pthread_once_t *once_control = (pthread_once_t *) arg;
+
+  *once_control = 0;
+  lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE);
+}
+
+int
+__pthread_once (pthread_once_t *once_control, void (*init_routine) (void))
+{
+  for (;;)
+    {
+      int oldval;
+      int newval;
+
+      /* Pseudo code:
+	 newval = __fork_generation | 1;
+	 oldval = *once_control;
+	 if ((oldval & 2) == 0)
+	   *once_control = newval;
+	 Do this atomically.
+      */
+      do
+	{
+	  newval = __fork_generation | 1;
+	  oldval = *once_control;
+	  if (oldval & 2)
+	    break;
+	} while (atomic_compare_and_exchange_val_acq (once_control, newval, oldval) != oldval);
+
+      /* Check if the initializer has already been done.  */
+      if ((oldval & 2) != 0)
+	return 0;
+
+      /* Check if another thread already runs the initializer.	*/
+      if ((oldval & 1) == 0)
+	break;
+
+      /* Check whether the initializer execution was interrupted by a fork.  */
+      if (oldval != newval)
+	break;
+
+      /* Same generation, some other thread was faster. Wait.  */
+      lll_futex_wait (once_control, oldval, LLL_PRIVATE);
+    }
+
+  /* This thread is the first here.  Do the initialization.
+     Register a cleanup handler so that in case the thread gets
+     interrupted the initialization can be restarted.  */
+  pthread_cleanup_push (clear_once_control, once_control);
+
+  init_routine ();
+
+  pthread_cleanup_pop (0);
+
+  /* Say that the initialisation is done.  */
+  *once_control = __fork_generation | 2;
+
+  /* Wake up all other threads.  */
+  lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE);
+
+  return 0;
+}
+weak_alias (__pthread_once, pthread_once)
+strong_alias (__pthread_once, __pthread_once_internal)

+ 0 - 254
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S

@@ -1,254 +0,0 @@
-/* Copyright (C) 2003, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <tcb-offsets.h>
-#include <bits/kernel-features.h>
-#include "lowlevel-atomic.h"
-
-
-	.text
-
-	.globl	__pthread_rwlock_rdlock
-	.type	__pthread_rwlock_rdlock,@function
-	.protected	__pthread_rwlock_rdlock
-	.align	5
-__pthread_rwlock_rdlock:
-	mov.l	r12, @-r15
-	mov.l	r9, @-r15
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	mov	r4, r8
-
-	/* Get the lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if MUTEX == 0
-	CMPXCHG (r3, @r8, r4, r2)
-#else
-	CMPXCHG (r3, @(MUTEX,r8), r4, r2)
-#endif
-	bf	1f
-2:
-	mov.l	@(WRITER,r8), r0
-	tst	r0, r0
-	bf	14f
-	mov.l	@(WRITERS_QUEUED,r8), r0
-	tst	r0, r0
-	bt	5f
-	mov	#FLAGS, r0
-	mov.b	@(r0,r8), r0
-	tst	r0, r0
-	bt	5f
-3:
-	mov.l	@(READERS_QUEUED,r8), r0
-	add	#1, r0
-	mov.l	r0, @(READERS_QUEUED,r8)
-	tst	r0, r0
-	bt	4f
-
-	mov.l	@(READERS_WAKEUP,r8), r9
-
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	10f
-11:
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
-	xor	r0, r5
-	extu.b	r5, r5
-#else
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-# if FUTEX_WAIT != 0
-	mov	#FUTEX_WAIT, r0
-	or	r0, r5
-# endif
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r0
-	xor	r0, r5
-#endif
-	mov	r8, r4
-	add	#READERS_WAKEUP, r4
-	mov	r9, r6
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	/* Reget the lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if MUTEX == 0
-	CMPXCHG (r3, @r8, r4, r2)
-#else
-	CMPXCHG (r3, @(MUTEX,r8), r4, r2)
-#endif
-	bf	12f
-13:
-	mov.l	@(READERS_QUEUED,r8), r0
-	add	#-1, r0
-	bra	2b
-	 mov.l	r0, @(READERS_QUEUED,r8)
-
-5:
-	mov	#0, r3
-	mov.l	@(NR_READERS,r8), r0
-	add	#1, r0
-	mov.l	r0, @(NR_READERS,r8)
-	tst	r0, r0
-	bt	8f
-
-9:
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	6f
-7:
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r9
-	mov.l	@r15+, r12
-	rts
-	 mov	r3, r0
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-
-1:
-	mov	r8, r5
-#if MUTEX != 0
-	add	#MUTEX, r5
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r6
-	extu.b	r6, r6
-	mov.l	.Lwait0, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait0b:
-	bra	2b
-	 nop
-14:
-	stc	gbr, r1
-	mov.w	.Ltidoff, r2
-	add	r2, r1
-	mov.l	@r1, r1
-	cmp/eq	r1, r0
-	bf	3b
-	/* Deadlock detected.  */
-	bra	9b
-	 mov	#EDEADLK, r3
-
-.Ltidoff:
-	.word	TID - TLS_PRE_TCB_SIZE
-
-6:
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake0, r1
-	bsrf	r1
-	 nop
-.Lwake0b:
-	bra	7b
-	 mov	#0, r3
-
-8:
-	/* Overflow.  */
-	mov.l	@(NR_READERS,r8), r1
-	add	#-1, r1
-	mov.l	r1, @(NR_READERS,r8)
-	bra	9b
-	 mov	#EAGAIN, r3
-
-4:
-	/* Overflow.  */
-	mov.l	@(READERS_QUEUED,r8), r1
-	add	#-1, r1
-	mov.l	r1, @(READERS_QUEUED,r8)
-	bra	9b
-	 mov	#EAGAIN, r3
-
-10:
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake1, r1
-	bsrf	r1
-	 nop
-.Lwake1b:
-	bra	11b
-	 nop
-
-12:
-	mov	r8, r5
-#if MUTEX != 0
-	add	#MUTEX, r5
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r6
-	extu.b	r6, r6
-	mov.l	.Lwait1, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait1b:
-	bra	13b
-	 nop
-
-	.align	2
-.Lwait0:
-	.long	__lll_lock_wait-.Lwait0b
-.Lwake0:
-	.long	__lll_unlock_wake-.Lwake0b
-.Lwait1:
-	.long	__lll_lock_wait-.Lwait1b
-.Lwake1:
-	.long	__lll_unlock_wake-.Lwake1b
-	.size	__pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock
-
-	.globl	pthread_rwlock_rdlock
-pthread_rwlock_rdlock = __pthread_rwlock_rdlock
-
-	.globl	__pthread_rwlock_rdlock_internal
-__pthread_rwlock_rdlock_internal = __pthread_rwlock_rdlock

+ 0 - 313
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S

@@ -1,313 +0,0 @@
-/* Copyright (C) 2003, 2007, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <tcb-offsets.h>
-#include <bits/kernel-features.h>
-#include "lowlevel-atomic.h"
-
-
-	.text
-
-	.globl	pthread_rwlock_timedrdlock
-	.type	pthread_rwlock_timedrdlock,@function
-	.align	5
-pthread_rwlock_timedrdlock:
-	mov.l	r12, @-r15
-	mov.l	r10, @-r15
-	mov.l	r9, @-r15
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	add	#-8, r15
-	mov	r4, r8
-	mov	r5, r9
-
-	/* Get the lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if MUTEX == 0
-	CMPXCHG (r3, @r8, r4, r2)
-#else
-	CMPXCHG (r3, @(MUTEX,r8), r4, r2)
-#endif
-	bf	1f
-2:
-	mov.l	@(WRITER,r8), r0
-	tst	r0, r0
-	bf	14f
-	mov.l	@(WRITERS_QUEUED,r8), r0
-	tst	r0, r0
-	bt	5f
-	mov	#FLAGS, r0
-	mov.b	@(r0,r8), r0
-	tst	r0, r0
-	bt	5f
-3:
-	/* Check the value of the timeout parameter.  */
-	mov.l	.L1g0, r1
-	mov.l	@(4,r9), r0
-	cmp/hs	r1, r0
-	bt	19f
-
-	mov.l	@(READERS_QUEUED,r8), r0
-	add	#1, r0
-	mov.l	r0, @(READERS_QUEUED,r8)
-	tst	r0, r0
-	bt	4f
-
-	mov.l	@(READERS_WAKEUP,r8), r10
-
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	10f
-
-11:
-	/* Get current time.  */
-	mov	r15, r4
-	mov	#0, r5
-	mov	#__NR_gettimeofday, r3
-	trapa	#0x12
-	SYSCALL_INST_PAD
-
-	mov.l	@(4,r15), r0
-	mov.w	.L1k0, r1
-	dmulu.l	r0, r1		/* Milli seconds to nano seconds.  */
-	mov.l	@r9, r2
-	mov.l	@(4,r9), r3
-	mov.l	@r15, r0
-	sts	macl, r1
-	sub	r0, r2
-	clrt
-	subc	r1, r3
-	bf	15f
-	mov.l	.L1g0, r1
-	add	r1, r3
-	add	#-1, r2
-15:
-	cmp/pz	r2
-	bf	16f		/* Time is already up.  */
-
-	/* Store relative timeout.  */
-	mov.l	r2, @r15
-	mov.l	r3, @(4,r15)
-
-	/* Futex call.  */
-	mov	r15, r7
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
-	xor	r0, r5
-	extu.b	r5, r5
-#else
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-# if FUTEX_WAIT != 0
-	mov	#FUTEX_WAIT, r0
-	or	r0, r5
-# endif
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r0
-	xor	r0, r5
-#endif
-	mov	r10, r6
-	mov	r8, r4
-	add	#READERS_WAKEUP, r4
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	mov	r0, r3
-
-17:
-	/* Reget the lock.  */
-	mov	#0, r5
-	mov	#1, r4
-#if MUTEX == 0
-	CMPXCHG (r5, @r8, r4, r2)
-#else
-	CMPXCHG (r5, @(MUTEX,r8), r4, r2)
-#endif
-	bf	12f
-
-13:
-	mov.l	@(READERS_QUEUED,r8), r0
-	add	#-1, r0
-	mov.l	r0, @(READERS_QUEUED,r8)
-	mov	#-ETIMEDOUT, r0
-	cmp/eq	r0, r3
-	bf	2b
-
-18:
-	bra	9f
-	 mov	#ETIMEDOUT, r3
-
-5:
-	mov	#0, r3
-	mov.l	@(NR_READERS,r8), r0
-	add	#1, r0
-	mov.l	r0, @(NR_READERS,r8)
-	tst	r0, r0
-	bt	8f
-
-9:
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	6f
-7:
-	add	#8,r15
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r9
-	mov.l	@r15+, r10
-	mov.l	@r15+, r12
-	rts
-	 mov	r3, r0
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-	.align	2
-.L1k0:
-	.long	1000
-.L1g0:
-	.long	1000000000
-
-1:
-	mov	r8, r5
-#if MUTEX != 0
-	add	#MUTEX, r5
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r6
-	extu.b	r6, r6
-	mov.l	.Lwait2, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait2b:
-	bra	2b
-	 nop
-14:
-	stc	gbr, r1
-	mov.w	.Ltidoff, r2
-	add	r2, r1
-	mov.l	@r1, r1
-	cmp/eq	r1, r0
-	bf	3b
-	/* Deadlock detected.  */
-	bra	9b
-	 mov	#EDEADLK, r3
-
-.Ltidoff:
-	.word	TID - TLS_PRE_TCB_SIZE
-
-6:
-	mov	r3, r10
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake2, r1
-	bsrf	r1
-	 nop
-.Lwake2b:
-	bra	7b
-	 mov	r10, r3
-
-8:
-	/* Overflow.  */
-	mov.l	@(NR_READERS,r8), r1
-	add	#-1, r1
-	mov.l	r1, @(NR_READERS,r8)
-	bra	9b
-	 mov	#EAGAIN, r3
-
-4:
-	/* Overflow.  */
-	mov.l	@(READERS_QUEUED,r8), r1
-	add	#-1, r1
-	mov.l	r1, @(READERS_QUEUED,r8)
-	bra	9b
-	 mov	#EAGAIN, r3
-
-10:
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake3, r1
-	bsrf	r1
-	 nop
-.Lwake3b:
-	bra	11b
-	 nop
-
-12:
-	mov	r3, r10
-	mov	r8, r5
-#if MUTEX != 0
-	add	#MUTEX, r5
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r6
-	extu.b	r6, r6
-	mov.l	.Lwait3, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait3b:
-	bra	13b
-	 mov	r10, r3
-
-16:
-	bra	17b
-	 mov	#-ETIMEDOUT, r3
-
-19:
-	bra	9b
-	 mov	#EINVAL, r3
-
-	.align	2
-.Lwait2:
-	.long	__lll_lock_wait-.Lwait2b
-.Lwake2:
-	.long	__lll_unlock_wake-.Lwake2b
-.Lwait3:
-	.long	__lll_lock_wait-.Lwait3b
-.Lwake3:
-	.long	__lll_unlock_wake-.Lwake3b
-	.size	pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock

+ 0 - 297
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S

@@ -1,297 +0,0 @@
-/* Copyright (C) 2003, 2007, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <tcb-offsets.h>
-#include <bits/kernel-features.h>
-#include "lowlevel-atomic.h"
-
-
-	.text
-
-	.globl	pthread_rwlock_timedwrlock
-	.type	pthread_rwlock_timedwrlock,@function
-	.align	5
-pthread_rwlock_timedwrlock:
-	mov.l	r12, @-r15
-	mov.l	r10, @-r15
-	mov.l	r9, @-r15
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	add	#-8, r15
-	mov	r4, r8
-	mov	r5, r9
-
-	/* Get the lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if MUTEX == 0
-	CMPXCHG (r3, @r8, r4, r2)
-#else
-	CMPXCHG (r3, @(MUTEX,r8), r4, r2)
-#endif
-	bf	1f
-2:
-	mov.l	@(WRITER,r8), r0
-	tst	r0, r0
-	bf	14f
-	mov.l	@(NR_READERS,r8), r0
-	tst	r0, r0
-	bt	5f
-3:
-	/* Check the value of the timeout parameter.  */
-	mov.l	.L1g1, r1
-	mov.l	@(4,r9), r0
-	cmp/hs	r1, r0
-	bt	19f
-
-	mov.l	@(WRITERS_QUEUED,r8), r0
-	add	#1, r0
-	mov.l	r0, @(WRITERS_QUEUED,r8)
-	tst	r0, r0
-	bt	4f
-
-	mov.l	@(WRITERS_WAKEUP,r8), r10
-
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	10f
-
-11:
-	/* Get current time.  */
-	mov	r15, r4
-	mov	#0, r5
-	mov	#__NR_gettimeofday, r3
-	trapa	#0x12
-	SYSCALL_INST_PAD
-
-	mov.l	@(4,r15), r0
-	mov.w	.L1k1, r1
-	dmulu.l	r0, r1		/* Milli seconds to nano seconds.  */
-	mov.l	@r9, r2
-	mov.l	@(4,r9), r3
-	mov.l	@r15, r0
-	sts	macl, r1
-	sub	r0, r2
-	clrt
-	subc	r1, r3
-	bf	15f
-	mov.l	.L1g1, r1
-	add	r1, r3
-	add	#-1, r2
-15:
-	cmp/pz	r2
-	bf	16f		/* Time is already up.  */
-
-	/* Store relative timeout.  */
-	mov.l	r2, @r15
-	mov.l	r3, @(4,r15)
-
-	/* Futex call.  */
-	mov	r15, r7
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
-	xor	r0, r5
-	extu.b	r5, r5
-#else
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-# if FUTEX_WAIT != 0
-	mov	#FUTEX_WAIT, r0
-	or	r0, r5
-# endif
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r0
-	xor	r0, r5
-#endif
-	mov	r10, r6
-	mov	r8, r4
-	add	#WRITERS_WAKEUP, r4
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-	mov	r0, r3
-
-17:
-	/* Reget the lock.  */
-	mov	#0, r5
-	mov	#1, r4
-#if MUTEX == 0
-	CMPXCHG (r5, @r8, r4, r2)
-#else
-	CMPXCHG (r5, @(MUTEX,r8), r4, r2)
-#endif
-	bf	12f
-
-13:
-	mov.l	@(WRITERS_QUEUED,r8), r0
-	add	#-1, r0
-	mov.l	r0, @(WRITERS_QUEUED,r8)
-	mov	#-ETIMEDOUT, r0
-	cmp/eq	r0, r3
-	bf	2b
-
-18:
-	bra	9f
-	 mov	#ETIMEDOUT, r3
-
-19:
-	bra	9f
-	 mov	#EINVAL, r3
-
-5:
-	mov	#0, r3
-	stc	gbr, r0
-	mov.w	.Ltidoff, r1
-	mov.l	@(r0,r1), r0
-	mov.l	r0, @(WRITER,r8)
-9:
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	6f
-7:
-	add	#8,r15
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r9
-	mov.l	@r15+, r10
-	mov.l	@r15+, r12
-	rts
-	 mov	r3, r0
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-.L1k1:
-	.word	1000
-	.align	2
-.L1g1:
-	.long	1000000000
-
-1:
-	mov	r8, r5
-#if MUTEX != 0
-	add	#MUTEX, r5
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r6
-	extu.b	r6, r6
-	mov.l	.Lwait6, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait6b:
-	bra	2b
-	 nop
-14:
-	stc	gbr, r1
-	mov.w	.Ltidoff, r2
-	add	r2, r1
-	mov.l	@r1, r1
-	cmp/eq	r1, r0
-	bf	3b
-	bra	9b
-	 mov	#EDEADLK, r3
-6:
-	mov	r3, r10
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake6, r1
-	bsrf	r1
-	 nop
-.Lwake6b:
-	bra	7b
-	 mov	r10, r3
-
-.Ltidoff:
-	.word	TID - TLS_PRE_TCB_SIZE
-
-4:
-	/* Overflow.  */
-	mov.l	@(WRITERS_QUEUED,r8), r1
-	add	#-1, r1
-	mov.l	r1, @(WRITERS_QUEUED,r8)
-	bra	9b
-	 mov	#EAGAIN, r3
-
-10:
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake7, r1
-	bsrf	r1
-	 nop
-.Lwake7b:
-	bra	11b
-	 nop
-
-12:
-	mov	r3, r10
-	mov	r8, r5
-#if MUTEX != 0
-	add	#MUTEX, r5
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r6
-	extu.b	r6, r6
-	mov.l	.Lwait7, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait7b:
-	bra	13b
-	 mov	r10, r3
-
-16:
-	bra	17b
-	 mov	#-ETIMEDOUT, r3
-
-	.align	2
-.Lwait6:
-	.long	__lll_lock_wait-.Lwait6b
-.Lwake6:
-	.long	__lll_unlock_wake-.Lwake6b
-.Lwait7:
-	.long	__lll_lock_wait-.Lwait7b
-.Lwake7:
-	.long	__lll_unlock_wake-.Lwake7b
-	.size	pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock

+ 0 - 198
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S

@@ -1,198 +0,0 @@
-/* Copyright (C) 2003, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <bits/kernel-features.h>
-#include <tcb-offsets.h>
-#include "lowlevel-atomic.h"
-
-
-	.text
-
-	.globl	__pthread_rwlock_unlock
-	.type	__pthread_rwlock_unlock,@function
-	.protected	__pthread_rwlock_unlock
-	.align	5
-__pthread_rwlock_unlock:
-	mov.l	r12, @-r15
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	mov	r4, r8
-
-	/* Get the lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if MUTEX == 0
-	CMPXCHG (r3, @r8, r4, r2)
-#else
-	CMPXCHG (r3, @(MUTEX,r8), r4, r2)
-#endif
-	bf	1f
-2:
-	mov.l	@(WRITER,r8), r0
-	tst	r0, r0
-	bf	5f
-	mov.l	@(NR_READERS,r8), r0
-	add	#-1, r0
-	mov.l	r0, @(NR_READERS,r8)
-	tst	r0, r0
-	bf	6f
-5:
-	mov	#0, r0
-	mov.l	r0, @(WRITER,r8)
-	mov	#1, r6
-	mov	r8, r4
-	add	#WRITERS_WAKEUP, r4
-	mov.l	@(WRITERS_QUEUED,r8), r0
-	tst	r0, r0
-	bf	0f
-
-	/* If also no readers waiting nothing to do.  */
-	mov.l	@(READERS_QUEUED,r8), r0
-	tst	r0, r0
-	bt	6f
-
-	mov	#-1, r6
-	shlr	r6		/* r6 = 0x7fffffff */
-	mov	r8, r4
-	add	#READERS_WAKEUP, r4
-
-0:
-	mov.l	@r4, r0
-	add	#1, r0
-	mov.l	r0, @r4
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	7f
-
-8:
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r0
-	xor	r0, r5
-	extu.b	r5, r5
-#else
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov	#FUTEX_WAKE, r0
-	or	r0, r5
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r0
-	xor	r0, r5
-#endif
-	mov	#SYS_futex, r3
-	mov	#0, r7
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r12
-	rts
-	 mov	#0, r0
-6:
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	3f
-4:
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r12
-	rts
-	 mov	#0, r0
-
-1:
-	mov	r8, r5
-#if MUTEX != 0
-	add	#MUTEX, r5
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r6
-	extu.b	r6, r6
-	mov.l	.Lwait8, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait8b:
-	bra	2b
-	 nop
-3:
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake8, r1
-	bsrf	r1
-	 nop
-.Lwake8b:
-	bra	4b
-	 nop
-
-7:
-	mov.l	r4, @-r15
-	mov.l	r6, @-r15
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake9, r1
-	bsrf	r1
-	 nop
-.Lwake9b:
-
-	mov.l	@r15+, r6
-	bra	8b
-	 mov.l	@r15+, r4
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-	.align	2
-.Lwait8:
-	.long	__lll_lock_wait-.Lwait8b
-.Lwake8:
-	.long	__lll_unlock_wake-.Lwake8b
-.Lwake9:
-	.long	__lll_unlock_wake-.Lwake9b
-	.size	__pthread_rwlock_unlock,.-__pthread_rwlock_unlock
-
-	.globl	pthread_rwlock_unlock
-pthread_rwlock_unlock = __pthread_rwlock_unlock
-
-	.globl	__pthread_rwlock_unlock_internal
-__pthread_rwlock_unlock_internal = __pthread_rwlock_unlock

+ 0 - 234
libpthread/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S

@@ -1,234 +0,0 @@
-/* Copyright (C) 2003, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <tcb-offsets.h>
-#include <bits/kernel-features.h>
-#include "lowlevel-atomic.h"
-
-
-	.text
-
-	.globl	__pthread_rwlock_wrlock
-	.type	__pthread_rwlock_wrlock,@function
-	.protected	__pthread_rwlock_wrlock
-	.align	5
-__pthread_rwlock_wrlock:
-	mov.l	r12, @-r15
-	mov.l	r9, @-r15
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	mov	r4, r8
-
-	/* Get the lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if MUTEX == 0
-	CMPXCHG (r3, @r8, r4, r2)
-#else
-	CMPXCHG (r3, @(MUTEX,r8), r4, r2)
-#endif
-	bf	1f
-2:
-	mov.l	@(WRITER,r8), r0
-	tst	r0, r0
-	bf	14f
-	mov.l	@(NR_READERS,r8), r0
-	tst	r0, r0
-	bt	5f
-3:
-	mov.l	@(WRITERS_QUEUED,r8), r0
-	add	#1, r0
-	mov.l	r0, @(WRITERS_QUEUED,r8)
-	tst	r0, r0
-	bt	4f
-
-	mov.l	@(WRITERS_WAKEUP,r8), r9
-
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	10f
-11:
-	mov	r8, r4
-	add	#WRITERS_WAKEUP, r4
-#ifdef __ASSUME_PRIVATE_FUTEX
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
-	xor	r0, r5
-	extu.b	r5, r5
-#else
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-# if FUTEX_WAIT != 0
-	mov	#FUTEX_WAIT, r0
-	or	r0, r5
-# endif
-	stc	gbr, r1
-	mov.w	.Lpfoff, r2
-	add	r2, r1
-	mov.l	@r1, r0
-	xor	r0, r5
-#endif
-	mov	r9, r6
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	/* Reget the lock.  */
-	mov	#0, r3
-	mov	#1, r4
-#if MUTEX == 0
-	CMPXCHG (r3, @r8, r4, r2)
-#else
-	CMPXCHG (r3, @(MUTEX,r8), r4, r2)
-#endif
-	bf	12f
-13:
-	mov.l	@(WRITERS_QUEUED,r8), r0
-	add	#-1, r0
-	bra	2b
-	 mov.l	r0, @(WRITERS_QUEUED,r8)
-
-5:
-	mov	#0, r3
-	stc	gbr, r0
-	mov.w	.Ltidoff, r1
-	mov.l	@(r0,r1), r0
-	mov.l	r0, @(WRITER,r8)
-9:
-#if MUTEX == 0
-	DEC (@r8, r2)
-#else
-	DEC (@(MUTEX,r8), r2)
-#endif
-	tst	r2, r2
-	bf	6f
-7:
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r9
-	mov.l	@r15+, r12
-	rts
-	 mov	r3, r0
-
-1:
-	mov	r8, r5
-#if MUTEX != 0
-	add	#MUTEX, r5
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r6
-	extu.b	r6, r6
-	mov.l	.Lwait4, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait4b:
-	bra	2b
-	 nop
-14:
-	stc	gbr, r1
-	mov.w	.Ltidoff, r2
-	add	r2, r1
-	mov.l	@r1, r1
-	cmp/eq	r1, r0
-	bf	3b
-	bra	9b
-	 mov	#EDEADLK, r3
-6:
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake4, r1
-	bsrf	r1
-	 nop
-.Lwake4b:
-	bra	7b
-	 mov	#0, r3
-
-#ifndef __ASSUME_PRIVATE_FUTEX
-.Lpfoff:
-	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
-#endif
-.Ltidoff:
-	.word	TID - TLS_PRE_TCB_SIZE
-
-4:
-	mov.l	@(WRITERS_QUEUED,r8), r1
-	add	#-1, r1
-	mov.l	r1, @(WRITERS_QUEUED,r8)
-	bra	9b
-	 mov	#EAGAIN, r3
-
-10:
-	mov	r8, r4
-#if MUTEX != 0
-	add	#MUTEX, r4
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r5
-	extu.b	r5, r5
-	mov.l	.Lwake5, r1
-	bsrf	r1
-	 nop
-.Lwake5b:
-	bra	11b
-	 nop
-
-12:
-	mov	r8, r5
-#if MUTEX != 0
-	add	#MUTEX, r5
-#endif
-	mov	#PSHARED, r0
-	mov.b	@(r0,r8), r6
-	extu.b	r6, r6
-	mov.l	.Lwait5, r1
-	bsrf	r1
-	 mov	r2, r4
-.Lwait5b:
-	bra	13b
-	 nop
-
-	.align	2
-.Lwait4:
-	.long	__lll_lock_wait-.Lwait4b
-.Lwake4:
-	.long	__lll_unlock_wake-.Lwake4b
-.Lwait5:
-	.long	__lll_lock_wait-.Lwait5b
-.Lwake5:
-	.long	__lll_unlock_wake-.Lwake5b
-	.globl	pthread_rwlock_wrlock
-pthread_rwlock_wrlock = __pthread_rwlock_wrlock
-
-	.globl	__pthread_rwlock_wrlock_internal
-__pthread_rwlock_wrlock_internal = __pthread_rwlock_wrlock

+ 0 - 108
libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S

@@ -1,108 +0,0 @@
-/* Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <pthread-errnos.h>
-#include <structsem.h>
-#include <lowlevellock.h>
-#include "lowlevel-atomic.h"
-
-
-	.text
-
-	.globl	sem_post
-	.type	sem_post,@function
-	.align	5
-sem_post:
-	mov.l	@(VALUE,r4), r2
-0:
-	mov.l	.Lmax, r1
-	cmp/eq	r1, r2
-	bt/s	3f
-	 mov	r2, r3
-	mov	r3, r5
-	add	#1, r5
-	CMPXCHG (r3, @(VALUE,r4), r5, r2)
-	bf	0b
-	mov.l	@(NWAITERS,r4), r2
-	tst	r2, r2
-	bt	2f
-	mov	#FUTEX_WAKE, r5
-	mov.l	@(PRIVATE,r4), r1
-	or	r1, r5
-	mov	#1, r6
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	cmp/pz	r0
-	bf	1f
-2:
-	rts
-	 mov	#0, r0
-
-1:
-	bra	4f
-	 mov	#EINVAL, r2
-
-3:
-	mov	#EOVERFLOW, r2
-4:
-	mov.l	r12, @-r15
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	mova	.Lgot3, r0
-	mov.l	.Lgot3, r12
-	add	r0, r12
-
-#if USE___THREAD
-	mov.l	.Lerrno3, r0
-	stc	gbr, r1
-	mov.l	@(r0, r12), r0
-	bra	.Lexit
-	 add	r1, r0
-	.align	2
-.Lerrno3:
-	.long	errno@GOTTPOFF
-.Lexit:
-	mov.l	r2, @r0
-#else
-	mov	r2, r8
-	mov.l	.Lerrloc3, r1
-	bsrf	r1
-	 nop
-.Lerrloc3b:
-	mov	r8, @r0
-#endif
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r12
-	rts
-	 mov	#-1, r0
-
-	.align	2
-.Lmax:
-	.long	SEM_VALUE_MAX
-.Lgot3:
-	.long	_GLOBAL_OFFSET_TABLE_
-#if !USE___THREAD
-.Lerrloc3:
-	.long	__errno_location@PLT-(.Lerrloc3b-.)
-#endif
-	.size	sem_post,.-sem_post

+ 0 - 357
libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S

@@ -1,357 +0,0 @@
-/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <pthread-errnos.h>
-#include <tcb-offsets.h>
-#include <structsem.h>
-#include <lowlevellock.h>
-#include "lowlevel-atomic.h"
-
-
-#if VALUE != 0
-# error "code needs to be rewritten for VALUE != 0"
-#endif
-
-	.text
-
-	.globl	sem_timedwait
-	.type	sem_timedwait,@function
-	.align	5
-sem_timedwait:
-.LSTARTCODE:
-	mov.l	@r4, r0
-2:
-	tst	r0, r0
-	bt	1f
-	mov	r0, r3
-	mov	r0, r6
-	add	#-1, r3
-	CMPXCHG (r6, @r4, r3, r2)
-	bf/s	2b
-	 mov	r2, r0
-	rts
-	 mov	#0, r0
-
-1:
-	/* Check whether the timeout value is valid.  */
-	mov.l	r8, @-r15
-.Lpush_r8:
-	mov.l	r9, @-r15
-.Lpush_r9:
-	mov.l	r10, @-r15
-.Lpush_r10:
-	mov.l	r12, @-r15
-.Lpush_r12:
-	sts.l	pr, @-r15
-.Lpush_pr:
-	add	#-8, r15
-.Lalloc:
-	mov	r4, r8
-	mov	r5, r9
-
-	/* Check for invalid nanosecond field.  */
-	mov.l	@(4,r9), r0
-	mov.l	.L1g, r1
-	cmp/hs	r1, r0
-	bt/s	6f
-	 mov	#EINVAL, r0
-	INC (@(NWAITERS,r8),r2)
-
-7:
-	/* Compute relative timeout.  */
-	mov	r15, r4
-	mov	#0, r5
-	mov	#__NR_gettimeofday, r3
-	trapa	#0x12
-	SYSCALL_INST_PAD
-
-	mov.l	@(4,r15), r0
-	mov.w	.L1k, r1
-	dmulu.l	r0, r1		/* Milli seconds to nano seconds.  */
-	mov.l	@r9, r2
-	mov.l	@(4,r9), r3
-	mov.l	@r15, r0
-	sts	macl, r1
-	sub	r0, r2
-	clrt
-	subc	r1, r3
-	bf	5f
-	mov.l	.L1g, r1
-	add	r1, r3
-	add	#-1, r2
-5:
-	cmp/pz	r2
-	bf/s	6f		/* Time is already up.  */
-	 mov	#ETIMEDOUT, r0
-
-	/* Store relative timeout.  */
-	mov.l	r2, @r15
-	mov.l	r3, @(4,r15)
-
-.LcleanupSTART:
-	mov.l	.Lenable0, r1
-	bsrf	r1
-	 nop
-.Lenable0b:
-	mov	r0, r10
-
-	mov	r8, r4
-#if FUTEX_WAIT == 0
-	mov.l	@(PRIVATE,r8), r5
-#else
-	mov.l	@(PRIVATE,r8), r5
-	mov	#FUTEX_WAIT, r0
-	or	r0, r5
-#endif
-	mov	#0, r6
-	mov	r15, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	mov.l	.Ldisable0, r1
-	mov	r10, r4
-	bsrf	r1
-	 mov	r0, r10
-.Ldisable0b:
-	mov	r10, r0
-.LcleanupEND:
-
-	tst	r0, r0
-	bt	9f
-	cmp/eq	#-EWOULDBLOCK, r0
-	bf	3f
-9:
-	mov.l	@r8, r0
-8:
-	tst	r0, r0
-	bt	7b
-
-	mov	r0, r3
-	mov	r0, r4
-	add	#-1, r3
-	CMPXCHG (r4, @r8, r3, r2)
-	bf/s	8b
-	 mov	r2, r0
-
-	DEC (@(NWAITERS,r8), r2)
-	mov	#0, r0
-
-10:
-	add	#8, r15
-	lds.l	@r15+, pr
-	mov.l	@r15+, r12
-	mov.l	@r15+, r10
-	mov.l	@r15+, r9
-	mov.l	@r15+, r8
-	rts
-	 nop
-
-3:
-	neg	r0, r0
-6:
-	mov	r0, r10
-	mova	.Lgot2, r0
-	mov.l	.Lgot2, r12
-	add	r0, r12
-
-#if USE___THREAD
-	mov.l	.Lerrno2, r0
-	stc	gbr, r1
-	mov.l	@(r0, r12), r0
-	bra	.Lexit
-	 add	r1, r0
-	.align	2
-.Lerrno2:
- 	.long	errno@GOTTPOFF
-.Lexit:
-#else
-	mov.l	.Lerrloc2, r1
-	bsrf	r1
-	 nop
-.Lerrloc2b:
-#endif
-	mov.l	r10, @r0
-	DEC (@(NWAITERS,r8), r2)
-	bra	10b
-	 mov	#-1, r0
-
-.L1k:
-	.word	1000
-	.align	2
-.L1g:
-	.long	1000000000
-.Lgot2:
-	.long	_GLOBAL_OFFSET_TABLE_
-#if !USE___THREAD
-.Lerrloc2:
-	.long	__errno_location@PLT-(.Lerrloc2b-.)
-#endif
-.Lenable0:
-	.long	__pthread_enable_asynccancel-.Lenable0b
-.Ldisable0:
-	.long	__pthread_disable_asynccancel-.Ldisable0b
-	.size	sem_timedwait,.-sem_timedwait
-
-	.type	sem_wait_cleanup,@function
-sem_wait_cleanup:
- 	DEC (@(NWAITERS,r8), r2)
-.LcallUR:
-	mov.l	.Lresume, r1
-#ifdef __PIC__
-	add	r12, r1
-#endif
-	jsr	@r1
-	 nop
-	sleep
-
-	.align	2
-.Lresume:
-#ifdef __PIC__
-	.long	_Unwind_Resume@GOTOFF
-#else
-	.long	_Unwind_Resume
-#endif
-.LENDCODE:
-	.size	sem_wait_cleanup,.-sem_wait_cleanup
-
-
-	.section .gcc_except_table,"a",@progbits
-.LexceptSTART:
-	.byte	0xff				! @LPStart format (omit)
-	.byte	0xff				! @TType format (omit)
-	.byte	0x01				! call-site format
-						! DW_EH_PE_uleb128
-	.uleb128 .Lcstend-.Lcstbegin
-.Lcstbegin:
-	.uleb128 .LcleanupSTART-.LSTARTCODE
-	.uleb128 .LcleanupEND-.LcleanupSTART
-	.uleb128 sem_wait_cleanup-.LSTARTCODE
-	.uleb128  0
-	.uleb128 .LcallUR-.LSTARTCODE
-	.uleb128 .LENDCODE-.LcallUR
-	.uleb128 0
-	.uleb128  0
-.Lcstend:
-
-
-	.section .eh_frame,"a",@progbits
-.LSTARTFRAME:
-	.ualong	.LENDCIE-.LSTARTCIE		! Length of the CIE.
-.LSTARTCIE:
-	.ualong	0				! CIE ID.
-	.byte	1				! Version number.
-#ifdef SHARED
-	.string	"zPLR"				! NUL-terminated augmentation
-						! string.
-#else
-	.string	"zPL"				! NUL-terminated augmentation
-						! string.
-#endif
-	.uleb128 1				! Code alignment factor.
-	.sleb128 -4				! Data alignment factor.
-	.byte	0x11				! Return address register
-						! column.
-#ifdef SHARED
-	.uleb128 7				! Augmentation value length.
-	.byte	0x9b				! Personality: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4
-						! + DW_EH_PE_indirect
-	.ualong	DW.ref.__gcc_personality_v0-.
-	.byte	0x1b				! LSDA Encoding: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4.
-	.byte	0x1b				! FDE Encoding: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4.
-#else
-	.uleb128 6				! Augmentation value length.
-	.byte	0x0				! Personality: absolute
-	.ualong	__gcc_personality_v0
-	.byte	0x0				! LSDA Encoding: absolute
-#endif
-	.byte 0x0c				! DW_CFA_def_cfa
-	.uleb128 0xf
-	.uleb128 0
-	.align 4
-.LENDCIE:
-
-	.ualong	.LENDFDE-.LSTARTFDE		! Length of the FDE.
-.LSTARTFDE:
-	.ualong	.LSTARTFDE-.LSTARTFRAME		! CIE pointer.
-#ifdef SHARED
-	.ualong	.LSTARTCODE-.			! PC-relative start address
-						! of the code.
-#else
-	.ualong	.LSTARTCODE			! Start address of the code.
-#endif
-	.ualong	.LENDCODE-.LSTARTCODE		! Length of the code.
-	.uleb128 4				! Augmentation size
-#ifdef SHARED
-	.ualong	.LexceptSTART-.
-#else
-	.ualong	.LexceptSTART
-#endif
-
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lpush_r8-.LSTARTCODE
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 4
-	.byte   0x88				! DW_CFA_offset r8
-        .uleb128 1
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lpush_r9-.Lpush_r8
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 8
-	.byte   0x89				! DW_CFA_offset r9
-        .uleb128 2
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lpush_r10-.Lpush_r9
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 12
-	.byte   0x8a				! DW_CFA_offset r10
-        .uleb128 3
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lpush_r12-.Lpush_r10
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 16
-	.byte   0x8c				! DW_CFA_offset r12
-        .uleb128 4
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lpush_pr-.Lpush_r12
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 20
-	.byte	0x91				! DW_CFA_offset pr
-	.uleb128 5
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lalloc-.Lpush_pr
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 28
-	.align	4
-.LENDFDE:
-
-
-#ifdef SHARED
-	.hidden	DW.ref.__gcc_personality_v0
-	.weak	DW.ref.__gcc_personality_v0
-	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
-	.align	4
-	.type	DW.ref.__gcc_personality_v0, @object
-	.size	DW.ref.__gcc_personality_v0, 4
-DW.ref.__gcc_personality_v0:
-	.long	__gcc_personality_v0
-#endif

+ 0 - 88
libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S

@@ -1,88 +0,0 @@
-/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <pthread-errnos.h>
-#include <lowlevellock.h>
-#include "lowlevel-atomic.h"
-
-
-	.text
-
-	.globl	sem_trywait
-	.type	sem_trywait,@function
-	.align	5
-sem_trywait:
-	mov.l	r12, @-r15
-	mov.l	r8, @-r15
-	sts.l	pr, @-r15
-	mov	r4, r8
-	mov.l	@r8, r0
-2:
-	tst	r0, r0
-	bt	1f
-
-	mov	r0, r3
-	mov	r0, r4
-	add	#-1, r3
-	CMPXCHG (r4, @r8, r3, r2)
-	bf/s	2b
-	 mov	r2, r0
-
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r12
-	rts
-	 mov	#0, r0
-
-1:
-	mov	#EAGAIN, r8
-	mova	.Lgot1, r0
-	mov.l	.Lgot1, r12
-	add	r0, r12
-
-#if USE___THREAD
-	mov.l	.Lerrno1, r0
-	stc	gbr, r1
-	mov.l	@(r0, r12), r0
-	bra	.Lexit
-	 add	r1, r0
-	.align	2
-.Lerrno1:
-	.long	errno@GOTTPOFF
-.Lexit:
-#else
-	mov.l	.Lerrloc1, r1
-	bsrf	r1
-	 nop
-.Lerrloc1b:
-#endif
-	mov.l	r8, @r0
-	lds.l	@r15+, pr
-	mov.l	@r15+, r8
-	mov.l	@r15+, r12
-	rts
-	 mov	#-1, r0
-
-	.align	2
-.Lgot1:
-	.long	_GLOBAL_OFFSET_TABLE_
-#if !USE___THREAD
-.Lerrloc1:
-	.long	__errno_location@PLT-(.Lerrloc1b-.)
-#endif
-	.size	sem_trywait,.-sem_trywait

+ 0 - 301
libpthread/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S

@@ -1,301 +0,0 @@
-/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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 <pthread-errnos.h>
-#include <tcb-offsets.h>
-#include <structsem.h>
-#include <lowlevellock.h>
-#include "lowlevel-atomic.h"
-
-
-#if VALUE != 0
-# error "code needs to be rewritten for VALUE != 0"
-#endif
-
-	.text
-
-	.globl	sem_wait
-	.type	sem_wait,@function
-	.align	5
-sem_wait:
-.LSTARTCODE:
-	mov.l	r8, @-r15
-.Lpush_r8:
-	mov.l	r10, @-r15
-.Lpush_r10:
-	mov.l	r12, @-r15
-.Lpush_r12:
-	sts.l	pr, @-r15
-.Lpush_pr:
-	mov	r4, r8
-
-	mov.l	@r8, r0
-2:
-	tst	r0, r0
-	bt	1f
-	mov	r0, r3
-	mov	r0, r4
-	add	#-1, r3
-	CMPXCHG (r4, @r8, r3, r2)
-	bf/s	2b
-	 mov	r2, r0
-7:
-	mov	#0, r0
-9:
-	lds.l	@r15+, pr
-	mov.l	@r15+, r12
-	mov.l	@r15+, r10
-	rts
-	 mov.l	@r15+, r8
-
-.Lafter_ret:
-1:
-	INC (@(NWAITERS,r8),r2)
-
-.LcleanupSTART:
-6:
-	mov.l	.Lenable0, r1
-	bsrf	r1
-	 nop
-.Lenable0b:
-	mov	r0, r10
-
-	mov	r8, r4
-#if FUTEX_WAIT == 0
-	mov.l	@(PRIVATE,r8), r5
-#else
-	mov.l	@(PRIVATE,r8), r5
-	mov	#FUTEX_WAIT, r0
-	or	r0, r5
-#endif
-	mov	#0, r6
-	mov	#0, r7
-	mov	#SYS_futex, r3
-	extu.b	r3, r3
-	trapa	#0x14
-	SYSCALL_INST_PAD
-
-	mov.l	.Ldisable0, r1
-	mov	r10, r4
-	bsrf	r1
-	 mov	r0, r10
-.Ldisable0b:
-	mov	r10, r0
-.LcleanupEND:
-
-	tst	r0, r0
-	bt	3f
-	cmp/eq	#-EWOULDBLOCK, r0
-	bf	4f
-
-3:
-	mov.l	@r8, r0
-5:
-	tst	r0, r0
-	bt	6b
-
-	mov	r0, r3
-	mov	r0, r4
-	add	#-1, r3
-	CMPXCHG (r4, @r8, r3, r2)
-	bf/s	5b
-	 mov	r2, r0
-
-	DEC (@(NWAITERS,r8), r2)
-	bra	7b
-	 nop
-
-4:
-	neg	r0, r0
-	mov	r0, r4
-	DEC (@(NWAITERS,r8), r2)
-	mov	r4, r8
-	mova	.Lgot0, r0
-	mov.l	.Lgot0, r12
-	add	r0, r12
-
-#if USE___THREAD
-	mov.l	.Lerrno0, r0
-	stc	gbr, r1
-	mov.l	@(r0, r12), r0
-	bra	.Lexit
-	 add	r1, r0
-	.align	2
-.Lerrno0:
-	.long	errno@GOTTPOFF
-.Lexit:
-#else
-	mov.l	.Lerrloc0, r1
-	bsrf	r1
-	 nop
-.Lerrloc0b:
-#endif
-	mov.l	r8, @r0
-	bra	9b
-	 mov	#-1, r0
-
-	.align	2
-.Lgot0:
-	.long	_GLOBAL_OFFSET_TABLE_
-#if !USE___THREAD
-.Lerrloc0:
-	.long	__errno_location@PLT-(.Lerrloc0b-.)
-#endif
-.Lenable0:
-	.long	__pthread_enable_asynccancel-.Lenable0b
-.Ldisable0:
-	.long	__pthread_disable_asynccancel-.Ldisable0b
-	.size	sem_wait,.-sem_wait
-
-
-	.type	sem_wait_cleanup,@function
-sem_wait_cleanup:
- 	DEC (@(NWAITERS,r8), r2)
-.LcallUR:
-	mov.l	.Lresume, r1
-#ifdef __PIC__
-	add	r12, r1
-#endif
-	jsr	@r1
-	 nop
-	sleep
-
-	.align	2
-.Lresume:
-#ifdef __PIC__
-	.long	_Unwind_Resume@GOTOFF
-#else
-	.long	_Unwind_Resume
-#endif
-.LENDCODE:
-	.size	sem_wait_cleanup,.-sem_wait_cleanup
-
-
-	.section .gcc_except_table,"a",@progbits
-.LexceptSTART:
-	.byte	0xff				! @LPStart format (omit)
-	.byte	0xff				! @TType format (omit)
-	.byte	0x01				! call-site format
-						! DW_EH_PE_uleb128
-	.uleb128 .Lcstend-.Lcstbegin
-.Lcstbegin:
-	.uleb128 .LcleanupSTART-.LSTARTCODE
-	.uleb128 .LcleanupEND-.LcleanupSTART
-	.uleb128 sem_wait_cleanup-.LSTARTCODE
-	.uleb128  0
-	.uleb128 .LcallUR-.LSTARTCODE
-	.uleb128 .LENDCODE-.LcallUR
-	.uleb128 0
-	.uleb128  0
-.Lcstend:
-
-
-	.section .eh_frame,"a",@progbits
-.LSTARTFRAME:
-	.ualong	.LENDCIE-.LSTARTCIE		! Length of the CIE.
-.LSTARTCIE:
-	.ualong	0				! CIE ID.
-	.byte	1				! Version number.
-#ifdef SHARED
-	.string	"zPLR"				! NUL-terminated augmentation
-						! string.
-#else
-	.string	"zPL"				! NUL-terminated augmentation
-						! string.
-#endif
-	.uleb128 1				! Code alignment factor.
-	.sleb128 -4				! Data alignment factor.
-	.byte	0x11				! Return address register
-						! column.
-#ifdef SHARED
-	.uleb128 7				! Augmentation value length.
-	.byte	0x9b				! Personality: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4
-						! + DW_EH_PE_indirect
-	.ualong	DW.ref.__gcc_personality_v0-.
-	.byte	0x1b				! LSDA Encoding: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4.
-	.byte	0x1b				! FDE Encoding: DW_EH_PE_pcrel
-						! + DW_EH_PE_sdata4.
-#else
-	.uleb128 6				! Augmentation value length.
-	.byte	0x0				! Personality: absolute
-	.ualong	__gcc_personality_v0
-	.byte	0x0				! LSDA Encoding: absolute
-#endif
-	.byte 0x0c				! DW_CFA_def_cfa
-	.uleb128 0xf
-	.uleb128 0
-	.align 4
-.LENDCIE:
-
-	.ualong	.LENDFDE-.LSTARTFDE		! Length of the FDE.
-.LSTARTFDE:
-	.ualong	.LSTARTFDE-.LSTARTFRAME		! CIE pointer.
-#ifdef SHARED
-	.ualong	.LSTARTCODE-.			! PC-relative start address
-						! of the code.
-#else
-	.ualong	.LSTARTCODE			! Start address of the code.
-#endif
-	.ualong	.LENDCODE-.LSTARTCODE		! Length of the code.
-	.uleb128 4				! Augmentation size
-#ifdef SHARED
-	.ualong	.LexceptSTART-.
-#else
-	.ualong	.LexceptSTART
-#endif
-
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lpush_r8-.LSTARTCODE
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 4
-	.byte   0x88				! DW_CFA_offset r8
-        .uleb128 1
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lpush_r10-.Lpush_r8
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 8
-	.byte   0x8a				! DW_CFA_offset r10
-        .uleb128 2
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lpush_r12-.Lpush_r10
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 12
-	.byte   0x8c				! DW_CFA_offset r12
-        .uleb128 3
-	.byte	4				! DW_CFA_advance_loc4
-	.ualong	.Lpush_pr-.Lpush_r12
-	.byte	14				! DW_CFA_def_cfa_offset
-	.uleb128 16
-	.byte   0x91				! DW_CFA_offset pr
-        .uleb128 4
-	.align	4
-.LENDFDE:
-
-
-#ifdef SHARED
-	.hidden	DW.ref.__gcc_personality_v0
-	.weak	DW.ref.__gcc_personality_v0
-	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
-	.align	4
-	.type	DW.ref.__gcc_personality_v0, @object
-	.size	DW.ref.__gcc_personality_v0, 4
-DW.ref.__gcc_personality_v0:
-	.long	__gcc_personality_v0
-#endif

+ 0 - 4
libpthread/nptl/sysdeps/unix/sysv/linux/sh/sh4/lowlevellock.h

@@ -1,4 +0,0 @@
-/*  4 instruction cycles not accessing cache and TLB are needed after
-    trapa instruction to avoid an SH-4 silicon bug.  */
-#define NEED_SYSCALL_INST_PAD
-#include <sysdeps/unix/sysv/linux/sh/lowlevellock.h>