Optimizing 0-displacement jumps on i386

Petr Skočík pskocik@gmail.com
Thu Aug 7 23:26:27 GMT 2025


Hi. I'm new here. I noticed (1) gas isn't literal and is capable of various
optimizations & (2) jumps are effectively variable-length due to how gas
iteratively does jmp relaxations and I was wondering why not take (2) all
the way and delete sequences like 0eb 00, i.e., jumps to the next
instruction?

These come up quite a lot (tailcalls to a neighboring function) & might be
difficult for compilers to eliminate them.
(It might be better if the assembler did it for other reasons anyway--like
I'd like to a bit more efficiently tailcall to some asm without the
compiler getting too nosy). It might be difficult for gas too, but since
the framework for length-adjusting jumps is already there ...?

Alternatively, and this seems rather easy, 0-displacement jumps could be
turned into 2-byte nops, which are quite a bit faster.

I tried doing it by modifying the tail of md_convert_frag like so:

  if(extension==1 && 0==(valueT)(displacement_from_opcode_start -
extension)){ //new
      opcode[0]=0x66; //new
      opcode[1]=0x90; //new
  }else  //new
  {
  /* Now put displacement after opcode.  */
      md_number_to_chars ((char *) where_to_put_displacement,
                  (valueT) (displacement_from_opcode_start - extension),
                  DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
  }
  fragP->fr_fix += extension;
}

and it seems to do the job.
Just a thought. Thanks for reading my message.

Best regards,
Petr Skocik
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/binutils/attachments/20250808/a120c5f1/attachment.htm>


More information about the Binutils mailing list