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