Ian Lance Taylor wrote: > Jeroen Demeyer writes: > >> I have a C++ program (i386 target) which has a piece of inline >> assembly with the following constraints: >> >> asm(/* Some asm code */ >> : "=&rm" (n0), "=&r" (n1), "=&r" (n2) >> : "2" (n0), "1" (n1), "g" (n2), "cI" (s) >> ); >> >> When compiled with g++ 4.1.2 (CXXFLAGS=-O2 -march=pentium4) the >> operands %0 and %5 get the same memory address, even though they refer >> to distinct variables (n0 and n2). > > It would help to see the types of the variables. Is n2 a pointer? > Also it would help to see the actual values that wind up getting > passed in. n0, n1, n2 are unsigned long (members of the same C++ class, the asm statement is in a member function), s is unsigned char. > I think more details would help. For example, run gcc with the -dg > option, look at FILENAME.xxx.greg, and show us the insn corresponding > to the asm statement. 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. I hope this clarifies the problem. Thank you!