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