[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
Evan Cheng
evan.cheng at apple.com
Wed Jan 11 14:15:31 PST 2006
Changes in directory llvm/lib/Target/X86:
X86ISelDAGToDAG.cpp updated: 1.29 -> 1.30
---
Log message:
Select DYNAMIC_STACKALLOC
---
Diffs of the changes: (+44 -1)
X86ISelDAGToDAG.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 44 insertions(+), 1 deletion(-)
Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.29 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.30
--- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.29 Wed Jan 11 00:09:51 2006
+++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Wed Jan 11 16:15:18 2006
@@ -458,6 +458,9 @@
if (Opcode >= ISD::BUILTIN_OP_END && Opcode < X86ISD::FIRST_NUMBER)
return N; // Already selected.
+
+ std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(N);
+ if (CGMI != CodeGenMap.end()) return CGMI->second;
switch (Opcode) {
default: break;
@@ -621,7 +624,7 @@
SDOperand Tmp1 = CurDAG->getTargetNode(Opc, VT, Tmp0);
SDOperand InFlag = SDOperand(0,0);
SDOperand Result = CurDAG->getCopyToReg(CurDAG->getEntryNode(),
- Reg, Tmp1, InFlag).getValue(1);
+ Reg, Tmp1, InFlag);
SDOperand Chain = Result.getValue(0);
InFlag = Result.getValue(1);
@@ -696,6 +699,46 @@
Base, Scale, Index, Disp, Chain);
return Chain;
}
+
+ case ISD::DYNAMIC_STACKALLOC: {
+ SDOperand Chain = N.getOperand(0);
+ SDOperand Size = N.getOperand(1);
+ SDOperand Align = N.getOperand(2);
+
+ // FIXME: We are currently ignoring the requested alignment for handling
+ // greater than the stack alignment. This will need to be revisited at
+ // some point.
+ if (!isa<ConstantSDNode>(Align) ||
+ cast<ConstantSDNode>(Align)->getValue() != 0) {
+ std::cerr << "Cannot allocate stack object with greater alignment than"
+ << " the stack alignment yet!";
+ abort();
+ }
+
+ // FIXME: This produces crappy code. Lots of unnecessary MOV32rr to and
+ // from ESP.
+ SDOperand InFlag;
+ SDOperand SPVal = CurDAG->getCopyFromReg(Chain, X86::ESP, MVT::i32, InFlag);
+ Chain = SPVal.getValue(1);
+ InFlag = SPVal.getValue(2);
+
+ SDOperand Result = Select(CurDAG->getNode(X86ISD::SUB_FLAG, MVT::i32,
+ SPVal, Size, InFlag));
+ InFlag = Result.getValue(1);
+
+ // Force the result back into ESP.
+ Chain = CurDAG->getCopyToReg(Chain,
+ CurDAG->getRegister(X86::ESP, MVT::i32),
+ Result, InFlag);
+ InFlag = Chain.getValue(1);
+
+ // Copy the result back from ESP.
+ Result = CurDAG->getCopyFromReg(Chain, X86::ESP, MVT::i32, InFlag);
+
+ CodeGenMap[N.getValue(0)] = Result;
+ CodeGenMap[N.getValue(1)] = Result.getValue(1);
+ return Result.getValue(N.ResNo);
+ }
}
return SelectCode(N);
More information about the llvm-commits
mailing list