aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
authorHarald van Dijk <harald@gigawatt.nl>2020-12-12 17:05:24 +0000
committerHarald van Dijk <harald@gigawatt.nl>2020-12-12 17:05:24 +0000
commitf61e5ecb919b3901590328e69d3e4a557eefd788 (patch)
tree0a3704c56eeb9cd2fd0ca4bf7dba5b93b66cbc2b /llvm
parenta4823377fd2f216f7556bf8e60379ca7c5722b57 (diff)
downloadllvm-f61e5ecb919b3901590328e69d3e4a557eefd788.zip
llvm-f61e5ecb919b3901590328e69d3e4a557eefd788.tar.gz
llvm-f61e5ecb919b3901590328e69d3e4a557eefd788.tar.bz2
[X86] Avoid data16 prefix for lea in x32 mode
The ABI demands a data16 prefix for lea in 64-bit LP64 mode, but not in 64-bit ILP32 mode. In both modes this prefix would ordinarily be ignored, but the instructions may be changed by the linker to instructions that are affected by the prefix. Reviewed By: RKSimon Differential Revision: https://reviews.llvm.org/D93157
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/X86/X86MCInstLower.cpp4
-rw-r--r--llvm/test/CodeGen/X86/pic.ll1
2 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp
index 6602d81..29faaa2d 100644
--- a/llvm/lib/Target/X86/X86MCInstLower.cpp
+++ b/llvm/lib/Target/X86/X86MCInstLower.cpp
@@ -979,6 +979,8 @@ void X86AsmPrinter::LowerTlsAddr(X86MCInstLower &MCInstLowering,
NoAutoPaddingScope NoPadScope(*OutStreamer);
bool Is64Bits = MI.getOpcode() != X86::TLS_addr32 &&
MI.getOpcode() != X86::TLS_base_addr32;
+ bool Is64BitsLP64 = MI.getOpcode() == X86::TLS_addr64 ||
+ MI.getOpcode() == X86::TLS_base_addr64;
MCContext &Ctx = OutStreamer->getContext();
MCSymbolRefExpr::VariantKind SRVK;
@@ -1012,7 +1014,7 @@ void X86AsmPrinter::LowerTlsAddr(X86MCInstLower &MCInstLowering,
if (Is64Bits) {
bool NeedsPadding = SRVK == MCSymbolRefExpr::VK_TLSGD;
- if (NeedsPadding)
+ if (NeedsPadding && Is64BitsLP64)
EmitAndCountInstruction(MCInstBuilder(X86::DATA16_PREFIX));
EmitAndCountInstruction(MCInstBuilder(X86::LEA64r)
.addReg(X86::RDI)
diff --git a/llvm/test/CodeGen/X86/pic.ll b/llvm/test/CodeGen/X86/pic.ll
index 3f3417e..101c749 100644
--- a/llvm/test/CodeGen/X86/pic.ll
+++ b/llvm/test/CodeGen/X86/pic.ll
@@ -285,6 +285,7 @@ entry:
; CHECK-I686-DAG: calll ___tls_get_addr@PLT
; CHECK-I686-DAG: leal tlssrcgd@TLSGD(,%ebx), %eax
; CHECK-I686-DAG: calll ___tls_get_addr@PLT
+; CHECK-X32-NOT: data16
; CHECK-X32-DAG: leaq tlsdstgd@TLSGD(%rip), %rdi
; CHECK-X32-DAG: callq __tls_get_addr@PLT
; CHECK-X32-DAG: leaq tlsptrgd@TLSGD(%rip), %rdi