$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Peter Dimov (pdimov_at_[hidden])
Date: 2006-03-16 19:03:01
Howard Hinnant wrote:
> My real problem is that I'm a neophyte in the bewildering world of
> gcc asm syntax.
Aren't we all?
> I've been studying:
>
> http://gcc.gnu.org/onlinedocs/gcc-4.0.3/gcc/Extended-
> Asm.html#Extended-Asm
>
> on the good advice of some colleagues. The other advice I'm getting
> is that there is still a bug in:
>
> boost/detail/sp_counted_base_gcc_ppc.hpp
>
> Looking at just atomic_increment:
>
> inline void atomic_increment( int * pw )
> {
> int tmp;
>
> __asm__
> (
> "0:\n\t"
> "lwarx %1, 0, %2\n\t"
> "addi %1, %1, 1\n\t"
> "stwcx. %1, 0, %2\n\t"
> "bne- 0b":
>
> "=m"( *pw ), "=&b"( tmp ):
> "r"( pw ):
> "cc"
> );
> }
>
> My current understanding is that the "=m" constraint indicates that
> *pw is write-only, and should be changed to "+m" to indicate read/
> write (to memory). Indeed when I make this change, my test case
> clears right up. It also appears that atomic_decrement and
> atomic_conditional_increment could use this treatment as well.
Looks like a bug. Hmm. I think I remember something about +m causing
internal compiler errors and not working in general (for some versions of
g++); that's why the x86 version uses "=m"(*pw) as an output and "m"(*pw) as
an input. But there are no "m"(*pw) inputs in PPC and IA64!
Can you try the +m change on as many g++ versions as possible? I may be
misremembering things. Or can you try the potentially safer alternative of
adding "m"( *pw ) as an input and see whether this also works?
If you contribute your test case, this will be appreciated, too.