File size: 1,383 Bytes
e36aeda | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | // 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
|