summaryrefslogtreecommitdiff
path: root/sys/src/libc/arm64/atom.s
blob: 004ebf7d6dac2fef6e3f17b996201decf7ce418a (plain)
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
/*
 * int cas32(u32int *p, u32int ov, u32int nv);
 * int cas(uint *p, int ov, int nv);
 * int casl(ulong *p, ulong ov, ulong nv);
 */
TEXT cas0(SB), 1, $-4
_cas0:
	CLREX
	MOVW	$0, R0
	RETURN

TEXT cas32(SB), 1, $-4
TEXT cas(SB), 1, $-4
TEXT casl(SB), 1, $-4
	MOVWU	ov+8(FP), R1
	MOVWU	nv+16(FP), R2
_cas1:
	LDXRW	(R0), R3
	CMP	R3, R1
	BNE	_cas0
	STXRW	R2, (R0), R4
	CBNZ	R4, _cas1
	MOVW	$1, R0
	B	_barrier(SB)

TEXT casp(SB), 1, $-4
	MOV	ov+8(FP), R1
	MOV	nv+16(FP), R2
_casp1:
	LDXR	(R0), R3
	CMP	R3, R1
	BNE	_cas0
	STXR	R2, (R0), R4
	CBNZ	R4, _casp1
	MOVW	$1, R0
	B	_barrier(SB)

TEXT _xinc(SB), 1, $-4	/* void	_xinc(long *); */
TEXT ainc(SB), 1, $-4	/* long ainc(long *); */
spinainc:
	LDXRW	(R0), R3
	ADDW	$1,R3
	STXRW	R3, (R0), R4
	CBNZ	R4, spinainc
	MOVW	R3, R0
	B	_barrier(SB)

TEXT _xdec(SB), 1, $-4	/* long _xdec(long *); */
TEXT adec(SB), 1, $-4	/* long adec(long *); */
spinadec:
	LDXRW	(R0), R3
	SUBW	$1,R3
	STXRW	R3, (R0), R4
	CBNZ	R4, spinadec
	MOVW	R3, R0
	B	_barrier(SB)