mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-27 13:30:05 +00:00
Teach the table generated emitPseudoExpansionLowering function to not emit a switch statement containing only a default statement (and no cases). Updated some of the code to use range-based for loops as well. No functional changes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209521 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a4df7d473f
commit
2bd2c560ee
@ -200,70 +200,74 @@ void PseudoLoweringEmitter::emitLoweringEmitter(raw_ostream &o) {
|
||||
|
||||
o << "bool " << Target.getName() + "AsmPrinter" << "::\n"
|
||||
<< "emitPseudoExpansionLowering(MCStreamer &OutStreamer,\n"
|
||||
<< " const MachineInstr *MI) {\n"
|
||||
<< " switch (MI->getOpcode()) {\n"
|
||||
<< " default: return false;\n";
|
||||
for (unsigned i = 0, e = Expansions.size(); i != e; ++i) {
|
||||
PseudoExpansion &Expansion = Expansions[i];
|
||||
CodeGenInstruction &Source = Expansion.Source;
|
||||
CodeGenInstruction &Dest = Expansion.Dest;
|
||||
o << " case " << Source.Namespace << "::"
|
||||
<< Source.TheDef->getName() << ": {\n"
|
||||
<< " MCInst TmpInst;\n"
|
||||
<< " MCOperand MCOp;\n"
|
||||
<< " TmpInst.setOpcode(" << Dest.Namespace << "::"
|
||||
<< Dest.TheDef->getName() << ");\n";
|
||||
<< " const MachineInstr *MI) {\n";
|
||||
|
||||
// Copy the operands from the source instruction.
|
||||
// FIXME: Instruction operands with defaults values (predicates and cc_out
|
||||
// in ARM, for example shouldn't need explicit values in the
|
||||
// expansion DAG.
|
||||
unsigned MIOpNo = 0;
|
||||
for (unsigned OpNo = 0, E = Dest.Operands.size(); OpNo != E;
|
||||
++OpNo) {
|
||||
o << " // Operand: " << Dest.Operands[OpNo].Name << "\n";
|
||||
for (unsigned i = 0, e = Dest.Operands[OpNo].MINumOperands;
|
||||
i != e; ++i) {
|
||||
switch (Expansion.OperandMap[MIOpNo + i].Kind) {
|
||||
case OpData::Operand:
|
||||
o << " lowerOperand(MI->getOperand("
|
||||
<< Source.Operands[Expansion.OperandMap[MIOpNo].Data
|
||||
.Operand].MIOperandNo + i
|
||||
<< "), MCOp);\n"
|
||||
<< " TmpInst.addOperand(MCOp);\n";
|
||||
break;
|
||||
case OpData::Imm:
|
||||
o << " TmpInst.addOperand(MCOperand::CreateImm("
|
||||
<< Expansion.OperandMap[MIOpNo + i].Data.Imm << "));\n";
|
||||
break;
|
||||
case OpData::Reg: {
|
||||
Record *Reg = Expansion.OperandMap[MIOpNo + i].Data.Reg;
|
||||
o << " TmpInst.addOperand(MCOperand::CreateReg(";
|
||||
// "zero_reg" is special.
|
||||
if (Reg->getName() == "zero_reg")
|
||||
o << "0";
|
||||
else
|
||||
o << Reg->getValueAsString("Namespace") << "::" << Reg->getName();
|
||||
o << "));\n";
|
||||
break;
|
||||
}
|
||||
if (!Expansions.empty()) {
|
||||
o << " switch (MI->getOpcode()) {\n"
|
||||
<< " default: return false;\n";
|
||||
for (auto &Expansion : Expansions) {
|
||||
CodeGenInstruction &Source = Expansion.Source;
|
||||
CodeGenInstruction &Dest = Expansion.Dest;
|
||||
o << " case " << Source.Namespace << "::"
|
||||
<< Source.TheDef->getName() << ": {\n"
|
||||
<< " MCInst TmpInst;\n"
|
||||
<< " MCOperand MCOp;\n"
|
||||
<< " TmpInst.setOpcode(" << Dest.Namespace << "::"
|
||||
<< Dest.TheDef->getName() << ");\n";
|
||||
|
||||
// Copy the operands from the source instruction.
|
||||
// FIXME: Instruction operands with defaults values (predicates and cc_out
|
||||
// in ARM, for example shouldn't need explicit values in the
|
||||
// expansion DAG.
|
||||
unsigned MIOpNo = 0;
|
||||
for (const auto &DestOperand : Dest.Operands) {
|
||||
o << " // Operand: " << DestOperand.Name << "\n";
|
||||
for (unsigned i = 0, e = DestOperand.MINumOperands; i != e; ++i) {
|
||||
switch (Expansion.OperandMap[MIOpNo + i].Kind) {
|
||||
case OpData::Operand:
|
||||
o << " lowerOperand(MI->getOperand("
|
||||
<< Source.Operands[Expansion.OperandMap[MIOpNo].Data
|
||||
.Operand].MIOperandNo + i
|
||||
<< "), MCOp);\n"
|
||||
<< " TmpInst.addOperand(MCOp);\n";
|
||||
break;
|
||||
case OpData::Imm:
|
||||
o << " TmpInst.addOperand(MCOperand::CreateImm("
|
||||
<< Expansion.OperandMap[MIOpNo + i].Data.Imm << "));\n";
|
||||
break;
|
||||
case OpData::Reg: {
|
||||
Record *Reg = Expansion.OperandMap[MIOpNo + i].Data.Reg;
|
||||
o << " TmpInst.addOperand(MCOperand::CreateReg(";
|
||||
// "zero_reg" is special.
|
||||
if (Reg->getName() == "zero_reg")
|
||||
o << "0";
|
||||
else
|
||||
o << Reg->getValueAsString("Namespace") << "::"
|
||||
<< Reg->getName();
|
||||
o << "));\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
MIOpNo += DestOperand.MINumOperands;
|
||||
}
|
||||
MIOpNo += Dest.Operands[OpNo].MINumOperands;
|
||||
if (Dest.Operands.isVariadic) {
|
||||
MIOpNo = Source.Operands.size() + 1;
|
||||
o << " // variable_ops\n";
|
||||
o << " for (unsigned i = " << MIOpNo
|
||||
<< ", e = MI->getNumOperands(); i != e; ++i)\n"
|
||||
<< " if (lowerOperand(MI->getOperand(i), MCOp))\n"
|
||||
<< " TmpInst.addOperand(MCOp);\n";
|
||||
}
|
||||
o << " EmitToStreamer(OutStreamer, TmpInst);\n"
|
||||
<< " break;\n"
|
||||
<< " }\n";
|
||||
}
|
||||
if (Dest.Operands.isVariadic) {
|
||||
MIOpNo = Source.Operands.size() + 1;
|
||||
o << " // variable_ops\n";
|
||||
o << " for (unsigned i = " << MIOpNo
|
||||
<< ", e = MI->getNumOperands(); i != e; ++i)\n"
|
||||
<< " if (lowerOperand(MI->getOperand(i), MCOp))\n"
|
||||
<< " TmpInst.addOperand(MCOp);\n";
|
||||
}
|
||||
o << " EmitToStreamer(OutStreamer, TmpInst);\n"
|
||||
<< " break;\n"
|
||||
<< " }\n";
|
||||
}
|
||||
o << " }\n return true;\n}\n\n";
|
||||
o << " }\n return true;";
|
||||
} else
|
||||
o << " return false;";
|
||||
|
||||
o << "\n}\n\n";
|
||||
}
|
||||
|
||||
void PseudoLoweringEmitter::run(raw_ostream &o) {
|
||||
|
Loading…
Reference in New Issue
Block a user