Moved in shared directory.
[kopensolaris-gnu/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 Library General Public License as
8    published by the Free Software Foundation; either version 2 of the
9    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    Library General Public License for more details.
15
16    You should have received a copy of the GNU Library General Public
17    License along with the GNU C Library; see the file COPYING.LIB.  If not,
18    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19    Boston, MA 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 */