[llvm-commits] [llvm] r41225 - in /llvm/trunk/lib/Target/Mips: MipsISelLowering.cpp MipsISelLowering.h

Bruno Cardoso Lopes bruno.cardoso at gmail.com
Tue Aug 21 09:09:26 PDT 2007


Author: bruno
Date: Tue Aug 21 11:09:25 2007
New Revision: 41225

URL: http://llvm.org/viewvc/llvm-project?rev=41225&view=rev
Log:
InlineAsm asm support for integer registers added

Modified:
    llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp
    llvm/trunk/lib/Target/Mips/MipsISelLowering.h

Modified: llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp?rev=41225&r1=41224&r2=41225&view=diff

==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp Tue Aug 21 11:09:25 2007
@@ -20,6 +20,7 @@
 #include "llvm/Function.h"
 #include "llvm/Intrinsics.h"
 #include "llvm/CallingConv.h"
+#include "llvm/ADT/VectorExtras.h"
 #include "llvm/CodeGen/CallingConvLower.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/MachineFunction.h"
@@ -551,3 +552,72 @@
     return DAG.getNode(MipsISD::Ret, MVT::Other, 
                            Chain, DAG.getRegister(Mips::RA, MVT::i32));
 }
+
+//===----------------------------------------------------------------------===//
+//                           Mips Inline Assembly Support
+//===----------------------------------------------------------------------===//
+
+/// getConstraintType - Given a constraint letter, return the type of
+/// constraint it is for this target.
+MipsTargetLowering::ConstraintType MipsTargetLowering::
+getConstraintType(const std::string &Constraint) const 
+{
+  if (Constraint.size() == 1) {
+    // Mips specific constrainy 
+    // GCC config/mips/constraints.md
+    //
+    // 'd' : An address register. Equivalent to r 
+    //       unless generating MIPS16 code. 
+    // 'y' : Equivalent to r; retained for 
+    //       backwards compatibility. 
+    //
+    switch (Constraint[0]) {
+      default : break;
+      case 'd':     
+      case 'y': 
+        return C_RegisterClass;
+        break;
+    }
+  }
+  return TargetLowering::getConstraintType(Constraint);
+}
+
+std::pair<unsigned, const TargetRegisterClass*> MipsTargetLowering::
+getRegForInlineAsmConstraint(const std::string &Constraint,
+                             MVT::ValueType VT) const 
+{
+  if (Constraint.size() == 1) {
+    switch (Constraint[0]) {
+    case 'r':
+      return std::make_pair(0U, Mips::CPURegsRegisterClass);
+      break;
+    }
+  }
+  return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
+}
+
+std::vector<unsigned> MipsTargetLowering::
+getRegClassForInlineAsmConstraint(const std::string &Constraint,
+                                  MVT::ValueType VT) const 
+{
+  if (Constraint.size() != 1)
+    return std::vector<unsigned>();
+
+  switch (Constraint[0]) {         
+    default : break;
+    case 'r':
+    // GCC Mips Constraint Letters
+    case 'd':     
+    case 'y': 
+      return make_vector<unsigned>(Mips::V0, Mips::V1, Mips::A0, 
+                                   Mips::A1, Mips::A2, Mips::A3, 
+                                   Mips::T0, Mips::T1, Mips::T2, 
+                                   Mips::T3, Mips::T4, Mips::T5, 
+                                   Mips::T6, Mips::T7, Mips::S0, 
+                                   Mips::S1, Mips::S2, Mips::S3, 
+                                   Mips::S4, Mips::S5, Mips::S6, 
+                                   Mips::S7, Mips::T8, Mips::T9, 0);
+      break;
+  }
+  return std::vector<unsigned>();
+}

Modified: llvm/trunk/lib/Target/Mips/MipsISelLowering.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsISelLowering.h?rev=41225&r1=41224&r2=41225&view=diff

==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsISelLowering.h (original)
+++ llvm/trunk/lib/Target/Mips/MipsISelLowering.h Tue Aug 21 11:09:25 2007
@@ -40,6 +40,7 @@
       // Return 
       Ret,
 
+      // Need to support addition with a input flag
       Add
     };
   }
@@ -79,6 +80,16 @@
     SDOperand LowerGlobalAddress(SDOperand Op, SelectionDAG &DAG);
     SDOperand LowerGlobalTLSAddress(SDOperand Op, SelectionDAG &DAG);
 
+    // Inline asm support
+    ConstraintType getConstraintType(const std::string &Constraint) const;
+
+    std::pair<unsigned, const TargetRegisterClass*> 
+              getRegForInlineAsmConstraint(const std::string &Constraint,
+              MVT::ValueType VT) const;
+
+    std::vector<unsigned>
+    getRegClassForInlineAsmConstraint(const std::string &Constraint,
+              MVT::ValueType VT) const;
   };
 }
 





More information about the llvm-commits mailing list