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 .globl rwlock_impl_begin, rwlock_impl_end
12 /* The non-contention read lock usage is 2 cache lines. */
14 .globl __read_lock, __read_unlock
16 __read_lock: /* %o0 = lock_ptr */
18 brlz,pn %g5, __read_wait_for_writer
22 bne,pn %icc, __read_lock
23 membar #StoreLoad | #StoreStore
26 __read_unlock: /* %o0 = lock_ptr */
32 membar #StoreLoad | #StoreStore
33 ba,a,pt %xcc, __read_unlock
35 __read_wait_for_writer:
37 brlz,pt %g5, __read_wait_for_writer
42 brnz,pt %g5, __write_wait_for_any
48 __write_unlock: /* %o0 = lock_ptr */
49 membar #LoadStore | #StoreStore
54 __write_lock: /* %o0 = lock_ptr */
55 sethi %hi(0x80000000), %g2
58 brnz,pn %g5, __write_wait_for_any
64 membar #StoreLoad | #StoreStore
67 .globl __write_trylock
68 __write_trylock: /* %o0 = lock_ptr */
69 sethi %hi(0x80000000), %g2
71 brnz,pn %g5, __write_trylock_fail
76 be,pt %icc, __write_trylock_succeed
77 membar #StoreLoad | #StoreStore
81 __write_trylock_succeed: