xref: /plan9/sys/src/ape/lib/ap/power/atom.s (revision 51f48f69b4c3e5c9d9f7955d28612ef2d4048ccc)
1*51f48f69SDavid du ColombierTEXT	_xinc(SB),$0	/* void _xinc(long *); */
2*51f48f69SDavid du ColombierTEXT	ainc(SB),$0	/* long ainc(long *); */
3*51f48f69SDavid du Colombier	MOVW	R3, R4
4*51f48f69SDavid du Colombierxincloop:
5*51f48f69SDavid du Colombier	LWAR	(R4), R3
6*51f48f69SDavid du Colombier	ADD	$1, R3
7*51f48f69SDavid du Colombier	DCBT	(R4)				/* fix 405 errata cpu_210 */
8*51f48f69SDavid du Colombier	STWCCC	R3, (R4)
9*51f48f69SDavid du Colombier	BNE	xincloop
10*51f48f69SDavid du Colombier	RETURN
11*51f48f69SDavid du Colombier
12*51f48f69SDavid du ColombierTEXT	_xdec(SB),$0	/* long _xdec(long *); */
13*51f48f69SDavid du ColombierTEXT	adec(SB),$0	/* long adec(long *); */
14*51f48f69SDavid du Colombier	MOVW	R3, R4
15*51f48f69SDavid du Colombierxdecloop:
16*51f48f69SDavid du Colombier	LWAR	(R4), R3
17*51f48f69SDavid du Colombier	ADD	$-1, R3
18*51f48f69SDavid du Colombier	DCBT	(R4)				/* fix 405 errata cpu_210 */
19*51f48f69SDavid du Colombier	STWCCC	R3, (R4)
20*51f48f69SDavid du Colombier	BNE	xdecloop
21*51f48f69SDavid du Colombier	RETURN
22*51f48f69SDavid du Colombier
23*51f48f69SDavid du ColombierTEXT	loadlink(SB), $0
24*51f48f69SDavid du Colombier
25*51f48f69SDavid du Colombier	LWAR	(R3), R3
26*51f48f69SDavid du Colombier	RETURN
27*51f48f69SDavid du Colombier
28*51f48f69SDavid du ColombierTEXT	storecond(SB), $0
29*51f48f69SDavid du Colombier
30*51f48f69SDavid du Colombier	MOVW	val+4(FP), R4
31*51f48f69SDavid du Colombier	DCBT	(R3)				/* fix 405 errata cpu_210 */
32*51f48f69SDavid du Colombier	STWCCC	R4, (R3)
33*51f48f69SDavid du Colombier	BNE	storecondfail
34*51f48f69SDavid du Colombier	MOVW	$1, R3
35*51f48f69SDavid du Colombier	RETURN
36*51f48f69SDavid du Colombierstorecondfail:
37*51f48f69SDavid du Colombier	MOVW	$0, R3
38*51f48f69SDavid du Colombier	RETURN
39*51f48f69SDavid du Colombier
40*51f48f69SDavid du Colombier/*
41*51f48f69SDavid du Colombier * int cas(uint *p, int ov, int nv);
42*51f48f69SDavid du Colombier * int casp(void **p, void *ov, void *nv);
43*51f48f69SDavid du Colombier */
44*51f48f69SDavid du Colombier
45*51f48f69SDavid du ColombierTEXT	cas+0(SB),0,$0
46*51f48f69SDavid du ColombierTEXT	casp+0(SB),0,$0
47*51f48f69SDavid du Colombier	MOVW	ov+4(FP),R4
48*51f48f69SDavid du Colombier	MOVW	nv+8(FP),R8
49*51f48f69SDavid du Colombier	LWAR	(R3),R5
50*51f48f69SDavid du Colombier	CMP	R5,R4
51*51f48f69SDavid du Colombier	BNE	fail
52*51f48f69SDavid du Colombier	DCBT	(R3)				/* fix 405 errata cpu_210 */
53*51f48f69SDavid du Colombier	STWCCC	R8,(R3)
54*51f48f69SDavid du Colombier	BNE	fail1
55*51f48f69SDavid du Colombier	MOVW	$1,R3
56*51f48f69SDavid du Colombier	RETURN
57*51f48f69SDavid du Colombierfail:
58*51f48f69SDavid du Colombier	DCBT	(R3)				/* fix 405 errata cpu_210 */
59*51f48f69SDavid du Colombier	STWCCC	R5,(R3)	/* give up exclusive access */
60*51f48f69SDavid du Colombierfail1:
61*51f48f69SDavid du Colombier	MOVW	R0,R3
62*51f48f69SDavid du Colombier	RETURN
63*51f48f69SDavid du Colombier	END
64