pthread_rwlock_rdlock on Linux/SH.
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / linux / sh / lowlevel-atomic.h
1 /* Copyright (C) 2003 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, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #ifdef __ASSEMBLER__
20
21 #define _IMP1 #1
22 #define _IMM1 #-1
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) \
47         .align  2; \
48         mova    99f, r0; \
49         mov     r15, r1; \
50         mov     _IMM6, r15; \
51 98:     mov.l   mem, old; \
52         add     old, reg; \
53         mov.l   reg, mem; \
54 99:     mov     r1, r15
55
56 #define CMPXCHG(reg, mem, new, old) \
57         .align  2; \
58         mova    99f, r0; \
59         nop; \
60         mov     r15, r1; \
61         mov     _IMM8, r15; \
62 98:     mov.l   mem, old; \
63         cmp/eq  old, reg; \
64         bf      99f; \
65         mov.l   new, mem; \
66 99:     mov     r1, r15
67
68 #endif  /* __ASSEMBLER__ */