Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/MC/X86/align-branch-enhanced-relaxation.s
- This file was added.
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu %s -x86-pad-max-prefix-size=1 --x86-align-branch-boundary=32 --x86-align-branch=jmp+indirect | llvm-objdump -d - | FileCheck %s | |||||
# RUN: llvm-mc -mcpu=skylake -filetype=obj -triple x86_64-pc-linux-gnu %s --mc-relax-all | llvm-objdump -d - | FileCheck --check-prefixes=RELAX-ALL %s | |||||
# Exercise cases where we are allowed to increase the length of unrelaxable | |||||
# instructions (by adding prefixes) for alignment purposes. | |||||
# The first test checks instructions 'int3', 'push %rbp', which will be padded | |||||
# later are unrelaxable (their encoding size is still 1 byte when | |||||
# --mc-relax-all is passed). | |||||
.text | |||||
.globl labeled_unrelaxable_test | |||||
labeled_unrelaxable_test: | |||||
# RELAX-ALL: 0: cc int3 | |||||
# RELAX-ALL: 1: 54 pushq %rsp | |||||
int3 | |||||
push %rsp | |||||
# The second test is a basic test, we just check the jmp is aligned by prefix | |||||
# padding the previous instructions. | |||||
.text | |||||
.globl labeled_basic_test | |||||
labeled_basic_test: | |||||
.p2align 5 | |||||
.rept 28 | |||||
int3 | |||||
.endr | |||||
# CHECK: 3c: 2e cc int3 | |||||
# CHECK: 3e: 2e 54 pushq %rsp | |||||
# CHECK: 40: eb 00 jmp | |||||
int3 | |||||
push %rsp | |||||
jmp foo | |||||
foo: | |||||
ret | |||||
# The third test check the correctness cornercase - can't add prefixes on a | |||||
# prefix or a instruction following by a prefix. | |||||
.globl labeled_prefix_test | |||||
labeled_prefix_test: | |||||
.p2align 5 | |||||
.rept 28 | |||||
int3 | |||||
.endr | |||||
# CHECK: 7c: 2e cc int3 | |||||
int3 | |||||
# CHECK: 7e: 3e cc int3 | |||||
DS | |||||
int3 | |||||
# CHECK: 80: eb 00 jmp | |||||
jmp bar | |||||
bar: | |||||
ret |