aboutsummaryrefslogtreecommitdiff
path: root/utils/TableGen/CodeGenTarget.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-11-01 00:27:05 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-11-01 00:27:05 +0000
commite2ba8975883874633a1035c245af3b948b940b25 (patch)
treec96cb0a2c458ddce539001e9f610df39969257df /utils/TableGen/CodeGenTarget.cpp
parent2f15c063baec25d337a8cd18cb8209e866b7845d (diff)
Add operand constraints to TargetInstrInfo.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31333 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenTarget.cpp')
-rw-r--r--utils/TableGen/CodeGenTarget.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/utils/TableGen/CodeGenTarget.cpp b/utils/TableGen/CodeGenTarget.cpp
index f5595d365f..489aba9814 100644
--- a/utils/TableGen/CodeGenTarget.cpp
+++ b/utils/TableGen/CodeGenTarget.cpp
@@ -273,6 +273,51 @@ bool CodeGenTarget::isLittleEndianEncoding() const {
return getInstructionSet()->getValueAsBit("isLittleEndianEncoding");
}
+static std::pair<unsigned, unsigned> parseConstraint(const std::string &CStr,
+ CodeGenInstruction *I) {
+ const std::string ops("="); // FIXME: Only supports TIED_TO for now.
+ std::string::size_type pos = CStr.find_first_of(ops);
+ assert(pos != std::string::npos && "Unrecognized constraint");
+ std::string Name = CStr.substr(1, pos); // Skip '$'
+
+ const std::string delims(" \t");
+ std::string::size_type wpos = Name.find_first_of(delims);
+ if (wpos != std::string::npos)
+ Name = Name.substr(0, wpos);
+ unsigned FIdx = I->getOperandNamed(Name);
+
+ Name = CStr.substr(pos+1);
+ wpos = Name.find_first_not_of(delims);
+ if (wpos != std::string::npos)
+ Name = Name.substr(wpos+1);
+ unsigned TIdx = I->getOperandNamed(Name);
+ return std::make_pair(FIdx, (TIdx << 16) | 1);
+}
+
+static std::vector<unsigned> parseConstraints(const std::string &CStr,
+ CodeGenInstruction *I) {
+ unsigned NumOps = I->OperandList.size();
+ std::vector<unsigned> Res(NumOps, 0);
+ if (CStr == "")
+ return Res;
+
+ const std::string delims(",");
+ std::string::size_type bidx, eidx;
+
+ bidx = CStr.find_first_not_of(delims);
+ while (bidx != std::string::npos) {
+ eidx = CStr.find_first_of(delims, bidx);
+ if (eidx == std::string::npos)
+ eidx = CStr.length();
+ std::pair<unsigned, unsigned> C =
+ parseConstraint(CStr.substr(bidx, eidx), I);
+ Res[C.first] = C.second;
+ bidx = CStr.find_first_not_of(delims, eidx);
+ }
+
+ return Res;
+}
+
CodeGenInstruction::CodeGenInstruction(Record *R, const std::string &AsmStr)
: TheDef(R), AsmString(AsmStr) {
Name = R->getValueAsString("Name");
@@ -338,6 +383,9 @@ CodeGenInstruction::CodeGenInstruction(Record *R, const std::string &AsmStr)
MIOperandNo, NumOps, MIOpInfo));
MIOperandNo += NumOps;
}
+
+ ConstraintStr = R->getValueAsString("Constraints");
+ ConstraintsList = parseConstraints(ConstraintStr, this);
}