diff options
author | Dean Prichard <dean.prichard@gmail.com> | 2010-02-18 15:37:16 -0800 |
---|---|---|
committer | Dean Prichard <dean.prichard@gmail.com> | 2010-02-18 15:37:16 -0800 |
commit | cc57fc042ce65cb7fe2b13fcc74992eb95b52958 (patch) | |
tree | a76b0d96d5be61c1888bf2b6e1e033772bdf7437 /src | |
parent | d1ab100c0865da99db815224f8d27b02b4c88eee (diff) | |
download | golang-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/Makefile | 16 | ||||
-rw-r--r-- | src/pkg/sync/asm_arm5.s | 40 | ||||
-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 |