* sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
(__pthread_cond_broadcast): Pass LLL_PRIVATE to lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private. Don't use FUTEX_CMP_REQUEUE if dep_mutex is not process private. * sysdeps/unix/sysv/linux/shpthread_cond_signal.S (__pthread_cond_signal): Pass LLL_PRIVATE to lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private. Use FUTEX_WAKE_OP. * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Include kernel-features.h and tcb-offsets.h. (__pthread_cond_wait, __condvar_w_cleanup): Pass LLL_PRIVATE to lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private. * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Include tcb-offsets.h. (__pthread_cond_timedwait, __condvar_tw_cleanup): Pass LLL_PRIVATE to lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private. * sysdeps/unix/sysv/linux/sh/pthread_once.S: Use #ifdef __ASSUME_PRIVATE_FUTEX instead of #if __ASSUME_PRIVATE_FUTEX. * sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Likewise. * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: Likewise. * sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: Likewise. * sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: Likewise. * sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: Likewise.
This commit is contained in:
parent
c20455999c
commit
d13f4a4386
@ -1,3 +1,31 @@
|
|||||||
|
2007-08-14 Kaz Kojima <kkojima@rr.iij4u.or.jp>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
|
||||||
|
(__pthread_cond_broadcast): Pass LLL_PRIVATE to lll_* and or
|
||||||
|
FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private.
|
||||||
|
Don't use FUTEX_CMP_REQUEUE if dep_mutex is not process private.
|
||||||
|
* sysdeps/unix/sysv/linux/shpthread_cond_signal.S
|
||||||
|
(__pthread_cond_signal): Pass LLL_PRIVATE to lll_* and or
|
||||||
|
FUTEX_PRIVATE_FLAG into SYS_futex op if cv is process private.
|
||||||
|
Use FUTEX_WAKE_OP.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Include
|
||||||
|
kernel-features.h and tcb-offsets.h.
|
||||||
|
(__pthread_cond_wait, __condvar_w_cleanup): Pass LLL_PRIVATE to
|
||||||
|
lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is
|
||||||
|
process private.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Include
|
||||||
|
tcb-offsets.h.
|
||||||
|
(__pthread_cond_timedwait, __condvar_tw_cleanup): Pass LLL_PRIVATE
|
||||||
|
to lll_* and or FUTEX_PRIVATE_FLAG into SYS_futex op if cv is
|
||||||
|
process private.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_once.S: Use #ifdef
|
||||||
|
__ASSUME_PRIVATE_FUTEX instead of #if __ASSUME_PRIVATE_FUTEX.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S: Likewise.
|
||||||
|
|
||||||
2007-08-14 Jakub Jelinek <jakub@redhat.com>
|
2007-08-14 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/lowlevellock.c: Comment fix.
|
* sysdeps/unix/sysv/linux/lowlevellock.c: Comment fix.
|
||||||
|
@ -74,14 +74,63 @@ __pthread_cond_signal:
|
|||||||
/* Wake up one thread. */
|
/* Wake up one thread. */
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #cond_futex, r4
|
add #cond_futex, r4
|
||||||
mov #FUTEX_WAKE, r5
|
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 #1, r6
|
||||||
mov #0, r7
|
mov #0, r7
|
||||||
|
mov r8, r0
|
||||||
|
add #cond_lock, r0
|
||||||
|
mov.l .Lfutexop, r1
|
||||||
mov #SYS_futex, r3
|
mov #SYS_futex, r3
|
||||||
extu.b r3, r3
|
extu.b r3, r3
|
||||||
trapa #0x14
|
trapa #0x14
|
||||||
SYSCALL_INST_PAD
|
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:
|
4:
|
||||||
/* Unlock. */
|
/* Unlock. */
|
||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
@ -90,27 +139,7 @@ __pthread_cond_signal:
|
|||||||
DEC (@r8, r2)
|
DEC (@r8, r2)
|
||||||
#endif
|
#endif
|
||||||
tst r2, r2
|
tst r2, r2
|
||||||
bf 5f
|
bt 6b
|
||||||
6:
|
|
||||||
mov #0, r0
|
|
||||||
lds.l @r15+, pr
|
|
||||||
rts
|
|
||||||
mov.l @r15+, r8
|
|
||||||
|
|
||||||
1:
|
|
||||||
/* Initial locking failed. */
|
|
||||||
mov r8, r5
|
|
||||||
#if cond_lock != 0
|
|
||||||
add #cond_lock, r5
|
|
||||||
#endif
|
|
||||||
mov #LLL_SHARED, r6
|
|
||||||
extu.b r6, r6
|
|
||||||
mov.l .Lwait4, r1
|
|
||||||
bsrf r1
|
|
||||||
mov r2, r4
|
|
||||||
.Lwait4b:
|
|
||||||
bra 2b
|
|
||||||
nop
|
|
||||||
|
|
||||||
5:
|
5:
|
||||||
/* Unlock in loop requires wakeup. */
|
/* Unlock in loop requires wakeup. */
|
||||||
@ -118,7 +147,12 @@ __pthread_cond_signal:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r4
|
add #cond_lock, r4
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r5
|
||||||
mov #LLL_SHARED, r5
|
mov #LLL_SHARED, r5
|
||||||
|
99:
|
||||||
mov.l .Lwake4, r1
|
mov.l .Lwake4, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
@ -126,6 +160,26 @@ __pthread_cond_signal:
|
|||||||
bra 6b
|
bra 6b
|
||||||
nop
|
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
|
.align 2
|
||||||
.Lwait4:
|
.Lwait4:
|
||||||
.long __lll_lock_wait-.Lwait4b
|
.long __lll_lock_wait-.Lwait4b
|
||||||
|
@ -21,8 +21,9 @@
|
|||||||
#include <lowlevellock.h>
|
#include <lowlevellock.h>
|
||||||
#include <lowlevelcond.h>
|
#include <lowlevelcond.h>
|
||||||
#include <pthread-errnos.h>
|
#include <pthread-errnos.h>
|
||||||
#include "lowlevel-atomic.h"
|
|
||||||
#include <kernel-features.h>
|
#include <kernel-features.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
|
#include "lowlevel-atomic.h"
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
@ -230,7 +231,22 @@ __pthread_cond_timedwait:
|
|||||||
|
|
||||||
mov r15, r7
|
mov r15, r7
|
||||||
add #16, r7
|
add #16, r7
|
||||||
mov #FUTEX_WAIT, r5
|
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.l @(8,r15), r6
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #cond_futex, r4
|
add #cond_futex, r4
|
||||||
@ -339,7 +355,22 @@ __pthread_cond_timedwait:
|
|||||||
|
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #cond_nwaiters, r4
|
add #cond_nwaiters, r4
|
||||||
mov #FUTEX_WAKE, r5
|
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 #1, r6
|
||||||
mov #0, r7
|
mov #0, r7
|
||||||
mov #SYS_futex, r3
|
mov #SYS_futex, r3
|
||||||
@ -379,6 +410,10 @@ __pthread_cond_timedwait:
|
|||||||
rts
|
rts
|
||||||
mov.l @r15+, r8
|
mov.l @r15+, r8
|
||||||
|
|
||||||
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
|
.Lpfoff:
|
||||||
|
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
||||||
|
#endif
|
||||||
.L1k:
|
.L1k:
|
||||||
.word 1000
|
.word 1000
|
||||||
.align 2
|
.align 2
|
||||||
@ -399,7 +434,12 @@ __pthread_cond_timedwait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r5
|
add #cond_lock, r5
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r6
|
||||||
mov #LLL_SHARED, r6
|
mov #LLL_SHARED, r6
|
||||||
|
99:
|
||||||
extu.b r6, r6
|
extu.b r6, r6
|
||||||
mov.l .Lwait2, r1
|
mov.l .Lwait2, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
@ -414,7 +454,12 @@ __pthread_cond_timedwait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r4
|
add #cond_lock, r4
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r5
|
||||||
mov #LLL_SHARED, r5
|
mov #LLL_SHARED, r5
|
||||||
|
99:
|
||||||
mov.l .Lmwait2, r1
|
mov.l .Lmwait2, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
@ -428,7 +473,12 @@ __pthread_cond_timedwait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r5
|
add #cond_lock, r5
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r6
|
||||||
mov #LLL_SHARED, r6
|
mov #LLL_SHARED, r6
|
||||||
|
99:
|
||||||
extu.b r6, r6
|
extu.b r6, r6
|
||||||
mov.l .Lwait3, r1
|
mov.l .Lwait3, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
@ -443,7 +493,12 @@ __pthread_cond_timedwait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r4
|
add #cond_lock, r4
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r5
|
||||||
mov #LLL_SHARED, r5
|
mov #LLL_SHARED, r5
|
||||||
|
99:
|
||||||
mov.l .Lmwait3, r1
|
mov.l .Lmwait3, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
@ -466,7 +521,12 @@ __pthread_cond_timedwait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r4
|
add #cond_lock, r4
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r5
|
||||||
mov #LLL_SHARED, r5
|
mov #LLL_SHARED, r5
|
||||||
|
99:
|
||||||
mov.l .Lmwait4, r1
|
mov.l .Lmwait4, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
@ -510,7 +570,12 @@ __condvar_tw_cleanup:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r5
|
add #cond_lock, r5
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r6
|
||||||
mov #LLL_SHARED, r6
|
mov #LLL_SHARED, r6
|
||||||
|
99:
|
||||||
extu.b r6, r6
|
extu.b r6, r6
|
||||||
mov.l .Lwait5, r1
|
mov.l .Lwait5, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
@ -605,7 +670,12 @@ __condvar_tw_cleanup:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r4
|
add #cond_lock, r4
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r5
|
||||||
mov #LLL_SHARED, r5
|
mov #LLL_SHARED, r5
|
||||||
|
99:
|
||||||
mov.l .Lmwait5, r1
|
mov.l .Lmwait5, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
#include <shlib-compat.h>
|
#include <shlib-compat.h>
|
||||||
#include <lowlevellock.h>
|
#include <lowlevellock.h>
|
||||||
#include <lowlevelcond.h>
|
#include <lowlevelcond.h>
|
||||||
|
#include <tcb-offsets.h>
|
||||||
|
#include <kernel-features.h>
|
||||||
#include "lowlevel-atomic.h"
|
#include "lowlevel-atomic.h"
|
||||||
|
|
||||||
.text
|
.text
|
||||||
@ -135,7 +137,22 @@ __pthread_cond_wait:
|
|||||||
mov.l r0, @r15
|
mov.l r0, @r15
|
||||||
|
|
||||||
mov #0, r7
|
mov #0, r7
|
||||||
mov #FUTEX_WAIT, r5
|
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.l @(8,r15), r6
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #cond_futex, r4
|
add #cond_futex, r4
|
||||||
@ -213,7 +230,22 @@ __pthread_cond_wait:
|
|||||||
|
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #cond_nwaiters, r4
|
add #cond_nwaiters, r4
|
||||||
mov #FUTEX_WAKE, r5
|
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 #1, r6
|
||||||
mov #0, r7
|
mov #0, r7
|
||||||
mov #SYS_futex, r3
|
mov #SYS_futex, r3
|
||||||
@ -247,6 +279,10 @@ __pthread_cond_wait:
|
|||||||
rts
|
rts
|
||||||
mov.l @r15+, r8
|
mov.l @r15+, r8
|
||||||
|
|
||||||
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
|
.Lpfoff0:
|
||||||
|
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
||||||
|
#endif
|
||||||
.align 2
|
.align 2
|
||||||
.Lmunlock0:
|
.Lmunlock0:
|
||||||
.long __pthread_mutex_unlock_usercnt-.Lmunlock0b
|
.long __pthread_mutex_unlock_usercnt-.Lmunlock0b
|
||||||
@ -263,7 +299,12 @@ __pthread_cond_wait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r5
|
add #cond_lock, r5
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r6
|
||||||
mov #LLL_SHARED, r6
|
mov #LLL_SHARED, r6
|
||||||
|
99:
|
||||||
extu.b r6, r6
|
extu.b r6, r6
|
||||||
mov.l .Lwait0, r1
|
mov.l .Lwait0, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
@ -277,7 +318,12 @@ __pthread_cond_wait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r4
|
add #cond_lock, r4
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r5
|
||||||
mov #LLL_SHARED, r5
|
mov #LLL_SHARED, r5
|
||||||
|
99:
|
||||||
mov.l .Lwake0, r1
|
mov.l .Lwake0, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
@ -291,7 +337,12 @@ __pthread_cond_wait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r5
|
add #cond_lock, r5
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r6
|
||||||
mov #LLL_SHARED, r6
|
mov #LLL_SHARED, r6
|
||||||
|
99:
|
||||||
extu.b r6, r6
|
extu.b r6, r6
|
||||||
mov.l .Lwait1, r1
|
mov.l .Lwait1, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
@ -306,7 +357,12 @@ __pthread_cond_wait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r4
|
add #cond_lock, r4
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r5
|
||||||
mov #LLL_SHARED, r5
|
mov #LLL_SHARED, r5
|
||||||
|
99:
|
||||||
mov.l .Lwake1, r1
|
mov.l .Lwake1, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
@ -329,7 +385,12 @@ __pthread_cond_wait:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r4
|
add #cond_lock, r4
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r5
|
||||||
mov #LLL_SHARED, r5
|
mov #LLL_SHARED, r5
|
||||||
|
99:
|
||||||
mov.l .Lwake2, r1
|
mov.l .Lwake2, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
@ -374,7 +435,12 @@ __condvar_w_cleanup:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r5
|
add #cond_lock, r5
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r6
|
||||||
mov #LLL_SHARED, r6
|
mov #LLL_SHARED, r6
|
||||||
|
99:
|
||||||
extu.b r6, r6
|
extu.b r6, r6
|
||||||
mov.l .Lwait3, r1
|
mov.l .Lwait3, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
@ -447,7 +513,22 @@ __condvar_w_cleanup:
|
|||||||
|
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #cond_nwaiters, r4
|
add #cond_nwaiters, r4
|
||||||
mov #FUTEX_WAKE, r5
|
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 #1, r6
|
||||||
mov #0, r7
|
mov #0, r7
|
||||||
mov #SYS_futex, r3
|
mov #SYS_futex, r3
|
||||||
@ -469,7 +550,12 @@ __condvar_w_cleanup:
|
|||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
add #cond_lock, r4
|
add #cond_lock, r4
|
||||||
#endif
|
#endif
|
||||||
|
mov.l @(dep_mutex,r8), r0
|
||||||
|
cmp/eq #-1, r0
|
||||||
|
bf/s 99f
|
||||||
|
mov #LLL_PRIVATE, r5
|
||||||
mov #LLL_SHARED, r5
|
mov #LLL_SHARED, r5
|
||||||
|
99:
|
||||||
mov.l .Lwake3, r1
|
mov.l .Lwake3, r1
|
||||||
bsrf r1
|
bsrf r1
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
@ -481,7 +567,22 @@ __condvar_w_cleanup:
|
|||||||
bf/s 5f
|
bf/s 5f
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #cond_futex, r4
|
add #cond_futex, r4
|
||||||
mov #FUTEX_WAKE, r5
|
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 #-1, r6
|
||||||
shlr r6 /* r6 = 0x7fffffff */
|
shlr r6 /* r6 = 0x7fffffff */
|
||||||
mov #0, r7
|
mov #0, r7
|
||||||
@ -505,6 +606,10 @@ __condvar_w_cleanup:
|
|||||||
mov r11, r4
|
mov r11, r4
|
||||||
sleep
|
sleep
|
||||||
|
|
||||||
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
|
.Lpfoff1:
|
||||||
|
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
||||||
|
#endif
|
||||||
.align 2
|
.align 2
|
||||||
.Lwait3:
|
.Lwait3:
|
||||||
.long __lll_lock_wait-.Lwait3b
|
.long __lll_lock_wait-.Lwait3b
|
||||||
|
@ -94,7 +94,7 @@ __pthread_once:
|
|||||||
bf 3f /* Different for generation -> run initializer. */
|
bf 3f /* Different for generation -> run initializer. */
|
||||||
|
|
||||||
/* Somebody else got here first. Wait. */
|
/* Somebody else got here first. Wait. */
|
||||||
#if __ASSUME_PRIVATE_FUTEX
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r5
|
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r5
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
#else
|
#else
|
||||||
@ -168,7 +168,7 @@ __pthread_once:
|
|||||||
INC (@r9, r2)
|
INC (@r9, r2)
|
||||||
/* Wake up all other threads. */
|
/* Wake up all other threads. */
|
||||||
mov r9, r4
|
mov r9, r4
|
||||||
#if __ASSUME_PRIVATE_FUTEX
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5
|
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5
|
||||||
extu.b r5, r5
|
extu.b r5, r5
|
||||||
#else
|
#else
|
||||||
@ -213,7 +213,7 @@ __pthread_once:
|
|||||||
mov #0, r7
|
mov #0, r7
|
||||||
mov.l r7, @r9
|
mov.l r7, @r9
|
||||||
mov r9, r4
|
mov r9, r4
|
||||||
#if __ASSUME_PRIVATE_FUTEX
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5
|
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5
|
||||||
#else
|
#else
|
||||||
stc gbr, r1
|
stc gbr, r1
|
||||||
@ -239,7 +239,7 @@ __pthread_once:
|
|||||||
sleep
|
sleep
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
|
|
||||||
#if !__ASSUME_PRIVATE_FUTEX
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
.Lpfoff:
|
.Lpfoff:
|
||||||
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
||||||
#endif
|
#endif
|
||||||
|
@ -74,7 +74,7 @@ __pthread_rwlock_rdlock:
|
|||||||
tst r2, r2
|
tst r2, r2
|
||||||
bf 10f
|
bf 10f
|
||||||
11:
|
11:
|
||||||
#if __ASSUME_PRIVATE_FUTEX
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
mov #PSHARED, r0
|
mov #PSHARED, r0
|
||||||
mov.b @(r0,r8), r5
|
mov.b @(r0,r8), r5
|
||||||
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
|
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
|
||||||
@ -142,7 +142,7 @@ __pthread_rwlock_rdlock:
|
|||||||
rts
|
rts
|
||||||
mov r3, r0
|
mov r3, r0
|
||||||
|
|
||||||
#if !__ASSUME_PRIVATE_FUTEX
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
.Lpfoff:
|
.Lpfoff:
|
||||||
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
||||||
#endif
|
#endif
|
||||||
|
@ -115,7 +115,7 @@ pthread_rwlock_timedrdlock:
|
|||||||
|
|
||||||
/* Futex call. */
|
/* Futex call. */
|
||||||
mov r15, r7
|
mov r15, r7
|
||||||
#if __ASSUME_PRIVATE_FUTEX
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
mov #PSHARED, r0
|
mov #PSHARED, r0
|
||||||
mov.b @(r0,r8), r5
|
mov.b @(r0,r8), r5
|
||||||
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
|
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
|
||||||
@ -193,7 +193,7 @@ pthread_rwlock_timedrdlock:
|
|||||||
rts
|
rts
|
||||||
mov r3, r0
|
mov r3, r0
|
||||||
|
|
||||||
#if !__ASSUME_PRIVATE_FUTEX
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
.Lpfoff:
|
.Lpfoff:
|
||||||
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
||||||
#endif
|
#endif
|
||||||
|
@ -111,7 +111,7 @@ pthread_rwlock_timedwrlock:
|
|||||||
|
|
||||||
/* Futex call. */
|
/* Futex call. */
|
||||||
mov r15, r7
|
mov r15, r7
|
||||||
#if __ASSUME_PRIVATE_FUTEX
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
mov #PSHARED, r0
|
mov #PSHARED, r0
|
||||||
mov.b @(r0,r8), r5
|
mov.b @(r0,r8), r5
|
||||||
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
|
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
|
||||||
@ -191,7 +191,7 @@ pthread_rwlock_timedwrlock:
|
|||||||
rts
|
rts
|
||||||
mov r3, r0
|
mov r3, r0
|
||||||
|
|
||||||
#if !__ASSUME_PRIVATE_FUTEX
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
.Lpfoff:
|
.Lpfoff:
|
||||||
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
||||||
#endif
|
#endif
|
||||||
|
@ -85,7 +85,7 @@ __pthread_rwlock_unlock:
|
|||||||
bf 7f
|
bf 7f
|
||||||
|
|
||||||
8:
|
8:
|
||||||
#if __ASSUME_PRIVATE_FUTEX
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
mov #PSHARED, r0
|
mov #PSHARED, r0
|
||||||
mov.b @(r0,r8), r5
|
mov.b @(r0,r8), r5
|
||||||
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r0
|
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r0
|
||||||
@ -177,7 +177,7 @@ __pthread_rwlock_unlock:
|
|||||||
bra 8b
|
bra 8b
|
||||||
mov.l @r15+, r4
|
mov.l @r15+, r4
|
||||||
|
|
||||||
#if !__ASSUME_PRIVATE_FUTEX
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
.Lpfoff:
|
.Lpfoff:
|
||||||
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
||||||
#endif
|
#endif
|
||||||
|
@ -72,7 +72,7 @@ __pthread_rwlock_wrlock:
|
|||||||
11:
|
11:
|
||||||
mov r8, r4
|
mov r8, r4
|
||||||
add #WRITERS_WAKEUP, r4
|
add #WRITERS_WAKEUP, r4
|
||||||
#if __ASSUME_PRIVATE_FUTEX
|
#ifdef __ASSUME_PRIVATE_FUTEX
|
||||||
mov #PSHARED, r0
|
mov #PSHARED, r0
|
||||||
mov.b @(r0,r8), r5
|
mov.b @(r0,r8), r5
|
||||||
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
|
mov #(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r0
|
||||||
@ -174,7 +174,7 @@ __pthread_rwlock_wrlock:
|
|||||||
bra 7b
|
bra 7b
|
||||||
mov #0, r3
|
mov #0, r3
|
||||||
|
|
||||||
#if !__ASSUME_PRIVATE_FUTEX
|
#ifndef __ASSUME_PRIVATE_FUTEX
|
||||||
.Lpfoff:
|
.Lpfoff:
|
||||||
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
.word PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user