strange move of __asm__
Marcus Meissner
marcus@jet.franken.de
Thu Mar 18 06:53:00 GMT 1999
Hi,
WINE contains the following function:
TEB * WINAPI NtCurrentTeb(void)
{
#ifdef __i386__
TEB *teb;
/* Get the TEB self-pointer */
__asm__( ".byte 0x64\n\tmovl (%1),%0"
: "=r" (teb) : "r" (&((TEB *)0)->self) );
return teb;
#else
return &pCurrentThread->teb;
#endif /* __i386__ */
}
(WINAPI is a #define for __attribute__((__stdcall__)), TEB is a struct)
It compiles to the following (correct working) assemblercode on i386 on
"gcc version egcs-2.93.12 19990314 (gcc2 ss-980929 experimental)":
000000fc <NtCurrentTeb>:
fc: b8 18 00 00 00 movl $0x18,%eax
101: 64 8b 00 movl %fs:(%eax),%eax
104: 55 pushl %ebp
105: 89 e5 movl %esp,%ebp
107: 89 ec movl %ebp,%esp
109: 5d popl %ebp
10a: c3 ret
egcs has moved the __asm__ outside the stackframe enter/leave. Now,
should this happen?
And couldn't egcs optimize the framestuff away if nothing is inside it?
Ciao, Marcus
More information about the Gcc-bugs
mailing list