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