1 /* $Id: dec_and_lock.S,v 1.5 2001/11/18 00:12:56 davem Exp $
2 * dec_and_lock.S: Sparc64 version of "atomic_dec_and_lock()"
3 * using cas and ldstub instructions.
5 * Copyright (C) 2000 David S. Miller (davem@redhat.com)
7 #include <linux/config.h>
9 #ifndef CONFIG_DEBUG_SPINLOCK
13 /* CAS basically works like this:
15 * void CAS(MEM, REG1, REG2)
18 * if (*(MEM) == REG1) {
28 .globl atomic_dec_and_lock
29 atomic_dec_and_lock: /* %o0 = counter, %o1 = lock */
30 loop1: lduw [%o0], %g5
34 nzero: cas [%o0], %g5, %g7
40 membar #StoreLoad | #StoreStore
45 brnz,pn %g3, spin_on_lock
46 membar #StoreLoad | #StoreStore
47 loop2: cas [%o0], %g5, %g7 /* ASSERT(g7 == 0) */
56 membar #StoreStore | #LoadStore
63 brnz,pt %g3, spin_on_lock
69 #endif /* !(CONFIG_DEBUG_SPINLOCK) */