mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-07-19 03:29:22 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24186 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b97cc99058
commit
764fe71e12
@ -185,23 +185,40 @@ SDOperand IA64DAGToDAGISel::SelectCALL(SDOperand Op) {
|
|||||||
} else {
|
} else {
|
||||||
// otherwise we need to load the function descriptor,
|
// otherwise we need to load the function descriptor,
|
||||||
// load the branch target (function)'s entry point and GP,
|
// load the branch target (function)'s entry point and GP,
|
||||||
// branch (call) then restore the
|
// branch (call) then restore the GP
|
||||||
// GP
|
|
||||||
|
|
||||||
SDOperand FnDescriptor = Select(N->getOperand(1));
|
SDOperand FnDescriptor = Select(N->getOperand(1));
|
||||||
|
|
||||||
// load the branch target's entry point [mem] and
|
// load the branch target's entry point [mem] and
|
||||||
// GP value [mem+8]
|
// 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,
|
SDOperand targetEntryPoint=CurDAG->getLoad(MVT::i64, Chain, FnDescriptor,
|
||||||
CurDAG->getSrcValue(0));
|
CurDAG->getSrcValue(0));
|
||||||
SDOperand targetGPAddr=CurDAG->getNode(ISD::ADD, MVT::i64, FnDescriptor,
|
SDOperand targetGPAddr=CurDAG->getNode(ISD::ADD, MVT::i64, FnDescriptor,
|
||||||
CurDAG->getConstant(8, MVT::i64));
|
CurDAG->getConstant(8, MVT::i64));
|
||||||
SDOperand targetGP=CurDAG->getLoad(MVT::i64, Chain, targetGPAddr,
|
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
|
// Copy the callee address into the b6 branch register
|
||||||
SDOperand B6 = CurDAG->getRegister(IA64::B6, MVT::i64);
|
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);
|
targetEntryPoint);
|
||||||
|
|
||||||
CallOperands.push_back(B6);
|
CallOperands.push_back(B6);
|
||||||
|
Loading…
Reference in New Issue
Block a user