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

164 lines
2.9 KiB
ArmAsm

# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu --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
# CHECK: <test_pad_via_relax>:
# CHECK: 200: testq
# CHECK: 203: jne
# CHECK: 209: int3
# note 6 byte jne which could be a 2 byte jne, but is instead
# expanded for padding purposes
# CHECK-NOT: nop
# CHECK: 220: callq
.global test_pad_via_relax
.p2align 5
test_pad_via_relax:
testq %rax, %rax
jnz bar
.rept 23
int3
.endr
callq bar
# 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: 240: int3
# CHECK: 25a: testq
# CHECK: 25d: jne
# CHECK: 25f: nop
# CHECK: 260: 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: 280: int3
# CHECK: 29d: jmp
# CHECK: 29f: nop
# CHECK: 2a0: 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