From: Endlisnis Newsgroups: comp.os.msdos.djgpp Subject: Not a bug in GCC. Was: Bug in GCC? Date: Wed, 09 Sep 1998 18:01:29 -0300 Organization: NBTel Internet Lines: 56 Message-ID: <35F6ECA9.2AD41252@unb.ca> References: NNTP-Posting-Host: fctnts10c05.nbnet.nb.ca Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk Salvador Eduardo Tropea (SET) wrote: > int add(int a,int b) > { > int ret; > asm ("movl %2,%0; addl %1,%0" : "rm="(ret) : "r"(b), "r"(a)); > return ret; > } But, your requires an extra move! I actually found the problem in my code, not the compiler. > > int add(int a, int b) > > { > > int Ret; > > asm ("addl %1, %0" //this line compiles to "addl ecx,ecx". > > : "=&r" (Ret) > > : "0" (a), "r" (b) > > ); > > return Ret; > > } As you can see I've allocated %0 to the output register (will be %eax), and I'm using it as an input register as well. My belief was that %0 would the (Ret) & (a), and %1 would be (b). But that is WRONG! That code makes %0 = (Ret), %1 = (a), %2 = (b). This caused %0 to be the SAME as %1, and thus my problem. The solution was to change "addl %1, %0" to "addl %2, %0" and then everything worked fine, but then I realized there was no need to load (b) into a register at all, so here's the final working code: int add(int a, int b) { int Ret; asm ("addl %2, %0" : "=&r" (Ret) : "0" (a), "mr" (b) ); return Ret; } Which compiles (with -O2 -m486) to: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax addl 12(%ebp), %eax leave ret -- (\/) Endlisnis (\/) s257m AT unb DOT ca Endlisnis AT GeoCities DOT com Endlis AT nbnet DOT nb DOT ca