VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[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 __atomic_add: /* %o0 = increment, %o1 = atomic_ptr */
14         lduw    [%o1], %g5
15         add     %g5, %o0, %g7
16         cas     [%o1], %g5, %g7
17         cmp     %g5, %g7
18         bne,pn  %icc, __atomic_add
19          membar #StoreLoad | #StoreStore
20         retl
21          add    %g7, %o0, %o0
22
23         .globl  __atomic_sub
24 __atomic_sub: /* %o0 = increment, %o1 = atomic_ptr */
25         lduw    [%o1], %g5
26         sub     %g5, %o0, %g7
27         cas     [%o1], %g5, %g7
28         cmp     %g5, %g7
29         bne,pn  %icc, __atomic_sub
30          membar #StoreLoad | #StoreStore
31         retl
32          sub    %g7, %o0, %o0
33
34         .globl  __atomic64_add
35 __atomic64_add: /* %o0 = increment, %o1 = atomic_ptr */
36         ldx     [%o1], %g5
37         add     %g5, %o0, %g7
38         casx    [%o1], %g5, %g7
39         cmp     %g5, %g7
40         bne,pn  %xcc, __atomic64_add
41          membar #StoreLoad | #StoreStore
42         retl
43          add    %g7, %o0, %o0
44
45         .globl  __atomic64_sub
46 __atomic64_sub: /* %o0 = increment, %o1 = atomic_ptr */
47         ldx     [%o1], %g5
48         sub     %g5, %o0, %g7
49         casx    [%o1], %g5, %g7
50         cmp     %g5, %g7
51         bne,pn  %xcc, __atomic64_sub
52          membar #StoreLoad | #StoreStore
53         retl
54          sub    %g7, %o0, %o0
55