2.3.90-1
[kopensolaris-gnu/glibc.git] / sysdeps / ia64 / bits / 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 #include <stdint.h>
20 #include <ia64intrin.h>
21
22 typedef int8_t atomic8_t;
23 typedef uint8_t uatomic8_t;
24 typedef int_fast8_t atomic_fast8_t;
25 typedef uint_fast8_t uatomic_fast8_t;
26
27 typedef int16_t atomic16_t;
28 typedef uint16_t uatomic16_t;
29 typedef int_fast16_t atomic_fast16_t;
30 typedef uint_fast16_t uatomic_fast16_t;
31
32 typedef int32_t atomic32_t;
33 typedef uint32_t uatomic32_t;
34 typedef int_fast32_t atomic_fast32_t;
35 typedef uint_fast32_t uatomic_fast32_t;
36
37 typedef int64_t atomic64_t;
38 typedef uint64_t uatomic64_t;
39 typedef int_fast64_t atomic_fast64_t;
40 typedef uint_fast64_t uatomic_fast64_t;
41
42 typedef intptr_t atomicptr_t;
43 typedef uintptr_t uatomicptr_t;
44 typedef intmax_t atomic_max_t;
45 typedef uintmax_t uatomic_max_t;
46
47
48 #define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \
49   (abort (), 0)
50
51 #define __arch_compare_and_exchange_bool_16_acq(mem, newval, oldval) \
52   (abort (), 0)
53
54 #define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \
55   (!__sync_bool_compare_and_swap ((mem), (int) (long) (oldval), \
56                                   (int) (long) (newval)))
57
58 #define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \
59   (!__sync_bool_compare_and_swap ((mem), (long) (oldval), \
60                                   (long) (newval)))
61
62 #define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
63   (abort (), (__typeof (*mem)) 0)
64
65 #define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
66   (abort (), (__typeof (*mem)) 0)
67
68 #define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
69   __sync_val_compare_and_swap ((mem), (int) (long) (oldval), \
70                                (int) (long) (newval))
71
72 #define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
73   __sync_val_compare_and_swap ((mem), (long) (oldval), (long) (newval))
74
75 /* Atomically store newval and return the old value.  */
76 #define atomic_exchange_acq(mem, value) \
77   __sync_lock_test_and_set (mem, value)
78
79 #define atomic_exchange_rel(mem, value) \
80   (__sync_synchronize (), __sync_lock_test_and_set (mem, value))
81
82 #define atomic_exchange_and_add(mem, value) \
83   ({ __typeof (*mem) __result;                                                \
84      __result = __sync_fetch_and_add ((mem), (int) (value));                  \
85      __result; })
86
87 #define atomic_decrement_if_positive(mem) \
88   ({ __typeof (*mem) __oldval, __val;                                         \
89      __typeof (mem) __memp = (mem);                                           \
90                                                                               \
91      __val = (*__memp);                                                       \
92      do                                                                       \
93        {                                                                      \
94          __oldval = __val;                                                    \
95          if (__builtin_expect (__val <= 0, 0))                                \
96            break;                                                             \
97          __val = atomic_compare_and_exchange_val_acq (__memp,   __oldval - 1, \
98                                                       __oldval);              \
99        }                                                                      \
100      while (__builtin_expect (__val != __oldval, 0));                         \
101      __oldval; })
102
103 #define atomic_bit_test_set(mem, bit) \
104   ({ __typeof (*mem) __oldval, __val;                                         \
105      __typeof (mem) __memp = (mem);                                           \
106      __typeof (*mem) __mask = ((__typeof (*mem)) 1 << (bit));                 \
107                                                                               \
108      __val = (*__memp);                                                       \
109      do                                                                       \
110        {                                                                      \
111          __oldval = __val;                                                    \
112          __val = atomic_compare_and_exchange_val_acq (__memp,                 \
113                                                       __oldval | __mask,      \
114                                                       __oldval);              \
115        }                                                                      \
116      while (__builtin_expect (__val != __oldval, 0));                         \
117      __oldval & __mask; })
118
119 #define atomic_full_barrier() __sync_synchronize ()