about summary refs log tree commit diff
path: root/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-03-29 01:24:20 +0000
committerUlrich Drepper <drepper@redhat.com>2003-03-29 01:24:20 +0000
commitdd731d53dcdbb24cd2a3f299a2ba4362505d3f55 (patch)
tree9db2cc09616d8073cc8c2888036e01cc60970d5b /nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S
parent10e717a20778341a2e8c7d11e3cb1cc90e943602 (diff)
downloadglibc-dd731d53dcdbb24cd2a3f299a2ba4362505d3f55.tar.gz
glibc-dd731d53dcdbb24cd2a3f299a2ba4362505d3f55.tar.xz
glibc-dd731d53dcdbb24cd2a3f299a2ba4362505d3f55.zip
Update.
2003-03-28  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

	* sysdeps/sh/bits/atomic.h (__arch_compare_and_exchange_val_8_acq):
	Return old value. Make asm output reg constraint earlyclobber.
	Renamed from...
	(__arch_compare_and_exchange_8_acq): ... this.
	(__arch_compare_and_exchange_val_16_acq):
	Return old value. Make asm output reg constraint earlyclobber.
	Renamed from...
	(__arch_compare_and_exchange_16_acq): ... this.
	(__arch_compare_and_exchange_val_32_acq):
	Return old value. Make asm output reg constraint earlyclobber.
	Renamed from...
	(__arch_compare_and_exchange_32_acq): ... this.
	(__arch_compare_and_exchange_val_64_acq):
	Renamed from...
	(__arch_compare_and_exchange_64_acq): ... this.
	(atomic_exchange_and_add): Use local variables and
	__arch_compare_and_exchange_val_64_acq.
	(atomic_add): Likewise.
	(atomic_add_negative, atomic_add_zero): Use local variables.

	* Makefile: Remove libmd5crypt goal.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S35
1 files changed, 20 insertions, 15 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S
index 60ff48f90a..89bdc76d37 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S
@@ -59,6 +59,12 @@ pthread_rwlock_timedwrlock:
 	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)
@@ -106,7 +112,7 @@ pthread_rwlock_timedwrlock:
 	/* Futex call.  */
 	mov	r15, r7
 	mov	#FUTEX_WAIT, r5
-	mov	#0, r6
+	mov.l	@(WRITERS_WAKEUP,r8), r6
 	mov	r8, r4
 	add	#WRITERS_WAKEUP, r4
 	mov	#SYS_futex, r3
@@ -128,22 +134,26 @@ pthread_rwlock_timedwrlock:
 	bf	12f
 
 13:
-	mov	#-ETIMEDOUT, r0
-	cmp/eq	r0, r3
-	bt	18f
 	mov.l	@(WRITERS_QUEUED,r8), r0
 	add	#-1, r0
 	mov.l	r0, @(WRITERS_QUEUED,r8)
-	mov	#0, r0
-	bra	2b
-	 mov.l	r0, @(WRITERS_WAKEUP,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, r1
+	stc	gbr, r0
 	mov.w	.Ltcboff,r2
-	sub	r2,r1
-	mov.l	@(8,r1),r0
+	sub	r2,r0
 	mov.l	r0, @(WRITER,r8)
 9:
 #if MUTEX == 0
@@ -184,7 +194,6 @@ pthread_rwlock_timedwrlock:
 	stc	gbr, r1
 	mov.w	.Ltcboff,r2
 	sub	r2,r1
-	mov.l	@(8,r1),r1
 	cmp/eq	r1, r0
 	bf	3b
 	bra	9b
@@ -238,10 +247,6 @@ pthread_rwlock_timedwrlock:
 	bra	17b
 	 mov	#-ETIMEDOUT, r3
 
-18:
-	bra	9b
-	 mov	#ETIMEDOUT, r3
-
 .Ltcboff:
 	.word	TLS_PRE_TCB_SIZE
 	.align	2