diff options
Diffstat (limited to 'lib/Target/Blackfin')
| -rw-r--r-- | lib/Target/Blackfin/BlackfinISelLowering.cpp | 47 | ||||
| -rw-r--r-- | lib/Target/Blackfin/BlackfinISelLowering.h | 6 | 
2 files changed, 53 insertions, 0 deletions
diff --git a/lib/Target/Blackfin/BlackfinISelLowering.cpp b/lib/Target/Blackfin/BlackfinISelLowering.cpp index 96d54aa..c07f1f2 100644 --- a/lib/Target/Blackfin/BlackfinISelLowering.cpp +++ b/lib/Target/Blackfin/BlackfinISelLowering.cpp @@ -15,6 +15,7 @@  #include "BlackfinISelLowering.h"  #include "BlackfinTargetMachine.h"  #include "llvm/Function.h" +#include "llvm/Type.h"  #include "llvm/CodeGen/CallingConvLower.h"  #include "llvm/CodeGen/MachineFrameInfo.h"  #include "llvm/CodeGen/MachineFunction.h" @@ -549,6 +550,52 @@ BlackfinTargetLowering::getConstraintType(const std::string &Constraint) const {    return TargetLowering::getConstraintType(Constraint);  } +/// Examine constraint type and operand type and determine a weight value. +/// This object must already have been set up with the operand type +/// and the current alternative constraint selected. +TargetLowering::ConstraintWeight +BlackfinTargetLowering::getSingleConstraintMatchWeight( +    AsmOperandInfo &info, const char *constraint) const { +  ConstraintWeight weight = CW_Invalid; +  Value *CallOperandVal = info.CallOperandVal; +    // If we don't have a value, we can't do a match, +    // but allow it at the lowest weight. +  if (CallOperandVal == NULL) +    return CW_Default; +  // Look at the constraint type. +  switch (*constraint) { +  default: +    weight = TargetLowering::getSingleConstraintMatchWeight(info, constraint); +    break; + +    // Blackfin-specific constraints +  case 'a': +  case 'd': +  case 'z': +  case 'D': +  case 'W': +  case 'e': +  case 'b': +  case 'v': +  case 'f': +  case 'c': +  case 't': +  case 'u': +  case 'k': +  case 'x': +  case 'y': +  case 'w': +    return CW_Register; +  case 'A': +  case 'B': +  case 'C': +  case 'Z': +  case 'Y': +    return CW_SpecificReg; +  } +  return weight; +} +  /// getRegForInlineAsmConstraint - Return register no and class for a C_Register  /// constraint.  std::pair<unsigned, const TargetRegisterClass*> BlackfinTargetLowering:: diff --git a/lib/Target/Blackfin/BlackfinISelLowering.h b/lib/Target/Blackfin/BlackfinISelLowering.h index 6bebcc3..15a745f 100644 --- a/lib/Target/Blackfin/BlackfinISelLowering.h +++ b/lib/Target/Blackfin/BlackfinISelLowering.h @@ -39,6 +39,12 @@ namespace llvm {                                      SelectionDAG &DAG) const;      ConstraintType getConstraintType(const std::string &Constraint) const; + +    /// Examine constraint string and operand type and determine a weight value. +    /// The operand object must already have been set up with the operand type. +    ConstraintWeight getSingleConstraintMatchWeight( +      AsmOperandInfo &info, const char *constraint) const; +      std::pair<unsigned, const TargetRegisterClass*>      getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const;      std::vector<unsigned>  | 
