xref: /plan9/sys/src/libthread/xincmips.s (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
1/*
2 *	R4000 user level lock code
3 */
4
5#define	LL(base, rt)	WORD	$((060<<26)|((base)<<21)|((rt)<<16))
6#define	SC(base, rt)	WORD	$((070<<26)|((base)<<21)|((rt)<<16))
7#define	NOOP		WORD	$0x27
8
9#ifdef oldstyle
10TEXT	xadd(SB), $0
11
12	MOVW	R1, R2		/* address of counter */
13loop:	MOVW	n+4(FP), R3	/* increment */
14	LL(2, 1)
15	NOOP
16	ADD	R1,R3,R3
17	SC(2, 3)
18	NOOP
19	BEQ	R3,loop
20	RET
21#endif
22
23TEXT	_xinc(SB), $0
24
25	MOVW	R1, R2		/* address of counter */
26loop:	MOVW	$1, R3
27	LL(2, 1)
28	NOOP
29	ADD	R1,R3,R3
30	SC(2, 3)
31	NOOP
32	BEQ	R3,loop
33	RET
34
35TEXT	_xdec(SB), $0
36
37	MOVW	R1, R2		/* address of counter */
38loop1:	MOVW	$-1, R3
39	LL(2, 1)
40	NOOP
41	ADD	R1,R3,R3
42	MOVW	R3, R1
43	SC(2, 3)
44	NOOP
45	BEQ	R3,loop1
46	RET
47