diff options
author | Chris Lattner <sabre@nondot.org> | 2005-10-19 01:27:22 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-10-19 01:27:22 +0000 |
commit | 0c0cfa741f3897cfb8ea5268a5425de0d57fb50a (patch) | |
tree | 81d86c89542ca8fa55499d5ddffa0f6eb6c31478 /utils | |
parent | 8d948323942cf031e9d1c55bda2bff9d4db4cf42 (diff) | |
download | external_llvm-0c0cfa741f3897cfb8ea5268a5425de0d57fb50a.zip external_llvm-0c0cfa741f3897cfb8ea5268a5425de0d57fb50a.tar.gz external_llvm-0c0cfa741f3897cfb8ea5268a5425de0d57fb50a.tar.bz2 |
Nate wants to define 'Pat's which turn into instructions that don't have
patterns. Certainly a logical request.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23810 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 46e298b..d0dc799 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -975,11 +975,36 @@ void DAGISelEmitter::ParseInstructions() { std::vector<Record*> Instrs = Records.getAllDerivedDefinitions("Instruction"); for (unsigned i = 0, e = Instrs.size(); i != e; ++i) { - if (!dynamic_cast<ListInit*>(Instrs[i]->getValueInit("Pattern"))) - continue; // no pattern yet, ignore it. + ListInit *LI = 0; - ListInit *LI = Instrs[i]->getValueAsListInit("Pattern"); - if (LI->getSize() == 0) continue; // no pattern. + if (dynamic_cast<ListInit*>(Instrs[i]->getValueInit("Pattern"))) + LI = Instrs[i]->getValueAsListInit("Pattern"); + + // If there is no pattern, only collect minimal information about the + // instruction for its operand list. We have to assume that there is one + // result, as we have no detailed info. + if (!LI || LI->getSize() == 0) { + std::vector<MVT::ValueType> ResultTypes; + std::vector<MVT::ValueType> OperandTypes; + + CodeGenInstruction &InstInfo =Target.getInstruction(Instrs[i]->getName()); + + // Doesn't even define a result? + if (InstInfo.OperandList.size() == 0) + continue; + + // Assume the first operand is the result. + ResultTypes.push_back(InstInfo.OperandList[0].Ty); + + // The rest are inputs. + for (unsigned j = 1, e = InstInfo.OperandList.size(); j != e; ++j) + OperandTypes.push_back(InstInfo.OperandList[j].Ty); + + // Create and insert the instruction. + Instructions.insert(std::make_pair(Instrs[i], + DAGInstruction(0, ResultTypes, OperandTypes))); + continue; // no pattern. + } // Parse the instruction. TreePattern *I = new TreePattern(Instrs[i], LI, *this); @@ -1112,6 +1137,7 @@ void DAGISelEmitter::ParseInstructions() { for (std::map<Record*, DAGInstruction>::iterator II = Instructions.begin(), E = Instructions.end(); II != E; ++II) { TreePattern *I = II->second.getPattern(); + if (I == 0) continue; // No pattern. if (I->getNumTrees() != 1) { std::cerr << "CANNOT HANDLE: " << I->getRecord()->getName() << " yet!"; |