mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	Pull utility routines with no SelectionDAG dependence out of
SelectionDAGBuilder. FunctionLoweringInfo isn't an ideal place for them to live, but it's better than SelectionDAGBuilder for now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101267 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -369,3 +369,79 @@ void llvm::CopyCatchInfo(BasicBlock *SrcBB, BasicBlock *DestBB,
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// hasInlineAsmMemConstraint - Return true if the inline asm instruction being
 | 
			
		||||
/// processed uses a memory 'm' constraint.
 | 
			
		||||
bool
 | 
			
		||||
llvm::hasInlineAsmMemConstraint(std::vector<InlineAsm::ConstraintInfo> &CInfos,
 | 
			
		||||
                                const TargetLowering &TLI) {
 | 
			
		||||
  for (unsigned i = 0, e = CInfos.size(); i != e; ++i) {
 | 
			
		||||
    InlineAsm::ConstraintInfo &CI = CInfos[i];
 | 
			
		||||
    for (unsigned j = 0, ee = CI.Codes.size(); j != ee; ++j) {
 | 
			
		||||
      TargetLowering::ConstraintType CType = TLI.getConstraintType(CI.Codes[j]);
 | 
			
		||||
      if (CType == TargetLowering::C_Memory)
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Indirect operand accesses access memory.
 | 
			
		||||
    if (CI.isIndirect)
 | 
			
		||||
      return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// getFCmpCondCode - Return the ISD condition code corresponding to
 | 
			
		||||
/// the given LLVM IR floating-point condition code.  This includes
 | 
			
		||||
/// consideration of global floating-point math flags.
 | 
			
		||||
///
 | 
			
		||||
ISD::CondCode llvm::getFCmpCondCode(FCmpInst::Predicate Pred) {
 | 
			
		||||
  ISD::CondCode FPC, FOC;
 | 
			
		||||
  switch (Pred) {
 | 
			
		||||
  case FCmpInst::FCMP_FALSE: FOC = FPC = ISD::SETFALSE; break;
 | 
			
		||||
  case FCmpInst::FCMP_OEQ:   FOC = ISD::SETEQ; FPC = ISD::SETOEQ; break;
 | 
			
		||||
  case FCmpInst::FCMP_OGT:   FOC = ISD::SETGT; FPC = ISD::SETOGT; break;
 | 
			
		||||
  case FCmpInst::FCMP_OGE:   FOC = ISD::SETGE; FPC = ISD::SETOGE; break;
 | 
			
		||||
  case FCmpInst::FCMP_OLT:   FOC = ISD::SETLT; FPC = ISD::SETOLT; break;
 | 
			
		||||
  case FCmpInst::FCMP_OLE:   FOC = ISD::SETLE; FPC = ISD::SETOLE; break;
 | 
			
		||||
  case FCmpInst::FCMP_ONE:   FOC = ISD::SETNE; FPC = ISD::SETONE; break;
 | 
			
		||||
  case FCmpInst::FCMP_ORD:   FOC = FPC = ISD::SETO;   break;
 | 
			
		||||
  case FCmpInst::FCMP_UNO:   FOC = FPC = ISD::SETUO;  break;
 | 
			
		||||
  case FCmpInst::FCMP_UEQ:   FOC = ISD::SETEQ; FPC = ISD::SETUEQ; break;
 | 
			
		||||
  case FCmpInst::FCMP_UGT:   FOC = ISD::SETGT; FPC = ISD::SETUGT; break;
 | 
			
		||||
  case FCmpInst::FCMP_UGE:   FOC = ISD::SETGE; FPC = ISD::SETUGE; break;
 | 
			
		||||
  case FCmpInst::FCMP_ULT:   FOC = ISD::SETLT; FPC = ISD::SETULT; break;
 | 
			
		||||
  case FCmpInst::FCMP_ULE:   FOC = ISD::SETLE; FPC = ISD::SETULE; break;
 | 
			
		||||
  case FCmpInst::FCMP_UNE:   FOC = ISD::SETNE; FPC = ISD::SETUNE; break;
 | 
			
		||||
  case FCmpInst::FCMP_TRUE:  FOC = FPC = ISD::SETTRUE; break;
 | 
			
		||||
  default:
 | 
			
		||||
    llvm_unreachable("Invalid FCmp predicate opcode!");
 | 
			
		||||
    FOC = FPC = ISD::SETFALSE;
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  if (FiniteOnlyFPMath())
 | 
			
		||||
    return FOC;
 | 
			
		||||
  else
 | 
			
		||||
    return FPC;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// getICmpCondCode - Return the ISD condition code corresponding to
 | 
			
		||||
/// the given LLVM IR integer condition code.
 | 
			
		||||
///
 | 
			
		||||
ISD::CondCode llvm::getICmpCondCode(ICmpInst::Predicate Pred) {
 | 
			
		||||
  switch (Pred) {
 | 
			
		||||
  case ICmpInst::ICMP_EQ:  return ISD::SETEQ;
 | 
			
		||||
  case ICmpInst::ICMP_NE:  return ISD::SETNE;
 | 
			
		||||
  case ICmpInst::ICMP_SLE: return ISD::SETLE;
 | 
			
		||||
  case ICmpInst::ICMP_ULE: return ISD::SETULE;
 | 
			
		||||
  case ICmpInst::ICMP_SGE: return ISD::SETGE;
 | 
			
		||||
  case ICmpInst::ICMP_UGE: return ISD::SETUGE;
 | 
			
		||||
  case ICmpInst::ICMP_SLT: return ISD::SETLT;
 | 
			
		||||
  case ICmpInst::ICMP_ULT: return ISD::SETULT;
 | 
			
		||||
  case ICmpInst::ICMP_SGT: return ISD::SETGT;
 | 
			
		||||
  case ICmpInst::ICMP_UGT: return ISD::SETUGT;
 | 
			
		||||
  default:
 | 
			
		||||
    llvm_unreachable("Invalid ICmp predicate opcode!");
 | 
			
		||||
    return ISD::SETNE;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -15,12 +15,15 @@
 | 
			
		||||
#ifndef FUNCTIONLOWERINGINFO_H
 | 
			
		||||
#define FUNCTIONLOWERINGINFO_H
 | 
			
		||||
 | 
			
		||||
#include "llvm/InlineAsm.h"
 | 
			
		||||
#include "llvm/Instructions.h"
 | 
			
		||||
#include "llvm/ADT/APInt.h"
 | 
			
		||||
#include "llvm/ADT/DenseMap.h"
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
#include "llvm/ADT/SmallSet.h"
 | 
			
		||||
#endif
 | 
			
		||||
#include "llvm/CodeGen/ValueTypes.h"
 | 
			
		||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
namespace llvm {
 | 
			
		||||
@@ -146,6 +149,22 @@ void AddCatchInfo(CallInst &I, MachineModuleInfo *MMI, MachineBasicBlock *MBB);
 | 
			
		||||
void CopyCatchInfo(BasicBlock *SrcBB, BasicBlock *DestBB,
 | 
			
		||||
                   MachineModuleInfo *MMI, FunctionLoweringInfo &FLI);
 | 
			
		||||
 | 
			
		||||
/// hasInlineAsmMemConstraint - Return true if the inline asm instruction being
 | 
			
		||||
/// processed uses a memory 'm' constraint.
 | 
			
		||||
bool hasInlineAsmMemConstraint(std::vector<InlineAsm::ConstraintInfo> &CInfos,
 | 
			
		||||
                               const TargetLowering &TLI);
 | 
			
		||||
 | 
			
		||||
/// getFCmpCondCode - Return the ISD condition code corresponding to
 | 
			
		||||
/// the given LLVM IR floating-point condition code.  This includes
 | 
			
		||||
/// consideration of global floating-point math flags.
 | 
			
		||||
///
 | 
			
		||||
ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred);
 | 
			
		||||
 | 
			
		||||
/// getICmpCondCode - Return the ISD condition code corresponding to
 | 
			
		||||
/// the given LLVM IR integer condition code.
 | 
			
		||||
///
 | 
			
		||||
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred);
 | 
			
		||||
 | 
			
		||||
} // end namespace llvm
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -972,61 +972,6 @@ static bool InBlock(const Value *V, const BasicBlock *BB) {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// getFCmpCondCode - Return the ISD condition code corresponding to
 | 
			
		||||
/// the given LLVM IR floating-point condition code.  This includes
 | 
			
		||||
/// consideration of global floating-point math flags.
 | 
			
		||||
///
 | 
			
		||||
static ISD::CondCode getFCmpCondCode(FCmpInst::Predicate Pred) {
 | 
			
		||||
  ISD::CondCode FPC, FOC;
 | 
			
		||||
  switch (Pred) {
 | 
			
		||||
  case FCmpInst::FCMP_FALSE: FOC = FPC = ISD::SETFALSE; break;
 | 
			
		||||
  case FCmpInst::FCMP_OEQ:   FOC = ISD::SETEQ; FPC = ISD::SETOEQ; break;
 | 
			
		||||
  case FCmpInst::FCMP_OGT:   FOC = ISD::SETGT; FPC = ISD::SETOGT; break;
 | 
			
		||||
  case FCmpInst::FCMP_OGE:   FOC = ISD::SETGE; FPC = ISD::SETOGE; break;
 | 
			
		||||
  case FCmpInst::FCMP_OLT:   FOC = ISD::SETLT; FPC = ISD::SETOLT; break;
 | 
			
		||||
  case FCmpInst::FCMP_OLE:   FOC = ISD::SETLE; FPC = ISD::SETOLE; break;
 | 
			
		||||
  case FCmpInst::FCMP_ONE:   FOC = ISD::SETNE; FPC = ISD::SETONE; break;
 | 
			
		||||
  case FCmpInst::FCMP_ORD:   FOC = FPC = ISD::SETO;   break;
 | 
			
		||||
  case FCmpInst::FCMP_UNO:   FOC = FPC = ISD::SETUO;  break;
 | 
			
		||||
  case FCmpInst::FCMP_UEQ:   FOC = ISD::SETEQ; FPC = ISD::SETUEQ; break;
 | 
			
		||||
  case FCmpInst::FCMP_UGT:   FOC = ISD::SETGT; FPC = ISD::SETUGT; break;
 | 
			
		||||
  case FCmpInst::FCMP_UGE:   FOC = ISD::SETGE; FPC = ISD::SETUGE; break;
 | 
			
		||||
  case FCmpInst::FCMP_ULT:   FOC = ISD::SETLT; FPC = ISD::SETULT; break;
 | 
			
		||||
  case FCmpInst::FCMP_ULE:   FOC = ISD::SETLE; FPC = ISD::SETULE; break;
 | 
			
		||||
  case FCmpInst::FCMP_UNE:   FOC = ISD::SETNE; FPC = ISD::SETUNE; break;
 | 
			
		||||
  case FCmpInst::FCMP_TRUE:  FOC = FPC = ISD::SETTRUE; break;
 | 
			
		||||
  default:
 | 
			
		||||
    llvm_unreachable("Invalid FCmp predicate opcode!");
 | 
			
		||||
    FOC = FPC = ISD::SETFALSE;
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  if (FiniteOnlyFPMath())
 | 
			
		||||
    return FOC;
 | 
			
		||||
  else
 | 
			
		||||
    return FPC;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// getICmpCondCode - Return the ISD condition code corresponding to
 | 
			
		||||
/// the given LLVM IR integer condition code.
 | 
			
		||||
///
 | 
			
		||||
static ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred) {
 | 
			
		||||
  switch (Pred) {
 | 
			
		||||
  case ICmpInst::ICMP_EQ:  return ISD::SETEQ;
 | 
			
		||||
  case ICmpInst::ICMP_NE:  return ISD::SETNE;
 | 
			
		||||
  case ICmpInst::ICMP_SLE: return ISD::SETLE;
 | 
			
		||||
  case ICmpInst::ICMP_ULE: return ISD::SETULE;
 | 
			
		||||
  case ICmpInst::ICMP_SGE: return ISD::SETGE;
 | 
			
		||||
  case ICmpInst::ICMP_UGE: return ISD::SETUGE;
 | 
			
		||||
  case ICmpInst::ICMP_SLT: return ISD::SETLT;
 | 
			
		||||
  case ICmpInst::ICMP_ULT: return ISD::SETULT;
 | 
			
		||||
  case ICmpInst::ICMP_SGT: return ISD::SETGT;
 | 
			
		||||
  case ICmpInst::ICMP_UGT: return ISD::SETUGT;
 | 
			
		||||
  default:
 | 
			
		||||
    llvm_unreachable("Invalid ICmp predicate opcode!");
 | 
			
		||||
    return ISD::SETNE;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
 | 
			
		||||
/// This function emits a branch and is used at the leaves of an OR or an
 | 
			
		||||
/// AND operator tree.
 | 
			
		||||
@@ -5213,27 +5158,6 @@ GetRegistersForValue(SDISelAsmOperandInfo &OpInfo,
 | 
			
		||||
  // Otherwise, we couldn't allocate enough registers for this.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// hasInlineAsmMemConstraint - Return true if the inline asm instruction being
 | 
			
		||||
/// processed uses a memory 'm' constraint.
 | 
			
		||||
static bool
 | 
			
		||||
hasInlineAsmMemConstraint(std::vector<InlineAsm::ConstraintInfo> &CInfos,
 | 
			
		||||
                          const TargetLowering &TLI) {
 | 
			
		||||
  for (unsigned i = 0, e = CInfos.size(); i != e; ++i) {
 | 
			
		||||
    InlineAsm::ConstraintInfo &CI = CInfos[i];
 | 
			
		||||
    for (unsigned j = 0, ee = CI.Codes.size(); j != ee; ++j) {
 | 
			
		||||
      TargetLowering::ConstraintType CType = TLI.getConstraintType(CI.Codes[j]);
 | 
			
		||||
      if (CType == TargetLowering::C_Memory)
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Indirect operand accesses access memory.
 | 
			
		||||
    if (CI.isIndirect)
 | 
			
		||||
      return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// visitInlineAsm - Handle a call to an InlineAsm object.
 | 
			
		||||
///
 | 
			
		||||
void SelectionDAGBuilder::visitInlineAsm(CallSite CS) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user