github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/go/runtime/internal/atomic/atomic.c (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include <stdint.h> 6 7 #include "runtime.h" 8 9 uint32_t Load (uint32_t *ptr) 10 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Load") 11 __attribute__ ((no_split_stack)); 12 13 uint32_t 14 Load (uint32_t *ptr) 15 { 16 return __atomic_load_n (ptr, __ATOMIC_SEQ_CST); 17 } 18 19 void *Loadp (void *ptr) 20 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Loadp") 21 __attribute__ ((no_split_stack)); 22 23 void * 24 Loadp (void *ptr) 25 { 26 return __atomic_load_n ((void **) ptr, __ATOMIC_SEQ_CST); 27 } 28 29 uint8_t Load8 (uint8_t *ptr) 30 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Load8") 31 __attribute__ ((no_split_stack)); 32 33 uint8_t 34 Load8 (uint8_t *ptr) 35 { 36 return __atomic_load_n (ptr, __ATOMIC_SEQ_CST); 37 } 38 39 uint64_t Load64 (uint64_t *ptr) 40 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Load64") 41 __attribute__ ((no_split_stack)); 42 43 uint64_t 44 Load64 (uint64_t *ptr) 45 { 46 if (((uintptr_t) ptr & 7) != 0) 47 panicmem (); 48 return __atomic_load_n (ptr, __ATOMIC_SEQ_CST); 49 } 50 51 uint32_t LoadAcq (uint32_t *ptr) 52 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.LoadAcq") 53 __attribute__ ((no_split_stack)); 54 55 uint32_t 56 LoadAcq (uint32_t *ptr) 57 { 58 return __atomic_load_n (ptr, __ATOMIC_ACQUIRE); 59 } 60 61 uintptr_t Loaduintptr (uintptr_t *ptr) 62 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Loaduintptr") 63 __attribute__ ((no_split_stack)); 64 65 uintptr_t 66 Loaduintptr (uintptr_t *ptr) 67 { 68 return __atomic_load_n (ptr, __ATOMIC_SEQ_CST); 69 } 70 71 uintgo Loaduint (uintgo *ptr) 72 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Loaduint") 73 __attribute__ ((no_split_stack)); 74 75 uintgo 76 Loaduint (uintgo *ptr) 77 { 78 return __atomic_load_n (ptr, __ATOMIC_SEQ_CST); 79 } 80 81 int64_t Loadint64 (int64_t *ptr) 82 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Loadint64") 83 __attribute__ ((no_split_stack)); 84 85 int64_t 86 Loadint64 (int64_t *ptr) 87 { 88 if (((uintptr_t) ptr & 7) != 0) 89 panicmem (); 90 return __atomic_load_n (ptr, __ATOMIC_SEQ_CST); 91 } 92 93 uint32_t Xadd (uint32_t *ptr, int32_t delta) 94 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xadd") 95 __attribute__ ((no_split_stack)); 96 97 uint32_t 98 Xadd (uint32_t *ptr, int32_t delta) 99 { 100 return __atomic_add_fetch (ptr, (uint32_t) delta, __ATOMIC_SEQ_CST); 101 } 102 103 uint64_t Xadd64 (uint64_t *ptr, int64_t delta) 104 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xadd64") 105 __attribute__ ((no_split_stack)); 106 107 uint64_t 108 Xadd64 (uint64_t *ptr, int64_t delta) 109 { 110 if (((uintptr_t) ptr & 7) != 0) 111 panicmem (); 112 return __atomic_add_fetch (ptr, (uint64_t) delta, __ATOMIC_SEQ_CST); 113 } 114 115 uintptr_t Xadduintptr (uintptr_t *ptr, uintptr_t delta) 116 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xadduintptr") 117 __attribute__ ((no_split_stack)); 118 119 uintptr_t 120 Xadduintptr (uintptr_t *ptr, uintptr_t delta) 121 { 122 return __atomic_add_fetch (ptr, delta, __ATOMIC_SEQ_CST); 123 } 124 125 int64_t Xaddint64 (int64_t *ptr, int64_t delta) 126 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xaddint64") 127 __attribute__ ((no_split_stack)); 128 129 int64_t 130 Xaddint64 (int64_t *ptr, int64_t delta) 131 { 132 if (((uintptr_t) ptr & 7) != 0) 133 panicmem (); 134 return __atomic_add_fetch (ptr, delta, __ATOMIC_SEQ_CST); 135 } 136 137 uint32_t Xchg (uint32_t *ptr, uint32_t new) 138 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xchg") 139 __attribute__ ((no_split_stack)); 140 141 uint32_t 142 Xchg (uint32_t *ptr, uint32_t new) 143 { 144 return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST); 145 } 146 147 uint64_t Xchg64 (uint64_t *ptr, uint64_t new) 148 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xchg64") 149 __attribute__ ((no_split_stack)); 150 151 uint64_t 152 Xchg64 (uint64_t *ptr, uint64_t new) 153 { 154 if (((uintptr_t) ptr & 7) != 0) 155 panicmem (); 156 return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST); 157 } 158 159 uintptr_t Xchguintptr (uintptr_t *ptr, uintptr_t new) 160 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Xchguintptr") 161 __attribute__ ((no_split_stack)); 162 163 uintptr_t 164 Xchguintptr (uintptr_t *ptr, uintptr_t new) 165 { 166 return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST); 167 } 168 169 void And8 (uint8_t *ptr, uint8_t val) 170 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.And8") 171 __attribute__ ((no_split_stack)); 172 173 void 174 And8 (uint8_t *ptr, uint8_t val) 175 { 176 __atomic_and_fetch (ptr, val, __ATOMIC_SEQ_CST); 177 } 178 179 void Or8 (uint8_t *ptr, uint8_t val) 180 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Or8") 181 __attribute__ ((no_split_stack)); 182 183 void 184 Or8 (uint8_t *ptr, uint8_t val) 185 { 186 __atomic_or_fetch (ptr, val, __ATOMIC_SEQ_CST); 187 } 188 189 _Bool Cas (uint32_t *ptr, uint32_t old, uint32_t new) 190 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Cas") 191 __attribute__ ((no_split_stack)); 192 193 _Bool 194 Cas (uint32_t *ptr, uint32_t old, uint32_t new) 195 { 196 return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED); 197 } 198 199 _Bool Cas64 (uint64_t *ptr, uint64_t old, uint64_t new) 200 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Cas64") 201 __attribute__ ((no_split_stack)); 202 203 _Bool 204 Cas64 (uint64_t *ptr, uint64_t old, uint64_t new) 205 { 206 if (((uintptr_t) ptr & 7) != 0) 207 panicmem (); 208 return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED); 209 } 210 211 _Bool CasRel (uint32_t *ptr, uint32_t old, uint32_t new) 212 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.CasRel") 213 __attribute__ ((no_split_stack)); 214 215 _Bool 216 CasRel (uint32_t *ptr, uint32_t old, uint32_t new) 217 { 218 return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_RELEASE, __ATOMIC_RELAXED); 219 } 220 221 _Bool Casp1 (void **ptr, void *old, void *new) 222 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Casp1") 223 __attribute__ ((no_split_stack)); 224 225 _Bool 226 Casp1 (void **ptr, void *old, void *new) 227 { 228 return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED); 229 } 230 231 _Bool Casuintptr (uintptr_t *ptr, uintptr_t old, uintptr_t new) 232 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Casuintptr") 233 __attribute__ ((no_split_stack)); 234 235 _Bool 236 Casuintptr (uintptr_t *ptr, uintptr_t old, uintptr_t new) 237 { 238 return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED); 239 } 240 241 void Store (uint32_t *ptr, uint32_t val) 242 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Store") 243 __attribute__ ((no_split_stack)); 244 245 void 246 Store (uint32_t *ptr, uint32_t val) 247 { 248 __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST); 249 } 250 251 void Store8 (uint8_t *ptr, uint8_t val) 252 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Store8") 253 __attribute__ ((no_split_stack)); 254 255 void 256 Store8 (uint8_t *ptr, uint8_t val) 257 { 258 __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST); 259 } 260 261 void Store64 (uint64_t *ptr, uint64_t val) 262 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Store64") 263 __attribute__ ((no_split_stack)); 264 265 void 266 Store64 (uint64_t *ptr, uint64_t val) 267 { 268 if (((uintptr_t) ptr & 7) != 0) 269 panicmem (); 270 __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST); 271 } 272 273 void StoreRel (uint32_t *ptr, uint32_t val) 274 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.StoreRel") 275 __attribute__ ((no_split_stack)); 276 277 void 278 StoreRel (uint32_t *ptr, uint32_t val) 279 { 280 __atomic_store_n (ptr, val, __ATOMIC_RELEASE); 281 } 282 283 void Storeuintptr (uintptr_t *ptr, uintptr_t val) 284 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.Storeuintptr") 285 __attribute__ ((no_split_stack)); 286 287 void 288 Storeuintptr (uintptr_t *ptr, uintptr_t val) 289 { 290 __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST); 291 } 292 293 void StorepNoWB (void *ptr, void *val) 294 __asm__ (GOSYM_PREFIX "runtime..z2finternal..z2fatomic.StorepNoWB") 295 __attribute__ ((no_split_stack)); 296 297 void 298 StorepNoWB (void *ptr, void *val) 299 { 300 __atomic_store_n ((void**) ptr, val, __ATOMIC_SEQ_CST); 301 }