summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-11-10 02:01:40 +0000
committerChris Lattner <sabre@nondot.org>2006-11-10 02:01:40 +0000
commitf19683956275a85bc0cfa0ac08760fdcc790f510 (patch)
tree2a4503da968aae5663c8ba31193ffc2a74b998e9 /utils
parent26ddb506ec08789d33298efb3a5c142dea22e320 (diff)
allow ptr_rc to explicitly appear in an instructions operand list, it doesn't
have to be a subpart of a complex operand. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31618 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/CodeGenTarget.cpp3
-rw-r--r--utils/TableGen/InstrInfoEmitter.cpp77
2 files changed, 42 insertions, 38 deletions
diff --git a/utils/TableGen/CodeGenTarget.cpp b/utils/TableGen/CodeGenTarget.cpp
index 440e7c67034..8aad3def21c 100644
--- a/utils/TableGen/CodeGenTarget.cpp
+++ b/utils/TableGen/CodeGenTarget.cpp
@@ -386,7 +386,8 @@ CodeGenInstruction::CodeGenInstruction(Record *R, const std::string &AsmStr)
} else if (Rec->getName() == "variable_ops") {
hasVariableNumberOfOperands = true;
continue;
- } else if (!Rec->isSubClassOf("RegisterClass"))
+ } else if (!Rec->isSubClassOf("RegisterClass") &&
+ Rec->getName() != "ptr_rc")
throw "Unknown operand class '" + Rec->getName() +
"' in instruction '" + R->getName() + "' instruction!";
diff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp
index deee320c5d5..7c5cc3b65ef 100644
--- a/utils/TableGen/InstrInfoEmitter.cpp
+++ b/utils/TableGen/InstrInfoEmitter.cpp
@@ -66,50 +66,53 @@ void InstrInfoEmitter::printDefList(const std::vector<Record*> &Uses,
std::vector<std::string>
InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
std::vector<std::string> Result;
+
for (unsigned i = 0, e = Inst.OperandList.size(); i != e; ++i) {
- if (Inst.OperandList[i].Rec->isSubClassOf("RegisterClass")) {
- std::string OpStr = getQualifiedName(Inst.OperandList[i].Rec);
- OpStr += "RegClassID, 0, ";
- OpStr += Inst.OperandList[i].Constraint;
-
- Result.push_back(OpStr);
+ // Handle aggregate operands and normal operands the same way by expanding
+ // either case into a list of operands for this op.
+ std::vector<CodeGenInstruction::OperandInfo> OperandList;
+
+ // This might be a multiple operand thing. Targets like X86 have
+ // registers in their multi-operand operands. It may also be an anonymous
+ // operand, which has a single operand, but no declared class for the
+ // operand.
+ DagInit *MIOI = Inst.OperandList[i].MIOperandInfo;
+
+ if (!MIOI || MIOI->getNumArgs() == 0) {
+ // Single, anonymous, operand.
+ OperandList.push_back(Inst.OperandList[i]);
} else {
- // This might be a multiple operand thing. Targets like X86 have
- // registers in their multi-operand operands. It may also be an anonymous
- // operand, which has a single operand, but no declared class for the
- // operand.
- DagInit *MIOI = Inst.OperandList[i].MIOperandInfo;
-
for (unsigned j = 0, e = Inst.OperandList[i].MINumOperands; j != e; ++j) {
- Record *OpR = 0;
- if (MIOI && j < MIOI->getNumArgs())
- if (DefInit *Def = dynamic_cast<DefInit*>(MIOI->getArg(j)))
- OpR = Def->getDef();
-
-
- std::string Res;
-
- if (OpR && OpR->isSubClassOf("RegisterClass"))
- Res += getQualifiedName(OpR) + "RegClassID, ";
- else
- Res += "0, ";
+ OperandList.push_back(Inst.OperandList[i]);
- // Fill in applicable flags.
- Res += "0";
-
- // Ptr value whose register class is resolved via callback.
- if (OpR && OpR->getName() == "ptr_rc")
- Res += "|M_LOOK_UP_PTR_REG_CLASS";
+ Record *OpR = dynamic_cast<DefInit*>(MIOI->getArg(j))->getDef();
+ OperandList.back().Rec = OpR;
+ }
+ }
- // Predicate operands.
- if (j == 0 && Inst.OperandList[i].Rec->isSubClassOf("PredicateOperand"))
- Res += "|M_PREDICATE_OPERAND";
+ for (unsigned j = 0, e = OperandList.size(); j != e; ++j) {
+ Record *OpR = OperandList[j].Rec;
+ std::string Res;
+
+ if (OpR->isSubClassOf("RegisterClass"))
+ Res += getQualifiedName(OpR) + "RegClassID, ";
+ else
+ Res += "0, ";
+ // Fill in applicable flags.
+ Res += "0";
- // fill in constraint info.
- Res += ", " + Inst.OperandList[i].Constraint;
+ // Ptr value whose register class is resolved via callback.
+ if (OpR->getName() == "ptr_rc")
+ Res += "|M_LOOK_UP_PTR_REG_CLASS";
+
+ // Predicate operands. Check to see if the original unexpanded operand
+ // was of type PredicateOperand.
+ if (j == 0 && Inst.OperandList[i].Rec->isSubClassOf("PredicateOperand"))
+ Res += "|M_PREDICATE_OPERAND";
- Result.push_back(Res);
- }
+ // Fill in constraint info.
+ Res += ", " + Inst.OperandList[i].Constraint;
+ Result.push_back(Res);
}
}