1// Copyright 2012 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
7func loadUint64(addr *uint64) (val uint64) {
8	for {
9		val = *addr
10		if CompareAndSwapUint64(addr, val, val) {
11			break
12		}
13	}
14	return
15}
16
17func storeUint64(addr *uint64, val uint64) {
18	for {
19		old := *addr
20		if CompareAndSwapUint64(addr, old, val) {
21			break
22		}
23	}
24	return
25}
26
27func addUint64(val *uint64, delta uint64) (new uint64) {
28	for {
29		old := *val
30		new = old + delta
31		if CompareAndSwapUint64(val, old, new) {
32			break
33		}
34	}
35	return
36}
37
38func swapUint64(addr *uint64, new uint64) (old uint64) {
39	for {
40		old = *addr
41		if CompareAndSwapUint64(addr, old, new) {
42			break
43		}
44	}
45	return
46}
47
48// Additional ARM-specific assembly routines.
49// Declaration here to give assembly routines correct stack maps for arguments.
50func armCompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)
51func armCompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)
52func generalCAS64(addr *uint64, old, new uint64) (swapped bool)
53func armAddUint32(addr *uint32, delta uint32) (new uint32)
54func armAddUint64(addr *uint64, delta uint64) (new uint64)
55func armSwapUint32(addr *uint32, new uint32) (old uint32)
56func armSwapUint64(addr *uint64, new uint64) (old uint64)
57func armLoadUint64(addr *uint64) (val uint64)
58func armStoreUint64(addr *uint64, val uint64)
59