blob: b98e60827e4b9ebe59a987ed8fc0499629ca7986 [file] [log] [blame]
Colin Cross7bb052a2015-02-03 12:59:37 -08001// 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)