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 5package atomic 6 7import "unsafe" 8 9// Export some functions via linkname to assembly in sync/atomic. 10// 11//go:linkname Load 12//go:linkname Loadp 13//go:linkname Load64 14 15//go:nosplit 16//go:noinline 17func Load(ptr *uint32) uint32 { 18 return *ptr 19} 20 21//go:nosplit 22//go:noinline 23func Loadp(ptr unsafe.Pointer) unsafe.Pointer { 24 return *(*unsafe.Pointer)(ptr) 25} 26 27//go:nosplit 28//go:noinline 29func Load8(ptr *uint8) uint8 { 30 return *ptr 31} 32 33//go:nosplit 34//go:noinline 35func Load64(ptr *uint64) uint64 { 36 return *ptr 37} 38 39//go:nosplit 40//go:noinline 41func LoadAcq(ptr *uint32) uint32 { 42 return *ptr 43} 44 45//go:nosplit 46//go:noinline 47func LoadAcq64(ptr *uint64) uint64 { 48 return *ptr 49} 50 51//go:nosplit 52//go:noinline 53func LoadAcquintptr(ptr *uintptr) uintptr { 54 return *ptr 55} 56 57//go:noescape 58func Store(ptr *uint32, val uint32) 59 60//go:noescape 61func Store8(ptr *uint8, val uint8) 62 63//go:noescape 64func Store64(ptr *uint64, val uint64) 65 66// NO go:noescape annotation; see atomic_pointer.go. 67func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer) 68 69//go:nosplit 70//go:noinline 71func StoreRel(ptr *uint32, val uint32) { 72 *ptr = val 73} 74 75//go:nosplit 76//go:noinline 77func StoreRel64(ptr *uint64, val uint64) { 78 *ptr = val 79} 80 81//go:nosplit 82//go:noinline 83func StoreReluintptr(ptr *uintptr, val uintptr) { 84 *ptr = val 85} 86 87//go:noescape 88func And8(ptr *uint8, val uint8) 89 90//go:noescape 91func Or8(ptr *uint8, val uint8) 92 93// NOTE: Do not add atomicxor8 (XOR is not idempotent). 94 95//go:noescape 96func And(ptr *uint32, val uint32) 97 98//go:noescape 99func Or(ptr *uint32, val uint32) 100 101//go:noescape 102func And32(ptr *uint32, val uint32) uint32 103 104//go:noescape 105func Or32(ptr *uint32, val uint32) uint32 106 107//go:noescape 108func And64(ptr *uint64, val uint64) uint64 109 110//go:noescape 111func Or64(ptr *uint64, val uint64) uint64 112 113//go:noescape 114func Anduintptr(ptr *uintptr, val uintptr) uintptr 115 116//go:noescape 117func Oruintptr(ptr *uintptr, val uintptr) uintptr 118 119//go:noescape 120func Xadd(ptr *uint32, delta int32) uint32 121 122//go:noescape 123func Xadd64(ptr *uint64, delta int64) uint64 124 125//go:noescape 126func Xadduintptr(ptr *uintptr, delta uintptr) uintptr 127 128//go:noescape 129func Xchg(ptr *uint32, new uint32) uint32 130 131//go:noescape 132func Xchg64(ptr *uint64, new uint64) uint64 133 134//go:noescape 135func Xchguintptr(ptr *uintptr, new uintptr) uintptr 136 137//go:noescape 138func Cas64(ptr *uint64, old, new uint64) bool 139 140//go:noescape 141func CasRel(ptr *uint32, old, new uint32) bool 142