...
1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build !linux
6
7#include "textflag.h"
8
9// TODO(minux): this is only valid for ARMv6+
10// func armcas(ptr *int32, old int32, new int32) bool
11// Atomically:
12// if *ptr == old {
13// *ptr = new
14// return true
15// } else {
16// return false
17// }
18TEXT ·Cas(SB),NOSPLIT,$0
19 JMP ·armcas(SB)
20
21// Non-linux OSes support only single processor machines before ARMv7.
22// So we don't need memory barriers if goarm < 7. And we fail loud at
23// startup (runtime.checkgoarm) if it is a multi-processor but goarm < 7.
24
25TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-8
26 MOVW addr+0(FP), R0
27 MOVW (R0), R1
28
29 MOVB runtime·goarm(SB), R11
30 CMP $7, R11
31 BLT 2(PC)
32 DMB MB_ISH
33
34 MOVW R1, ret+4(FP)
35 RET
36
37TEXT ·Store(SB),NOSPLIT,$0-8
38 MOVW addr+0(FP), R1
39 MOVW v+4(FP), R2
40
41 MOVB runtime·goarm(SB), R8
42 CMP $7, R8
43 BLT 2(PC)
44 DMB MB_ISH
45
46 MOVW R2, (R1)
47
48 CMP $7, R8
49 BLT 2(PC)
50 DMB MB_ISH
51 RET
52
53TEXT ·Load8(SB),NOSPLIT|NOFRAME,$0-5
54 MOVW addr+0(FP), R0
55 MOVB (R0), R1
56
57 MOVB runtime·goarm(SB), R11
58 CMP $7, R11
59 BLT 2(PC)
60 DMB MB_ISH
61
62 MOVB R1, ret+4(FP)
63 RET
64
65TEXT ·Store8(SB),NOSPLIT,$0-5
66 MOVW addr+0(FP), R1
67 MOVB v+4(FP), R2
68
69 MOVB runtime·goarm(SB), R8
70 CMP $7, R8
71 BLT 2(PC)
72 DMB MB_ISH
73
74 MOVB R2, (R1)
75
76 CMP $7, R8
77 BLT 2(PC)
78 DMB MB_ISH
79 RET
80
View as plain text