[discuss] small challenge for instruction selection

Jan Beulich JBeulich@novell.com
Thu Jun 16 07:06:00 GMT 2005


>>> "H. J. Lu" <hjl@lucon.org> 16.06.05 03:11:08 >>>
On Wed, Jun 15, 2005 at 05:29:07PM -0700, Siddha, Suresh B wrote:
> On Tue, Jun 14, 2005 at 11:15:33PM +0200, Andi Kleen wrote:
> > > movl $0x80706050,0x40302010(%rdi)
> > > ret $0xb0a0
> > > 
> > > Is 3 bytes overhead with 8+2 bytes contiguous.
> > 
> > Nice. Thanks Zachary. Any other calls? :)
> 
> with 2 bytes overhead.
> 
> 	// mov    %eax,0x8070605040302010
>         __asm__ __volatile__ ( ".byte 0xa3; .quad  0x8070605040302010");
>         __asm__ __volatile__ ( "ret $0xa090");
> 
> Assembler is not generating the intended code when I use the mnemonic form
> for the first asm stmt. Disassembly is fine though.
> 
>
>I opened a bug:
>
>http://sources.redhat.com/bugzilla/show_bug.cgi?id=1013 

I don't think that's a bug: include/opcodes/i386.h explicitly disallows this mov form in 64-bit mode; movabs is to be used here instead. This is because for symbolics you'd have an ambiguity resulting otherwise in that you could encode this mov with either 64-bit displacement or sign-extended 32-bit one, with no way for the programmer to indicate which one to choose. Thus you've got to use movabs here to make clear you want a 64-bit disp, and use mov when you rather (and that's very reasonably the default) want a 32-bit one.

Jan



More information about the Binutils mailing list