This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Register Allocation Bug?


#define ESP (rel,value,addr) \
asm volatile ("mov (%%esp, %2, 4), %0\n \t" \
"lea (%%esp, %2, 4), %1\n \t" \
: "=r" (value), "=r" (addr) \
: "r" (rel)); \


It didn't work as expected so I looked at the assembler code generated
for the above:

 1:       b8 00 00 00 00          mov    $0x0,%eax
 2:       8b 04 84                mov    (%esp,%eax,4),%eax
 3:       8d 14 84                lea    (%esp,%eax,4),%edx
 4:       89 45 f8                mov    %eax,0xfffffff8(%ebp)
 5:       89 55 fc                mov    %edx,0xfffffffc(%ebp)


As it turns out, %eax is being used for both input and output in line 2, clobbering %eax, so of course line 3 does not give the expected result... Is this a compiler error?

It's not a compiler bug: you need to use an "early clobber", namely "=&r"(value) . See the Fine Manual.


Segher



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]