llvm/llvm/test/MC/X86/align-branch-basic.s

# RUN: llvm-mc -filetype=obj -triple x86_64 --x86-align-branch-boundary=32 --x86-align-branch=call+jmp+indirect+ret+jcc %s | llvm-objdump -d --no-show-raw-insn - | FileCheck %s

  # These tests are checking the basic cases for each instructions, and a
  # bit of the alignment checking logic itself.  Fused instruction cases are
  # excluded, as are details of argument parsing.

  # instruction sizes for reference:
  #  callq is 5 bytes long
  #  int3 is 1 byte
  #  jmp <near-label> is 2 bytes
  #  jmp <far-label> is 5 bytes
  #  ret N is 2 bytes

  # Next couple tests are checking the edge cases on the alignment computation

  .text
  # CHECK: <test1>:
  # CHECK: 20: callq
  .globl  test1
  .p2align  5
test1:
  .rept 29
  int3
  .endr
  callq bar

  # CHECK: <test2>:
  # CHECK: 60: callq
  .globl  test2
  .p2align  5
test2:
  .rept 31
  int3
  .endr
  callq bar

  # CHECK: <test3>:
  # CHECK: a0: callq
  .globl  test3
  .p2align  5
test3:
  .rept 27
  int3
  .endr
  callq bar

  # next couple check instruction type coverage

  # CHECK: <test_jmp>:
  # CHECK: e0: jmp
  .globl  test_jmp
  .p2align  5
test_jmp:
  .rept 31
  int3
  .endr
  jmp bar

  # CHECK: <test_ret>:
  # CHECK: 120: retq
  .globl  test_ret
  .p2align  5
test_ret:
  .rept 31
  int3
  .endr
  retq $0

  # check a case with a relaxable instruction

  # CHECK: <test_jmp_far>:
  # CHECK: 160: jmp
  .globl  test_jmp_far
  .p2align  5
test_jmp_far:
  .rept 31
  int3
  .endr
  jmp baz

  # CHECK: <test_jcc>:
  # CHECK: 1a0: jne
  .globl  test_jcc
  .p2align  5
test_jcc:
  .rept 31
  int3
  .endr
  jne bar

  # CHECK: <test_indirect>:
  # CHECK: 1e0: jmp
  .globl  test_indirect
  .p2align  5
test_indirect:
  .rept 31
  int3
  .endr
  jmpq *(%rax)

  .p2align 4
  .type   bar,@function
bar:
  retq

  # This case looks really tempting to pad, but doing so for the call causes
  # the jmp to be misaligned.
  # CHECK: <test_pad_via_relax_neg1>:
  # CHECK: 200: int3
  # CHECK: 21a: testq
  # CHECK: 21d: jne
  # CHECK: 21f: nop
  # CHECK: 220: callq
  .global test_pad_via_relax_neg1
  .p2align  5
test_pad_via_relax_neg1:
  .rept 26
  int3
  .endr
  testq %rax, %rax
  jnz bar
  callq bar

  # Same as previous, but without fusion
  # CHECK: <test_pad_via_relax_neg2>:
  # CHECK: 240: int3
  # CHECK: 25d: jmp
  # CHECK: 25f: nop
  # CHECK: 260: callq
  .global test_pad_via_relax_neg2
  .p2align  5
test_pad_via_relax_neg2:
  .rept 29
  int3
  .endr
  jmp bar2
  callq bar2

bar2:

  .section "unknown"
  .p2align 4
  .type   baz,@function
baz:
  retq