Use a base register instead of an index register with the local dynamic model.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 7 Jun 2012 18:39:19 +0000 (18:39 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 7 Jun 2012 18:39:19 +0000 (18:39 +0000)
Fixes pr13048.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158158 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86MCInstLower.cpp
test/CodeGen/X86/tls-pic.ll

index 9dc5c7035d4d7867ca275eed57756b6538e3ac5e..df7507ce3d6bcf0c0afdb25cdd043bb19a991a61 100644 (file)
@@ -596,6 +596,14 @@ static void LowerTlsAddr(MCStreamer &OutStreamer,
     LEA.addOperand(MCOperand::CreateReg(0));        // index
     LEA.addOperand(MCOperand::CreateExpr(symRef));  // disp
     LEA.addOperand(MCOperand::CreateReg(0));        // seg
+  } else if (SRVK == MCSymbolRefExpr::VK_TLSLDM) {
+    LEA.setOpcode(X86::LEA32r);
+    LEA.addOperand(MCOperand::CreateReg(X86::EAX)); // dest
+    LEA.addOperand(MCOperand::CreateReg(X86::EBX)); // base
+    LEA.addOperand(MCOperand::CreateImm(1));        // scale
+    LEA.addOperand(MCOperand::CreateReg(0));        // index
+    LEA.addOperand(MCOperand::CreateExpr(symRef));  // disp
+    LEA.addOperand(MCOperand::CreateReg(0));        // seg
   } else {
     LEA.setOpcode(X86::LEA32r);
     LEA.addOperand(MCOperand::CreateReg(X86::EAX)); // dest
index c3e821672568c5180edd0dd3579ed3c7a67c2331..51c3d2363f8bfd9e648353feb5311d6e5335fe59 100644 (file)
@@ -75,7 +75,7 @@ entry:
 }
 
 ; X32:    f5:
-; X32:      leal {{[jk]}}@TLSLDM
+; X32:      leal {{[jk]}}@TLSLDM(%ebx)
 ; X32-NEXT: calll ___tls_get_addr@PLT
 ; X32-NEXT: movl {{[jk]}}@DTPOFF(%eax)
 ; X32-NEXT: addl {{[jk]}}@DTPOFF(%eax)