diff options
author | rdivacky <rdivacky@FreeBSD.org> | 2009-10-14 17:57:32 +0000 |
---|---|---|
committer | rdivacky <rdivacky@FreeBSD.org> | 2009-10-14 17:57:32 +0000 |
commit | cd749a9c07f1de2fb8affde90537efa4bc3e7c54 (patch) | |
tree | b21f6de4e08b89bb7931806bab798fc2a5e3a686 /utils/TableGen/DAGISelEmitter.cpp | |
parent | 72621d11de5b873f1695f391eb95f0b336c3d2d4 (diff) | |
download | FreeBSD-src-cd749a9c07f1de2fb8affde90537efa4bc3e7c54.zip FreeBSD-src-cd749a9c07f1de2fb8affde90537efa4bc3e7c54.tar.gz |
Update llvm to r84119.
Diffstat (limited to 'utils/TableGen/DAGISelEmitter.cpp')
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 100 |
1 files changed, 36 insertions, 64 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index bb26a1d..dcf64e4 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -23,11 +23,8 @@ #include <iostream> using namespace llvm; -namespace { - cl::opt<bool> - GenDebug("gen-debug", cl::desc("Generate debug code"), - cl::init(false)); -} +static cl::opt<bool> +GenDebug("gen-debug", cl::desc("Generate debug code"), cl::init(false)); //===----------------------------------------------------------------------===// // DAGISelEmitter Helper methods @@ -60,8 +57,8 @@ static const ComplexPattern *NodeGetComplexPattern(TreePatternNode *N, /// patterns before small ones. This is used to determine the size of a /// pattern. static unsigned getPatternSize(TreePatternNode *P, CodeGenDAGPatterns &CGP) { - assert((EMVT::isExtIntegerInVTs(P->getExtTypes()) || - EMVT::isExtFloatingPointInVTs(P->getExtTypes()) || + assert((EEVT::isExtIntegerInVTs(P->getExtTypes()) || + EEVT::isExtFloatingPointInVTs(P->getExtTypes()) || P->getExtTypeNum(0) == MVT::isVoid || P->getExtTypeNum(0) == MVT::Flag || P->getExtTypeNum(0) == MVT::iPTR || @@ -698,7 +695,7 @@ public: if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) { Record *LeafRec = DI->getDef(); if (LeafRec->isSubClassOf("RegisterClass") || - LeafRec->getName() == "ptr_rc") { + LeafRec->isSubClassOf("PointerLikeRegClass")) { // Handle register references. Nothing to do here. } else if (LeafRec->isSubClassOf("Register")) { // Handle register references. @@ -787,7 +784,7 @@ public: EmitResultCode(TreePatternNode *N, std::vector<Record*> DstRegs, bool InFlagDecled, bool ResNodeDecled, bool LikeLeaf = false, bool isRoot = false) { - // List of arguments of getTargetNode() or SelectNodeTo(). + // List of arguments of getMachineNode() or SelectNodeTo(). std::vector<std::string> NodeOps; // This is something selected from the pattern we matched. if (!N->getName().empty()) { @@ -932,7 +929,8 @@ public: unsigned ResNo = TmpNo++; assert(N->getExtTypes().size() == 1 && "Multiple types not handled!"); emitCode("SDValue Tmp" + utostr(ResNo) + - " = CurDAG->getTargetConstant(0x" + itohexstr(II->getValue()) + + " = CurDAG->getTargetConstant(0x" + + utohexstr((uint64_t) II->getValue()) + "ULL, " + getEnumName(N->getTypeNum(0)) + ");"); NodeOps.push_back("Tmp" + utostr(ResNo)); return NodeOps; @@ -1091,7 +1089,7 @@ public: std::string Code = "Opc" + utostr(OpcNo); if (!isRoot || (InputHasChain && !NodeHasChain)) - // For call to "getTargetNode()". + // For call to "getMachineNode()". Code += ", N.getDebugLoc()"; emitOpcode(II.Namespace + "::" + II.TheDef->getName()); @@ -1137,24 +1135,18 @@ public: emitCode("}"); } - // Generate MemOperandSDNodes nodes for each memory accesses covered by + // Populate MemRefs with entries for each memory accesses covered by // this pattern. - if (II.mayLoad | II.mayStore) { - std::vector<std::string>::const_iterator mi, mie; - for (mi = LSI.begin(), mie = LSI.end(); mi != mie; ++mi) { - std::string LSIName = "LSI_" + *mi; - emitCode("SDValue " + LSIName + " = " - "CurDAG->getMemOperand(cast<MemSDNode>(" + - *mi + ")->getMemOperand());"); - if (GenDebug) { - emitCode("CurDAG->setSubgraphColor(" + LSIName +".getNode(), \"yellow\");"); - emitCode("CurDAG->setSubgraphColor(" + LSIName +".getNode(), \"black\");"); - } - if (IsVariadic) - emitCode("Ops" + utostr(OpsNo) + ".push_back(" + LSIName + ");"); - else - AllOps.push_back(LSIName); - } + if (isRoot && !LSI.empty()) { + std::string MemRefs = "MemRefs" + utostr(OpsNo); + emitCode("MachineSDNode::mmo_iterator " + MemRefs + " = " + "MF->allocateMemRefsArray(" + utostr(LSI.size()) + ");"); + for (unsigned i = 0, e = LSI.size(); i != e; ++i) + emitCode(MemRefs + "[" + utostr(i) + "] = " + "cast<MemSDNode>(" + LSI[i] + ")->getMemOperand();"); + After.push_back("cast<MachineSDNode>(ResNode)->setMemRefs(" + + MemRefs + ", " + MemRefs + " + " + utostr(LSI.size()) + + ");"); } if (NodeHasChain) { @@ -1305,7 +1297,7 @@ public: // would leave users of the chain dangling. // if (!isRoot || (InputHasChain && !NodeHasChain)) { - Code = "CurDAG->getTargetNode(" + Code; + Code = "CurDAG->getMachineNode(" + Code; } else { Code = "CurDAG->SelectNodeTo(N.getNode(), " + Code; } @@ -1778,7 +1770,7 @@ void DAGISelEmitter::EmitInstructionSelector(raw_ostream &OS) { CallerCode += ", " + TargetOpcodes[j]; } for (unsigned j = 0, e = TargetVTs.size(); j != e; ++j) { - CalleeCode += ", MVT VT" + utostr(j); + CalleeCode += ", MVT::SimpleValueType VT" + utostr(j); CallerCode += ", " + TargetVTs[j]; } for (std::set<std::string>::iterator @@ -1930,7 +1922,7 @@ void DAGISelEmitter::EmitInstructionSelector(raw_ostream &OS) { << " std::vector<SDValue> Ops(N.getNode()->op_begin(), N.getNode()->op_end());\n" << " SelectInlineAsmMemoryOperands(Ops);\n\n" - << " std::vector<MVT> VTs;\n" + << " std::vector<EVT> VTs;\n" << " VTs.push_back(MVT::Other);\n" << " VTs.push_back(MVT::Flag);\n" << " SDValue New = CurDAG->getNode(ISD::INLINEASM, N.getDebugLoc(), " @@ -1959,32 +1951,14 @@ void DAGISelEmitter::EmitInstructionSelector(raw_ostream &OS) { << " MVT::Other, Tmp, Chain);\n" << "}\n\n"; - OS << "SDNode *Select_DECLARE(const SDValue &N) {\n" - << " SDValue Chain = N.getOperand(0);\n" - << " SDValue N1 = N.getOperand(1);\n" - << " SDValue N2 = N.getOperand(2);\n" - << " if (!isa<FrameIndexSDNode>(N1) || !isa<GlobalAddressSDNode>(N2)) {\n" - << " CannotYetSelect(N);\n" - << " }\n" - << " int FI = cast<FrameIndexSDNode>(N1)->getIndex();\n" - << " GlobalValue *GV = cast<GlobalAddressSDNode>(N2)->getGlobal();\n" - << " SDValue Tmp1 = " - << "CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());\n" - << " SDValue Tmp2 = " - << "CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy());\n" - << " return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::DECLARE,\n" - << " MVT::Other, Tmp1, Tmp2, Chain);\n" - << "}\n\n"; - OS << "// The main instruction selector code.\n" << "SDNode *SelectCode(SDValue N) {\n" - << " MVT::SimpleValueType NVT = N.getNode()->getValueType(0).getSimpleVT();\n" + << " MVT::SimpleValueType NVT = N.getNode()->getValueType(0).getSimpleVT().SimpleTy;\n" << " switch (N.getOpcode()) {\n" << " default:\n" << " assert(!N.isMachineOpcode() && \"Node already selected!\");\n" << " break;\n" << " case ISD::EntryToken: // These nodes remain the same.\n" - << " case ISD::MEMOPERAND:\n" << " case ISD::BasicBlock:\n" << " case ISD::Register:\n" << " case ISD::HANDLENODE:\n" @@ -2009,7 +1983,6 @@ void DAGISelEmitter::EmitInstructionSelector(raw_ostream &OS) { << " case ISD::INLINEASM: return Select_INLINEASM(N);\n" << " case ISD::DBG_LABEL: return Select_DBG_LABEL(N);\n" << " case ISD::EH_LABEL: return Select_EH_LABEL(N);\n" - << " case ISD::DECLARE: return Select_DECLARE(N);\n" << " case ISD::UNDEF: return Select_UNDEF(N);\n"; // Loop over all of the case statements, emiting a call to each method we @@ -2083,20 +2056,19 @@ void DAGISelEmitter::EmitInstructionSelector(raw_ostream &OS) { << "}\n\n"; OS << "void CannotYetSelect(SDValue N) DISABLE_INLINE {\n" - << " cerr << \"Cannot yet select: \";\n" - << " N.getNode()->dump(CurDAG);\n" - << " cerr << '\\n';\n" - << " abort();\n" + << " std::string msg;\n" + << " raw_string_ostream Msg(msg);\n" + << " Msg << \"Cannot yet select: \";\n" + << " N.getNode()->print(Msg, CurDAG);\n" + << " llvm_report_error(Msg.str());\n" << "}\n\n"; OS << "void CannotYetSelectIntrinsic(SDValue N) DISABLE_INLINE {\n" - << " cerr << \"Cannot yet select: \";\n" + << " errs() << \"Cannot yet select: \";\n" << " unsigned iid = cast<ConstantSDNode>(N.getOperand(" << "N.getOperand(0).getValueType() == MVT::Other))->getZExtValue();\n" - << " cerr << \"intrinsic %\"<< " - << "Intrinsic::getName((Intrinsic::ID)iid);\n" - << " cerr << '\\n';\n" - << " abort();\n" + << " llvm_report_error(\"Cannot yet select: intrinsic %\" +\n" + << "Intrinsic::getName((Intrinsic::ID)iid));\n" << "}\n\n"; } @@ -2115,12 +2087,12 @@ void DAGISelEmitter::run(raw_ostream &OS) { EmitNodeTransforms(OS); EmitPredicateFunctions(OS); - DOUT << "\n\nALL PATTERNS TO MATCH:\n\n"; + DEBUG(errs() << "\n\nALL PATTERNS TO MATCH:\n\n"); for (CodeGenDAGPatterns::ptm_iterator I = CGP.ptm_begin(), E = CGP.ptm_end(); I != E; ++I) { - DOUT << "PATTERN: "; DEBUG(I->getSrcPattern()->dump()); - DOUT << "\nRESULT: "; DEBUG(I->getDstPattern()->dump()); - DOUT << "\n"; + DEBUG(errs() << "PATTERN: "; I->getSrcPattern()->dump()); + DEBUG(errs() << "\nRESULT: "; I->getDstPattern()->dump()); + DEBUG(errs() << "\n"); } // At this point, we have full information about the 'Patterns' we need to |