Some minor fixes.

llvm-svn: 25227
This commit is contained in:
Evan Cheng 2006-01-11 22:16:13 +00:00
parent 66540aa32c
commit 5fa1397b29

View File

@ -2128,10 +2128,11 @@ public:
} }
// Emit all the chain and CopyToReg stuff. // Emit all the chain and CopyToReg stuff.
bool ChainEmitted = HasChain;
if (HasChain) if (HasChain)
OS << " Chain = Select(Chain);\n"; OS << " Chain = Select(Chain);\n";
if (HasImpInputs) if (HasImpInputs)
EmitCopyToRegs(Pattern, "N", HasChain, true); EmitCopyToRegs(Pattern, "N", ChainEmitted, true);
if (HasInFlag || HasOptInFlag) { if (HasInFlag || HasOptInFlag) {
unsigned FlagNo = (unsigned) HasChain + Pattern->getNumChildren(); unsigned FlagNo = (unsigned) HasChain + Pattern->getNumChildren();
if (HasOptInFlag) if (HasOptInFlag)
@ -2199,11 +2200,10 @@ public:
<< ValNo + (unsigned)HasChain << ");\n"; << ValNo + (unsigned)HasChain << ");\n";
if (HasImpResults) { if (HasImpResults) {
if (EmitCopyFromRegs(N, HasChain)) { if (EmitCopyFromRegs(N, ChainEmitted)) {
OS << " CodeGenMap[N.getValue(" << ValNo << ")] = " OS << " CodeGenMap[N.getValue(" << ValNo << ")] = "
<< "Result.getValue(" << ValNo << ");\n"; << "Result.getValue(" << ValNo << ");\n";
ValNo++; ValNo++;
HasChain = true;
} }
} }
@ -2314,14 +2314,14 @@ private:
/// EmitCopyToRegs - Emit the flag operands for the DAG that is /// EmitCopyToRegs - Emit the flag operands for the DAG that is
/// being built. /// being built.
void EmitCopyToRegs(TreePatternNode *N, const std::string &RootName, void EmitCopyToRegs(TreePatternNode *N, const std::string &RootName,
bool HasChain, bool isRoot = false) { bool &ChainEmitted, bool isRoot = false) {
const CodeGenTarget &T = ISE.getTargetInfo(); const CodeGenTarget &T = ISE.getTargetInfo();
unsigned OpNo = unsigned OpNo =
(unsigned) NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE); (unsigned) NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) { for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) {
TreePatternNode *Child = N->getChild(i); TreePatternNode *Child = N->getChild(i);
if (!Child->isLeaf()) { if (!Child->isLeaf()) {
EmitCopyToRegs(Child, RootName + utostr(OpNo), HasChain); EmitCopyToRegs(Child, RootName + utostr(OpNo), ChainEmitted);
} else { } else {
if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) { if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) {
Record *RR = DI->getDef(); Record *RR = DI->getDef();
@ -2329,7 +2329,11 @@ private:
MVT::ValueType RVT = getRegisterValueType(RR, T); MVT::ValueType RVT = getRegisterValueType(RR, T);
if (RVT == MVT::Flag) { if (RVT == MVT::Flag) {
OS << " InFlag = Select(" << RootName << OpNo << ");\n"; OS << " InFlag = Select(" << RootName << OpNo << ");\n";
} else if (HasChain) { } else {
if (!ChainEmitted) {
OS << " SDOperand Chain = CurDAG->getEntryNode();\n";
ChainEmitted = true;
}
OS << " SDOperand " << RootName << "CR" << i << ";\n"; OS << " SDOperand " << RootName << "CR" << i << ";\n";
OS << " " << RootName << "CR" << i OS << " " << RootName << "CR" << i
<< " = CurDAG->getCopyToReg(Chain, CurDAG->getRegister(" << " = CurDAG->getCopyToReg(Chain, CurDAG->getRegister("
@ -2340,12 +2344,6 @@ private:
<< ".getValue(0);\n"; << ".getValue(0);\n";
OS << " InFlag = " << RootName << "CR" << i OS << " InFlag = " << RootName << "CR" << i
<< ".getValue(1);\n"; << ".getValue(1);\n";
} else {
OS << " InFlag = CurDAG->getCopyToReg(CurDAG->getEntryNode()"
<< ", CurDAG->getRegister(" << ISE.getQualifiedName(RR)
<< ", MVT::" << getEnumName(RVT) << ")"
<< ", Select(" << RootName << OpNo
<< "), InFlag).getValue(1);\n";
} }
} }
} }
@ -2356,7 +2354,7 @@ private:
/// EmitCopyFromRegs - Emit code to copy result to physical registers /// EmitCopyFromRegs - Emit code to copy result to physical registers
/// as specified by the instruction. It returns true if any copy is /// as specified by the instruction. It returns true if any copy is
/// emitted. /// emitted.
bool EmitCopyFromRegs(TreePatternNode *N, bool HasChain) { bool EmitCopyFromRegs(TreePatternNode *N, bool &ChainEmitted) {
bool RetVal = false; bool RetVal = false;
Record *Op = N->getOperator(); Record *Op = N->getOperator();
if (Op->isSubClassOf("Instruction")) { if (Op->isSubClassOf("Instruction")) {
@ -2369,20 +2367,15 @@ private:
if (RR->isSubClassOf("Register")) { if (RR->isSubClassOf("Register")) {
MVT::ValueType RVT = getRegisterValueType(RR, CGT); MVT::ValueType RVT = getRegisterValueType(RR, CGT);
if (RVT != MVT::Flag) { if (RVT != MVT::Flag) {
if (HasChain) { if (!ChainEmitted) {
OS << " SDOperand Chain = CurDAG->getEntryNode();\n";
ChainEmitted = true;
}
OS << " Result = CurDAG->getCopyFromReg(Chain, " OS << " Result = CurDAG->getCopyFromReg(Chain, "
<< ISE.getQualifiedName(RR) << ISE.getQualifiedName(RR)
<< ", MVT::" << getEnumName(RVT) << ", InFlag);\n"; << ", MVT::" << getEnumName(RVT) << ", InFlag);\n";
OS << " Chain = Result.getValue(1);\n"; OS << " Chain = Result.getValue(1);\n";
OS << " InFlag = Result.getValue(2);\n"; OS << " InFlag = Result.getValue(2);\n";
} else {
OS << " Chain;\n";
OS << " Result = CurDAG->getCopyFromReg("
<< "CurDAG->getEntryNode(), ISE.getQualifiedName(RR)"
<< ", MVT::" << getEnumName(RVT) << ", InFlag);\n";
OS << " Chain = Result.getValue(1);\n";
OS << " InFlag = Result.getValue(2);\n";
}
RetVal = true; RetVal = true;
} }
} }