github.com/zxy12/go_duplicate_112_new@v0.0.0-20200807091221-747231827200/src/runtime/internal/atomic/atomic_wasm.go (about) 1 // Copyright 2018 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 // TODO(neelance): implement with actual atomic operations as soon as threads are available 6 // See https://github.com/WebAssembly/design/issues/1073 7 8 package atomic 9 10 import "unsafe" 11 12 //go:nosplit 13 //go:noinline 14 func Load(ptr *uint32) uint32 { 15 return *ptr 16 } 17 18 //go:nosplit 19 //go:noinline 20 func Loadp(ptr unsafe.Pointer) unsafe.Pointer { 21 return *(*unsafe.Pointer)(ptr) 22 } 23 24 //go:nosplit 25 //go:noinline 26 func LoadAcq(ptr *uint32) uint32 { 27 return *ptr 28 } 29 30 //go:nosplit 31 //go:noinline 32 func Load64(ptr *uint64) uint64 { 33 return *ptr 34 } 35 36 //go:nosplit 37 //go:noinline 38 func Xadd(ptr *uint32, delta int32) uint32 { 39 new := *ptr + uint32(delta) 40 *ptr = new 41 return new 42 } 43 44 //go:nosplit 45 //go:noinline 46 func Xadd64(ptr *uint64, delta int64) uint64 { 47 new := *ptr + uint64(delta) 48 *ptr = new 49 return new 50 } 51 52 //go:nosplit 53 //go:noinline 54 func Xadduintptr(ptr *uintptr, delta uintptr) uintptr { 55 new := *ptr + delta 56 *ptr = new 57 return new 58 } 59 60 //go:nosplit 61 //go:noinline 62 func Xchg(ptr *uint32, new uint32) uint32 { 63 old := *ptr 64 *ptr = new 65 return old 66 } 67 68 //go:nosplit 69 //go:noinline 70 func Xchg64(ptr *uint64, new uint64) uint64 { 71 old := *ptr 72 *ptr = new 73 return old 74 } 75 76 //go:nosplit 77 //go:noinline 78 func Xchguintptr(ptr *uintptr, new uintptr) uintptr { 79 old := *ptr 80 *ptr = new 81 return old 82 } 83 84 //go:nosplit 85 //go:noinline 86 func And8(ptr *uint8, val uint8) { 87 *ptr = *ptr & val 88 } 89 90 //go:nosplit 91 //go:noinline 92 func Or8(ptr *uint8, val uint8) { 93 *ptr = *ptr | val 94 } 95 96 // NOTE: Do not add atomicxor8 (XOR is not idempotent). 97 98 //go:nosplit 99 //go:noinline 100 func Cas64(ptr *uint64, old, new uint64) bool { 101 if *ptr == old { 102 *ptr = new 103 return true 104 } 105 return false 106 } 107 108 //go:nosplit 109 //go:noinline 110 func Store(ptr *uint32, val uint32) { 111 *ptr = val 112 } 113 114 //go:nosplit 115 //go:noinline 116 func StoreRel(ptr *uint32, val uint32) { 117 *ptr = val 118 } 119 120 //go:nosplit 121 //go:noinline 122 func Store64(ptr *uint64, val uint64) { 123 *ptr = val 124 } 125 126 //go:noinline 127 //go:nosplit 128 func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer) { 129 *(*uintptr)(ptr) = uintptr(val) 130 } 131 132 //go:nosplit 133 //go:noinline 134 func Cas(ptr *uint32, old, new uint32) bool { 135 if *ptr == old { 136 *ptr = new 137 return true 138 } 139 return false 140 } 141 142 //go:nosplit 143 //go:noinline 144 func Casp1(ptr *unsafe.Pointer, old, new unsafe.Pointer) bool { 145 if *ptr == old { 146 *ptr = new 147 return true 148 } 149 return false 150 } 151 152 //go:nosplit 153 //go:noinline 154 func Casuintptr(ptr *uintptr, old, new uintptr) bool { 155 if *ptr == old { 156 *ptr = new 157 return true 158 } 159 return false 160 } 161 162 //go:nosplit 163 //go:noinline 164 func CasRel(ptr *uint32, old, new uint32) bool { 165 if *ptr == old { 166 *ptr = new 167 return true 168 } 169 return false 170 } 171 172 //go:nosplit 173 //go:noinline 174 func Storeuintptr(ptr *uintptr, new uintptr) { 175 *ptr = new 176 } 177 178 //go:nosplit 179 //go:noinline 180 func Loaduintptr(ptr *uintptr) uintptr { 181 return *ptr 182 } 183 184 //go:nosplit 185 //go:noinline 186 func Loaduint(ptr *uint) uint { 187 return *ptr 188 } 189 190 //go:nosplit 191 //go:noinline 192 func Loadint64(ptr *int64) int64 { 193 return *ptr 194 } 195 196 //go:nosplit 197 //go:noinline 198 func Xaddint64(ptr *int64, delta int64) int64 { 199 new := *ptr + delta 200 *ptr = new 201 return new 202 }