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