xref: /plan9-contrib/sys/src/ape/lib/ap/arm/atom.s (revision 43fc641d02286a1fe4c6ca8065ef945254a88744)
1*43fc641dSDavid du Colombier#define DMB	MCR 15, 0, R0, C7, C10, 5
251f48f69SDavid du Colombier#define	CLREX		WORD	$0xf57ff01f
351f48f69SDavid du Colombier#define	LDREX(a,r)	WORD	$(0xe<<28|0x01900f9f | (a)<<16 | (r)<<12)
451f48f69SDavid du Colombier/* `The order of operands is from left to right in dataflow order' - asm man */
551f48f69SDavid du Colombier#define	STREX(v,a,r)	WORD	$(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0)
651f48f69SDavid du Colombier
751f48f69SDavid du Colombier/*
851f48f69SDavid du Colombier * int cas(ulong *p, ulong ov, ulong nv);
951f48f69SDavid du Colombier */
1051f48f69SDavid du Colombier
1151f48f69SDavid du ColombierTEXT	cas+0(SB),0,$0		/* r0 holds p */
1251f48f69SDavid du ColombierTEXT	casp+0(SB),0,$0		/* r0 holds p */
1351f48f69SDavid du Colombier	MOVW	ov+4(FP), R1
1451f48f69SDavid du Colombier	MOVW	nv+8(FP), R2
1551f48f69SDavid du Colombierspincas:
1651f48f69SDavid du Colombier	LDREX(0,3)	/*	LDREX	0(R0),R3	*/
1751f48f69SDavid du Colombier	CMP.S	R3, R1
1851f48f69SDavid du Colombier	BNE	fail
1951f48f69SDavid du Colombier	STREX(2,0,4)	/*	STREX	0(R0),R2,R4	*/
2051f48f69SDavid du Colombier	CMP.S	$0, R4
2151f48f69SDavid du Colombier	BNE	spincas
22*43fc641dSDavid du Colombier	MOVW	$0, R0
23*43fc641dSDavid du Colombier	DMB
2451f48f69SDavid du Colombier	MOVW	$1, R0
2551f48f69SDavid du Colombier	RET
2651f48f69SDavid du Colombierfail:
2751f48f69SDavid du Colombier	CLREX
2851f48f69SDavid du Colombier	MOVW	$0, R0
29*43fc641dSDavid du Colombier	DMB
3051f48f69SDavid du Colombier	RET
3151f48f69SDavid du Colombier
3251f48f69SDavid du ColombierTEXT _xinc(SB), $0	/* void	_xinc(long *); */
3351f48f69SDavid du ColombierTEXT ainc(SB), $0	/* long ainc(long *); */
3451f48f69SDavid du Colombierspinainc:
3551f48f69SDavid du Colombier	LDREX(0,3)	/*	LDREX	0(R0),R3	*/
3651f48f69SDavid du Colombier	ADD	$1,R3
3751f48f69SDavid du Colombier	STREX(3,0,4)	/*	STREX	0(R0),R3,R4	*/
3851f48f69SDavid du Colombier	CMP.S	$0, R4
3951f48f69SDavid du Colombier	BNE	spinainc
40*43fc641dSDavid du Colombier	MOVW	$0, R0
41*43fc641dSDavid du Colombier	DMB
4251f48f69SDavid du Colombier	MOVW	R3, R0
4351f48f69SDavid du Colombier	RET
4451f48f69SDavid du Colombier
4551f48f69SDavid du ColombierTEXT _xdec(SB), $0	/* long _xdec(long *); */
4651f48f69SDavid du ColombierTEXT adec(SB), $0	/* long adec(long *); */
4751f48f69SDavid du Colombierspinadec:
4851f48f69SDavid du Colombier	LDREX(0,3)	/*	LDREX	0(R0),R3	*/
4951f48f69SDavid du Colombier	SUB	$1,R3
5051f48f69SDavid du Colombier	STREX(3,0,4)	/*	STREX	0(R0),R3,R4	*/
5151f48f69SDavid du Colombier	CMP.S	$0, R4
5251f48f69SDavid du Colombier	BNE	spinadec
53*43fc641dSDavid du Colombier	MOVW	$0, R0
54*43fc641dSDavid du Colombier	DMB
5551f48f69SDavid du Colombier	MOVW	R3, R0
5651f48f69SDavid du Colombier	RET
5751f48f69SDavid du Colombier
5851f48f69SDavid du ColombierTEXT loadlinked(SB), $0	/* long loadlinked(long *); */
5951f48f69SDavid du Colombier	LDREX(0,0)	/*	LDREX	0(R0),R0	*/
6051f48f69SDavid du Colombier	RET
6151f48f69SDavid du Colombier
6251f48f69SDavid du ColombierTEXT storecond(SB), $0	/* int storecond(long *, long); */
6351f48f69SDavid du Colombier	MOVW	ov+4(FP), R3
64*43fc641dSDavid du Colombier	STREX(3,0,4)	/*	STREX	0(R0),R3,R4	*/
65*43fc641dSDavid du Colombier	MOVW	$0, R0
66*43fc641dSDavid du Colombier	DMB
67*43fc641dSDavid du Colombier	RSB	$1, R4, R0
6851f48f69SDavid du Colombier	RET
69