summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-11-12 15:23:23 -0800
committerKai Backman <kaib@golang.org>2009-11-12 15:23:23 -0800
commitf71341d7ff3141c8aa67ddbea9e61560a5fc7cbe (patch)
treedc537ee26bbb21fdf1c5ed51a6673f023a11d28c /src
parent15c013a72729323777de745d773b90ada71c1288 (diff)
downloadgolang-f71341d7ff3141c8aa67ddbea9e61560a5fc7cbe.tar.gz
add support for pre arm v6 cas. set GOARM=5 to enable.
R=rsc http://codereview.appspot.com/154101
Diffstat (limited to 'src')
-rw-r--r--src/pkg/runtime/Makefile4
-rw-r--r--src/pkg/runtime/arm/cas5.s43
-rw-r--r--src/pkg/runtime/arm/cas6.s (renamed from src/pkg/runtime/arm/cas.s)0
3 files changed, 46 insertions, 1 deletions
diff --git a/src/pkg/runtime/Makefile b/src/pkg/runtime/Makefile
index f66d4c2a5..e31073cf2 100644
--- a/src/pkg/runtime/Makefile
+++ b/src/pkg/runtime/Makefile
@@ -28,9 +28,11 @@ OFILES_386=\
vlop.$O\
vlrt.$O\
+GOARM ?= 6
+
# arm-specific object files
OFILES_arm=\
- cas.$O\
+ cas$(GOARM).$O\
memset.$O\
vlop.$O\
vlrt.$O\
diff --git a/src/pkg/runtime/arm/cas5.s b/src/pkg/runtime/arm/cas5.s
new file mode 100644
index 000000000..8a4c8be12
--- /dev/null
+++ b/src/pkg/runtime/arm/cas5.s
@@ -0,0 +1,43 @@
+// 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.
+
+#include "arm/asm.h"
+
+// This version works on pre v6 architectures
+
+// bool cas(int32 *val, int32 old, int32 new)
+// Atomically:
+// if(*val == old){
+// *val = new;
+// return 1;
+// }else
+// return 0;
+
+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
+ RET
+fail1:
+ MOVW R3, (R4) // release mutex
+fail0:
+ MOVW $0, R0
+ RET
+
+DATA cas_mutex(SB)/4, $0
+GLOBL cas_mutex(SB), $4
diff --git a/src/pkg/runtime/arm/cas.s b/src/pkg/runtime/arm/cas6.s
index 63df1396d..63df1396d 100644
--- a/src/pkg/runtime/arm/cas.s
+++ b/src/pkg/runtime/arm/cas6.s