COMPARE_AND_EXCHANGE for linux-powerpc
Edouard G. Parmelan
egp at free.fr
Fri Feb 23 14:19:47 PST 2001
Carlos Valiente wrote:
> On Friday 23 February 2001 10:32, Edouard G. Parmelan wrote:
>
> > > I've copied and pasted the C version of COMPARE_AND_EXCHANGE from
> > > config/mips/common.h and everything seems to work OK.
> >
> > Be careful, this C version will only work with unix-jthread subsystem.
>
> Oops, I hadn't thought about it :-( What would be a cleaner solution? Perhaps
> an implementation in PowerPC assembler?
Yep. Could you test this:
/*
* Do an atomic compare and exchange. The address 'A' is checked against
* value 'O' and if they match it's exchanged with value 'N'.
* We return '1' if the exchange is sucessful, otherwise 0.
*/
#define COMPARE_AND_EXCHANGE(A,O,N) \
({ \
int tmp, ret = 0; \
\
asm volatile( \
"1: lwarx %0,0,%3\n" \
" cmpw 0,%0,%4\n" \
" bne 2f\n" \
" stwcx %5,0,%3\n" \
" bne- 1b\n" \
" sync\n" \
" li %1,1\n" \
"2:\n" \
: "=&r"(tmp), "=&r"(ret), "=m"(*(A)) \
: "r"(A), "r"(O), "r"(N), "m"(*(A)) \
: "cc", "memory"); \
\
ret; \
})
--
Edouard G. Parmelan
http://egp.free.fr
More information about the kaffe
mailing list