diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-10 01:45:28 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-10 01:45:28 +0000 |
commit | a9dfb1bc07e437e4a97bd6b16e7af63de7e99839 (patch) | |
tree | 441d13a09add9cda34a5a4a41b8f4ed145d049a1 /llvm/utils/TableGen/CodeGenInstruction.cpp | |
parent | 75c9a4eeaeed62d6b203206f5a61e2f41208bc3e (diff) | |
download | bcm5719-llvm-a9dfb1bc07e437e4a97bd6b16e7af63de7e99839.tar.gz bcm5719-llvm-a9dfb1bc07e437e4a97bd6b16e7af63de7e99839.zip |
Introduce a new CodeGenInstruction::ConstraintInfo class
for representing constraint info semantically instead of
as a c expression that will be blatted out to the .inc
file. Fix X86RecognizableInstr to use this instead of
parsing C code :).
llvm-svn: 95753
Diffstat (limited to 'llvm/utils/TableGen/CodeGenInstruction.cpp')
-rw-r--r-- | llvm/utils/TableGen/CodeGenInstruction.cpp | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/llvm/utils/TableGen/CodeGenInstruction.cpp b/llvm/utils/TableGen/CodeGenInstruction.cpp index 684431a6f49..d31502b1acb 100644 --- a/llvm/utils/TableGen/CodeGenInstruction.cpp +++ b/llvm/utils/TableGen/CodeGenInstruction.cpp @@ -33,10 +33,10 @@ static void ParseConstraint(const std::string &CStr, CodeGenInstruction *I) { I->ParseOperandName(Name, false); // Build the string for the operand - std::string OpConstraint = "(1 << TOI::EARLY_CLOBBER)"; - if (!I->OperandList[Op.first].Constraints[Op.second].empty()) + if (!I->OperandList[Op.first].Constraints[Op.second].isNone()) throw "Operand '" + Name + "' cannot have multiple constraints!"; - I->OperandList[Op.first].Constraints[Op.second] = OpConstraint; + I->OperandList[Op.first].Constraints[Op.second] = + CodeGenInstruction::ConstraintInfo::getEarlyClobber(); return; } @@ -65,13 +65,11 @@ static void ParseConstraint(const std::string &CStr, CodeGenInstruction *I) { unsigned FlatOpNo = I->getFlattenedOperandNumber(SrcOp); - // Build the string for the operand. - std::string OpConstraint = - "((" + utostr(FlatOpNo) + " << 16) | (1 << TOI::TIED_TO))"; - if (!I->OperandList[DestOp.first].Constraints[DestOp.second].empty()) + if (!I->OperandList[DestOp.first].Constraints[DestOp.second].isNone()) throw "Operand '" + DestOpName + "' cannot have multiple constraints!"; - I->OperandList[DestOp.first].Constraints[DestOp.second] = OpConstraint; + I->OperandList[DestOp.first].Constraints[DestOp.second] = + CodeGenInstruction::ConstraintInfo::getTied(FlatOpNo); } static void ParseConstraints(const std::string &CStr, CodeGenInstruction *I) { @@ -210,18 +208,13 @@ CodeGenInstruction::CodeGenInstruction(Record *R, const std::string &AsmStr) // For backward compatibility: isTwoAddress means operand 1 is tied to // operand 0. if (isTwoAddress) { - if (!OperandList[1].Constraints[0].empty()) + if (!OperandList[1].Constraints[0].isNone()) throw R->getName() + ": cannot use isTwoAddress property: instruction " "already has constraint set!"; - OperandList[1].Constraints[0] = "((0 << 16) | (1 << TOI::TIED_TO))"; + OperandList[1].Constraints[0] = + CodeGenInstruction::ConstraintInfo::getTied(0); } - // Any operands with unset constraints get 0 as their constraint. - for (unsigned op = 0, e = OperandList.size(); op != e; ++op) - for (unsigned j = 0, e = OperandList[op].MINumOperands; j != e; ++j) - if (OperandList[op].Constraints[j].empty()) - OperandList[op].Constraints[j] = "0"; - // Parse the DisableEncoding field. std::string DisableEncoding = R->getValueAsString("DisableEncoding"); while (1) { |