On Saturday 10 February 2007, John David Anglin wrote: > > static void __lll_mutex_lock(int *futex) > > { > > int lws_errno = 14; > > int lws_ret; > > asm ( > > "0: \n\t" > > "copy %3, %%r26 \n\t" > > "copy %4, %%r25 \n\t" > > "copy %5, %%r24 \n\t" > > "ble " "0xb0" "(%%sr2, %%r0) \n\t" > > "ldi " "0" ", %%r20 \n\t" > > "cmpib,=,n " "11" ",%%r21,0b \n\t" > > "nop \n\t" > > "stw %%r28, %0 \n\t" > > "sub %%r0, %%r21, %%r21 \n\t" > > "stw %%r21, %1 \n\t" > > > > : "=m" (lws_ret), "=m"(lws_errno), "=m"(*futex) > > : "r"(futex), "r"(0), "r"(1) > > :"r1", "r26", "r25", "r24", "r23", "r22", "r21", "r20", "r28", "r31", > > : "memory" > > > > ); > > } > > Aren't lws_errno and lws_ret supposed to be global? As is, they > are just local variables and do nothing. right, as they should be i think ... the sample here is reduced preprocessed code so you lose the visibility that ___lll_mutex_lock() is really just an expanded macro from the atomic.h header and you lose a lot of the actual code (i removed the stuff that wasnt involved with the bad code generation) lws_ret for sure should not be a local variable as that is the return value -mike