aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/SelectionDAG/ScheduleDAG.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/ScheduleDAG.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
index 6ffa9c720d..4e45bd6564 100644
--- a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
@@ -283,6 +283,35 @@ void ScheduleDAG::EmitNode(NodeInfo *NI) {
MRI->copyRegToReg(*BB, BB->end(), VRBase, SrcReg, TRC);
break;
}
+ case ISD::INLINEASM: {
+ unsigned NumOps = Node->getNumOperands();
+ if (Node->getOperand(NumOps-1).getValueType() == MVT::Flag)
+ --NumOps; // Ignore the flag operand.
+
+ // Create the inline asm machine instruction.
+ MachineInstr *MI =
+ new MachineInstr(BB, TargetInstrInfo::INLINEASM, (NumOps-2)/2+1);
+
+ // Add the asm string as an external symbol operand.
+ const char *AsmStr =
+ cast<ExternalSymbolSDNode>(Node->getOperand(1))->getSymbol();
+ MI->addExternalSymbolOperand(AsmStr, false);
+
+ // Add all of the operand registers to the instruction.
+ for (unsigned i = 2; i != NumOps; i += 2) {
+ unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg();
+ unsigned Flags = cast<ConstantSDNode>(Node->getOperand(i))->getValue();
+ MachineOperand::UseType UseTy;
+ switch (Flags) {
+ default: assert(0 && "Bad flags!");
+ case 1: UseTy = MachineOperand::Use; break;
+ case 2: UseTy = MachineOperand::Def; break;
+ case 3: UseTy = MachineOperand::UseAndDef; break;
+ }
+ MI->addMachineRegOperand(Reg, UseTy);
+ }
+ break;
+ }
}
}