[llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp
Duraid Madina
duraid at octopus.com.au
Fri Nov 4 09:56:05 PST 2005
Changes in directory llvm/lib/Target/IA64:
IA64ISelDAGToDAG.cpp updated: 1.7 -> 1.8
---
Log message:
oops, forgot to load GP for indirect calls, though the old code now commented
out failed (e.g. methcall) - now the code compiles, though it's not quite
right just yet (tm) ;)
would fix this but it's 3am! :O
---
Diffs of the changes: (+21 -4)
IA64ISelDAGToDAG.cpp | 25 +++++++++++++++++++++----
1 files changed, 21 insertions(+), 4 deletions(-)
Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp
diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.7 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.8
--- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.7 Fri Nov 4 03:59:06 2005
+++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Fri Nov 4 11:55:53 2005
@@ -185,23 +185,40 @@
} else {
// otherwise we need to load the function descriptor,
// load the branch target (function)'s entry point and GP,
- // branch (call) then restore the
- // GP
+ // branch (call) then restore the GP
SDOperand FnDescriptor = Select(N->getOperand(1));
// load the branch target's entry point [mem] and
// GP value [mem+8]
+ SDOperand targetEntryPoint=CurDAG->getTargetNode(IA64::LD8, MVT::i64,
+ FnDescriptor);
+ Chain = targetEntryPoint.getValue(1);
+ SDOperand targetGPAddr=CurDAG->getTargetNode(IA64::ADDS, MVT::i64,
+ FnDescriptor, CurDAG->getConstant(8, MVT::i64));
+ Chain = targetGPAddr.getValue(1);
+ SDOperand targetGP=CurDAG->getTargetNode(IA64::LD8, MVT::i64,
+ targetGPAddr);
+ Chain = targetGP.getValue(1);
+
+/* FIXME! (methcall still fails)
SDOperand targetEntryPoint=CurDAG->getLoad(MVT::i64, Chain, FnDescriptor,
CurDAG->getSrcValue(0));
SDOperand targetGPAddr=CurDAG->getNode(ISD::ADD, MVT::i64, FnDescriptor,
CurDAG->getConstant(8, MVT::i64));
SDOperand targetGP=CurDAG->getLoad(MVT::i64, Chain, targetGPAddr,
- CurDAG->getSrcValue(0));
+ CurDAG->getSrcValue(0));
+ */
+
+ // Copy the callee GP into r1
+ SDOperand r1 = CurDAG->getRegister(IA64::r1, MVT::i64);
+ Chain = CurDAG->getNode(ISD::CopyToReg, MVT::i64, Chain, r1,
+ targetGP);
+
// Copy the callee address into the b6 branch register
SDOperand B6 = CurDAG->getRegister(IA64::B6, MVT::i64);
- Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, B6,
+ Chain = CurDAG->getNode(ISD::CopyToReg, MVT::i64, Chain, B6,
targetEntryPoint);
CallOperands.push_back(B6);
More information about the llvm-commits
mailing list