[llvm-dev] x86: How to Force 2-byte `jmp` instruction in lowering

Dean Michael Berris via llvm-dev llvm-dev at lists.llvm.org
Wed Jun 22 00:10:16 PDT 2016

I have a bit of a riddle:

In http://reviews.llvm.org/D19904 I'm trying to spell the following

  .palign 2, 0x90
  jmp +0x9
  nopw 512(%rax,%rax,1)
  // rest of the code

I try the following snippet to accomplish this:

  auto Target = OutContext.createLinkerPrivateTempSymbol();

  // Use a two-byte `jmp`. This version of JMP takes an 8-bit relative
offset as
  // an operand (computed as an offset from the jmp instruction).
          .addExpr(MCSymbolRefExpr::create(Target, OutContext)),
  EmitNops(*OutStreamer, 9, Subtarget->is64Bit(), getSubtargetInfo());

Which turns into:

  .palign 2, 0x90
  jmp .Ltmp0
  nopw 512(%rax,%rax,1)
  // rest of the code

Is there a way of forcing the lowered JMP instruction to turn into a
two-byte jump that does a short relative jump (one that fits within 8
bits)? When I run the binary and disassemble the function I'm seeing it
turn into a 5-byte jump (jmpq <32-bit offset>) instead of a 2-byte jump
(jmp <8-bit offset>).

Thanks in advance!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160622/e14aea1d/attachment.html>

More information about the llvm-dev mailing list