summaryrefslogtreecommitdiff
path: root/src/pkg/sync
diff options
context:
space:
mode:
authorShenghou Ma <minux.ma@gmail.com>2012-05-23 02:02:01 +0800
committerShenghou Ma <minux.ma@gmail.com>2012-05-23 02:02:01 +0800
commit87d79b8f5c9b53a21b50fc1b2b68cc138e05edc3 (patch)
tree9ded1631b42d164ba77a6e27fdc0827330e82d55 /src/pkg/sync
parent366f0686c7a47662a701b9a27828404cf09eaa52 (diff)
downloadgo-87d79b8f5c9b53a21b50fc1b2b68cc138e05edc3.tar.gz
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 issue 3331. R=golang-dev, rsc, dvyukov CC=golang-dev http://codereview.appspot.com/6210071
Diffstat (limited to 'src/pkg/sync')
-rw-r--r--src/pkg/sync/atomic/64bit_linux_arm.go36
-rw-r--r--src/pkg/sync/atomic/asm_linux_arm.s20
2 files changed, 46 insertions, 10 deletions
diff --git a/src/pkg/sync/atomic/64bit_linux_arm.go b/src/pkg/sync/atomic/64bit_linux_arm.go
new file mode 100644
index 000000000..f070e78bd
--- /dev/null
+++ b/src/pkg/sync/atomic/64bit_linux_arm.go
@@ -0,0 +1,36 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package atomic
+
+func loadUint64(addr *uint64) (val uint64) {
+ for {
+ val = *addr
+ if CompareAndSwapUint64(addr, val, val) {
+ break
+ }
+ }
+ return
+}
+
+func storeUint64(addr *uint64, val uint64) {
+ for {
+ old := *addr
+ if CompareAndSwapUint64(addr, old, val) {
+ break
+ }
+ }
+ return
+}
+
+func addUint64(val *uint64, delta uint64) (new uint64) {
+ for {
+ old := *val
+ new = old + delta
+ if CompareAndSwapUint64(val, old, new) {
+ break
+ }
+ }
+ return
+}
diff --git a/src/pkg/sync/atomic/asm_linux_arm.s b/src/pkg/sync/atomic/asm_linux_arm.s
index f03ea6630..4619c2343 100644
--- a/src/pkg/sync/atomic/asm_linux_arm.s
+++ b/src/pkg/sync/atomic/asm_linux_arm.s
@@ -121,20 +121,20 @@ TEXT setupAndCallCAS64<>(SB),7,$-4
MOVW R1, armCAS64(SB)
MOVW R1, PC
-TEXT ·CompareAndSwapInt64(SB),7,$-4
+TEXT ·CompareAndSwapInt64(SB),7,$0
+ B ·CompareAndSwapUint64(SB)
+
+TEXT ·CompareAndSwapUint64(SB),7,$-4
MOVW armCAS64(SB), R0
CMP $0, R0
MOVW.NE R0, PC
B setupAndCallCAS64<>(SB)
-TEXT ·CompareAndSwapUint64(SB),7,$0
- B ·CompareAndSwapInt64(SB)
-
TEXT ·AddInt64(SB),7,$0
- B ·armAddUint64(SB)
+ B ·addUint64(SB)
TEXT ·AddUint64(SB),7,$0
- B ·armAddUint64(SB)
+ B ·addUint64(SB)
TEXT ·LoadInt32(SB),7,$0
B ·LoadUint32(SB)
@@ -150,10 +150,10 @@ loadloop1:
RET
TEXT ·LoadInt64(SB),7,$0
- B ·armLoadUint64(SB)
+ B ·loadUint64(SB)
TEXT ·LoadUint64(SB),7,$0
- B ·armLoadUint64(SB)
+ B ·loadUint64(SB)
TEXT ·LoadUintptr(SB),7,$0
B ·LoadUint32(SB)
@@ -174,10 +174,10 @@ storeloop1:
RET
TEXT ·StoreInt64(SB),7,$0
- B ·armStoreUint64(SB)
+ B ·storeUint64(SB)
TEXT ·StoreUint64(SB),7,$0
- B ·armStoreUint64(SB)
+ B ·storeUint64(SB)
TEXT ·StoreUintptr(SB),7,$0
B ·StoreUint32(SB)