mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-17 06:33:21 +00:00
Replace a few uses of SelectionDAG::getTargetNode with
SelectionDAG::SelectNodeTo in the instruction selector. This updates existing nodes in place instead of creating new ones. Go back to selecting ISD::DBG_LABEL nodes into TargetInstrInfo::DBG_LABEL nodes instead of leaving them unselected, now that SelectNodeTo allows us to update them in place. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53057 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
501e763dfe
commit
cd920d9ecf
@ -461,10 +461,19 @@ public:
|
|||||||
SDOperand Op1, SDOperand Op2, SDOperand Op3);
|
SDOperand Op1, SDOperand Op2, SDOperand Op3);
|
||||||
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
|
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT,
|
||||||
SDOperandPtr Ops, unsigned NumOps);
|
SDOperandPtr Ops, unsigned NumOps);
|
||||||
|
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1, MVT VT2);
|
||||||
|
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
|
||||||
|
MVT VT2, SDOperandPtr Ops, unsigned NumOps);
|
||||||
|
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
|
||||||
|
MVT VT2, MVT VT3, SDOperandPtr Ops, unsigned NumOps);
|
||||||
|
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
|
||||||
|
MVT VT2, SDOperand Op1);
|
||||||
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
|
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
|
||||||
MVT VT2, SDOperand Op1, SDOperand Op2);
|
MVT VT2, SDOperand Op1, SDOperand Op2);
|
||||||
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
|
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT VT1,
|
||||||
MVT VT2, SDOperand Op1, SDOperand Op2, SDOperand Op3);
|
MVT VT2, SDOperand Op1, SDOperand Op2, SDOperand Op3);
|
||||||
|
SDNode *SelectNodeTo(SDNode *N, unsigned TargetOpc, SDVTList VTs,
|
||||||
|
SDOperandPtr Ops, unsigned NumOps);
|
||||||
|
|
||||||
|
|
||||||
/// getTargetNode - These are used for target selectors to create a new node
|
/// getTargetNode - These are used for target selectors to create a new node
|
||||||
|
@ -885,16 +885,6 @@ void ScheduleDAG::EmitNode(SDNode *Node, bool IsClone,
|
|||||||
assert(0 && "EntryToken should have been excluded from the schedule!");
|
assert(0 && "EntryToken should have been excluded from the schedule!");
|
||||||
break;
|
break;
|
||||||
case ISD::TokenFactor: // fall thru
|
case ISD::TokenFactor: // fall thru
|
||||||
case ISD::DECLARE:
|
|
||||||
case ISD::SRCVALUE:
|
|
||||||
break;
|
|
||||||
case ISD::DBG_LABEL:
|
|
||||||
BB->push_back(BuildMI(TII->get(TargetInstrInfo::DBG_LABEL))
|
|
||||||
.addImm(cast<LabelSDNode>(Node)->getLabelID()));
|
|
||||||
break;
|
|
||||||
case ISD::EH_LABEL:
|
|
||||||
BB->push_back(BuildMI(TII->get(TargetInstrInfo::EH_LABEL))
|
|
||||||
.addImm(cast<LabelSDNode>(Node)->getLabelID()));
|
|
||||||
break;
|
break;
|
||||||
case ISD::CopyToReg: {
|
case ISD::CopyToReg: {
|
||||||
unsigned SrcReg;
|
unsigned SrcReg;
|
||||||
@ -951,34 +941,14 @@ void ScheduleDAG::EmitNode(SDNode *Node, bool IsClone,
|
|||||||
|
|
||||||
switch (Flags & 7) {
|
switch (Flags & 7) {
|
||||||
default: assert(0 && "Bad flags!");
|
default: assert(0 && "Bad flags!");
|
||||||
case 1: // Use of register.
|
|
||||||
for (; NumVals; --NumVals, ++i) {
|
|
||||||
unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg();
|
|
||||||
MI->addOperand(MachineOperand::CreateReg(Reg, false));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2: // Def of register.
|
case 2: // Def of register.
|
||||||
for (; NumVals; --NumVals, ++i) {
|
for (; NumVals; --NumVals, ++i) {
|
||||||
unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg();
|
unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg();
|
||||||
MI->addOperand(MachineOperand::CreateReg(Reg, true));
|
MI->addOperand(MachineOperand::CreateReg(Reg, true));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3: { // Immediate.
|
case 1: // Use of register.
|
||||||
for (; NumVals; --NumVals, ++i) {
|
case 3: // Immediate.
|
||||||
if (ConstantSDNode *CS =
|
|
||||||
dyn_cast<ConstantSDNode>(Node->getOperand(i))) {
|
|
||||||
MI->addOperand(MachineOperand::CreateImm(CS->getValue()));
|
|
||||||
} else if (GlobalAddressSDNode *GA =
|
|
||||||
dyn_cast<GlobalAddressSDNode>(Node->getOperand(i))) {
|
|
||||||
MI->addOperand(MachineOperand::CreateGA(GA->getGlobal(),
|
|
||||||
GA->getOffset()));
|
|
||||||
} else {
|
|
||||||
BasicBlockSDNode *BB =cast<BasicBlockSDNode>(Node->getOperand(i));
|
|
||||||
MI->addOperand(MachineOperand::CreateMBB(BB->getBasicBlock()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4: // Addressing mode.
|
case 4: // Addressing mode.
|
||||||
// The addressing mode has been selected, just add all of the
|
// The addressing mode has been selected, just add all of the
|
||||||
// operands to the machine instruction.
|
// operands to the machine instruction.
|
||||||
|
@ -3693,130 +3693,97 @@ void SDNode::MorphNodeTo(unsigned Opc, SDVTList L,
|
|||||||
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
MVT VT) {
|
MVT VT) {
|
||||||
SDVTList VTs = getVTList(VT);
|
SDVTList VTs = getVTList(VT);
|
||||||
FoldingSetNodeID ID;
|
return SelectNodeTo(N, TargetOpc, VTs, (SDOperand*)0, 0);
|
||||||
AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, (SDOperand*)0, 0);
|
|
||||||
void *IP = 0;
|
|
||||||
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
|
|
||||||
return ON;
|
|
||||||
|
|
||||||
RemoveNodeFromCSEMaps(N);
|
|
||||||
|
|
||||||
N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc, VTs, SDOperandPtr(), 0);
|
|
||||||
|
|
||||||
CSEMap.InsertNode(N, IP);
|
|
||||||
return N;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
MVT VT, SDOperand Op1) {
|
MVT VT, SDOperand Op1) {
|
||||||
// If an identical node already exists, use it.
|
|
||||||
SDVTList VTs = getVTList(VT);
|
SDVTList VTs = getVTList(VT);
|
||||||
SDOperand Ops[] = { Op1 };
|
SDOperand Ops[] = { Op1 };
|
||||||
|
return SelectNodeTo(N, TargetOpc, VTs, Ops, 1);
|
||||||
FoldingSetNodeID ID;
|
|
||||||
AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 1);
|
|
||||||
void *IP = 0;
|
|
||||||
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
|
|
||||||
return ON;
|
|
||||||
|
|
||||||
RemoveNodeFromCSEMaps(N);
|
|
||||||
N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 1);
|
|
||||||
CSEMap.InsertNode(N, IP);
|
|
||||||
return N;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
MVT VT, SDOperand Op1,
|
MVT VT, SDOperand Op1,
|
||||||
SDOperand Op2) {
|
SDOperand Op2) {
|
||||||
// If an identical node already exists, use it.
|
|
||||||
SDVTList VTs = getVTList(VT);
|
SDVTList VTs = getVTList(VT);
|
||||||
SDOperand Ops[] = { Op1, Op2 };
|
SDOperand Ops[] = { Op1, Op2 };
|
||||||
|
return SelectNodeTo(N, TargetOpc, VTs, Ops, 2);
|
||||||
FoldingSetNodeID ID;
|
|
||||||
AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 2);
|
|
||||||
void *IP = 0;
|
|
||||||
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
|
|
||||||
return ON;
|
|
||||||
|
|
||||||
RemoveNodeFromCSEMaps(N);
|
|
||||||
|
|
||||||
N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 2);
|
|
||||||
|
|
||||||
CSEMap.InsertNode(N, IP); // Memoize the new node.
|
|
||||||
return N;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
MVT VT, SDOperand Op1,
|
MVT VT, SDOperand Op1,
|
||||||
SDOperand Op2, SDOperand Op3) {
|
SDOperand Op2, SDOperand Op3) {
|
||||||
// If an identical node already exists, use it.
|
|
||||||
SDVTList VTs = getVTList(VT);
|
SDVTList VTs = getVTList(VT);
|
||||||
SDOperand Ops[] = { Op1, Op2, Op3 };
|
SDOperand Ops[] = { Op1, Op2, Op3 };
|
||||||
FoldingSetNodeID ID;
|
return SelectNodeTo(N, TargetOpc, VTs, Ops, 3);
|
||||||
AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 3);
|
|
||||||
void *IP = 0;
|
|
||||||
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
|
|
||||||
return ON;
|
|
||||||
|
|
||||||
RemoveNodeFromCSEMaps(N);
|
|
||||||
|
|
||||||
N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 3);
|
|
||||||
|
|
||||||
CSEMap.InsertNode(N, IP); // Memoize the new node.
|
|
||||||
return N;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
MVT VT, SDOperandPtr Ops,
|
MVT VT, SDOperandPtr Ops,
|
||||||
unsigned NumOps) {
|
unsigned NumOps) {
|
||||||
// If an identical node already exists, use it.
|
|
||||||
SDVTList VTs = getVTList(VT);
|
SDVTList VTs = getVTList(VT);
|
||||||
FoldingSetNodeID ID;
|
return SelectNodeTo(N, TargetOpc, VTs, Ops, NumOps);
|
||||||
AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, NumOps);
|
}
|
||||||
void *IP = 0;
|
|
||||||
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
return ON;
|
MVT VT1, MVT VT2, SDOperandPtr Ops,
|
||||||
|
unsigned NumOps) {
|
||||||
RemoveNodeFromCSEMaps(N);
|
SDVTList VTs = getVTList(VT1, VT2);
|
||||||
N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, NumOps);
|
return SelectNodeTo(N, TargetOpc, VTs, Ops, NumOps);
|
||||||
|
}
|
||||||
CSEMap.InsertNode(N, IP); // Memoize the new node.
|
|
||||||
return N;
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
|
MVT VT1, MVT VT2) {
|
||||||
|
SDVTList VTs = getVTList(VT1, VT2);
|
||||||
|
return SelectNodeTo(N, TargetOpc, VTs, (SDOperand *)0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
|
MVT VT1, MVT VT2, MVT VT3, SDOperandPtr Ops,
|
||||||
|
unsigned NumOps) {
|
||||||
|
SDVTList VTs = getVTList(VT1, VT2, VT3);
|
||||||
|
return SelectNodeTo(N, TargetOpc, VTs, Ops, NumOps);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
|
MVT VT1, MVT VT2,
|
||||||
|
SDOperand Op1) {
|
||||||
|
SDVTList VTs = getVTList(VT1, VT2);
|
||||||
|
SDOperand Ops[] = { Op1 };
|
||||||
|
return SelectNodeTo(N, TargetOpc, VTs, Ops, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
MVT VT1, MVT VT2,
|
MVT VT1, MVT VT2,
|
||||||
SDOperand Op1, SDOperand Op2) {
|
SDOperand Op1, SDOperand Op2) {
|
||||||
SDVTList VTs = getVTList(VT1, VT2);
|
SDVTList VTs = getVTList(VT1, VT2);
|
||||||
FoldingSetNodeID ID;
|
|
||||||
SDOperand Ops[] = { Op1, Op2 };
|
SDOperand Ops[] = { Op1, Op2 };
|
||||||
AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 2);
|
return SelectNodeTo(N, TargetOpc, VTs, Ops, 2);
|
||||||
void *IP = 0;
|
|
||||||
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
|
|
||||||
return ON;
|
|
||||||
|
|
||||||
RemoveNodeFromCSEMaps(N);
|
|
||||||
N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 2);
|
|
||||||
CSEMap.InsertNode(N, IP); // Memoize the new node.
|
|
||||||
return N;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
MVT VT1, MVT VT2,
|
MVT VT1, MVT VT2,
|
||||||
SDOperand Op1, SDOperand Op2,
|
SDOperand Op1, SDOperand Op2,
|
||||||
SDOperand Op3) {
|
SDOperand Op3) {
|
||||||
// If an identical node already exists, use it.
|
|
||||||
SDVTList VTs = getVTList(VT1, VT2);
|
SDVTList VTs = getVTList(VT1, VT2);
|
||||||
SDOperand Ops[] = { Op1, Op2, Op3 };
|
SDOperand Ops[] = { Op1, Op2, Op3 };
|
||||||
|
return SelectNodeTo(N, TargetOpc, VTs, Ops, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc,
|
||||||
|
SDVTList VTs, SDOperandPtr Ops,
|
||||||
|
unsigned NumOps) {
|
||||||
|
// If an identical node already exists, use it.
|
||||||
FoldingSetNodeID ID;
|
FoldingSetNodeID ID;
|
||||||
AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 3);
|
AddNodeIDNode(ID, ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, NumOps);
|
||||||
void *IP = 0;
|
void *IP = 0;
|
||||||
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
|
if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP))
|
||||||
return ON;
|
return ON;
|
||||||
|
|
||||||
RemoveNodeFromCSEMaps(N);
|
RemoveNodeFromCSEMaps(N);
|
||||||
|
|
||||||
N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, 3);
|
N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc, VTs, Ops, NumOps);
|
||||||
CSEMap.InsertNode(N, IP); // Memoize the new node.
|
CSEMap.InsertNode(N, IP); // Memoize the new node.
|
||||||
return N;
|
return N;
|
||||||
}
|
}
|
||||||
@ -4109,8 +4076,7 @@ void SelectionDAG::ReplaceAllUsesOfValueWith(SDOperand From, SDOperand To,
|
|||||||
for (SDNode::use_iterator UI = From.Val->use_begin(),
|
for (SDNode::use_iterator UI = From.Val->use_begin(),
|
||||||
E = From.Val->use_end(); UI != E; ++UI) {
|
E = From.Val->use_end(); UI != E; ++UI) {
|
||||||
SDNode *User = UI->getUser();
|
SDNode *User = UI->getUser();
|
||||||
if (!Users.count(User))
|
Users.insert(User);
|
||||||
Users.insert(User);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// When one of the recursive merges deletes nodes from the graph, we need to
|
// When one of the recursive merges deletes nodes from the graph, we need to
|
||||||
|
@ -1860,8 +1860,26 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
|
|||||||
<< "}\n\n";
|
<< "}\n\n";
|
||||||
|
|
||||||
OS << "SDNode *Select_UNDEF(const SDOperand &N) {\n"
|
OS << "SDNode *Select_UNDEF(const SDOperand &N) {\n"
|
||||||
<< " return CurDAG->getTargetNode(TargetInstrInfo::IMPLICIT_DEF,\n"
|
<< " return CurDAG->SelectNodeTo(N.Val, TargetInstrInfo::IMPLICIT_DEF,\n"
|
||||||
<< " N.getValueType());\n"
|
<< " N.getValueType());\n"
|
||||||
|
<< "}\n\n";
|
||||||
|
|
||||||
|
OS << "SDNode *Select_DBG_LABEL(const SDOperand &N) {\n"
|
||||||
|
<< " SDOperand Chain = N.getOperand(0);\n"
|
||||||
|
<< " unsigned C = cast<LabelSDNode>(N)->getLabelID();\n"
|
||||||
|
<< " SDOperand Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n"
|
||||||
|
<< " AddToISelQueue(Chain);\n"
|
||||||
|
<< " return CurDAG->SelectNodeTo(N.Val, TargetInstrInfo::DBG_LABEL,\n"
|
||||||
|
<< " MVT::Other, Tmp, Chain);\n"
|
||||||
|
<< "}\n\n";
|
||||||
|
|
||||||
|
OS << "SDNode *Select_EH_LABEL(const SDOperand &N) {\n"
|
||||||
|
<< " SDOperand Chain = N.getOperand(0);\n"
|
||||||
|
<< " unsigned C = cast<LabelSDNode>(N)->getLabelID();\n"
|
||||||
|
<< " SDOperand Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n"
|
||||||
|
<< " AddToISelQueue(Chain);\n"
|
||||||
|
<< " return CurDAG->SelectNodeTo(N.Val, TargetInstrInfo::EH_LABEL,\n"
|
||||||
|
<< " MVT::Other, Tmp, Chain);\n"
|
||||||
<< "}\n\n";
|
<< "}\n\n";
|
||||||
|
|
||||||
OS << "SDNode *Select_DECLARE(const SDOperand &N) {\n"
|
OS << "SDNode *Select_DECLARE(const SDOperand &N) {\n"
|
||||||
@ -1880,9 +1898,8 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
|
|||||||
<< " SDOperand Tmp2 = "
|
<< " SDOperand Tmp2 = "
|
||||||
<< "CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy());\n"
|
<< "CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy());\n"
|
||||||
<< " AddToISelQueue(Chain);\n"
|
<< " AddToISelQueue(Chain);\n"
|
||||||
<< " SDOperand Ops[] = { Tmp1, Tmp2, Chain };\n"
|
<< " return CurDAG->SelectNodeTo(N.Val, TargetInstrInfo::DECLARE,\n"
|
||||||
<< " return CurDAG->getTargetNode(TargetInstrInfo::DECLARE,\n"
|
<< " MVT::Other, Tmp1, Tmp2, Chain);\n"
|
||||||
<< " MVT::Other, Ops, 3);\n"
|
|
||||||
<< "}\n\n";
|
<< "}\n\n";
|
||||||
|
|
||||||
OS << "SDNode *Select_EXTRACT_SUBREG(const SDOperand &N) {\n"
|
OS << "SDNode *Select_EXTRACT_SUBREG(const SDOperand &N) {\n"
|
||||||
@ -1891,9 +1908,8 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
|
|||||||
<< " unsigned C = cast<ConstantSDNode>(N1)->getValue();\n"
|
<< " unsigned C = cast<ConstantSDNode>(N1)->getValue();\n"
|
||||||
<< " SDOperand Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n"
|
<< " SDOperand Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n"
|
||||||
<< " AddToISelQueue(N0);\n"
|
<< " AddToISelQueue(N0);\n"
|
||||||
<< " SDOperand Ops[] = { N0, Tmp };\n"
|
<< " return CurDAG->SelectNodeTo(N.Val, TargetInstrInfo::EXTRACT_SUBREG,\n"
|
||||||
<< " return CurDAG->getTargetNode(TargetInstrInfo::EXTRACT_SUBREG,\n"
|
<< " N.getValueType(), N0, Tmp);\n"
|
||||||
<< " N.getValueType(), Ops, 2);\n"
|
|
||||||
<< "}\n\n";
|
<< "}\n\n";
|
||||||
|
|
||||||
OS << "SDNode *Select_INSERT_SUBREG(const SDOperand &N) {\n"
|
OS << "SDNode *Select_INSERT_SUBREG(const SDOperand &N) {\n"
|
||||||
@ -1903,10 +1919,9 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
|
|||||||
<< " unsigned C = cast<ConstantSDNode>(N2)->getValue();\n"
|
<< " unsigned C = cast<ConstantSDNode>(N2)->getValue();\n"
|
||||||
<< " SDOperand Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n"
|
<< " SDOperand Tmp = CurDAG->getTargetConstant(C, MVT::i32);\n"
|
||||||
<< " AddToISelQueue(N1);\n"
|
<< " AddToISelQueue(N1);\n"
|
||||||
<< " SDOperand Ops[] = { N0, N1, Tmp };\n"
|
|
||||||
<< " AddToISelQueue(N0);\n"
|
<< " AddToISelQueue(N0);\n"
|
||||||
<< " return CurDAG->getTargetNode(TargetInstrInfo::INSERT_SUBREG,\n"
|
<< " return CurDAG->SelectNodeTo(N.Val, TargetInstrInfo::INSERT_SUBREG,\n"
|
||||||
<< " N.getValueType(), Ops, 3);\n"
|
<< " N.getValueType(), N0, N1, Tmp);\n"
|
||||||
<< "}\n\n";
|
<< "}\n\n";
|
||||||
|
|
||||||
OS << "// The main instruction selector code.\n"
|
OS << "// The main instruction selector code.\n"
|
||||||
@ -1942,13 +1957,13 @@ void DAGISelEmitter::EmitInstructionSelector(std::ostream &OS) {
|
|||||||
<< " case ISD::TokenFactor:\n"
|
<< " case ISD::TokenFactor:\n"
|
||||||
<< " case ISD::CopyFromReg:\n"
|
<< " case ISD::CopyFromReg:\n"
|
||||||
<< " case ISD::CopyToReg: {\n"
|
<< " case ISD::CopyToReg: {\n"
|
||||||
<< " case ISD::DBG_LABEL:\n"
|
|
||||||
<< " case ISD::EH_LABEL:\n"
|
|
||||||
<< " for (unsigned i = 0, e = N.getNumOperands(); i != e; ++i)\n"
|
<< " for (unsigned i = 0, e = N.getNumOperands(); i != e; ++i)\n"
|
||||||
<< " AddToISelQueue(N.getOperand(i));\n"
|
<< " AddToISelQueue(N.getOperand(i));\n"
|
||||||
<< " return NULL;\n"
|
<< " return NULL;\n"
|
||||||
<< " }\n"
|
<< " }\n"
|
||||||
<< " case ISD::INLINEASM: return Select_INLINEASM(N);\n"
|
<< " case ISD::INLINEASM: return Select_INLINEASM(N);\n"
|
||||||
|
<< " case ISD::DBG_LABEL: return Select_DBG_LABEL(N);\n"
|
||||||
|
<< " case ISD::EH_LABEL: return Select_EH_LABEL(N);\n"
|
||||||
<< " case ISD::DECLARE: return Select_DECLARE(N);\n"
|
<< " case ISD::DECLARE: return Select_DECLARE(N);\n"
|
||||||
<< " case ISD::EXTRACT_SUBREG: return Select_EXTRACT_SUBREG(N);\n"
|
<< " case ISD::EXTRACT_SUBREG: return Select_EXTRACT_SUBREG(N);\n"
|
||||||
<< " case ISD::INSERT_SUBREG: return Select_INSERT_SUBREG(N);\n"
|
<< " case ISD::INSERT_SUBREG: return Select_INSERT_SUBREG(N);\n"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user