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