OSDN Git Service

Replace FSF snail mail address with URLs
[uclinux-h8/uClibc.git] / libpthread / nptl / sysdeps / unix / sysv / linux / sh / lowlevel-atomic.h
1 /* Copyright (C) 2003, 2004, 2008 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
17
18 #ifdef __ASSEMBLER__
19
20 #define _IMP1 #1
21 #define _IMM1 #-1
22 #define _IMM4 #-4
23 #define _IMM6 #-6
24 #define _IMM8 #-8
25
26 #define INC(mem, reg) \
27         .align  2; \
28         mova    99f, r0; \
29         mov     r15, r1; \
30         mov     _IMM6, r15; \
31 98:     mov.l   mem, reg; \
32         add     _IMP1, reg; \
33         mov.l   reg, mem; \
34 99:     mov     r1, r15
35
36 #define DEC(mem, reg) \
37         .align  2; \
38         mova    99f, r0; \
39         mov     r15, r1; \
40         mov     _IMM6, r15; \
41 98:     mov.l   mem, reg; \
42         add     _IMM1, reg; \
43         mov.l   reg, mem; \
44 99:     mov     r1, r15
45
46 #define XADD(reg, mem, old, tmp) \
47         .align  2; \
48         mova    99f, r0; \
49         nop; \
50         mov     r15, r1; \
51         mov     _IMM8, r15; \
52 98:     mov.l   mem, old; \
53         mov     reg, tmp; \
54         add     old, tmp; \
55         mov.l   tmp, mem; \
56 99:     mov     r1, r15
57
58 #define XCHG(reg, mem, old) \
59         .align  2; \
60         mova    99f, r0; \
61         nop; \
62         mov     r15, r1; \
63         mov     _IMM4, r15; \
64 98:     mov.l   mem, old; \
65         mov.l   reg, mem; \
66 99:     mov     r1, r15
67
68 #define CMPXCHG(reg, mem, new, old) \
69         .align  2; \
70         mova    99f, r0; \
71         nop; \
72         mov     r15, r1; \
73         mov     _IMM8, r15; \
74 98:     mov.l   mem, old; \
75         cmp/eq  old, reg; \
76         bf      99f; \
77         mov.l   new, mem; \
78 99:     mov     r1, r15
79
80 #endif  /* __ASSEMBLER__ */