24
24
#ifndef ETHREAD_TILE_ATOMIC_H
25
25
#define ETHREAD_TILE_ATOMIC_H
27
#define ETHR_HAVE_NATIVE_ATOMIC32 1
27
29
#include <atomic.h>
29
31
/* An atomic is an aligned int accessed via locked operations.
32
volatile long counter;
33
} ethr_native_atomic_t;
35
#ifdef ETHR_TRY_INLINE_FUNCS
34
volatile ethr_sint32_t counter;
35
} ethr_native_atomic32_t;
37
#define ETHR_MEMORY_BARRIER __insn_mf()
39
#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
41
static ETHR_INLINE ethr_sint32_t *
42
ethr_native_atomic32_addr(ethr_native_atomic32_t *var)
44
return (ethr_sint32_t *) &var->counter;
37
47
static ETHR_INLINE void
38
ethr_native_atomic_init(ethr_native_atomic_t *var, long i)
48
ethr_native_atomic32_init(ethr_native_atomic32_t *var, ethr_sint32_t i)
43
53
static ETHR_INLINE void
44
ethr_native_atomic_set(ethr_native_atomic_t *var, long i)
54
ethr_native_atomic32_set(ethr_native_atomic32_t *var, ethr_sint32_t i)
47
56
atomic_exchange_acq(&var->counter, i);
50
static ETHR_INLINE long
51
ethr_native_atomic_read(ethr_native_atomic_t *var)
59
static ETHR_INLINE ethr_sint32_t
60
ethr_native_atomic32_read(ethr_native_atomic32_t *var)
53
62
return var->counter;
56
65
static ETHR_INLINE void
57
ethr_native_atomic_add(ethr_native_atomic_t *var, long incr)
66
ethr_native_atomic32_add(ethr_native_atomic32_t *var, ethr_sint32_t incr)
60
68
atomic_add(&var->counter, incr);
63
71
static ETHR_INLINE void
64
ethr_native_atomic_inc(ethr_native_atomic_t *var)
72
ethr_native_atomic32_inc(ethr_native_atomic32_t *var)
67
74
atomic_increment(&var->counter);
70
77
static ETHR_INLINE void
71
ethr_native_atomic_dec(ethr_native_atomic_t *var)
78
ethr_native_atomic32_dec(ethr_native_atomic32_t *var)
74
80
atomic_decrement(&var->counter);
77
static ETHR_INLINE long
78
ethr_native_atomic_add_return(ethr_native_atomic_t *var, long incr)
83
static ETHR_INLINE ethr_sint32_t
84
ethr_native_atomic32_add_return(ethr_native_atomic32_t *var, ethr_sint32_t incr)
81
86
return atomic_exchange_and_add(&var->counter, incr) + incr;
84
static ETHR_INLINE long
85
ethr_native_atomic_inc_return(ethr_native_atomic_t *var)
87
return ethr_native_atomic_add_return(&var->counter, 1);
90
static ETHR_INLINE long
91
ethr_native_atomic_dec_return(ethr_native_atomic_t *var)
93
return ethr_native_atomic_add_return(&var->counter, -1);
96
static ETHR_INLINE long
97
ethr_native_atomic_and_retold(ethr_native_atomic_t *var, long mask)
99
/* Implement a barrier suitable for a mutex unlock. */
89
static ETHR_INLINE ethr_sint32_t
90
ethr_native_atomic32_inc_return(ethr_native_atomic32_t *var)
92
return ethr_native_atomic32_add_return(var, 1);
95
static ETHR_INLINE ethr_sint32_t
96
ethr_native_atomic32_dec_return(ethr_native_atomic32_t *var)
98
return ethr_native_atomic32_add_return(var, -1);
101
static ETHR_INLINE ethr_sint32_t
102
ethr_native_atomic32_and_retold(ethr_native_atomic32_t *var, ethr_sint32_t mask)
101
104
return atomic_and_val(&var->counter, mask);
104
static ETHR_INLINE long
105
ethr_native_atomic_or_retold(ethr_native_atomic_t *var, long mask)
107
static ETHR_INLINE ethr_sint32_t
108
ethr_native_atomic32_or_retold(ethr_native_atomic32_t *var, ethr_sint32_t mask)
108
110
return atomic_or_val(&var->counter, mask);
111
static ETHR_INLINE long
112
ethr_native_atomic_xchg(ethr_native_atomic_t *var, long val)
113
static ETHR_INLINE ethr_sint32_t
114
ethr_native_atomic32_xchg(ethr_native_atomic32_t *var, ethr_sint32_t val)
115
116
return atomic_exchange_acq(&var->counter, val);
118
static ETHR_INLINE long
119
ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, long new, long expected)
119
static ETHR_INLINE ethr_sint32_t
120
ethr_native_atomic32_cmpxchg(ethr_native_atomic32_t *var,
122
ethr_sint32_t expected)
121
/* Implement a barrier suitable for a mutex unlock. */
123
124
return atomic_compare_and_exchange_val_acq(&var->counter, new, expected);
128
* Atomic ops with at least specified barriers.
131
static ETHR_INLINE ethr_sint32_t
132
ethr_native_atomic32_read_acqb(ethr_native_atomic32_t *var)
134
ethr_sint32_t res = ethr_native_atomic32_read(var);
139
static ETHR_INLINE ethr_sint32_t
140
ethr_native_atomic32_inc_return_acqb(ethr_native_atomic32_t *var)
142
ethr_sint32_t res = ethr_native_atomic32_inc_return(var);
147
static ETHR_INLINE void
148
ethr_native_atomic32_set_relb(ethr_native_atomic32_t *var, ethr_sint32_t val)
151
ethr_native_atomic32_set(var, val);
154
static ETHR_INLINE void
155
ethr_native_atomic32_dec_relb(ethr_native_atomic32_t *var)
158
ethr_native_atomic32_dec(var);
161
static ETHR_INLINE ethr_sint32_t
162
ethr_native_atomic32_dec_return_relb(ethr_native_atomic32_t *var)
165
return ethr_native_atomic32_dec_return(var);
168
static ETHR_INLINE ethr_sint32_t
169
ethr_native_atomic32_cmpxchg_acqb(ethr_native_atomic32_t *var,
173
return ethr_native_atomic32_cmpxchg(var, new, exp);
176
static ETHR_INLINE ethr_sint32_t
177
ethr_native_atomic32_cmpxchg_relb(ethr_native_atomic32_t *var,
182
return ethr_native_atomic32_cmpxchg(var, new, exp);
126
185
#endif /* ETHR_TRY_INLINE_FUNCS */
128
187
#endif /* ETHREAD_TILE_ATOMIC_H */