[llvm-commits] [llvm] r118225 - /llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
Chris Lattner
sabre at nondot.org
Wed Nov 3 18:42:59 PDT 2010
Author: lattner
Date: Wed Nov 3 20:42:59 2010
New Revision: 118225
URL: http://llvm.org/viewvc/llvm-project?rev=118225&view=rev
Log:
replace SrcOpNum with SrcOpName, eliminating a numering dependency
on the incoming operand list. This also makes the code simpler.
Modified:
llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
Modified: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp?rev=118225&r1=118224&r2=118225&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Wed Nov 3 20:42:59 2010
@@ -250,10 +250,10 @@
/// The unique class instance this operand should match.
ClassInfo *Class;
- /// The original operand this corresponds to.
- int SrcOpNum;
+ /// The operand name this is, if anything.
+ StringRef SrcOpName;
- explicit AsmOperand(StringRef T) : Token(T), Class(0), SrcOpNum(-1) {}
+ explicit AsmOperand(StringRef T) : Token(T), Class(0) {}
};
/// ResOperand - This represents a single operand in the result instruction
@@ -1141,7 +1141,7 @@
for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
if (Operands[i].MIOperandNo == unsigned(OITied)) {
OI = &Operands[i];
- Idx = i;
+ OperandName = OI->Name;
break;
}
}
@@ -1150,40 +1150,37 @@
}
Op.Class = getOperandClass(Token, *OI);
- Op.SrcOpNum = Idx;
+ Op.SrcOpName = OperandName;
}
void MatchableInfo::BuildResultOperands() {
- /// OperandMap - This is a mapping from the MCInst operands (specified by the
- /// II.OperandList operands) to the AsmOperands that they are filled in from.
- SmallVector<int, 16> OperandMap(TheOperandList.size(), -1);
-
- // Order the (class) operands by the order to convert them into an MCInst.
- for (unsigned i = 0, e = AsmOperands.size(); i != e; ++i) {
- MatchableInfo::AsmOperand &Op = AsmOperands[i];
- if (Op.SrcOpNum != -1)
- OperandMap[Op.SrcOpNum] = i;
- }
-
for (unsigned i = 0, e = TheOperandList.size(); i != e; ++i) {
const CGIOperandList::OperandInfo &OpInfo = TheOperandList[i];
+
+ // If this is a tied operand, just copy from the previously handled operand.
+ int TiedOp = OpInfo.getTiedRegister();
+ if (TiedOp != -1) {
+ ResOperands.push_back(ResOperand::getTiedOp(TiedOp, &OpInfo));
+ continue;
+ }
// Find out what operand from the asmparser that this MCInst operand comes
// from.
- int SrcOperand = OperandMap[i];
- if (SrcOperand != -1) {
+ int SrcOperand = -1;
+ for (unsigned op = 0, e = AsmOperands.size(); op != e; ++op)
+ if (OpInfo.Name == AsmOperands[op].SrcOpName) {
+ SrcOperand = op;
+ break;
+ }
+
+ if (!OpInfo.Name.empty() && SrcOperand != -1) {
ResOperands.push_back(ResOperand::getRenderedOp(SrcOperand, &OpInfo));
continue;
}
- // Otherwise, this must be a tied operand.
- int TiedOp = OpInfo.getTiedRegister();
- if (TiedOp == -1)
- throw TGError(TheDef->getLoc(), "Instruction '" +
- TheDef->getName() + "' has operand '" + OpInfo.Name +
- "' that doesn't appear in asm string!");
-
- ResOperands.push_back(ResOperand::getTiedOp(TiedOp, &OpInfo));
+ throw TGError(TheDef->getLoc(), "Instruction '" +
+ TheDef->getName() + "' has operand '" + OpInfo.Name +
+ "' that doesn't appear in asm string!");
}
}
More information about the llvm-commits
mailing list