diff options
author | Kai Backman <kaib@golang.org> | 2009-11-12 15:23:23 -0800 |
---|---|---|
committer | Kai Backman <kaib@golang.org> | 2009-11-12 15:23:23 -0800 |
commit | f71341d7ff3141c8aa67ddbea9e61560a5fc7cbe (patch) | |
tree | dc537ee26bbb21fdf1c5ed51a6673f023a11d28c /src | |
parent | 15c013a72729323777de745d773b90ada71c1288 (diff) | |
download | golang-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/Makefile | 4 | ||||
-rw-r--r-- | src/pkg/runtime/arm/cas5.s | 43 | ||||
-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 |