llvm/test/MC/ELF/relax-arith3.s
Michael Kuperstein 5020a9198d [X86] Avoid over-relaxation of 8-bit immediates in integer arithmetic instructions.
Only consider an instruction a candidate for relaxation if the last operand of the 
instruction is an expression. We previously checked whether any operand is an expression,
which is useless, since for all instructions concerned, the only operand that may be
affected by relaxation is the last one.
In addition, this removes the check for having RIP as an argument, since it was 
plain wrong - even when one of the arguments is RIP, relaxation may still be needed.

This fixes PR9807.

Patch by: david.l.kreitzer@intel.com
Differential Revision: http://reviews.llvm.org/D10766

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241152 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-01 10:54:42 +00:00

77 lines
2.9 KiB
ArmAsm

// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-objdump -d - | FileCheck %s
// Test that we correctly relax these instructions into versions that use
// 16 or 32 bit immediate values.
bar:
// CHECK: Disassembly of section imul:
// CHECK-NEXT: imul:
// CHECK-NEXT: 0: 66 69 1d 00 00 00 00 00 00 imulw $0, (%rip), %bx
// CHECK-NEXT: 9: 69 1d 00 00 00 00 00 00 00 00 imull $0, (%rip), %ebx
// CHECK-NEXT: 13: 48 69 1d 00 00 00 00 00 00 00 00 imulq $0, (%rip), %rbx
.section imul,"x"
imul $foo, bar(%rip), %bx
imul $foo, bar(%rip), %ebx
imul $foo, bar(%rip), %rbx
// CHECK: Disassembly of section and:
// CHECK-NEXT: and:
// CHECK-NEXT: 0: 66 81 25 00 00 00 00 00 00 andw $0, (%rip)
// CHECK-NEXT: 9: 81 25 00 00 00 00 00 00 00 00 andl $0, (%rip)
// CHECK-NEXT: 13: 48 81 25 00 00 00 00 00 00 00 00 andq $0, (%rip)
.section and,"x"
andw $foo, bar(%rip)
andl $foo, bar(%rip)
andq $foo, bar(%rip)
// CHECK: Disassembly of section or:
// CHECK-NEXT: or:
// CHECK-NEXT: 0: 66 81 0d 00 00 00 00 00 00 orw $0, (%rip)
// CHECK-NEXT: 9: 81 0d 00 00 00 00 00 00 00 00 orl $0, (%rip)
// CHECK-NEXT: 13: 48 81 0d 00 00 00 00 00 00 00 00 orq $0, (%rip)
.section or,"x"
orw $foo, bar(%rip)
orl $foo, bar(%rip)
orq $foo, bar(%rip)
// CHECK: Disassembly of section xor:
// CHECK-NEXT: xor:
// CHECK-NEXT: 0: 66 81 35 00 00 00 00 00 00 xorw $0, (%rip)
// CHECK-NEXT: 9: 81 35 00 00 00 00 00 00 00 00 xorl $0, (%rip)
// CHECK-NEXT: 13: 48 81 35 00 00 00 00 00 00 00 00 xorq $0, (%rip)
.section xor,"x"
xorw $foo, bar(%rip)
xorl $foo, bar(%rip)
xorq $foo, bar(%rip)
// CHECK: Disassembly of section add:
// CHECK-NEXT: add:
// CHECK-NEXT: 0: 66 81 05 00 00 00 00 00 00 addw $0, (%rip)
// CHECK-NEXT: 9: 81 05 00 00 00 00 00 00 00 00 addl $0, (%rip)
// CHECK-NEXT: 13: 48 81 05 00 00 00 00 00 00 00 00 addq $0, (%rip)
.section add,"x"
addw $foo, bar(%rip)
addl $foo, bar(%rip)
addq $foo, bar(%rip)
// CHECK: Disassembly of section sub:
// CHECK-NEXT: sub:
// CHECK-NEXT: 0: 66 81 2d 00 00 00 00 00 00 subw $0, (%rip)
// CHECK-NEXT: 9: 81 2d 00 00 00 00 00 00 00 00 subl $0, (%rip)
// CHECK-NEXT: 13: 48 81 2d 00 00 00 00 00 00 00 00 subq $0, (%rip)
.section sub,"x"
subw $foo, bar(%rip)
subl $foo, bar(%rip)
subq $foo, bar(%rip)
// CHECK: Disassembly of section cmp:
// CHECK-NEXT: cmp:
// CHECK-NEXT: 0: 66 81 3d 00 00 00 00 00 00 cmpw $0, (%rip)
// CHECK-NEXT: 9: 81 3d 00 00 00 00 00 00 00 00 cmpl $0, (%rip)
// CHECK-NEXT: 13: 48 81 3d 00 00 00 00 00 00 00 00 cmpq $0, (%rip)
.section cmp,"x"
cmpw $foo, bar(%rip)
cmpl $foo, bar(%rip)
cmpq $foo, bar(%rip)