Jeroen Demeyer <jdemeyer@xxxxxxxxxxxxx> writes: > This is the full asm statement: > asm("# number_t& number_t::operator>>=(unsigned char s)\n" > " shrdl %6, %4, %3\n" > " movl %3, %0\n" > " movl %5, %2\n" > " shrdl %6, %2, %1\n" > " shrl %6, %2\n" > : "=&rm" (n0), "=&r" (n1), "=&r" (n2) > : "2" (n0), "1" (n1), "g" (n2), "cI" (s) > ); > > The code generated is the following: > shrdl %cl, %esi, %eax > movl %eax, -4384(%ebp) > movl -4384(%ebp), %eax > shrdl %cl, %eax, %esi > shrl %cl, %eax > > As you can see, %0 and %5 both become -4384(%ebp). > See attachment for the output from -dg. Thanks for the details. Unfortunately, I am no wiser. As far as I can tell, this should work correctly. Either you've found a bug, or I'm missing something. If you like, and you want to help others avoid this problem, please file a bug report with the preprocessed source code and command line at http://gcc.gnu.org/bugzilla/ . For more information about filing bug reports see http://gcc.gnu.org/bugs.html . If you just want to fix it for yourself change constraint 0 to "=&r" or change constraint 5 to "r". Ian