[llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp

Duraid Madina duraid at octopus.com.au
Thu Nov 24 23:49:37 PST 2005



Changes in directory llvm/lib/Target/IA64:

IA64ISelDAGToDAG.cpp updated: 1.11 -> 1.12
---
Log message:

add support for dynamic_stackalloc to the dag isel (thanks andrew ;)

next up: support argument passing in memory, not just registers



---
Diffs of the changes:  (+31 -3)

 IA64ISelDAGToDAG.cpp |   34 +++++++++++++++++++++++++++++++---
 1 files changed, 31 insertions(+), 3 deletions(-)


Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp
diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.11 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.12
--- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.11	Mon Nov 21 08:14:54 2005
+++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp	Fri Nov 25 01:49:25 2005
@@ -536,9 +536,37 @@
   case ISD::SREM:
   case ISD::UREM: return SelectDIV(Op);
  
-/* todo:
- * case ISD::DYNAMIC_STACKALLOC:
-*/
+  case ISD::DYNAMIC_STACKALLOC: {
+    if (!isa<ConstantSDNode>(N->getOperand(2)) ||
+        cast<ConstantSDNode>(N->getOperand(2))->getValue() != 0) {
+      std::cerr << "Cannot allocate stack object with greater alignment than"
+                << " the stack alignment yet!";
+      abort();
+    }
+
+    SDOperand Chain = Select(N->getOperand(0));
+    SDOperand Amt   = Select(N->getOperand(1));
+    SDOperand Reg = CurDAG->getRegister(IA64::r12, MVT::i64);
+    SDOperand Val = CurDAG->getCopyFromReg(Chain, IA64::r12, MVT::i64);
+    Chain = Val.getValue(1);
+    
+    // Subtract the amount (guaranteed to be a multiple of the stack alignment)
+    // from the stack pointer, giving us the result pointer.
+    SDOperand Result = Select(CurDAG->getNode(ISD::SUB, MVT::i64, Val, Amt));
+    
+    // Copy this result back into r12.
+    Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, Reg, Result);
+    
+    // Copy this result back out of r12 to make sure we're not using the stack
+    // space without decrementing the stack pointer.
+    Result = CurDAG->getCopyFromReg(Chain, IA64::r12, MVT::i64);
+  
+    // Finally, replace the DYNAMIC_STACKALLOC with the copyfromreg.
+    CodeGenMap[Op.getValue(0)] = Result;
+    CodeGenMap[Op.getValue(1)] = Result.getValue(1);
+    return SDOperand(Result.Val, Op.ResNo);
+  }
+
   case ISD::ConstantFP: {
     SDOperand Chain = CurDAG->getEntryNode(); // this is a constant, so..
 






More information about the llvm-commits mailing list