xref: /plan9/sys/src/libc/arm/atom.s (revision 53ff6c4dddeb19bd84c918cdd2542d7c51263329)
1bb9c7457SDavid du Colombier#define	CLREX		WORD	$0xf57ff01f
2f05caca4SDavid du Colombier#define	LDREX(a,r)	WORD	$(0xe<<28|0x01900f9f | (a)<<16 | (r)<<12)
3bb9c7457SDavid du Colombier/* `The order of operands is from left to right in dataflow order' - asm man */
4bb9c7457SDavid du Colombier#define	STREX(v,a,r)	WORD	$(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0)
5f05caca4SDavid du Colombier
6*53ff6c4dSDavid du Colombier/*
7*53ff6c4dSDavid du Colombier * int cas(ulong *p, ulong ov, ulong nv);
8*53ff6c4dSDavid du Colombier */
9*53ff6c4dSDavid du Colombier
100f53e541SDavid du ColombierTEXT	cas+0(SB),0,$0		/* r0 holds p */
110f53e541SDavid du ColombierTEXT	casp+0(SB),0,$0		/* r0 holds p */
12f05caca4SDavid du Colombier	MOVW	ov+4(FP), R1
13f05caca4SDavid du Colombier	MOVW	nv+8(FP), R2
14f05caca4SDavid du Colombierspincas:
15f05caca4SDavid du Colombier	LDREX(0,3)	/*	LDREX	0(R0),R3	*/
16f05caca4SDavid du Colombier	CMP.S	R3, R1
17f05caca4SDavid du Colombier	BNE	fail
18bb9c7457SDavid du Colombier	STREX(2,0,4)	/*	STREX	0(R0),R2,R4	*/
19f05caca4SDavid du Colombier	CMP.S	$0, R4
20f05caca4SDavid du Colombier	BNE	spincas
21f05caca4SDavid du Colombier	MOVW	$1, R0
22f05caca4SDavid du Colombier	RET
23f05caca4SDavid du Colombierfail:
24*53ff6c4dSDavid du Colombier	CLREX
25f05caca4SDavid du Colombier	MOVW	$0, R0
26f05caca4SDavid du Colombier	RET
27f05caca4SDavid du Colombier
28711e4d0eSDavid du ColombierTEXT _xinc(SB), $0	/* void	_xinc(long *); */
29f05caca4SDavid du ColombierTEXT ainc(SB), $0	/* long ainc(long *); */
30f05caca4SDavid du Colombierspinainc:
31f05caca4SDavid du Colombier	LDREX(0,3)	/*	LDREX	0(R0),R3	*/
32f05caca4SDavid du Colombier	ADD	$1,R3
33bb9c7457SDavid du Colombier	STREX(3,0,4)	/*	STREX	0(R0),R3,R4	*/
34f05caca4SDavid du Colombier	CMP.S	$0, R4
35f05caca4SDavid du Colombier	BNE	spinainc
36f05caca4SDavid du Colombier	MOVW	R3, R0
37f05caca4SDavid du Colombier	RET
38f05caca4SDavid du Colombier
39711e4d0eSDavid du ColombierTEXT _xdec(SB), $0	/* long _xdec(long *); */
40711e4d0eSDavid du ColombierTEXT adec(SB), $0	/* long adec(long *); */
41f05caca4SDavid du Colombierspinadec:
42f05caca4SDavid du Colombier	LDREX(0,3)	/*	LDREX	0(R0),R3	*/
43f05caca4SDavid du Colombier	SUB	$1,R3
44bb9c7457SDavid du Colombier	STREX(3,0,4)	/*	STREX	0(R0),R3,R4	*/
45f05caca4SDavid du Colombier	CMP.S	$0, R4
46f05caca4SDavid du Colombier	BNE	spinadec
47f05caca4SDavid du Colombier	MOVW	R3, R0
48f05caca4SDavid du Colombier	RET
49f05caca4SDavid du Colombier
50f05caca4SDavid du ColombierTEXT loadlinked(SB), $0	/* long loadlinked(long *); */
51f05caca4SDavid du Colombier	LDREX(0,0)	/*	LDREX	0(R0),R0	*/
52f05caca4SDavid du Colombier	RET
53f05caca4SDavid du Colombier
54f05caca4SDavid du ColombierTEXT storecond(SB), $0	/* int storecond(long *, long); */
55f05caca4SDavid du Colombier	MOVW	ov+4(FP), R3
56bb9c7457SDavid du Colombier	STREX(3,0,0)	/*	STREX	0(R0),R3,R0	*/
57f05caca4SDavid du Colombier	RSB	$1, R0
58f05caca4SDavid du Colombier	RET
59