]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/s390/s390-64/atomicity.h
Update.
[thirdparty/glibc.git] / sysdeps / s390 / s390-64 / atomicity.h
1 /* Low-level functions for atomic operations. 64 bit S/390 version.
2 Copyright (C) 2001 Free Software Foundation, Inc.
3 Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA. */
20
21 #ifndef _ATOMICITY_H
22 #define _ATOMICITY_H 1
23
24 #include <inttypes.h>
25
26 static inline int
27 __attribute__ ((unused))
28 exchange_and_add (volatile uint32_t *mem, int val)
29 {
30 int result;
31 __asm__ __volatile__(
32 " L %0,%2\n"
33 " LA 2,%1\n"
34 "0: LR 0,%0\n"
35 " AR 0,%3\n"
36 " CS %0,0,0(2)\n"
37 " JL 0b"
38 : "=&d" (result), "=m" (*mem)
39 : "1" (*mem), "d" (val) : "0", "1", "2" );
40 return result;
41 }
42
43 static inline void
44 __attribute__ ((unused))
45 atomic_add (volatile uint32_t *mem, int val)
46 {
47 __asm__ __volatile__(
48 " LA 2,%0\n"
49 "0: L 0,%1\n"
50 " LR 1,0\n"
51 " AR 1,%2\n"
52 " CS 0,1,0(2)\n"
53 " JL 0b"
54 : "=m" (*mem) : "0" (*mem), "d" (val) : "0", "1", "2" );
55 }
56
57 static inline int
58 __attribute__ ((unused))
59 compare_and_swap (volatile long int *p, long int oldval, long int newval)
60 {
61 int retval;
62
63 __asm__ __volatile__(
64 " la 1,%1\n"
65 " lgr 0,%2\n"
66 " csg 0,%3,0(1)\n"
67 " ipm %0\n"
68 " srl %0,28\n"
69 "0:"
70 : "=&r" (retval), "+m" (*p)
71 : "d" (oldval) , "d" (newval)
72 : "memory", "0", "1", "cc");
73 return !retval;
74 }
75
76 #endif /* atomicity.h */