summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDean Prichard <dean.prichard@gmail.com>2010-02-18 15:37:16 -0800
committerDean Prichard <dean.prichard@gmail.com>2010-02-18 15:37:16 -0800
commitcc57fc042ce65cb7fe2b13fcc74992eb95b52958 (patch)
treea76b0d96d5be61c1888bf2b6e1e033772bdf7437 /src
parentd1ab100c0865da99db815224f8d27b02b4c88eee (diff)
downloadgolang-cc57fc042ce65cb7fe2b13fcc74992eb95b52958.tar.gz
sync: allow to work on armv5
asm_arm.s was using ldrex which does not work on armv5. Tested on Sheevaplug. R=rsc, kaib CC=golang-dev http://codereview.appspot.com/214049 Committer: Kai Backman <kaib@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/pkg/sync/Makefile16
-rw-r--r--src/pkg/sync/asm_arm5.s40
-rw-r--r--src/pkg/sync/asm_arm6.s (renamed from src/pkg/sync/asm_arm.s)0
3 files changed, 55 insertions, 1 deletions
diff --git a/src/pkg/sync/Makefile b/src/pkg/sync/Makefile
index 25d11d03d..4b9a05816 100644
--- a/src/pkg/sync/Makefile
+++ b/src/pkg/sync/Makefile
@@ -9,7 +9,21 @@ GOFILES=\
mutex.go\
rwmutex.go\
+# 386-specific object files
+OFILES_386=\
+ asm_386.$O\
+
+# amd64-specific object files
+OFILES_amd64=\
+ asm_amd64.$O\
+
+GOARM?=6
+
+# arm-specific object files
+OFILES_arm=\
+ asm_arm$(GOARM).$O\
+
OFILES=\
- asm_$(GOARCH).$O\
+ $(OFILES_$(GOARCH))\
include ../../Make.pkg
diff --git a/src/pkg/sync/asm_arm5.s b/src/pkg/sync/asm_arm5.s
new file mode 100644
index 000000000..3cdca0b87
--- /dev/null
+++ b/src/pkg/sync/asm_arm5.s
@@ -0,0 +1,40 @@
+// Copyright 2009 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.
+
+// This version works on pre v6 architectures
+// func cas(val *int32, old, new int32) bool
+// Atomically:
+// if *val == old {
+// *val = new;
+// return true;
+// }else
+// return false;
+
+TEXT ·cas(SB),7,$0
+ MOVW 0(FP), R0 // *val
+ MOVW 4(FP), R1 // old
+ MOVW 8(FP), R2 // new
+ MOVW $1, R3
+ MOVW $cas_mutex(SB), R4
+l:
+ SWPW (R4), R3 // acquire mutex
+ CMP $0, R3
+ BNE fail0
+
+ MOVW (R0), R5
+ CMP R1, R5
+ BNE fail1
+
+ MOVW R2, (R0)
+ MOVW R3, (R4) // release mutex
+ MOVW $1, R0
+ MOVW R0, 16(SP)
+ RET
+fail1:
+ MOVW R3, (R4) // release mutex
+fail0:
+ MOVW $0, R0
+ MOVW R0, 16(SP)
+ RET
+
diff --git a/src/pkg/sync/asm_arm.s b/src/pkg/sync/asm_arm6.s
index d1e0851d0..d1e0851d0 100644
--- a/src/pkg/sync/asm_arm.s
+++ b/src/pkg/sync/asm_arm6.s