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