This is the mail archive of the gcc-help@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: C/C++ Calling assembler


On Fri, 2009-05-01 at 09:28 -0400, John Fine wrote:

> > An examination of the assembler produced always shows it passes the buffer
> > pointer in %edi and not on the stack.
> >   
> ?? %edi not %rdi ??
> 
> That would mean you are compiling 32 bit code.  I assume that is not 
> what you intended.
> 
> But possibly with a statically allocated buffer, the compiler can deduce 
> that the buffer will be in the first 4GB at run time and it can put the 
> correct address into rdi more efficiently by moving it to edi (with 
> implicit zeroing of the high 32  bits) than by moving it to rdi.

Yes, apparently the compiler does this. It will, for example, put
constants like text messages in a "small memory" area and pass the
address in the 32-bit portion of the register. Because changing the
32-bit portion of the register always zeros the high-order 32 bits, this
results in a correct 64-bit address. The main saving here is that the
instruction to access edi does not require a REX prefix byte, but rdi
does.

Aside: changing 8 or 16 bits in a register does NOT affect the other
portions of the register.

Bob



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