]> Cypherpunks repositories - gostls13.git/commitdiff
sync: allow to work on armv5
authorDean Prichard <dean.prichard@gmail.com>
Thu, 18 Feb 2010 23:37:16 +0000 (15:37 -0800)
committerKai Backman <kaib@golang.org>
Thu, 18 Feb 2010 23:37:16 +0000 (15:37 -0800)
asm_arm.s was using ldrex which does not work
on armv5. Tested on Sheevaplug.

R=rsc, kaib
CC=golang-dev
https://golang.org/cl/214049

src/pkg/sync/Makefile
src/pkg/sync/asm_arm5.s [new file with mode: 0644]
src/pkg/sync/asm_arm6.s [moved from src/pkg/sync/asm_arm.s with 100% similarity]

index 25d11d03dbf32c9009576b633db2a0e557f65608..4b9a05816d14e7ae987bd6ed0f87cb855b7b5764 100644 (file)
@@ -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 (file)
index 0000000..3cdca0b
--- /dev/null
@@ -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