merge two large parallel loops in EmitConvertToMCInst, no change

in the generated .inc files.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118083 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-11-02 21:49:44 +00:00
parent a1a45fd254
commit dda855de8b

View File

@ -1139,68 +1139,16 @@ static void EmitConvertToMCInst(CodeGenTarget &Target,
// Build the conversion function signature. // Build the conversion function signature.
std::string Signature = "Convert"; std::string Signature = "Convert";
unsigned CurIndex = 0; unsigned CurIndex = 0;
std::string CaseBody;
raw_string_ostream CaseOS(CaseBody);
// Compute the convert enum and the case body.
for (unsigned i = 0, e = MIOperandList.size(); i != e; ++i) { for (unsigned i = 0, e = MIOperandList.size(); i != e; ++i) {
MatchableInfo::Operand &Op = II.AsmOperands[MIOperandList[i].second]; MatchableInfo::Operand &Op = II.AsmOperands[MIOperandList[i].second];
assert(CurIndex <= Op.OperandInfo->MIOperandNo && assert(CurIndex <= Op.OperandInfo->MIOperandNo &&
"Duplicate match for instruction operand!"); "Duplicate match for instruction operand!");
// Skip operands which weren't matched by anything, this occurs when the
// .td file encodes "implicit" operands as explicit ones.
//
// FIXME: This should be removed from the MCInst structure.
for (; CurIndex != Op.OperandInfo->MIOperandNo; ++CurIndex) {
std::pair<unsigned, unsigned> *Tie = GetTiedOperandAtIndex(TiedOperands,
CurIndex);
if (!Tie)
Signature += "__Imp";
else
Signature += "__Tie" + utostr(Tie->second);
}
Signature += "__";
// Registers are always converted the same, don't duplicate the conversion
// function based on them.
//
// FIXME: We could generalize this based on the render method, if it
// mattered.
if (Op.Class->isRegisterClass())
Signature += "Reg";
else
Signature += Op.Class->ClassName;
Signature += utostr(Op.OperandInfo->MINumOperands);
Signature += "_" + utostr(MIOperandList[i].second);
CurIndex += Op.OperandInfo->MINumOperands;
}
// Add any trailing implicit operands.
for (; CurIndex != NumMIOperands; ++CurIndex) {
std::pair<unsigned, unsigned> *Tie = GetTiedOperandAtIndex(TiedOperands,
CurIndex);
if (!Tie)
Signature += "__Imp";
else
Signature += "__Tie" + utostr(Tie->second);
}
II.ConversionFnKind = Signature;
// Check if we have already generated this signature.
if (!GeneratedFns.insert(Signature).second)
continue;
// If not, emit it now.
// Add to the enum list.
OS << " " << Signature << ",\n";
// And to the convert function.
CvtOS << " case " << Signature << ":\n";
CurIndex = 0;
for (unsigned i = 0, e = MIOperandList.size(); i != e; ++i) {
MatchableInfo::Operand &Op = II.AsmOperands[MIOperandList[i].second];
// Add the implicit operands. // Add the implicit operands.
for (; CurIndex != Op.OperandInfo->MIOperandNo; ++CurIndex) { for (; CurIndex != Op.OperandInfo->MIOperandNo; ++CurIndex) {
// See if this is a tied operand. // See if this is a tied operand.
@ -1210,18 +1158,33 @@ static void EmitConvertToMCInst(CodeGenTarget &Target,
if (!Tie) { if (!Tie) {
// If not, this is some implicit operand. Just assume it is a register // If not, this is some implicit operand. Just assume it is a register
// for now. // for now.
CvtOS << " Inst.addOperand(MCOperand::CreateReg(0));\n"; CaseOS << " Inst.addOperand(MCOperand::CreateReg(0));\n";
Signature += "__Imp";
} else { } else {
// Copy the tied operand. // Copy the tied operand.
assert(Tie->first>Tie->second && "Tied operand preceeds its target!"); assert(Tie->first>Tie->second && "Tied operand preceeds its target!");
CvtOS << " Inst.addOperand(Inst.getOperand(" CaseOS << " Inst.addOperand(Inst.getOperand("
<< Tie->second << "));\n"; << Tie->second << "));\n";
Signature += "__Tie" + utostr(Tie->second);
} }
} }
CvtOS << " ((" << TargetOperandClass << "*)Operands[" // Registers are always converted the same, don't duplicate the conversion
<< MIOperandList[i].second // function based on them.
<< "+1])->" << Op.Class->RenderMethod //
// FIXME: We could generalize this based on the render method, if it
// mattered.
Signature += "__";
if (Op.Class->isRegisterClass())
Signature += "Reg";
else
Signature += Op.Class->ClassName;
Signature += utostr(Op.OperandInfo->MINumOperands);
Signature += "_" + utostr(MIOperandList[i].second);
CaseOS << " ((" << TargetOperandClass << "*)Operands["
<< MIOperandList[i].second << "+1])->" << Op.Class->RenderMethod
<< "(Inst, " << Op.OperandInfo->MINumOperands << ");\n"; << "(Inst, " << Op.OperandInfo->MINumOperands << ");\n";
CurIndex += Op.OperandInfo->MINumOperands; CurIndex += Op.OperandInfo->MINumOperands;
} }
@ -1234,15 +1197,28 @@ static void EmitConvertToMCInst(CodeGenTarget &Target,
if (!Tie) { if (!Tie) {
// If not, this is some implicit operand. Just assume it is a register // If not, this is some implicit operand. Just assume it is a register
// for now. // for now.
CvtOS << " Inst.addOperand(MCOperand::CreateReg(0));\n"; CaseOS << " Inst.addOperand(MCOperand::CreateReg(0));\n";
Signature += "__Imp";
} else { } else {
// Copy the tied operand. // Copy the tied operand.
assert(Tie->first>Tie->second && "Tied operand preceeds its target!"); assert(Tie->first>Tie->second && "Tied operand preceeds its target!");
CvtOS << " Inst.addOperand(Inst.getOperand(" CaseOS << " Inst.addOperand(Inst.getOperand("
<< Tie->second << "));\n"; << Tie->second << "));\n";
Signature += "__Tie" + utostr(Tie->second);
} }
} }
II.ConversionFnKind = Signature;
// Check if we have already generated this signature.
if (!GeneratedFns.insert(Signature).second)
continue;
// If not, emit it now. Add to the enum list.
OS << " " << Signature << ",\n";
CvtOS << " case " << Signature << ":\n";
CvtOS << CaseOS.str();
CvtOS << " return;\n"; CvtOS << " return;\n";
} }