Skip to content

Commit 090f9fc

Browse files
committed
sync/atomic: use cas64 to implement {Load,Store,Add}{Uint,Int}64 on Linux/ARM
Now with GOARM=5 our all.bash should pass on ARMv5 systems. Fixes #3331. R=golang-dev, rsc, dvyukov CC=golang-dev https://golang.org/cl/6210071
1 parent fb3a1b6 commit 090f9fc

File tree

2 files changed

+46
-10
lines changed

2 files changed

+46
-10
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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+
5+
package atomic
6+
7+
func loadUint64(addr *uint64) (val uint64) {
8+
for {
9+
val = *addr
10+
if CompareAndSwapUint64(addr, val, val) {
11+
break
12+
}
13+
}
14+
return
15+
}
16+
17+
func storeUint64(addr *uint64, val uint64) {
18+
for {
19+
old := *addr
20+
if CompareAndSwapUint64(addr, old, val) {
21+
break
22+
}
23+
}
24+
return
25+
}
26+
27+
func 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+
}

src/pkg/sync/atomic/asm_linux_arm.s

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -121,20 +121,20 @@ TEXT setupAndCallCAS64<>(SB),7,$-4
121121
MOVW R1, armCAS64(SB)
122122
MOVW R1, PC
123123

124-
TEXT ·CompareAndSwapInt64(SB),7,$-4
124+
TEXT ·CompareAndSwapInt64(SB),7,$0
125+
B ·CompareAndSwapUint64(SB)
126+
127+
TEXT ·CompareAndSwapUint64(SB),7,$-4
125128
MOVW armCAS64(SB), R0
126129
CMP $0, R0
127130
MOVW.NE R0, PC
128131
B setupAndCallCAS64<>(SB)
129132

130-
TEXT ·CompareAndSwapUint64(SB),7,$0
131-
B ·CompareAndSwapInt64(SB)
132-
133133
TEXT ·AddInt64(SB),7,$0
134-
B ·armAddUint64(SB)
134+
B ·addUint64(SB)
135135

136136
TEXT ·AddUint64(SB),7,$0
137-
B ·armAddUint64(SB)
137+
B ·addUint64(SB)
138138

139139
TEXT ·LoadInt32(SB),7,$0
140140
B ·LoadUint32(SB)
@@ -150,10 +150,10 @@ loadloop1:
150150
RET
151151

152152
TEXT ·LoadInt64(SB),7,$0
153-
B ·armLoadUint64(SB)
153+
B ·loadUint64(SB)
154154

155155
TEXT ·LoadUint64(SB),7,$0
156-
B ·armLoadUint64(SB)
156+
B ·loadUint64(SB)
157157

158158
TEXT ·LoadUintptr(SB),7,$0
159159
B ·LoadUint32(SB)
@@ -174,10 +174,10 @@ storeloop1:
174174
RET
175175

176176
TEXT ·StoreInt64(SB),7,$0
177-
B ·armStoreUint64(SB)
177+
B ·storeUint64(SB)
178178

179179
TEXT ·StoreUint64(SB),7,$0
180-
B ·armStoreUint64(SB)
180+
B ·storeUint64(SB)
181181

182182
TEXT ·StoreUintptr(SB),7,$0
183183
B ·StoreUint32(SB)

0 commit comments

Comments
 (0)