1// Copyright 2009 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 Load64(ptr *uint64) uint64 {
30	return *ptr
31}
32
33//go:nosplit
34//go:noinline
35func LoadAcq(ptr *uint32) uint32 {
36	return *ptr
37}
38
39//go:nosplit
40//go:noinline
41func LoadAcq64(ptr *uint64) uint64 {
42	return *ptr
43}
44
45//go:nosplit
46//go:noinline
47func LoadAcquintptr(ptr *uintptr) uintptr {
48	return *ptr
49}
50
51//go:noescape
52func Xadd(ptr *uint32, delta int32) uint32
53
54//go:noescape
55func Xadd64(ptr *uint64, delta int64) uint64
56
57//go:noescape
58func Xadduintptr(ptr *uintptr, delta uintptr) uintptr
59
60//go:noescape
61func Xchg(ptr *uint32, new uint32) uint32
62
63//go:noescape
64func Xchg64(ptr *uint64, new uint64) uint64
65
66//go:noescape
67func Xchguintptr(ptr *uintptr, new uintptr) uintptr
68
69//go:nosplit
70//go:noinline
71func Load8(ptr *uint8) uint8 {
72	return *ptr
73}
74
75//go:noescape
76func And8(ptr *uint8, val uint8)
77
78//go:noescape
79func Or8(ptr *uint8, val uint8)
80
81//go:noescape
82func And(ptr *uint32, val uint32)
83
84//go:noescape
85func Or(ptr *uint32, val uint32)
86
87//go:noescape
88func And32(ptr *uint32, val uint32) uint32
89
90//go:noescape
91func Or32(ptr *uint32, val uint32) uint32
92
93//go:noescape
94func And64(ptr *uint64, val uint64) uint64
95
96//go:noescape
97func Or64(ptr *uint64, val uint64) uint64
98
99//go:noescape
100func Anduintptr(ptr *uintptr, val uintptr) uintptr
101
102//go:noescape
103func Oruintptr(ptr *uintptr, val uintptr) uintptr
104
105// NOTE: Do not add atomicxor8 (XOR is not idempotent).
106
107//go:noescape
108func Cas64(ptr *uint64, old, new uint64) bool
109
110//go:noescape
111func CasRel(ptr *uint32, old, new uint32) bool
112
113//go:noescape
114func Store(ptr *uint32, val uint32)
115
116//go:noescape
117func Store8(ptr *uint8, val uint8)
118
119//go:noescape
120func Store64(ptr *uint64, val uint64)
121
122//go:noescape
123func StoreRel(ptr *uint32, val uint32)
124
125//go:noescape
126func StoreRel64(ptr *uint64, val uint64)
127
128//go:noescape
129func StoreReluintptr(ptr *uintptr, val uintptr)
130
131// StorepNoWB performs *ptr = val atomically and without a write
132// barrier.
133//
134// NO go:noescape annotation; see atomic_pointer.go.
135func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer)
136