Do not consider MMX_MOVD64rr a move instructions. The source register is in GR32...
[oota-llvm.git] / lib / Target / PowerPC / PPCSubtarget.cpp
index 82876d70f4776ea15e2d04216fe4fcfc4fdafc5d..425d8e6195c6a5cd7491ba481d7d96bb7ad8b712 100644 (file)
@@ -16,6 +16,7 @@
 #include "llvm/Module.h"
 #include "llvm/Target/TargetMachine.h"
 #include "PPCGenSubtarget.inc"
+#include <cstdlib>
 using namespace llvm;
 
 #if defined(__APPLE__)
@@ -60,6 +61,7 @@ PPCSubtarget::PPCSubtarget(const TargetMachine &tm, const Module &M,
                            const std::string &FS, bool is64Bit)
   : TM(tm)
   , StackAlignment(16)
+  , DarwinDirective(PPC::DIR_NONE)
   , IsGigaProcessor(false)
   , Has64BitSupport(false)
   , Use64BitRegs(false)
@@ -67,8 +69,8 @@ PPCSubtarget::PPCSubtarget(const TargetMachine &tm, const Module &M,
   , HasAltivec(false)
   , HasFSQRT(false)
   , HasSTFIWX(false)
-  , IsDarwin(false)
-  , HasLazyResolverStubs(false) {
+  , HasLazyResolverStubs(false)
+  , DarwinVers(0) {
 
   // Determine default and user specified characteristics
   std::string CPU = "generic";
@@ -81,36 +83,41 @@ PPCSubtarget::PPCSubtarget(const TargetMachine &tm, const Module &M,
 
   // If we are generating code for ppc64, verify that options make sense.
   if (is64Bit) {
-    if (!has64BitSupport()) {
-      cerr << "PPC: Generation of 64-bit code for a 32-bit processor "
-           << "requested.  Ignoring 32-bit processor feature.\n";
-      Has64BitSupport = true;
-    }
+    Has64BitSupport = true;
     // Silently force 64-bit register use on ppc64.
     Use64BitRegs = true;
   }
   
   // If the user requested use of 64-bit regs, but the cpu selected doesn't
-  // support it, warn and ignore.
-  if (use64BitRegs() && !has64BitSupport()) {
-    cerr << "PPC: 64-bit registers requested on CPU without support.  "
-         << "Disabling 64-bit register use.\n";
+  // support it, ignore.
+  if (use64BitRegs() && !has64BitSupport())
     Use64BitRegs = false;
-  }
   
   // Set the boolean corresponding to the current target triple, or the default
   // if one cannot be determined, to true.
-  const std::string& TT = M.getTargetTriple();
-  if (TT.length() > 5) {
-    IsDarwin = TT.find("-darwin") != std::string::npos;
+  const std::string &TT = M.getTargetTriple();
+  if (TT.length() > 7) {
+    // Determine which version of darwin this is.
+    size_t DarwinPos = TT.find("-darwin");
+    if (DarwinPos != std::string::npos) {
+      if (isdigit(TT[DarwinPos+7]))
+        DarwinVers = atoi(&TT[DarwinPos+7]);
+      else
+        DarwinVers = 8;  // Minimum supported darwin is Tiger.
+    }
   } else if (TT.empty()) {
+    // Try to autosense the subtarget from the host compiler.
 #if defined(__APPLE__)
-    IsDarwin = true;
+#if __APPLE_CC__ > 5400
+    DarwinVers = 9;  // GCC 5400+ is Leopard.
+#else
+    DarwinVers = 8;  // Minimum supported darwin is Tiger.
+#endif
 #endif
   }
 
   // Set up darwin-specific properties.
-  if (IsDarwin) {
+  if (isDarwin()) {
     HasLazyResolverStubs = true;
     AsmFlavor = NewMnemonic;
   } else {
@@ -135,7 +142,11 @@ bool PPCSubtarget::hasLazyResolverStub(const GlobalValue *GV) const {
   // We never hae stubs if HasLazyResolverStubs=false or if in static mode.
   if (!HasLazyResolverStubs || TM.getRelocationModel() == Reloc::Static)
     return false;
-  
+  // If symbol visibility is hidden, the extra load is not needed if
+  // the symbol is definitely defined in the current translation unit.
+  bool isDecl = GV->isDeclaration() && !GV->hasNotBeenReadFromBitcode();
+  if (GV->hasHiddenVisibility() && !isDecl && !GV->hasCommonLinkage())
+    return false;
   return GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
-         (GV->isDeclaration() && !GV->hasNotBeenReadFromBitcode());
+         GV->hasCommonLinkage() || isDecl;
 }