1 /* $Id: rwlock.S,v 1.4 2000/09/09 00:00:34 davem Exp $
2 * rwlocks.S: These things are too big to do inline.
4 * Copyright (C) 1999 David S. Miller (davem@redhat.com)
10 /* The non-contention read lock usage is 2 cache lines. */
12 .globl __read_lock, __read_unlock
13 __read_lock: /* %o0 = lock_ptr */
15 brlz,pn %g5, __read_wait_for_writer
19 bne,pn %icc, __read_lock
20 membar #StoreLoad | #StoreStore
23 __read_unlock: /* %o0 = lock_ptr */
29 membar #StoreLoad | #StoreStore
30 ba,a,pt %xcc, __read_unlock
32 __read_wait_for_writer:
34 brlz,pt %g5, __read_wait_for_writer
39 brnz,pt %g5, __write_wait_for_any
45 __write_unlock: /* %o0 = lock_ptr */
46 membar #LoadStore | #StoreStore
51 __write_lock: /* %o0 = lock_ptr */
52 sethi %hi(0x80000000), %g2
55 brnz,pn %g5, __write_wait_for_any
61 membar #StoreLoad | #StoreStore
64 .globl __write_trylock
65 __write_trylock: /* %o0 = lock_ptr */
66 sethi %hi(0x80000000), %g2
68 brnz,pn %g5, __write_trylock_fail
73 be,pt %icc, __write_trylock_succeed
74 membar #StoreLoad | #StoreStore
78 __write_trylock_succeed: