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