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//go:linkname Load
11//go:linkname Loadp
12//go:linkname Load64
13
14//go:nosplit
15//go:noinline
16func Load(ptr *uint32) uint32 {
17	return *ptr
18}
19
20//go:nosplit
21//go:noinline
22func Loadp(ptr unsafe.Pointer) unsafe.Pointer {
23	return *(*unsafe.Pointer)(ptr)
24}
25
26//go:nosplit
27//go:noinline
28func Load64(ptr *uint64) uint64 {
29	return *ptr
30}
31
32//go:nosplit
33//go:noinline
34func LoadAcq(ptr *uint32) uint32 {
35	return *ptr
36}
37
38//go:nosplit
39//go:noinline
40func LoadAcq64(ptr *uint64) uint64 {
41	return *ptr
42}
43
44//go:nosplit
45//go:noinline
46func LoadAcquintptr(ptr *uintptr) uintptr {
47	return *ptr
48}
49
50//go:noescape
51func Xadd(ptr *uint32, delta int32) uint32
52
53//go:noescape
54func Xadd64(ptr *uint64, delta int64) uint64
55
56//go:noescape
57func Xadduintptr(ptr *uintptr, delta uintptr) uintptr
58
59//go:noescape
60func Xchg(ptr *uint32, new uint32) uint32
61
62//go:noescape
63func Xchg64(ptr *uint64, new uint64) uint64
64
65//go:noescape
66func Xchguintptr(ptr *uintptr, new uintptr) uintptr
67
68//go:nosplit
69//go:noinline
70func Load8(ptr *uint8) uint8 {
71	return *ptr
72}
73
74//go:noescape
75func And8(ptr *uint8, val uint8)
76
77//go:noescape
78func Or8(ptr *uint8, val uint8)
79
80//go:noescape
81func And(ptr *uint32, val uint32)
82
83//go:noescape
84func Or(ptr *uint32, val uint32)
85
86// NOTE: Do not add atomicxor8 (XOR is not idempotent).
87
88//go:noescape
89func Cas64(ptr *uint64, old, new uint64) bool
90
91//go:noescape
92func CasRel(ptr *uint32, old, new uint32) bool
93
94//go:noescape
95func Store(ptr *uint32, val uint32)
96
97//go:noescape
98func Store8(ptr *uint8, val uint8)
99
100//go:noescape
101func Store64(ptr *uint64, val uint64)
102
103//go:noescape
104func StoreRel(ptr *uint32, val uint32)
105
106//go:noescape
107func StoreRel64(ptr *uint64, val uint64)
108
109//go:noescape
110func StoreReluintptr(ptr *uintptr, val uintptr)
111
112// StorepNoWB performs *ptr = val atomically and without a write
113// barrier.
114//
115// NO go:noescape annotation; see atomic_pointer.go.
116func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer)
117