xref: /plan9-contrib/sys/src/ape/lib/ap/mips64/atom.s (revision 6c6e36e1134c52b146e9d71d8c7dc193994c0c4e)
1*6c6e36e1SDavid du Colombier/*
2*6c6e36e1SDavid du Colombier *	R4000 user-level atomic operations
3*6c6e36e1SDavid du Colombier */
4*6c6e36e1SDavid du Colombier
5*6c6e36e1SDavid du Colombier#define	LL(base, rt)	WORD	$((060<<26)|((base)<<21)|((rt)<<16))
6*6c6e36e1SDavid du Colombier#define	SC(base, rt)	WORD	$((070<<26)|((base)<<21)|((rt)<<16))
7*6c6e36e1SDavid du Colombier#define	NOOP		WORD	$0x27
8*6c6e36e1SDavid du Colombier
9*6c6e36e1SDavid du ColombierTEXT ainc(SB), 1, $-8			/* long ainc(long *); */
10*6c6e36e1SDavid du ColombierTEXT _xinc(SB), 1, $-8			/* void _xinc(long *); */
11*6c6e36e1SDavid du Colombier	MOVV	R1, R2			/* address of counter */
12*6c6e36e1SDavid du Colombierloop:	MOVW	$1, R3
13*6c6e36e1SDavid du Colombier	LL(2, 1)
14*6c6e36e1SDavid du Colombier	NOOP
15*6c6e36e1SDavid du Colombier	ADDU	R1, R3
16*6c6e36e1SDavid du Colombier	MOVV	R3, R1			/* return new value */
17*6c6e36e1SDavid du Colombier	SC(2, 3)
18*6c6e36e1SDavid du Colombier	NOOP
19*6c6e36e1SDavid du Colombier	BEQ	R3,loop
20*6c6e36e1SDavid du Colombier	RET
21*6c6e36e1SDavid du Colombier
22*6c6e36e1SDavid du ColombierTEXT adec(SB), 1, $-8			/* long adec(long*); */
23*6c6e36e1SDavid du ColombierTEXT _xdec(SB), 1, $-8			/* long _xdec(long *); */
24*6c6e36e1SDavid du Colombier	MOVV	R1, R2			/* address of counter */
25*6c6e36e1SDavid du Colombierloop1:	MOVW	$-1, R3
26*6c6e36e1SDavid du Colombier	LL(2, 1)
27*6c6e36e1SDavid du Colombier	NOOP
28*6c6e36e1SDavid du Colombier	ADDU	R1, R3
29*6c6e36e1SDavid du Colombier	MOVV	R3, R1			/* return new value */
30*6c6e36e1SDavid du Colombier	SC(2, 3)
31*6c6e36e1SDavid du Colombier	NOOP
32*6c6e36e1SDavid du Colombier	BEQ	R3,loop1
33*6c6e36e1SDavid du Colombier	RET
34*6c6e36e1SDavid du Colombier
35*6c6e36e1SDavid du Colombier/*
36*6c6e36e1SDavid du Colombier * int cas(uint* p, int ov, int nv);
37*6c6e36e1SDavid du Colombier */
38*6c6e36e1SDavid du ColombierTEXT cas(SB), 1, $-8
39*6c6e36e1SDavid du Colombier	MOVW	ov+12(FP), R2
40*6c6e36e1SDavid du Colombier	MOVW	nv+20(FP), R3
41*6c6e36e1SDavid du Colombierspincas:
42*6c6e36e1SDavid du Colombier	LL(1, 4)			/* R4 = *R1 */
43*6c6e36e1SDavid du Colombier	NOOP
44*6c6e36e1SDavid du Colombier	BNE	R2, R4, fail
45*6c6e36e1SDavid du Colombier	SC(1, 3)			/* *R1 = R3 */
46*6c6e36e1SDavid du Colombier	NOOP
47*6c6e36e1SDavid du Colombier	BEQ	R3, spincas		/* R3 == 0 means store failed */
48*6c6e36e1SDavid du Colombier	MOVW	$1, R1
49*6c6e36e1SDavid du Colombier	RET
50*6c6e36e1SDavid du Colombierfail:
51*6c6e36e1SDavid du Colombier	MOVV	$0, R1
52*6c6e36e1SDavid du Colombier	RET
53