| // 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. | |
| //go:build !linux | |
| #include "textflag.h" | |
| // TODO(minux): this is only valid for ARMv6+ | |
| // func armcas(ptr *int32, old int32, new int32) bool | |
| // Atomically: | |
| // if *ptr == old { | |
| // *ptr = new | |
| // return true | |
| // } else { | |
| // return false | |
| // } | |
| 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 | |
| TEXT 路Load8(SB),NOSPLIT|NOFRAME,$0-5 | |
| MOVW addr+0(FP), R0 | |
| MOVB (R0), R1 | |
| MOVB runtime路goarm(SB), R11 | |
| CMP $7, R11 | |
| BLT 2(PC) | |
| DMB MB_ISH | |
| MOVB R1, ret+4(FP) | |
| RET | |
| TEXT 路Store8(SB),NOSPLIT,$0-5 | |
| MOVW addr+0(FP), R1 | |
| MOVB v+4(FP), R2 | |
| MOVB runtime路goarm(SB), R8 | |
| CMP $7, R8 | |
| BLT 2(PC) | |
| DMB MB_ISH | |
| MOVB R2, (R1) | |
| CMP $7, R8 | |
| BLT 2(PC) | |
| DMB MB_ISH | |
| RET | |