diff options
| author | Dean Prichard <dean.prichard@gmail.com> | 2010-02-18 15:37:16 -0800 |
|---|---|---|
| committer | Kai Backman <kaib@golang.org> | 2010-02-18 15:37:16 -0800 |
| commit | 86b0ea6447c40be506cd71c2fdeb98255f08b23d (patch) | |
| tree | cca1a1c4eb84819a467260368f688869dce1d04a | |
| parent | 713e3e154158b39f775183bad8ec615e10371b13 (diff) | |
| download | go-86b0ea6447c40be506cd71c2fdeb98255f08b23d.tar.xz | |
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
https://golang.org/cl/214049
| -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 25d11d03db..4b9a05816d 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 0000000000..3cdca0b870 --- /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 d1e0851d0b..d1e0851d0b 100644 --- a/src/pkg/sync/asm_arm.s +++ b/src/pkg/sync/asm_arm6.s |
