Be bug compatible with gcc by returning MMX values in RAX.
[oota-llvm.git] / lib / Target / Mips / MipsTargetMachine.cpp
index a170d6fb36d5b84b742955e81febc6bbd7a73b7f..ff2e5b81589c9950090723f25fcdb24956418764 100644 (file)
 #include "llvm/Target/TargetMachineRegistry.h"
 using namespace llvm;
 
+/// MipsTargetMachineModule - Note that this is used on hosts that
+/// cannot link in a library unless there are references into the
+/// library.  In particular, it seems that it is not possible to get
+/// things to work on Win32 without this.  Though it is unused, do not
+/// remove it.
+extern "C" int MipsTargetMachineModule;
+int MipsTargetMachineModule = 0;
+
 // Register the target.
-static RegisterTarget<MipsTargetMachine>    X("mips", "  Mips");
-static RegisterTarget<MipselTargetMachine>  Y("mipsel", "  Mipsel");
+static RegisterTarget<MipsTargetMachine>    X("mips", "Mips");
+static RegisterTarget<MipselTargetMachine>  Y("mipsel", "Mipsel");
 
 const TargetAsmInfo *MipsTargetMachine::
 createTargetAsmInfo() const 
@@ -33,19 +41,24 @@ createTargetAsmInfo() const
 // The stack is always 8 byte aligned
 // On function prologue, the stack is created by decrementing
 // its pointer. Once decremented, all references are done with positive
-// offset from the stack/frame pointer, so StackGrowsUp is used.
+// offset from the stack/frame pointer, using StackGrowsUp enables 
+// an easier handling.
 // Using CodeModel::Large enables different CALL behavior.
 MipsTargetMachine::
 MipsTargetMachine(const Module &M, const std::string &FS, bool isLittle=false):
   Subtarget(*this, M, FS, isLittle), 
-  DataLayout(isLittle ? std::string("e-p:32:32:32") :
-                        std::string("E-p:32:32:32")), 
+  DataLayout(isLittle ? std::string("e-p:32:32:32-i8:8:32-i16:16:32") :
+                        std::string("E-p:32:32:32-i8:8:32-i16:16:32")), 
   InstrInfo(*this), 
   FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0),
   TLInfo(*this) 
 {
-  if (getRelocationModel() != Reloc::Static)
+  // Abicall enables PIC by default
+  if (Subtarget.hasABICall())
     setRelocationModel(Reloc::PIC_);  
+
+  // TODO: create an option to enable long calls, like -mlong-calls, 
+  // that would be our CodeModel::Large. It must not work with Abicall.
   if (getCodeModel() == CodeModel::Default)
     setCodeModel(CodeModel::Small);
 }
@@ -112,7 +125,7 @@ addPreEmitPass(PassManagerBase &PM, bool Fast)
 // true if AssemblyEmitter is supported
 bool MipsTargetMachine::
 addAssemblyEmitter(PassManagerBase &PM, bool Fast, 
-                   std::ostream &Out) 
+                   raw_ostream &Out) 
 {
   // Output assembly language.
   PM.add(createMipsCodePrinterPass(Out, *this));