// Copyright 2015 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. // +build !linux,arm #include "textflag.h" // TODO(minux): this is only valid for ARMv6+ // bool armcas(int32 *val, int32 old, int32 new) // Atomically: // if(*val == old){ // *val = new; // return 1; // }else // return 0; TEXT ·Cas(SB),NOSPLIT,$0 JMP ·armcas(SB) // Non-linux OSes support only single processor machines before ARMv7. // So we don't need memory barriers if goarm < 7. And we fail loud at // startup (runtime.checkgoarm) if it is a multi-processor but goarm < 7. TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-8 MOVW addr+0(FP), R0 MOVW (R0), R1 MOVB runtime·goarm(SB), R11 CMP $7, R11 BLT 2(PC) DMB MB_ISH MOVW R1, ret+4(FP) RET TEXT ·Store(SB),NOSPLIT,$0-8 MOVW addr+0(FP), R1 MOVW v+4(FP), R2 MOVB runtime·goarm(SB), R8 CMP $7, R8 BLT 2(PC) DMB MB_ISH MOVW R2, (R1) CMP $7, R8 BLT 2(PC) DMB MB_ISH RET