(elf_machine_lookup_noplt_p, elf_machine_lookup_noexec_p): Remove.
[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 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 */