github.com/llvm-mirror/llgo@v0.0.0-20190322182713-bf6f0a60fce1/third_party/gofrontend/libgo/go/sync/atomic/atomic.c (about) 1 /* atomic.c -- implement atomic routines for Go. 2 3 Copyright 2011 The Go Authors. All rights reserved. 4 Use of this source code is governed by a BSD-style 5 license that can be found in the LICENSE file. */ 6 7 #include <stdint.h> 8 9 #include "runtime.h" 10 11 int32_t SwapInt32 (int32_t *, int32_t) 12 __asm__ (GOSYM_PREFIX "sync_atomic.SwapInt32") 13 __attribute__ ((no_split_stack)); 14 15 int32_t 16 SwapInt32 (int32_t *addr, int32_t new) 17 { 18 return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST); 19 } 20 21 int64_t SwapInt64 (int64_t *, int64_t) 22 __asm__ (GOSYM_PREFIX "sync_atomic.SwapInt64") 23 __attribute__ ((no_split_stack)); 24 25 int64_t 26 SwapInt64 (int64_t *addr, int64_t new) 27 { 28 return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST); 29 } 30 31 uint32_t SwapUint32 (uint32_t *, uint32_t) 32 __asm__ (GOSYM_PREFIX "sync_atomic.SwapUint32") 33 __attribute__ ((no_split_stack)); 34 35 uint32_t 36 SwapUint32 (uint32_t *addr, uint32_t new) 37 { 38 return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST); 39 } 40 41 uint64_t SwapUint64 (uint64_t *, uint64_t) 42 __asm__ (GOSYM_PREFIX "sync_atomic.SwapUint64") 43 __attribute__ ((no_split_stack)); 44 45 uint64_t 46 SwapUint64 (uint64_t *addr, uint64_t new) 47 { 48 return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST); 49 } 50 51 uintptr_t SwapUintptr (uintptr_t *, uintptr_t) 52 __asm__ (GOSYM_PREFIX "sync_atomic.SwapUintptr") 53 __attribute__ ((no_split_stack)); 54 55 uintptr_t 56 SwapUintptr (uintptr_t *addr, uintptr_t new) 57 { 58 return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST); 59 } 60 61 void *SwapPointer (void **, void *) 62 __asm__ (GOSYM_PREFIX "sync_atomic.SwapPointer") 63 __attribute__ ((no_split_stack)); 64 65 void * 66 SwapPointer (void **addr, void *new) 67 { 68 return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST); 69 } 70 71 _Bool CompareAndSwapInt32 (int32_t *, int32_t, int32_t) 72 __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapInt32") 73 __attribute__ ((no_split_stack)); 74 75 _Bool 76 CompareAndSwapInt32 (int32_t *val, int32_t old, int32_t new) 77 { 78 return __sync_bool_compare_and_swap (val, old, new); 79 } 80 81 _Bool CompareAndSwapInt64 (int64_t *, int64_t, int64_t) 82 __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapInt64") 83 __attribute__ ((no_split_stack)); 84 85 _Bool 86 CompareAndSwapInt64 (int64_t *val, int64_t old, int64_t new) 87 { 88 return __sync_bool_compare_and_swap (val, old, new); 89 } 90 91 _Bool CompareAndSwapUint32 (uint32_t *, uint32_t, uint32_t) 92 __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapUint32") 93 __attribute__ ((no_split_stack)); 94 95 _Bool 96 CompareAndSwapUint32 (uint32_t *val, uint32_t old, uint32_t new) 97 { 98 return __sync_bool_compare_and_swap (val, old, new); 99 } 100 101 _Bool CompareAndSwapUint64 (uint64_t *, uint64_t, uint64_t) 102 __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapUint64") 103 __attribute__ ((no_split_stack)); 104 105 _Bool 106 CompareAndSwapUint64 (uint64_t *val, uint64_t old, uint64_t new) 107 { 108 return __sync_bool_compare_and_swap (val, old, new); 109 } 110 111 _Bool CompareAndSwapUintptr (uintptr_t *, uintptr_t, uintptr_t) 112 __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapUintptr") 113 __attribute__ ((no_split_stack)); 114 115 _Bool 116 CompareAndSwapUintptr (uintptr_t *val, uintptr_t old, uintptr_t new) 117 { 118 return __sync_bool_compare_and_swap (val, old, new); 119 } 120 121 _Bool CompareAndSwapPointer (void **, void *, void *) 122 __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapPointer") 123 __attribute__ ((no_split_stack)); 124 125 _Bool 126 CompareAndSwapPointer (void **val, void *old, void *new) 127 { 128 return __sync_bool_compare_and_swap (val, old, new); 129 } 130 131 int32_t AddInt32 (int32_t *, int32_t) 132 __asm__ (GOSYM_PREFIX "sync_atomic.AddInt32") 133 __attribute__ ((no_split_stack)); 134 135 int32_t 136 AddInt32 (int32_t *val, int32_t delta) 137 { 138 return __sync_add_and_fetch (val, delta); 139 } 140 141 uint32_t AddUint32 (uint32_t *, uint32_t) 142 __asm__ (GOSYM_PREFIX "sync_atomic.AddUint32") 143 __attribute__ ((no_split_stack)); 144 145 uint32_t 146 AddUint32 (uint32_t *val, uint32_t delta) 147 { 148 return __sync_add_and_fetch (val, delta); 149 } 150 151 int64_t AddInt64 (int64_t *, int64_t) 152 __asm__ (GOSYM_PREFIX "sync_atomic.AddInt64") 153 __attribute__ ((no_split_stack)); 154 155 int64_t 156 AddInt64 (int64_t *val, int64_t delta) 157 { 158 return __sync_add_and_fetch (val, delta); 159 } 160 161 uint64_t AddUint64 (uint64_t *, uint64_t) 162 __asm__ (GOSYM_PREFIX "sync_atomic.AddUint64") 163 __attribute__ ((no_split_stack)); 164 165 uint64_t 166 AddUint64 (uint64_t *val, uint64_t delta) 167 { 168 return __sync_add_and_fetch (val, delta); 169 } 170 171 uintptr_t AddUintptr (uintptr_t *, uintptr_t) 172 __asm__ (GOSYM_PREFIX "sync_atomic.AddUintptr") 173 __attribute__ ((no_split_stack)); 174 175 uintptr_t 176 AddUintptr (uintptr_t *val, uintptr_t delta) 177 { 178 return __sync_add_and_fetch (val, delta); 179 } 180 181 int32_t LoadInt32 (int32_t *addr) 182 __asm__ (GOSYM_PREFIX "sync_atomic.LoadInt32") 183 __attribute__ ((no_split_stack)); 184 185 int32_t 186 LoadInt32 (int32_t *addr) 187 { 188 int32_t v; 189 190 v = *addr; 191 while (! __sync_bool_compare_and_swap (addr, v, v)) 192 v = *addr; 193 return v; 194 } 195 196 int64_t LoadInt64 (int64_t *addr) 197 __asm__ (GOSYM_PREFIX "sync_atomic.LoadInt64") 198 __attribute__ ((no_split_stack)); 199 200 int64_t 201 LoadInt64 (int64_t *addr) 202 { 203 int64_t v; 204 205 v = *addr; 206 while (! __sync_bool_compare_and_swap (addr, v, v)) 207 v = *addr; 208 return v; 209 } 210 211 uint32_t LoadUint32 (uint32_t *addr) 212 __asm__ (GOSYM_PREFIX "sync_atomic.LoadUint32") 213 __attribute__ ((no_split_stack)); 214 215 uint32_t 216 LoadUint32 (uint32_t *addr) 217 { 218 uint32_t v; 219 220 v = *addr; 221 while (! __sync_bool_compare_and_swap (addr, v, v)) 222 v = *addr; 223 return v; 224 } 225 226 uint64_t LoadUint64 (uint64_t *addr) 227 __asm__ (GOSYM_PREFIX "sync_atomic.LoadUint64") 228 __attribute__ ((no_split_stack)); 229 230 uint64_t 231 LoadUint64 (uint64_t *addr) 232 { 233 uint64_t v; 234 235 v = *addr; 236 while (! __sync_bool_compare_and_swap (addr, v, v)) 237 v = *addr; 238 return v; 239 } 240 241 uintptr_t LoadUintptr (uintptr_t *addr) 242 __asm__ (GOSYM_PREFIX "sync_atomic.LoadUintptr") 243 __attribute__ ((no_split_stack)); 244 245 uintptr_t 246 LoadUintptr (uintptr_t *addr) 247 { 248 uintptr_t v; 249 250 v = *addr; 251 while (! __sync_bool_compare_and_swap (addr, v, v)) 252 v = *addr; 253 return v; 254 } 255 256 void *LoadPointer (void **addr) 257 __asm__ (GOSYM_PREFIX "sync_atomic.LoadPointer") 258 __attribute__ ((no_split_stack)); 259 260 void * 261 LoadPointer (void **addr) 262 { 263 void *v; 264 265 v = *addr; 266 while (! __sync_bool_compare_and_swap (addr, v, v)) 267 v = *addr; 268 return v; 269 } 270 271 void StoreInt32 (int32_t *addr, int32_t val) 272 __asm__ (GOSYM_PREFIX "sync_atomic.StoreInt32") 273 __attribute__ ((no_split_stack)); 274 275 void 276 StoreInt32 (int32_t *addr, int32_t val) 277 { 278 int32_t v; 279 280 v = *addr; 281 while (! __sync_bool_compare_and_swap (addr, v, val)) 282 v = *addr; 283 } 284 285 void StoreInt64 (int64_t *addr, int64_t val) 286 __asm__ (GOSYM_PREFIX "sync_atomic.StoreInt64") 287 __attribute__ ((no_split_stack)); 288 289 void 290 StoreInt64 (int64_t *addr, int64_t val) 291 { 292 int64_t v; 293 294 v = *addr; 295 while (! __sync_bool_compare_and_swap (addr, v, val)) 296 v = *addr; 297 } 298 299 void StoreUint32 (uint32_t *addr, uint32_t val) 300 __asm__ (GOSYM_PREFIX "sync_atomic.StoreUint32") 301 __attribute__ ((no_split_stack)); 302 303 void 304 StoreUint32 (uint32_t *addr, uint32_t val) 305 { 306 uint32_t v; 307 308 v = *addr; 309 while (! __sync_bool_compare_and_swap (addr, v, val)) 310 v = *addr; 311 } 312 313 void StoreUint64 (uint64_t *addr, uint64_t val) 314 __asm__ (GOSYM_PREFIX "sync_atomic.StoreUint64") 315 __attribute__ ((no_split_stack)); 316 317 void 318 StoreUint64 (uint64_t *addr, uint64_t val) 319 { 320 uint64_t v; 321 322 v = *addr; 323 while (! __sync_bool_compare_and_swap (addr, v, val)) 324 v = *addr; 325 } 326 327 void StoreUintptr (uintptr_t *addr, uintptr_t val) 328 __asm__ (GOSYM_PREFIX "sync_atomic.StoreUintptr") 329 __attribute__ ((no_split_stack)); 330 331 void 332 StoreUintptr (uintptr_t *addr, uintptr_t val) 333 { 334 uintptr_t v; 335 336 v = *addr; 337 while (! __sync_bool_compare_and_swap (addr, v, val)) 338 v = *addr; 339 } 340 341 void StorePointer (void **addr, void *val) 342 __asm__ (GOSYM_PREFIX "sync_atomic.StorePointer") 343 __attribute__ ((no_split_stack)); 344 345 void 346 StorePointer (void **addr, void *val) 347 { 348 void *v; 349 350 v = *addr; 351 while (! __sync_bool_compare_and_swap (addr, v, val)) 352 v = *addr; 353 }