diff options
author | Harald van Dijk <harald@gigawatt.nl> | 2020-12-12 17:05:24 +0000 |
---|---|---|
committer | Harald van Dijk <harald@gigawatt.nl> | 2020-12-12 17:05:24 +0000 |
commit | f61e5ecb919b3901590328e69d3e4a557eefd788 (patch) | |
tree | 0a3704c56eeb9cd2fd0ca4bf7dba5b93b66cbc2b /llvm | |
parent | a4823377fd2f216f7556bf8e60379ca7c5722b57 (diff) | |
download | llvm-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.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/pic.ll | 1 |
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 |