xref: /haiku/src/system/libroot/os/arch/ppc/atomic.S (revision 5af32e752606778be5dd7379f319fe43cb3f6b8c)
1*5af32e75SAxel Dörfler/*
2*5af32e75SAxel Dörfler** Copyright 2003, Axel D�rfler, axeld@pinc-software.de. All rights reserved.
3*5af32e75SAxel Dörfler** Distributed under the terms of the OpenBeOS License.
4*5af32e75SAxel Dörfler*/
5*5af32e75SAxel Dörfler
6*5af32e75SAxel Dörfler#define FUNCTION(x) .global x; .type x,@function; x
7*5af32e75SAxel Dörfler
8*5af32e75SAxel Dörfler.text
9*5af32e75SAxel Dörfler
10*5af32e75SAxel Dörfler/* int atomic_add(int *value, int increment)
11*5af32e75SAxel Dörfler *                r3          r4
12*5af32e75SAxel Dörfler */
13*5af32e75SAxel DörflerFUNCTION(atomic_add):
14*5af32e75SAxel Dörflerlost1:	lwarx	%r5, 0, %r3		// reserve memory address located in "r3"
15*5af32e75SAxel Dörfler		add		%r0, %r5, %r4	// (contents are stored in "r5")
16*5af32e75SAxel Dörfler		stwcx.	%r0, 0, %r3
17*5af32e75SAxel Dörfler		bne-	lost1			// try again if reservation was lost
18*5af32e75SAxel Dörfler		mr		%r3, %r5		// return old value (was in "r5")
19*5af32e75SAxel Dörfler		blr
20*5af32e75SAxel Dörfler
21*5af32e75SAxel Dörfler/* int atomic_and(int *value, int andValue)
22*5af32e75SAxel Dörfler *                r3          r4
23*5af32e75SAxel Dörfler */
24*5af32e75SAxel DörflerFUNCTION(atomic_and):
25*5af32e75SAxel Dörflerlost2:	lwarx	%r5, 0, %r3
26*5af32e75SAxel Dörfler		and		%r0, %r5, %r4
27*5af32e75SAxel Dörfler		stwcx.	%r0, 0, %r3
28*5af32e75SAxel Dörfler		bne-	lost2
29*5af32e75SAxel Dörfler		mr		%r3, %r5
30*5af32e75SAxel Dörfler		blr
31*5af32e75SAxel Dörfler
32*5af32e75SAxel Dörfler/* int atomic_or(int *value, int orValue)
33*5af32e75SAxel Dörfler *               r3          r4
34*5af32e75SAxel Dörfler */
35*5af32e75SAxel DörflerFUNCTION(atomic_or):
36*5af32e75SAxel Dörflerlost3:	lwarx	%r5, 0, %r3
37*5af32e75SAxel Dörfler		or		%r0, %r5, %r4
38*5af32e75SAxel Dörfler		stwcx.	%r0, 0, %r3
39*5af32e75SAxel Dörfler		bne-	lost3
40*5af32e75SAxel Dörfler		mr		%r3, %r5
41*5af32e75SAxel Dörfler		blr
42*5af32e75SAxel Dörfler
43*5af32e75SAxel Dörfler/* int atomic_set(int *value, int setTo)
44*5af32e75SAxel Dörfler *                r3          r4
45*5af32e75SAxel Dörfler */
46*5af32e75SAxel DörflerFUNCTION(atomic_set):
47*5af32e75SAxel Dörflerlost4:	lwarx	%r5, 0, %r3
48*5af32e75SAxel Dörfler		stwcx.	%r4, 0, %r3
49*5af32e75SAxel Dörfler		bne-	lost4
50*5af32e75SAxel Dörfler		mr		%r3, %r5
51*5af32e75SAxel Dörfler		blr
52*5af32e75SAxel Dörfler
53*5af32e75SAxel Dörfler/* int atomic_test_and_set(int *value, int setTo, int testValue)
54*5af32e75SAxel Dörfler *                  r3          r4         r5
55*5af32e75SAxel Dörfler */
56*5af32e75SAxel DörflerFUNCTION(atomic_test_and_set):
57*5af32e75SAxel Dörflerlost5:	lwarx	%r6, 0, %r3
58*5af32e75SAxel Dörfler		cmpw	%r6, %r5
59*5af32e75SAxel Dörfler		bne		out5
60*5af32e75SAxel Dörfler		stwcx.	%r4, 0, %r3
61*5af32e75SAxel Dörflerout5:	mr		%r3, %r6
62*5af32e75SAxel Dörfler		blr
63*5af32e75SAxel Dörfler
64*5af32e75SAxel Dörfler/* int atomic_get(int *value)
65*5af32e75SAxel Dörfler *                  r3
66*5af32e75SAxel Dörfler */
67*5af32e75SAxel DörflerFUNCTION(atomic_get):
68*5af32e75SAxel Dörflerlost6:	lwarx	%r5, 0, %r3
69*5af32e75SAxel Dörfler		stwcx.	%r5, 0, %r3
70*5af32e75SAxel Dörfler		bne-	lost6
71*5af32e75SAxel Dörfler		mr		%r3, %r5
72*5af32e75SAxel Dörfler		blr
73