Optimizing 0-displacement jumps on i386

H. Peter Anvin hpa@zytor.com
Tue Aug 12 01:57:51 GMT 2025


On 2025-08-11 11:19, H. Peter Anvin wrote:
> 
> Arguably this should be merged with subsequent alignment padding if it
> fits within one instruction.  However, in order to actually be effective
> in any meaningful way, this version of the optimization probably needs
> to be performed in the linker, or it will simply never happen if the
> code is compiled with linker garbage collection, which is pretty common
> these days.
> 
> The optimization in gas would still apply to intra-function jumps.
> 
> Note that it may very well be necessary to disable this optimization, in
> case something expects to be able to create a jump instruction and patch
> its target; such code might use a zero-displacement jump to ensure a
> two-byte as opposed to a 5/6-byte jump. It should be rare though.
> 

One more issue: a zero-offset jump may also be used to sync the prefetch
pipe on the CPUs that require that. For example, the Linux boot code
contains the following sequence:

        /* Self-modify the INT instruction.  Ugly, but works. */
        cmpb    %al, 3f
        je      1f
        movb    %al, 3f
        jmp     1f              /* Synchronize pipeline */
1:

	-hpa



More information about the Binutils mailing list