vserver 1.9.3
[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_add
13         .type   __atomic_add,#function
14 __atomic_add: /* %o0 = increment, %o1 = atomic_ptr */
15         lduw    [%o1], %g5
16         add     %g5, %o0, %g7
17         cas     [%o1], %g5, %g7
18         cmp     %g5, %g7
19         bne,pn  %icc, __atomic_add
20          membar #StoreLoad | #StoreStore
21         retl
22          add    %g7, %o0, %o0
23         .size   __atomic_add, .-__atomic_add
24
25         .globl  __atomic_sub
26         .type   __atomic_sub,#function
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         .size   __atomic_sub, .-__atomic_sub
37
38         .globl  __atomic64_add
39         .type   __atomic64_add,#function
40 __atomic64_add: /* %o0 = increment, %o1 = atomic_ptr */
41         ldx     [%o1], %g5
42         add     %g5, %o0, %g7
43         casx    [%o1], %g5, %g7
44         cmp     %g5, %g7
45         bne,pn  %xcc, __atomic64_add
46          membar #StoreLoad | #StoreStore
47         retl
48          add    %g7, %o0, %o0
49         .size   __atomic64_add, .-__atomic64_add
50
51         .globl  __atomic64_sub
52         .type   __atomic64_sub,#function
53 __atomic64_sub: /* %o0 = increment, %o1 = atomic_ptr */
54         ldx     [%o1], %g5
55         sub     %g5, %o0, %g7
56         casx    [%o1], %g5, %g7
57         cmp     %g5, %g7
58         bne,pn  %xcc, __atomic64_sub
59          membar #StoreLoad | #StoreStore
60         retl
61          sub    %g7, %o0, %o0
62         .size   __atomic64_sub, .-__atomic64_sub