1 /* atomic.S: These things are too big to do inline.
3 * Copyright (C) 1999, 2007 2012 David S. Miller (davem@davemloft.net)
6 #include <linux/linkage.h>
8 #include <asm/backoff.h>
12 /* Two versions of the atomic routines, one that
13 * does not return a value and does not perform
14 * memory barriers, and a second which returns
15 * a value and does the barriers.
17 ENTRY(atomic_add) /* %o0 = increment, %o1 = atomic_ptr */
23 bne,pn %icc, BACKOFF_LABEL(2f, 1b)
27 2: BACKOFF_SPIN(%o2, %o3, 1b)
30 ENTRY(atomic_sub) /* %o0 = decrement, %o1 = atomic_ptr */
36 bne,pn %icc, BACKOFF_LABEL(2f, 1b)
40 2: BACKOFF_SPIN(%o2, %o3, 1b)
43 ENTRY(atomic_add_ret) /* %o0 = increment, %o1 = atomic_ptr */
49 bne,pn %icc, BACKOFF_LABEL(2f, 1b)
53 2: BACKOFF_SPIN(%o2, %o3, 1b)
54 ENDPROC(atomic_add_ret)
56 ENTRY(atomic_sub_ret) /* %o0 = decrement, %o1 = atomic_ptr */
62 bne,pn %icc, BACKOFF_LABEL(2f, 1b)
66 2: BACKOFF_SPIN(%o2, %o3, 1b)
67 ENDPROC(atomic_sub_ret)
69 ENTRY(atomic64_add) /* %o0 = increment, %o1 = atomic_ptr */
75 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
79 2: BACKOFF_SPIN(%o2, %o3, 1b)
82 ENTRY(atomic64_sub) /* %o0 = decrement, %o1 = atomic_ptr */
88 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
92 2: BACKOFF_SPIN(%o2, %o3, 1b)
95 ENTRY(atomic64_add_ret) /* %o0 = increment, %o1 = atomic_ptr */
101 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
105 2: BACKOFF_SPIN(%o2, %o3, 1b)
106 ENDPROC(atomic64_add_ret)
108 ENTRY(atomic64_sub_ret) /* %o0 = decrement, %o1 = atomic_ptr */
114 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
118 2: BACKOFF_SPIN(%o2, %o3, 1b)
119 ENDPROC(atomic64_sub_ret)
121 ENTRY(atomic64_dec_if_positive) /* %o0 = atomic_ptr */
128 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
132 2: BACKOFF_SPIN(%o2, %o3, 1b)
133 ENDPROC(atomic64_dec_if_positive)