ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / sparc64 / lib / atomic.S
1 /* $Id: atomic.S,v 1.4 2001/11/18 00:12:56 davem Exp $
2  * atomic.S: These things are too big to do inline.
3  *
4  * Copyright (C) 1999 David S. Miller (davem@redhat.com)
5  */
6
7 #include <asm/asi.h>
8
9         .text
10         .align  64
11
12         .globl  atomic_impl_begin, atomic_impl_end
13
14         .globl  __atomic_add
15 atomic_impl_begin:
16 __atomic_add: /* %o0 = increment, %o1 = atomic_ptr */
17         lduw    [%o1], %g5
18         add     %g5, %o0, %g7
19         cas     [%o1], %g5, %g7
20         cmp     %g5, %g7
21         bne,pn  %icc, __atomic_add
22          membar #StoreLoad | #StoreStore
23         retl
24          add    %g7, %o0, %o0
25
26         .globl  __atomic_sub
27 __atomic_sub: /* %o0 = increment, %o1 = atomic_ptr */
28         lduw    [%o1], %g5
29         sub     %g5, %o0, %g7
30         cas     [%o1], %g5, %g7
31         cmp     %g5, %g7
32         bne,pn  %icc, __atomic_sub
33          membar #StoreLoad | #StoreStore
34         retl
35          sub    %g7, %o0, %o0
36
37         .globl  __atomic64_add
38 __atomic64_add: /* %o0 = increment, %o1 = atomic_ptr */
39         ldx     [%o1], %g5
40         add     %g5, %o0, %g7
41         casx    [%o1], %g5, %g7
42         cmp     %g5, %g7
43         bne,pn  %xcc, __atomic64_add
44          membar #StoreLoad | #StoreStore
45         retl
46          add    %g7, %o0, %o0
47
48         .globl  __atomic64_sub
49 __atomic64_sub: /* %o0 = increment, %o1 = atomic_ptr */
50         ldx     [%o1], %g5
51         sub     %g5, %o0, %g7
52         casx    [%o1], %g5, %g7
53         cmp     %g5, %g7
54         bne,pn  %xcc, __atomic64_sub
55          membar #StoreLoad | #StoreStore
56         retl
57          sub    %g7, %o0, %o0
58
59 atomic_impl_end: