diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-03-29 01:24:20 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-03-29 01:24:20 +0000 |
commit | dd731d53dcdbb24cd2a3f299a2ba4362505d3f55 (patch) | |
tree | 9db2cc09616d8073cc8c2888036e01cc60970d5b /nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S | |
parent | 10e717a20778341a2e8c7d11e3cb1cc90e943602 (diff) | |
download | glibc-dd731d53dcdbb24cd2a3f299a2ba4362505d3f55.tar glibc-dd731d53dcdbb24cd2a3f299a2ba4362505d3f55.tar.gz glibc-dd731d53dcdbb24cd2a3f299a2ba4362505d3f55.tar.bz2 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_unlock.S')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S index af046aad47..8303a984ae 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S +++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S @@ -57,24 +57,48 @@ __pthread_rwlock_unlock: 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 9f + 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 */ - bra 0f - add #READERS_WAKEUP, r4 -9: - mov #1, r6 - add #WRITERS_WAKEUP, r4 + 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: mov #FUTEX_WAKE, r5 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) @@ -114,11 +138,29 @@ __pthread_rwlock_unlock: bra 4b nop +7: + mov.l r4, @-r15 + mov.l r6, @-r15 + mov r8, r4 +#if MUTEX != 0 + add #MUTEX, r4 +#endif + mov.l .Lwake9, r1 + bsrf r1 + nop +.Lwake9b: + + mov.l @r15+, r6 + bra 8b + mov.l @r15+, r4 + .align 2 .Lwait8: .long __lll_mutex_lock_wait-.Lwait8b .Lwake8: .long __lll_mutex_unlock_wake-.Lwake8b +.Lwake9: + .long __lll_mutex_unlock_wake-.Lwake9b .size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock .globl pthread_rwlock_unlock |