|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2005-04-14 10:22:26
Rene Rivera wrote:
> Peter Dimov wrote:
>> Rene Rivera wrote:
>>> OK, I tried translating the gcc_x86. But I just don't understand the
>>> GCC machine description language well enough. What does the assembly
>>> end up being for all those memory, cc, etc. ?
>>
>> I don't think that CodeWarrior has any way of specifying whether an
>> asm statement affects memory, clobbers a register, or should not be
>> reordered. It's supposedly (and hopefully) smart enough to figure
>> these things out on its own. ;-)
>
> It is smart enough, and you have to jump some hoops to make it
> optimize assembly blocks.. But I also meant all the other GCC
> constructs that I don't know :-) For example MOVL is not x86
> assembly, but some GCC construct, and I'm not totally sure yet if
> it's just the argument inverted version of MOV.
Yes, movl is the argument-inverted mov.
> This is what I came up with for the atomic_conditional_increment..
>
> inline int atomic_conditional_increment( int * pw )
> {
> // int rv = *pw;
> // if( rv != 0 ) ++*pw;
> // return rv;
>
> int rv;
> int register tmp;
>
> asm
> {
> mov eax, [pw]
> L0:
> test eax, eax
> je L1
> mov tmp, eax
> inc tmp
> lock
> cmpxchg [pw], tmp
> jne L0
> L1:
> mov rv, eax
> //~ "movl %0, %%eax\n\t"
> //~ "0:\n\t"
> //~ "test %%eax, %%eax\n\t"
> //~ "je 1f\n\t"
> //~ "movl %%eax, %2\n\t"
> //~ "incl %2\n\t"
> //~ "lock\n\t"
> //~ "cmpxchgl %2, %0\n\t"
> //~ "jne 0b\n\t"
> //~ "1:":
> //~ "=m"( *pw ), "=&a"( rv ), "=&r"( tmp ): // outputs (%0,
> %1, %2) //~ "m"( *pw ): // input (%3)
> //~ "cc" // clobbers
> }
>
> return rv;
> }
>
> But, even though the logic seems correct to me, it doesn't work.
Assuming CodeWarrior returns in eax, try:
inline int atomic_conditional_increment( int * pw )
{
// int rv = *pw;
// if( rv != 0 ) ++*pw;
// return rv;
asm
{
mov esi, [pw]
mov eax, [esi]
L0:
test eax, eax
je L1
mov ebx, eax
inc ebx
lock cmpxchg [esi], ebx
jne L0
L1:
}
}
// esi == pw, eax == *pw
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk