diff options
author | Chris Lattner <sabre@nondot.org> | 2005-09-08 21:27:15 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-09-08 21:27:15 +0000 |
commit | 33c92e92961c9a1aaaac767edeeac62dd787111e (patch) | |
tree | 2c1edd05d65c1ceaf937a5e122ad6eafb3576d4c | |
parent | 6af14a629deba4a6577af11b567138e891c4f81c (diff) |
Parse information about type constraints on SDNodes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23281 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 40 | ||||
-rw-r--r-- | utils/TableGen/DAGISelEmitter.h | 31 |
2 files changed, 71 insertions, 0 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 6bace1158d..dfb17f3ae4 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -19,11 +19,51 @@ using namespace llvm; //===----------------------------------------------------------------------===// +// SDTypeConstraint implementation +// + +SDTypeConstraint::SDTypeConstraint(Record *R) { + OperandNo = R->getValueAsInt("OperandNum"); + + if (R->isSubClassOf("SDTCisVT")) { + ConstraintType = SDTCisVT; + x.SDTCisVT_Info.VT = getValueType(R->getValueAsDef("VT")); + } else if (R->isSubClassOf("SDTCisInt")) { + ConstraintType = SDTCisInt; + } else if (R->isSubClassOf("SDTCisFP")) { + ConstraintType = SDTCisFP; + } else if (R->isSubClassOf("SDTCisSameAs")) { + ConstraintType = SDTCisSameAs; + x.SDTCisSameAs_Info.OtherOperandNum = R->getValueAsInt("OtherOperandNum"); + } else if (R->isSubClassOf("SDTCisVTSmallerThanOp")) { + ConstraintType = SDTCisVTSmallerThanOp; + x.SDTCisVTSmallerThanOp_Info.OtherOperandNum = + R->getValueAsInt("OtherOperandNum"); + } else { + std::cerr << "Unrecognized SDTypeConstraint '" << R->getName() << "'!\n"; + exit(1); + } +} + +//===----------------------------------------------------------------------===// // SDNodeInfo implementation // SDNodeInfo::SDNodeInfo(Record *R) : Def(R) { EnumName = R->getValueAsString("Opcode"); SDClassName = R->getValueAsString("SDClass"); + Record *TypeProfile = R->getValueAsDef("TypeProfile"); + NumResults = TypeProfile->getValueAsInt("NumResults"); + NumOperands = TypeProfile->getValueAsInt("NumOperands"); + + // Parse the type constraints. + ListInit *Constraints = TypeProfile->getValueAsListInit("Constraints"); + for (unsigned i = 0, e = Constraints->getSize(); i != e; ++i) { + assert(dynamic_cast<DefInit*>(Constraints->getElement(i)) && + "Constraints list should contain constraint definitions!"); + Record *Constraint = + static_cast<DefInit*>(Constraints->getElement(i))->getDef(); + TypeConstraints.push_back(Constraint); + } } //===----------------------------------------------------------------------===// diff --git a/utils/TableGen/DAGISelEmitter.h b/utils/TableGen/DAGISelEmitter.h index 20ead35a79..e2fade9917 100644 --- a/utils/TableGen/DAGISelEmitter.h +++ b/utils/TableGen/DAGISelEmitter.h @@ -24,6 +24,29 @@ namespace llvm { class TreePattern; class DAGISelEmitter; + /// SDTypeConstraint - This is a discriminated union of constraints, + /// corresponding to the SDTypeConstraint tablegen class in Target.td. + struct SDTypeConstraint { + SDTypeConstraint(Record *R); + + unsigned OperandNo; // The operand # this constraint applies to. + enum { + SDTCisVT, SDTCisInt, SDTCisFP, SDTCisSameAs, SDTCisVTSmallerThanOp + } ConstraintType; + + union { // The discriminated union. + struct { + MVT::ValueType VT; + } SDTCisVT_Info; + struct { + unsigned OtherOperandNum; + } SDTCisSameAs_Info; + struct { + unsigned OtherOperandNum; + } SDTCisVTSmallerThanOp_Info; + } x; + }; + /// SDNodeInfo - One of these records is created for each SDNode instance in /// the target .td file. This represents the various dag nodes we will be /// processing. @@ -31,12 +54,20 @@ namespace llvm { Record *Def; std::string EnumName; std::string SDClassName; + int NumResults, NumOperands; + std::vector<SDTypeConstraint> TypeConstraints; public: SDNodeInfo(Record *R); // Parse the specified record. + int getNumResults() const { return NumResults; } + int getNumOperands() const { return NumOperands; } Record *getRecord() const { return Def; } const std::string &getEnumName() const { return EnumName; } const std::string &getSDClassName() const { return SDClassName; } + + const std::vector<SDTypeConstraint> &getTypeConstraints() { + return TypeConstraints; + } }; /// FIXME: TreePatternNode's can be shared in some cases (due to dag-shaped |